using Infrastructure;
using Microsoft.Extensions.Configuration;
using Xunit;
using ZR.Common;
using ZR.Model.Business.Dto;
namespace ZR.Tests
{
///
/// CosService 单元测试
///
public class CosServiceTests : IClassFixture
{
public CosServiceTests(TestFixture fixture)
{
// 确保配置已初始化
}
///
/// 测试URL生成逻辑 - 验证返回的图片数量与请求数量一致
///
[Fact]
public void GetUploadUrls_ReturnsCorrectImageCount()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List { "张三", "李四" },
FileExt = ".jpg",
ImageCount = 3
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
Assert.NotNull(response.Images);
Assert.Equal(3, response.Images.Count);
}
///
/// 测试URL生成逻辑 - 验证每张图片都有完整的URL结构
///
[Fact]
public void GetUploadUrls_ReturnsCompleteUrlStructure()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List { "张三", "李四" },
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);
}
///
/// 测试目录路径格式 - 验证路径包含正确的日期格式
///
[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 { "张三" },
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);
}
///
/// 测试目录路径格式 - 验证路径包含正确的分类目录
///
[Fact]
public void GetUploadUrls_PathContainsCorrectCategories()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List { "张三" },
FileExt = ".jpg",
ImageCount = 1
};
// Act
var response = CosService.GetUploadUrls(request);
// Assert
Assert.NotNull(response);
var image = response.Images[0];
// 验证AccessUrl包含当日照片目录
Assert.Contains("/当日照片/", image.AccessUrl);
}
///
/// 测试文件名格式 - 验证文件名包含时间戳和扩展名
///
[Fact]
public void GetUploadUrls_FileNameHasCorrectFormat()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List { "张三" },
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);
}
///
/// 测试空Workers列表
///
[Fact]
public void GetUploadUrls_WithEmptyWorkers_ReturnsEmptyWorkersUrls()
{
// Arrange
var request = new CosUploadUrlsRequest
{
RecordTime = DateTime.Now,
DeptName = "测试部门",
Content = "测试内容",
Workers = new List(),
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);
}
///
/// 测试COS URL验证 - 有效URL
///
[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);
}
///
/// 测试COS URL验证 - 无效URL
///
[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);
}
///
/// 测试COS URL验证 - 空URL
///
[Fact]
public void IsValidCosUrl_WithEmptyUrl_ReturnsFalse()
{
// Act
var result = CosService.IsValidCosUrl("");
// Assert
Assert.False(result);
}
///
/// 测试获取临时密钥
///
[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);
}
}
///
/// 测试夹具 - 初始化配置
///
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()
{
// 清理资源
}
}
}