using System;
using System.Linq;
using System.Threading.Tasks;
using Amazon.S3;
using Amazon.S3.Model;
using Dpz.Core.Service.ObjectStorage;
using Dpz.Core.Service.ObjectStorage.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using NUnit.Framework;

namespace Dpz.Core.Server.ObjectStorage.Test;

/// <summary>
/// COS 视频服务集成测试
/// </summary>
[TestFixture]
public class CosVideoCloudServiceIntegrationTest
{
    private const string TestVideoM3U8 = "/Video/JingGuowang-One/1080p.m3u8";

    /// <summary>
    /// 对真实 COS 上的 m3u8 视频获取元数据:验证能解析出大于 0 的时长、非空的分片列表,
    /// 且各分片时长之和与总时长一致(精度 0.001)。
    /// </summary>
    [Test]
    public async Task GetVideoMetaAsync_WhenRealCosM3u8_ReturnsDurationAndSegments()
    {
        Assume.That(
            Environment.GetEnvironmentVariable("DPZ_ENABLE_COS_INTEGRATION_TESTS") == "1",
            "需要显式开启真实 COS 集成测试"
        );
        var service = CreateService();

        var result = await service.GetVideoMetaAsync(TestVideoM3U8);

        Assert.That(result.Success, Is.True, result.Message);
        Assert.That(result.Data, Is.Not.Null);
        Assert.Multiple(() =>
        {
            Assert.That(result.Data!.Duration, Is.GreaterThan(0));
            Assert.That(result.Data.Points, Is.Not.Empty);
            Assert.That(result.Data.Points.Sum(), Is.EqualTo(result.Data.Duration).Within(0.001));
        });
    }

    /// <summary>
    /// 对真实 COS 上的 m3u8 视频在 47 秒处截图:验证截图成功、返回的封面地址指向
    /// Video/JingGuowang-One/video.webp,且该封面已真实写入 COS(ContentType 为 image/jpeg)。
    /// 注意:本用例会真实写入并覆盖线上封面文件。
    /// </summary>
    [Test]
    public async Task VideoScreenshotAsync_WhenRealCosM3u8_UploadsCover()
    {
        Assume.That(
            Environment.GetEnvironmentVariable("DPZ_ENABLE_COS_INTEGRATION_TESTS") == "1",
            "需要显式开启真实 COS 集成测试"
        );
        var provider = CreateServiceProvider();
        var service = provider.GetRequiredService<IVideoCloudService>();
        var options = provider.GetRequiredService<S3ObjectStorageOptions>();
        var amazonS3 = provider.GetRequiredService<IAmazonS3>();

        var result = await service.VideoScreenshotAsync(TestVideoM3U8, TimeSpan.FromSeconds(47));

        Assert.That(result.Success, Is.True, result.Message);
        Assert.That(result.Data, Does.EndWith("/Video/JingGuowang-One/video.webp"));

        var metadata = await amazonS3.GetObjectMetadataAsync(
            new GetObjectMetadataRequest
            {
                BucketName = options.Bucket,
                Key = "Video/JingGuowang-One/video.webp",
            }
        );

        Assert.Multiple(() =>
        {
            Assert.That(metadata.Headers.ContentType, Is.EqualTo("image/jpeg"));
        });
    }

    private static IVideoCloudService CreateService()
    {
        return CreateServiceProvider().GetRequiredService<IVideoCloudService>();
    }

    private static ServiceProvider CreateServiceProvider()
    {
        var configuration = new ConfigurationBuilder().AddJsonFile("appsettings.Test.json").Build();
        var services = new ServiceCollection();
        services.AddSingleton<IConfiguration>(configuration);
        services.AddLogging(x => x.AddConsole());
        services.AddS3ObjectStorage();
        services.AddCosVideoSyncHandleService();
        return services.BuildServiceProvider();
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个针对腾讯云 COS(Cloud Object Storage)视频服务的集成测试类,使用 NUnit 测试框架编写。

主要功能

1. 测试类概述

[TestFixture]
public class CosVideoCloudServiceIntegrationTest
  • 测试腾讯云对象存储上的视频处理功能
  • 包含两个核心测试用例,针对 M3U8 格式的视频文件

2. 测试用例一:视频元数据获取

GetVideoMetaAsync_WhenRealCosM3u8_ReturnsDurationAndSegments()

测试目标: 验证从真实 COS 获取 M3U8 视频的元数据

验证点:

  • ✅ 能成功解析视频
  • ✅ 视频时长 > 0
  • ✅ 分片列表(Points)不为空
  • ✅ 所有分片时长之和 = 总时长(精度 0.001 秒)

前置条件: 需要设置环境变量 DPZ_ENABLE_COS_INTEGRATION_TESTS=1 才会执行

3. 测试用例二:视频截图

VideoScreenshotAsync_WhenRealCosM3u8_UploadsCover()

测试目标: 在视频第 47 秒处截取封面图并上传到 COS

验证点:

  • ✅ 截图操作成功
  • ✅ 返回的封面路径以 /Video/JingGuowang-One/video.webp 结尾
  • ✅ 文件已真实上传到 COS
  • ✅ 文件 ContentType 为 image/jpeg

⚠️ 注意: 此测试会真实写入并覆盖线上封面文件

4. 辅助方法

CreateServiceProvider()

构建依赖注入容器:

- 加载 appsettings.Test.json 配置文件
- 注册日志服务(控制台输出)
- 注册 S3 对象存储服务
- 注册 COS 视频同步处理服务

CreateService()

简化服务获取的快捷方法

技术要点

技术栈说明
NUnit测试框架
AWS S3 SDK兼容 COS 的对象存储 SDK
依赖注入使用 Microsoft.Extensions.DependencyInjection
异步编程所有测试方法使用 async/await
集成测试保护通过环境变量控制是否执行真实 COS 操作

设计特点

  1. 安全防护:使用 Assume.That 确保不会意外执行真实环境测试
  2. 完整验证:不仅验证返回值,还通过 AWS S3 SDK 直接验证 COS 上的实际文件
  3. 多重断言:使用 Assert.Multiple 提高测试效率
  4. 真实环境测试:直接操作生产级别的 COS 服务,确保功能可用性
评论加载中...