WorkCamera/server/Zr.Admin.NET/ZR.Tests/CosServiceTests.cs
2026-01-05 21:20:55 +08:00

283 lines
8.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Infrastructure;
using Microsoft.Extensions.Configuration;
using Xunit;
using ZR.Common;
using ZR.Model.Business.Dto;
namespace ZR.Tests
{
/// <summary>
/// CosService 单元测试
/// </summary>
public class CosServiceTests : IClassFixture<TestFixture>
{
public CosServiceTests(TestFixture fixture)
{
// 确保配置已初始化
}
/// <summary>
/// 测试URL生成逻辑 - 验证返回的图片数量与请求数量一致
/// </summary>
[Fact]
public void GetUploadUrls_ReturnsCorrectImageCount()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List<string> { "张三", "李四" },
FileExt = ".jpg",
ImageCount = 3
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
Assert.NotNull(response.Images);
Assert.Equal(3, response.Images.Count);
}
/// <summary>
/// 测试URL生成逻辑 - 验证每张图片都有完整的URL结构
/// </summary>
[Fact]
public void GetUploadUrls_ReturnsCompleteUrlStructure()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List<string> { "张三", "李四" },
FileExt = ".jpg",
ImageCount = 1
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
Assert.Single(response.Images);
var image = response.Images[0];
Assert.NotNull(image.ImageId);
Assert.NotNull(image.FileName);
Assert.NotNull(image.AccessUrl);
Assert.NotNull(image.UploadUrls);
Assert.NotNull(image.UploadUrls.Daily);
Assert.NotNull(image.UploadUrls.Content);
Assert.NotNull(image.UploadUrls.Dept);
Assert.NotNull(image.UploadUrls.Workers);
Assert.Equal(2, image.UploadUrls.Workers.Count);
}
/// <summary>
/// 测试目录路径格式 - 验证路径包含正确的日期格式
/// </summary>
[Fact]
public void GetUploadUrls_PathContainsCorrectDateFormat()
{
// Arrange
var recordTime = new DateTime(2025, 1, 5, 10, 30, 0);
var request = new CosUploadUrlsRequest
{
RecordTime = recordTime,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List<string> { "张三" },
FileExt = ".jpg",
ImageCount = 1
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
var image = response.Images[0];
// 验证AccessUrl包含正确的日期路径格式
Assert.Contains("/workfiles/202501/20250105/", image.AccessUrl);
}
/// <summary>
/// 测试目录路径格式 - 验证路径包含正确的分类目录
/// </summary>
[Fact]
public void GetUploadUrls_PathContainsCorrectCategories()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List<string> { "张三" },
FileExt = ".jpg",
ImageCount = 1
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
var image = response.Images[0];
// 验证AccessUrl包含当日照片目录
Assert.Contains("/当日照片/", image.AccessUrl);
}
/// <summary>
/// 测试文件名格式 - 验证文件名包含时间戳和扩展名
/// </summary>
[Fact]
public void GetUploadUrls_FileNameHasCorrectFormat()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List<string> { "张三" },
FileExt = ".png",
ImageCount = 1
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
var image = response.Images[0];
// 验证文件名以指定扩展名结尾
Assert.EndsWith(".png", image.FileName);
// 验证文件名包含下划线时间戳_随机数格式
Assert.Contains("_", image.FileName);
}
/// <summary>
/// 测试空Workers列表
/// </summary>
[Fact]
public void GetUploadUrls_WithEmptyWorkers_ReturnsEmptyWorkersUrls()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List<string>(),
FileExt = ".jpg",
ImageCount = 1
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
var image = response.Images[0];
Assert.NotNull(image.UploadUrls.Workers);
Assert.Empty(image.UploadUrls.Workers);
}
/// <summary>
/// 测试COS URL验证 - 有效URL
/// </summary>
[Fact]
public void IsValidCosUrl_WithValidUrl_ReturnsTrue()
{
// Arrange
var validUrl = "https://miaoyu-1308826010.cos.ap-shanghai.myqcloud.com/workfiles/202501/20250105/当日照片/test.jpg";
// Act
var result = CosService.IsValidCosUrl(validUrl);
// Assert
Assert.True(result);
}
/// <summary>
/// 测试COS URL验证 - 无效URL
/// </summary>
[Fact]
public void IsValidCosUrl_WithInvalidUrl_ReturnsFalse()
{
// Arrange
var invalidUrl = "https://other-domain.com/workfiles/test.jpg";
// Act
var result = CosService.IsValidCosUrl(invalidUrl);
// Assert
Assert.False(result);
}
/// <summary>
/// 测试COS URL验证 - 空URL
/// </summary>
[Fact]
public void IsValidCosUrl_WithEmptyUrl_ReturnsFalse()
{
// Act
var result = CosService.IsValidCosUrl("");
// Assert
Assert.False(result);
}
/// <summary>
/// 测试获取临时密钥
/// </summary>
[Fact]
public void GetTempCredentials_ReturnsValidCredentials()
{
// Act
var credentials = CosService.GetTempCredentials();
// Assert
Assert.NotNull(credentials);
Assert.NotNull(credentials.SecretId);
Assert.NotNull(credentials.SecretKey);
Assert.NotNull(credentials.Region);
Assert.NotNull(credentials.Bucket);
Assert.NotNull(credentials.DomainUrl);
Assert.NotNull(credentials.Prefixes);
Assert.True(credentials.DurationSecond > 0);
}
}
/// <summary>
/// 测试夹具 - 初始化配置
/// </summary>
public class TestFixture : IDisposable
{
public TestFixture()
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.test.json", optional: false, reloadOnChange: true)
.Build();
// 初始化AppSettings
new AppSettings(configuration);
}
public void Dispose()
{
// 清理资源
}
}
}