using Util.FileStorage.Aliyun.Samples; using Util.Helpers; using Util.Http; using File = Util.Helpers.File; namespace Util.FileStorage.Aliyun.Tests; /// /// 阿里云对象存储服务测试 /// public class AliyunFileStoreTest : IDisposable { #region 测试初始化 /// /// 文件存储服务 /// private readonly AliyunFileStore _fileStore; /// /// 输出操作 /// private readonly ITestOutputHelper _testOutputHelper; /// /// Http客户端 /// private IHttpClient _client; /// /// 测试初始化 /// public AliyunFileStoreTest( IFileStore fileStore, ITestOutputHelper testOutputHelper, IHttpClient client ) { _fileStore = fileStore as AliyunFileStore; _testOutputHelper = testOutputHelper; _client = client; Time.SetTime( new DateTime( 2012, 12, 12, 12, 12, 12, 123 ) ); } #endregion #region 测试清理 /// /// 测试清理 /// public void Dispose() { Time.Reset(); } #endregion #region CreateBucketAsync /// /// 测试创建存储桶 - 修正名称有大写字母和下划线及两侧横线 /// [Fact] public async Task TestCreateBucketAsync_1() { var name = $"-Test{Id.Create()}_1_"; //创建桶 await _fileStore.CreateBucketAsync( name ); //验证 var result = await _fileStore.BucketExistsAsync( name ); Assert.True( result ); //删除桶 await _fileStore.DeleteBucketAsync( name ); //验证桶已不存在 result = await _fileStore.BucketExistsAsync( name ); Assert.False( result ); } #endregion #region FileExistsAsync /// /// 测试文件是否存在 - 默认桶 /// [Fact] public async Task TestFileExistsAsync_1() { //定义文件名 var name = $"{Id.Create()}.png"; //文件未创建不存在 var result = await _fileStore.FileExistsAsync( name ); Assert.False( result ); //读取文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); //创建文件 await _fileStore.SaveFileAsync( stream, name ); //验证 result = await _fileStore.FileExistsAsync( name ); Assert.True( result ); } /// /// 测试文件是否存在 - 指定存储桶 /// [Fact] public async Task TestFileExistsAsync_2() { //定义变量 var name = $"{Id.Create()}.png"; var bucketName = "TestFileExistsAsync_2"; //文件未创建不存在 var result = await _fileStore.FileExistsAsync( new FileExistsArgs( name ) { BucketName = bucketName } ); Assert.False( result ); //读取文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); //创建文件 await _fileStore.SaveFileAsync( new SaveFileArgs( name, stream ) { BucketName = bucketName } ); //验证 result = await _fileStore.FileExistsAsync( new FileExistsArgs( name ) { BucketName = bucketName } ); Assert.True( result ); } #endregion #region GetFileStreamAsync /// /// 测试获取文件流 /// [Fact] public async Task TestGetFileStreamAsync() { //保存文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); var fileInfo = new FileInfo( path ); var result = await _fileStore.SaveFileAsync( fileInfo ); //验证 var exists = await _fileStore.FileExistsAsync( result.FileName ); Assert.True( exists ); //获取文件 await using var stream = await _fileStore.GetFileStreamAsync( result.FileName ); var bytes = await File.ToBytesAsync( stream ); Assert.Equal( result.Size.Size, bytes.Length ); } #endregion #region GetFileBytesAsync /// /// 测试获取文件字节流 /// [Fact] public async Task TestGetFileBytesAsync() { //保存文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); var fileInfo = new FileInfo( path ); var result = await _fileStore.SaveFileAsync( fileInfo ); //获取文件 var bytes = await _fileStore.GetFileBytesAsync( result.FileName ); Assert.Equal( result.Size.Size, bytes.Length ); } #endregion #region SaveFileAsync /// /// 测试保存文件 - 使用默认桶 /// [Fact] public async Task TestSaveFileAsync_1() { var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); var result = await _fileStore.SaveFileAsync( stream, "b.png" ); Assert.Equal( "b.png", result.FilePath ); Assert.Equal( "b.png", result.FileName ); Assert.Equal( "png", result.Extension ); Assert.Equal( "5.23 KB", result.Size.ToString() ); } /// /// 测试保存文件 - 指定存储桶 /// [Fact] public async Task TestSaveFileAsync_2() { var fileName = "a.png"; var bucketName = "TestSaveFileAsync_2"; var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); await _fileStore.SaveFileAsync( new SaveFileArgs( fileName, stream ) { BucketName = bucketName } ); var result = await _fileStore.FileExistsAsync( new FileExistsArgs( fileName ) { BucketName = bucketName } ); Assert.True( result ); } /// /// 测试保存文件 - 指定文件名处理策略 /// [Fact] public async Task TestSaveFileAsync_3() { var fileName = "b.png"; var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); var result = await _fileStore.SaveFileAsync( stream, fileName, UserTimeFileNameProcessor.Policy ); Assert.Equal( $"{TestSession.TestUserId}/2012-12-12-12-12-12-123/b.png", result.FilePath ); Assert.Equal( "b.png", result.FileName ); Assert.Equal( "png", result.Extension ); } /// /// 测试保存文件 - 使用FileInfo /// [Fact] public async Task TestSaveFileAsync_4() { var path = Common.GetPhysicalPath( "~/Resources/a.png" ); var fileInfo = new FileInfo( path ); var result = await _fileStore.SaveFileAsync( fileInfo ); Assert.Equal( "a.png", result.FilePath ); Assert.Equal( "a.png", result.FileName ); Assert.Equal( "png", result.Extension ); } /// /// 测试保存文件 - 使用字节流 /// [Fact] public async Task TestSaveFileAsync_5() { var path = Common.GetPhysicalPath( "~/Resources/a.png" ); var stream = Util.Helpers.File.ReadToBytes( path ); var result = await _fileStore.SaveFileAsync( stream, "b.png" ); Assert.Equal( "b.png", result.FileName ); Assert.Equal( "png", result.Extension ); } #endregion #region SaveFileByUrlAsync /// /// 测试下载远程文件并保存到文件存储 /// [Fact] public async Task TestSaveFileByUrlAsync_1() { var result = await _fileStore.SaveFileByUrlAsync( "https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png", "baidu.png" ); var exists = await _fileStore.FileExistsAsync( result.FilePath ); Assert.True( exists ); } #endregion #region CopyFileAsync /// /// 测试复制文件 /// [Fact] public async Task TestCopyFileAsync() { var sourceName = "e.png"; var destinationName = "a/b/c/f.png"; //保存文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); await _fileStore.SaveFileAsync( stream, sourceName ); //复制文件 await _fileStore.CopyFileAsync( sourceName, destinationName ); //验证 var result = await _fileStore.FileExistsAsync( sourceName ); Assert.True( result ); result = await _fileStore.FileExistsAsync( destinationName ); Assert.True( result ); } #endregion #region MoveFileAsync /// /// 测试移动文件 /// [Fact] public async Task TestMoveFileAsync() { var sourceName = "r.png"; var destinationName = "t/y/z/g.png"; //保存文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); await _fileStore.SaveFileAsync( stream, sourceName ); //移动文件 await _fileStore.MoveFileAsync( sourceName, destinationName ); //验证 var result = await _fileStore.FileExistsAsync( sourceName ); Assert.False( result ); result = await _fileStore.FileExistsAsync( destinationName ); Assert.True( result ); } #endregion #region DeleteFileAsync /// /// 测试删除文件 /// [Fact] public async Task TestDeleteFileAsync() { var name = "b.png"; //保存文件 var path = Common.GetPhysicalPath( "~/Resources/a.png" ); await using var stream = File.ReadToStream( path ); await _fileStore.SaveFileAsync( stream, name ); //验证已存在 var result = await _fileStore.FileExistsAsync( name ); Assert.True( result ); //删除文件 await _fileStore.DeleteFileAsync( name ); //验证已不存在 result = await _fileStore.FileExistsAsync( name ); Assert.False( result ); } #endregion #region GenerateDownloadUrlAsync /// /// 测试生成下载Url /// [Fact] public async Task TestGenerateDownloadUrlAsync() { var args = new GenerateDownloadUrlArgs("a.jpg") { BucketName = "test" }; var url = await _fileStore.GenerateDownloadUrlAsync( args ); _testOutputHelper.WriteLine( url ); Assert.StartsWith( "https://test.oss-cn-beijing.aliyuncs.com/a.jpg", url ); } #endregion #region GenerateUploadUrlAsync /// /// 测试生成上传Url /// [Fact] public async Task TestGenerateUploadUrlAsync() { //生成上传Url var fileName = Id.Create(); var path = Common.GetPhysicalPath( "~/Resources/a.png" ); var upload = await _fileStore.GenerateUploadUrlAsync( new GenerateUploadUrlArgs( fileName ) { BucketName = "util-test" } ); _testOutputHelper.WriteLine( Util.Helpers.Json.ToJson( upload ) ); //发送请求 await _client.Post( upload.Url ).FileContent( path ).Content( upload.Data ) .OnFail( ( m, o ) => { _testOutputHelper.WriteLine( Util.Helpers.Json.ToJson( o ) ); } ) .GetResultAsync(); //验证 var exists = await _fileStore.FileExistsAsync( new FileExistsArgs( fileName ) {BucketName = "util-test" } ); Assert.True( exists ); } #endregion }