/
AzureBlobStreamTests.cs
175 lines (147 loc) · 6.46 KB
/
AzureBlobStreamTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using FluentAssertions;
using ManagedCode.Storage.Azure;
using ManagedCode.Storage.Core.Models;
using ManagedCode.Storage.Tests.Common;
using Microsoft.Extensions.DependencyInjection;
using Testcontainers.Azurite;
using Xunit;
namespace ManagedCode.Storage.Tests.Storages.Azure;
public class AzureBlobStreamTests : StreamTests<AzuriteContainer>
{
protected override AzuriteContainer Build()
{
return new AzuriteBuilder()
.WithImage("mcr.microsoft.com/azure-storage/azurite:3.26.0")
.Build();
}
protected override ServiceProvider ConfigureServices()
{
return AzureConfigurator.ConfigureServices(Container.GetConnectionString());
}
[Fact]
public async Task ReadStreamWithStreamReader_WhenFileExists_ReturnData()
{
// Arrange
var directory = "test-directory";
var fileSizeInBytes = 10;
await using var localFile = LocalFile.FromRandomNameWithExtension(".txt");
FileHelper.GenerateLocalFileWithData(localFile, fileSizeInBytes);
var storage = (IAzureStorage) Storage;
UploadOptions options = new() { FileName = localFile.Name, Directory = directory };
await using var localFileStream = localFile.FileInfo.OpenRead();
var result = await storage.UploadAsync(localFileStream, options);
await using var blobStream = storage.GetBlobStream(result.Value.FullName);
// Act
using var streamReader = new StreamReader(blobStream);
var content = await streamReader.ReadToEndAsync();
// Assert
await using var fileStream = localFile.FileInfo.OpenRead();
using var fileReader = new StreamReader(fileStream);
var fileContent = await fileReader.ReadToEndAsync();
content.Should().NotBeNullOrEmpty();
fileContent.Should().NotBeNullOrEmpty();
content.Should().Be(fileContent);
}
[Fact]
public async Task ReadStream_WhenFileExists_ReturnData()
{
// Arrange
var directory = "test-directory";
var fileSizeInBytes = 10;
await using var localFile = LocalFile.FromRandomNameWithExtension(".txt");
FileHelper.GenerateLocalFileWithData(localFile, fileSizeInBytes);
var storage = (IAzureStorage) Storage;
UploadOptions options = new() { FileName = localFile.Name, Directory = directory };
await using var fileStream = localFile.FileInfo.OpenRead();
var result = await storage.UploadAsync(fileStream, options);
await using var blobStream = storage.GetBlobStream(result.Value.FullName);
var chunkSize = (int) blobStream.Length / 2;
var chunk1 = new byte[chunkSize];
var chunk2 = new byte[chunkSize];
// Act
var bytesReadForChunk1 = await blobStream.ReadAsync(chunk1, 0, chunkSize);
var bytesReadForChunk2 = await blobStream.ReadAsync(chunk2, 0, chunkSize);
// Assert
bytesReadForChunk1.Should().Be(chunkSize);
bytesReadForChunk2.Should().Be(chunkSize);
chunk1.Should().NotBeNullOrEmpty().And.HaveCount(chunkSize);
chunk2.Should().NotBeNullOrEmpty().And.HaveCount(chunkSize);
}
[Fact]
public async Task ReadStream_WhenFileDoesNotExists_ReturnNoData()
{
// Arrange
var directory = "test-directory";
var storage = (IAzureStorage) Storage;
await storage.CreateContainerAsync();
var fullFileName = $"{directory}/{Guid.NewGuid()}.txt";
await using var blobStream = storage.GetBlobStream(fullFileName);
var chunk = new byte[4];
// Act
var bytesRead = await blobStream.ReadAsync(chunk, 0, 4);
// Assert
bytesRead.Should().Be(0);
chunk.Should().NotBeNullOrEmpty();
chunk.Should().AllBeEquivalentTo(0);
}
[Fact]
public async Task WriteStreamWithStreamWriter_SaveData()
{
// Arrange
var directory = "test-directory";
await using var localFile = LocalFile.FromRandomNameWithExtension(".txt");
var fileSizeInBytes = 10;
FileHelper.GenerateLocalFileWithData(localFile, fileSizeInBytes);
var fullFileName = $"{directory}/{localFile.FileInfo.FullName}";
var storage = (IAzureStorage) Storage;
await storage.CreateContainerAsync();
// Act
await using (var blobStream = storage.GetBlobStream(fullFileName))
{
await using (var localFileStream = localFile.FileStream)
{
await localFileStream.CopyToAsync(blobStream);
}
}
// Assert
var fileResult = await storage.DownloadAsync(fullFileName);
fileResult.IsSuccess.Should().BeTrue();
fileResult.Value.Should().NotBeNull();
await using var fileStream = fileResult.Value.FileStream;
using var streamReader = new StreamReader(fileStream);
var fileContent = await streamReader.ReadLineAsync();
fileContent.Should().NotBeNullOrEmpty();
}
[Fact]
public async Task Seek_WhenFileExists_ReturnData()
{
// Arrange
var directory = "test-directory";
var fileSizeInBytes = 10;
await using var localFile = LocalFile.FromRandomNameWithExtension(".txt");
FileHelper.GenerateLocalFileWithData(localFile, fileSizeInBytes);
var storage = (IAzureStorage) Storage;
UploadOptions options = new() { FileName = localFile.Name, Directory = directory };
await using var localFileStream = localFile.FileInfo.OpenRead();
var result = await storage.UploadAsync(localFileStream, options);
await using var blobStream = storage.GetBlobStream(result.Value.FullName);
// Act
var seekInPosition = fileSizeInBytes / 2;
blobStream.Seek(seekInPosition, SeekOrigin.Current);
var buffer = new byte[seekInPosition];
var bytesRead = await blobStream.ReadAsync(buffer);
// Assert
bytesRead.Should().Be(seekInPosition);
await using var fileStream = localFile.FileInfo.OpenRead();
using var fileReader = new StreamReader(fileStream);
var fileContent = await fileReader.ReadToEndAsync();
var content = Encoding.UTF8.GetString(buffer);
content.Should().NotBeNullOrEmpty();
var trimmedFileContent = fileContent.Remove(0, seekInPosition);
content.Should().Be(trimmedFileContent);
}
}