Skip to content

Commit 8bc8c8e

Browse files
committed
[test] Add tests for inventory management HTTP endpoints
1 parent b389a39 commit 8bc8c8e

File tree

1 file changed

+207
-0
lines changed

1 file changed

+207
-0
lines changed
Lines changed: 207 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,207 @@
1+
using System.Net;
2+
using System.Text;
3+
using ByteSync.Common.Business.Inventories;
4+
using ByteSync.Common.Business.Misc;
5+
using ByteSync.Common.Business.Sessions;
6+
using ByteSync.Common.Controls.Json;
7+
using ByteSync.Functions.Http;
8+
using ByteSync.Functions.UnitTests.TestHelpers;
9+
using ByteSync.ServerCommon.Business.Auth;
10+
using ByteSync.ServerCommon.Commands.Inventories;
11+
using FluentAssertions;
12+
using MediatR;
13+
using Microsoft.Azure.Functions.Worker;
14+
using Moq;
15+
16+
namespace ByteSync.Functions.UnitTests.Http;
17+
18+
[TestFixture]
19+
public class InventoryFunctionTests
20+
{
21+
private static FunctionContext BuildFunctionContextWithClient()
22+
{
23+
var mockContext = new Mock<FunctionContext>();
24+
var items = new Dictionary<object, object>();
25+
mockContext.SetupGet(c => c.Items).Returns(items);
26+
27+
var client = new Client("cli", "cliInst", "1.0.0", OSPlatforms.Windows, "127.0.0.1");
28+
items[AuthConstants.FUNCTION_CONTEXT_CLIENT] = client;
29+
30+
return mockContext.Object;
31+
}
32+
33+
private static async Task WriteBodyAsync<T>(FakeHttpRequestData request, T body)
34+
{
35+
var json = JsonHelper.Serialize(body);
36+
var bytes = Encoding.UTF8.GetBytes(json);
37+
request.Body.SetLength(0);
38+
await request.Body.WriteAsync(bytes, 0, bytes.Length);
39+
request.Body.Position = 0;
40+
}
41+
42+
[Test]
43+
public async Task Start_ForwardsRequest_AndReturnsOk()
44+
{
45+
var mediatorMock = new Mock<IMediator>();
46+
47+
StartInventoryRequest? captured = null;
48+
mediatorMock
49+
.Setup(m => m.Send(It.IsAny<StartInventoryRequest>(), It.IsAny<CancellationToken>()))
50+
.Callback<object, CancellationToken>((r, _) => captured = (StartInventoryRequest)r)
51+
.ReturnsAsync(StartInventoryResult.BuildOK());
52+
53+
var function = new InventoryFunction(mediatorMock.Object);
54+
var context = BuildFunctionContextWithClient();
55+
var request = new FakeHttpRequestData(context);
56+
57+
var response = await function.Start(request, context, "S1");
58+
59+
response.StatusCode.Should().Be(HttpStatusCode.OK);
60+
captured.Should().NotBeNull();
61+
captured!.SessionId.Should().Be("S1");
62+
}
63+
64+
[Test]
65+
public async Task AddDataSource_ForwardsRequest_AndReturnsOk()
66+
{
67+
var mediatorMock = new Mock<IMediator>();
68+
69+
AddDataSourceRequest? captured = null;
70+
mediatorMock
71+
.Setup(m => m.Send(It.IsAny<AddDataSourceRequest>(), It.IsAny<CancellationToken>()))
72+
.Callback<object, CancellationToken>((r, _) => captured = (AddDataSourceRequest)r)
73+
.ReturnsAsync(true);
74+
75+
var function = new InventoryFunction(mediatorMock.Object);
76+
var context = BuildFunctionContextWithClient();
77+
var request = new FakeHttpRequestData(context);
78+
79+
var dataSource = new EncryptedDataSource { Id = "DS1", Data = [1] };
80+
await WriteBodyAsync(request, dataSource);
81+
82+
var response = await function.AddDataSource(request, context, "S1", "CI1", "DN1");
83+
84+
response.StatusCode.Should().Be(HttpStatusCode.OK);
85+
captured.Should().NotBeNull();
86+
captured!.DataNodeId.Should().Be("DN1");
87+
}
88+
89+
[Test]
90+
public async Task RemoveDataSource_ForwardsRequest_AndReturnsOk()
91+
{
92+
var mediatorMock = new Mock<IMediator>();
93+
94+
RemoveDataSourceRequest? captured = null;
95+
mediatorMock
96+
.Setup(m => m.Send(It.IsAny<RemoveDataSourceRequest>(), It.IsAny<CancellationToken>()))
97+
.Callback<object, CancellationToken>((r, _) => captured = (RemoveDataSourceRequest)r)
98+
.ReturnsAsync(true);
99+
100+
var function = new InventoryFunction(mediatorMock.Object);
101+
var context = BuildFunctionContextWithClient();
102+
var request = new FakeHttpRequestData(context);
103+
104+
var dataSource = new EncryptedDataSource { Id = "DS1", Data = [1] };
105+
await WriteBodyAsync(request, dataSource);
106+
107+
var response = await function.RemoveDataSource(request, context, "S1", "CI1", "DN1");
108+
109+
response.StatusCode.Should().Be(HttpStatusCode.OK);
110+
captured.Should().NotBeNull();
111+
captured!.DataNodeId.Should().Be("DN1");
112+
}
113+
114+
[Test]
115+
public async Task GetDataSources_ForwardsRequest_AndReturnsOk()
116+
{
117+
var mediatorMock = new Mock<IMediator>();
118+
119+
GetDataSourcesRequest? captured = null;
120+
mediatorMock
121+
.Setup(m => m.Send(It.IsAny<GetDataSourcesRequest>(), It.IsAny<CancellationToken>()))
122+
.Callback<object, CancellationToken>((r, _) => captured = (GetDataSourcesRequest)r)
123+
.ReturnsAsync([new EncryptedDataSource { Id = "DS1" }]);
124+
125+
var function = new InventoryFunction(mediatorMock.Object);
126+
var context = new Mock<FunctionContext>().Object;
127+
var request = new FakeHttpRequestData(context);
128+
129+
var response = await function.GetDataSources(request, context, "S1", "CI1", "DN1");
130+
131+
response.StatusCode.Should().Be(HttpStatusCode.OK);
132+
captured.Should().NotBeNull();
133+
captured!.DataNodeId.Should().Be("DN1");
134+
}
135+
136+
[Test]
137+
public async Task AddDataNode_ForwardsRequest_AndReturnsOk()
138+
{
139+
var mediatorMock = new Mock<IMediator>();
140+
141+
AddDataNodeRequest? captured = null;
142+
mediatorMock
143+
.Setup(m => m.Send(It.IsAny<AddDataNodeRequest>(), It.IsAny<CancellationToken>()))
144+
.Callback<object, CancellationToken>((r, _) => captured = (AddDataNodeRequest)r)
145+
.ReturnsAsync(true);
146+
147+
var function = new InventoryFunction(mediatorMock.Object);
148+
var context = BuildFunctionContextWithClient();
149+
var request = new FakeHttpRequestData(context);
150+
151+
var dataNode = new EncryptedDataNode { Id = "DN1", Data = [1] };
152+
await WriteBodyAsync(request, dataNode);
153+
154+
var response = await function.AddDataNode(request, context, "S1", "CI1");
155+
156+
response.StatusCode.Should().Be(HttpStatusCode.OK);
157+
captured.Should().NotBeNull();
158+
captured!.ClientInstanceId.Should().Be("CI1");
159+
}
160+
161+
[Test]
162+
public async Task RemoveDataNode_ForwardsRequest_AndReturnsOk()
163+
{
164+
var mediatorMock = new Mock<IMediator>();
165+
166+
RemoveDataNodeRequest? captured = null;
167+
mediatorMock
168+
.Setup(m => m.Send(It.IsAny<RemoveDataNodeRequest>(), It.IsAny<CancellationToken>()))
169+
.Callback<object, CancellationToken>((r, _) => captured = (RemoveDataNodeRequest)r)
170+
.ReturnsAsync(true);
171+
172+
var function = new InventoryFunction(mediatorMock.Object);
173+
var context = BuildFunctionContextWithClient();
174+
var request = new FakeHttpRequestData(context);
175+
176+
var dataNode = new EncryptedDataNode { Id = "DN1", Data = [1] };
177+
await WriteBodyAsync(request, dataNode);
178+
179+
var response = await function.RemoveDataNode(request, context, "S1", "CI1");
180+
181+
response.StatusCode.Should().Be(HttpStatusCode.OK);
182+
captured.Should().NotBeNull();
183+
captured!.ClientInstanceId.Should().Be("CI1");
184+
}
185+
186+
[Test]
187+
public async Task GetDataNodes_ForwardsRequest_AndReturnsOk()
188+
{
189+
var mediatorMock = new Mock<IMediator>();
190+
191+
GetDataNodesRequest? captured = null;
192+
mediatorMock
193+
.Setup(m => m.Send(It.IsAny<GetDataNodesRequest>(), It.IsAny<CancellationToken>()))
194+
.Callback<object, CancellationToken>((r, _) => captured = (GetDataNodesRequest)r)
195+
.ReturnsAsync([new EncryptedDataNode { Id = "DN1" }]);
196+
197+
var function = new InventoryFunction(mediatorMock.Object);
198+
var context = new Mock<FunctionContext>().Object;
199+
var request = new FakeHttpRequestData(context);
200+
201+
var response = await function.GetDataNodes(request, context, "S1", "CI1");
202+
203+
response.StatusCode.Should().Be(HttpStatusCode.OK);
204+
captured.Should().NotBeNull();
205+
captured!.ClientInstanceId.Should().Be("CI1");
206+
}
207+
}

0 commit comments

Comments
 (0)