Skip to content

Commit b389a39

Browse files
committed
[test] Add tests for file upload and download HTTP functions
1 parent 6dc43fb commit b389a39

1 file changed

Lines changed: 240 additions & 0 deletions

File tree

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
1+
using System.Net;
2+
using System.Text;
3+
using ByteSync.Common.Business.Misc;
4+
using ByteSync.Common.Business.SharedFiles;
5+
using ByteSync.Common.Controls.Json;
6+
using ByteSync.Functions.Http;
7+
using ByteSync.Functions.UnitTests.TestHelpers;
8+
using ByteSync.ServerCommon.Business.Auth;
9+
using ByteSync.ServerCommon.Commands.FileTransfers;
10+
using FluentAssertions;
11+
using MediatR;
12+
using Microsoft.Azure.Functions.Worker;
13+
using Moq;
14+
15+
namespace ByteSync.Functions.UnitTests.Http;
16+
17+
[TestFixture]
18+
public class FileTransferFunctionTests
19+
{
20+
private static FunctionContext BuildFunctionContextWithClient()
21+
{
22+
var mockContext = new Mock<FunctionContext>();
23+
var items = new Dictionary<object, object>();
24+
mockContext.SetupGet(c => c.Items).Returns(items);
25+
26+
var client = new Client("cli", "cliInst", "1.0.0", OSPlatforms.Windows, "127.0.0.1");
27+
items[AuthConstants.FUNCTION_CONTEXT_CLIENT] = client;
28+
29+
return mockContext.Object;
30+
}
31+
32+
private static async Task WriteBodyAsync<T>(FakeHttpRequestData request, T body)
33+
{
34+
var json = JsonHelper.Serialize(body);
35+
var bytes = Encoding.UTF8.GetBytes(json);
36+
request.Body.SetLength(0);
37+
await request.Body.WriteAsync(bytes, 0, bytes.Length);
38+
request.Body.Position = 0;
39+
}
40+
41+
[Test]
42+
public async Task GetUploadFileUrl_ForwardsRequest_AndReturnsOk()
43+
{
44+
var mediatorMock = new Mock<IMediator>();
45+
46+
GetUploadFileUrlRequest? captured = null;
47+
mediatorMock
48+
.Setup(m => m.Send(It.IsAny<GetUploadFileUrlRequest>(), It.IsAny<CancellationToken>()))
49+
.Callback<object, CancellationToken>((r, _) => captured = (GetUploadFileUrlRequest)r)
50+
.ReturnsAsync("http://upload.url");
51+
52+
var function = new FileTransferFunction(mediatorMock.Object);
53+
var context = BuildFunctionContextWithClient();
54+
var request = new FakeHttpRequestData(context);
55+
56+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1", SharedFileType = SharedFileTypes.FullInventory } };
57+
await WriteBodyAsync(request, parameters);
58+
59+
var response = await function.GetUploadFileUrl(request, context, "S1");
60+
61+
response.StatusCode.Should().Be(HttpStatusCode.OK);
62+
captured.Should().NotBeNull();
63+
captured!.SessionId.Should().Be("S1");
64+
}
65+
66+
[Test]
67+
public async Task GetUploadFileStorageLocation_ForwardsRequest_AndReturnsOk()
68+
{
69+
var mediatorMock = new Mock<IMediator>();
70+
71+
GetUploadFileStorageLocationRequest? captured = null;
72+
mediatorMock
73+
.Setup(m => m.Send(It.IsAny<GetUploadFileStorageLocationRequest>(), It.IsAny<CancellationToken>()))
74+
.Callback<object, CancellationToken>((r, _) => captured = (GetUploadFileStorageLocationRequest)r)
75+
.ReturnsAsync(new FileStorageLocation("http://abc", StorageProvider.AzureBlobStorage));
76+
77+
var function = new FileTransferFunction(mediatorMock.Object);
78+
var context = BuildFunctionContextWithClient();
79+
var request = new FakeHttpRequestData(context);
80+
81+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
82+
await WriteBodyAsync(request, parameters);
83+
84+
var response = await function.GetUploadFileStorageLocation(request, context, "S1");
85+
86+
response.StatusCode.Should().Be(HttpStatusCode.OK);
87+
captured.Should().NotBeNull();
88+
captured!.SessionId.Should().Be("S1");
89+
}
90+
91+
[Test]
92+
public async Task GetDownloadFileUrl_ForwardsRequest_AndReturnsOk()
93+
{
94+
var mediatorMock = new Mock<IMediator>();
95+
96+
GetDownloadFileUrlRequest? captured = null;
97+
mediatorMock
98+
.Setup(m => m.Send(It.IsAny<GetDownloadFileUrlRequest>(), It.IsAny<CancellationToken>()))
99+
.Callback<object, CancellationToken>((r, _) => captured = (GetDownloadFileUrlRequest)r)
100+
.ReturnsAsync("http://download.url");
101+
102+
var function = new FileTransferFunction(mediatorMock.Object);
103+
var context = BuildFunctionContextWithClient();
104+
var request = new FakeHttpRequestData(context);
105+
106+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
107+
await WriteBodyAsync(request, parameters);
108+
109+
var response = await function.GetDownloadFileUrl(request, context, "S1");
110+
111+
response.StatusCode.Should().Be(HttpStatusCode.OK);
112+
captured.Should().NotBeNull();
113+
captured!.SessionId.Should().Be("S1");
114+
}
115+
116+
[Test]
117+
public async Task GetDownloadFileStorageLocation_ForwardsRequest_AndReturnsOk()
118+
{
119+
var mediatorMock = new Mock<IMediator>();
120+
121+
GetDownloadFileStorageLocationRequest? captured = null;
122+
mediatorMock
123+
.Setup(m => m.Send(It.IsAny<GetDownloadFileStorageLocationRequest>(), It.IsAny<CancellationToken>()))
124+
.Callback<object, CancellationToken>((r, _) => captured = (GetDownloadFileStorageLocationRequest)r)
125+
.ReturnsAsync(new FileStorageLocation("http://xyz", StorageProvider.AzureBlobStorage));
126+
127+
var function = new FileTransferFunction(mediatorMock.Object);
128+
var context = BuildFunctionContextWithClient();
129+
var request = new FakeHttpRequestData(context);
130+
131+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
132+
await WriteBodyAsync(request, parameters);
133+
134+
var response = await function.GetDownloadFileStorageLocation(request, context, "S1");
135+
136+
response.StatusCode.Should().Be(HttpStatusCode.OK);
137+
captured.Should().NotBeNull();
138+
captured!.SessionId.Should().Be("S1");
139+
}
140+
141+
[Test]
142+
public async Task AssertFilePartIsUploaded_ForwardsRequest_AndReturnsOk()
143+
{
144+
var mediatorMock = new Mock<IMediator>();
145+
146+
AssertFilePartIsUploadedRequest? captured = null;
147+
mediatorMock
148+
.Setup(m => m.Send(It.IsAny<AssertFilePartIsUploadedRequest>(), It.IsAny<CancellationToken>()))
149+
.Callback<object, CancellationToken>((r, _) => captured = (AssertFilePartIsUploadedRequest)r)
150+
.Returns(Task.CompletedTask);
151+
152+
var function = new FileTransferFunction(mediatorMock.Object);
153+
var context = BuildFunctionContextWithClient();
154+
var request = new FakeHttpRequestData(context);
155+
156+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
157+
await WriteBodyAsync(request, parameters);
158+
159+
var response = await function.AssertFilePartIsUploaded(request, context, "S1");
160+
161+
response.StatusCode.Should().Be(HttpStatusCode.OK);
162+
captured.Should().NotBeNull();
163+
captured!.SessionId.Should().Be("S1");
164+
}
165+
166+
[Test]
167+
public async Task AssertFilePartIsDownloaded_ForwardsRequest_AndReturnsOk()
168+
{
169+
var mediatorMock = new Mock<IMediator>();
170+
171+
AssertFilePartIsDownloadedRequest? captured = null;
172+
mediatorMock
173+
.Setup(m => m.Send(It.IsAny<AssertFilePartIsDownloadedRequest>(), It.IsAny<CancellationToken>()))
174+
.Callback<object, CancellationToken>((r, _) => captured = (AssertFilePartIsDownloadedRequest)r)
175+
.Returns(Task.CompletedTask);
176+
177+
var function = new FileTransferFunction(mediatorMock.Object);
178+
var context = BuildFunctionContextWithClient();
179+
var request = new FakeHttpRequestData(context);
180+
181+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
182+
await WriteBodyAsync(request, parameters);
183+
184+
var response = await function.AssertFilePartIsDownloaded(request, context, "S1");
185+
186+
response.StatusCode.Should().Be(HttpStatusCode.OK);
187+
captured.Should().NotBeNull();
188+
captured!.SessionId.Should().Be("S1");
189+
}
190+
191+
[Test]
192+
public async Task AssertUploadIsFinished_ForwardsRequest_AndReturnsOk()
193+
{
194+
var mediatorMock = new Mock<IMediator>();
195+
196+
AssertUploadIsFinishedRequest? captured = null;
197+
mediatorMock
198+
.Setup(m => m.Send(It.IsAny<AssertUploadIsFinishedRequest>(), It.IsAny<CancellationToken>()))
199+
.Callback<object, CancellationToken>((r, _) => captured = (AssertUploadIsFinishedRequest)r)
200+
.Returns(Task.CompletedTask);
201+
202+
var function = new FileTransferFunction(mediatorMock.Object);
203+
var context = BuildFunctionContextWithClient();
204+
var request = new FakeHttpRequestData(context);
205+
206+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
207+
await WriteBodyAsync(request, parameters);
208+
209+
var response = await function.AssertUploadIsFinished(request, context, "S1");
210+
211+
response.StatusCode.Should().Be(HttpStatusCode.OK);
212+
captured.Should().NotBeNull();
213+
captured!.SessionId.Should().Be("S1");
214+
}
215+
216+
[Test]
217+
public async Task AssertDownloadIsFinished_ForwardsRequest_AndReturnsOk()
218+
{
219+
var mediatorMock = new Mock<IMediator>();
220+
221+
AssertDownloadIsFinishedRequest? captured = null;
222+
mediatorMock
223+
.Setup(m => m.Send(It.IsAny<AssertDownloadIsFinishedRequest>(), It.IsAny<CancellationToken>()))
224+
.Callback<object, CancellationToken>((r, _) => captured = (AssertDownloadIsFinishedRequest)r)
225+
.Returns(Task.CompletedTask);
226+
227+
var function = new FileTransferFunction(mediatorMock.Object);
228+
var context = BuildFunctionContextWithClient();
229+
var request = new FakeHttpRequestData(context);
230+
231+
var parameters = new TransferParameters { SharedFileDefinition = new SharedFileDefinition { Id = "F1" } };
232+
await WriteBodyAsync(request, parameters);
233+
234+
var response = await function.AssertDownloadIsFinished(request, context, "S1");
235+
236+
response.StatusCode.Should().Be(HttpStatusCode.OK);
237+
captured.Should().NotBeNull();
238+
captured!.SessionId.Should().Be("S1");
239+
}
240+
}

0 commit comments

Comments
 (0)