Skip to content

Commit 2219d50

Browse files
authored
Used ai to create tests for the main sdk services (block-core#629)
1 parent 9fee20d commit 2219d50

File tree

6 files changed

+2210
-0
lines changed

6 files changed

+2210
-0
lines changed
Lines changed: 245 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,245 @@
1+
using Angor.Data.Documents.Interfaces;
2+
using Angor.Sdk.Common;
3+
using Angor.Sdk.Funding.Founder.Operations;
4+
using Angor.Sdk.Funding.Projects.Domain;
5+
using Angor.Sdk.Funding.Services;
6+
using Angor.Sdk.Funding.Shared;
7+
using Angor.Sdk.Tests.Shared;
8+
using Angor.Shared.Models;
9+
using Angor.Shared.Services;
10+
using CSharpFunctionalExtensions;
11+
using FluentAssertions;
12+
using Microsoft.Extensions.Logging.Abstractions;
13+
using Moq;
14+
using Xunit;
15+
16+
namespace Angor.Sdk.Tests.Funding.Founder;
17+
18+
/// <summary>
19+
/// Unit tests for Founder App Service handlers.
20+
/// Tests the GetProjectInvestments, CreateProjectKeys, and GetReleasableTransactions handlers.
21+
/// </summary>
22+
public class FounderAppServiceTests : IClassFixture<TestNetworkFixture>
23+
{
24+
private readonly TestNetworkFixture _fixture;
25+
private readonly Mock<IProjectService> _mockProjectService;
26+
private readonly Mock<IAngorIndexerService> _mockAngorIndexerService;
27+
private readonly Mock<IInvestmentHandshakeService> _mockInvestmentHandshakeService;
28+
private readonly Mock<IGenericDocumentCollection<DerivedProjectKeys>> _mockDerivedProjectKeysCollection;
29+
30+
public FounderAppServiceTests(TestNetworkFixture fixture)
31+
{
32+
_fixture = fixture;
33+
_mockProjectService = new Mock<IProjectService>();
34+
_mockAngorIndexerService = new Mock<IAngorIndexerService>();
35+
_mockInvestmentHandshakeService = new Mock<IInvestmentHandshakeService>();
36+
_mockDerivedProjectKeysCollection = new Mock<IGenericDocumentCollection<DerivedProjectKeys>>();
37+
}
38+
39+
#region GetProjectInvestmentsHandler Tests
40+
41+
[Fact]
42+
public async Task GetProjectInvestmentsHandler_WhenProjectNotFound_ReturnsFailure()
43+
{
44+
// Arrange
45+
var walletId = new WalletId(Guid.NewGuid().ToString());
46+
var projectId = new ProjectId("test-project");
47+
48+
_mockProjectService
49+
.Setup(x => x.GetAsync(projectId))
50+
.ReturnsAsync(Result.Failure<Project>("Project not found"));
51+
52+
var handler = new GetProjectInvestments.GetProjectInvestmentsHandler(
53+
_mockAngorIndexerService.Object,
54+
_mockProjectService.Object,
55+
_fixture.NetworkConfiguration,
56+
_mockInvestmentHandshakeService.Object);
57+
58+
var request = new GetProjectInvestments.GetProjectInvestmentsRequest(walletId, projectId);
59+
60+
// Act
61+
var result = await handler.Handle(request, CancellationToken.None);
62+
63+
// Assert
64+
result.IsFailure.Should().BeTrue();
65+
result.Error.Should().Contain("Project not found");
66+
}
67+
68+
[Fact]
69+
public async Task GetProjectInvestmentsHandler_WhenHandshakeSyncFails_ReturnsFailure()
70+
{
71+
// Arrange
72+
var walletId = new WalletId(Guid.NewGuid().ToString());
73+
var project = TestDataBuilder.CreateProject().Build();
74+
75+
_mockProjectService
76+
.Setup(x => x.GetAsync(project.Id))
77+
.ReturnsAsync(Result.Success(project));
78+
79+
_mockInvestmentHandshakeService
80+
.Setup(x => x.SyncHandshakesFromNostrAsync(walletId, project.Id, project.NostrPubKey))
81+
.ReturnsAsync(Result.Failure<IEnumerable<InvestmentHandshake>>("Nostr sync failed"));
82+
83+
var handler = new GetProjectInvestments.GetProjectInvestmentsHandler(
84+
_mockAngorIndexerService.Object,
85+
_mockProjectService.Object,
86+
_fixture.NetworkConfiguration,
87+
_mockInvestmentHandshakeService.Object);
88+
89+
var request = new GetProjectInvestments.GetProjectInvestmentsRequest(walletId, project.Id);
90+
91+
// Act
92+
var result = await handler.Handle(request, CancellationToken.None);
93+
94+
// Assert
95+
result.IsFailure.Should().BeTrue();
96+
result.Error.Should().Contain("Nostr sync failed");
97+
}
98+
99+
[Fact]
100+
public async Task GetProjectInvestmentsHandler_WhenNoHandshakes_ReturnsEmptyList()
101+
{
102+
// Arrange
103+
var walletId = new WalletId(Guid.NewGuid().ToString());
104+
var project = TestDataBuilder.CreateProject().Build();
105+
106+
_mockProjectService
107+
.Setup(x => x.GetAsync(project.Id))
108+
.ReturnsAsync(Result.Success(project));
109+
110+
_mockInvestmentHandshakeService
111+
.Setup(x => x.SyncHandshakesFromNostrAsync(walletId, project.Id, project.NostrPubKey))
112+
.ReturnsAsync(Result.Success<IEnumerable<InvestmentHandshake>>(Enumerable.Empty<InvestmentHandshake>()));
113+
114+
_mockInvestmentHandshakeService
115+
.Setup(x => x.GetHandshakesAsync(walletId, project.Id))
116+
.ReturnsAsync(Result.Success<IEnumerable<InvestmentHandshake>>(Enumerable.Empty<InvestmentHandshake>()));
117+
118+
_mockAngorIndexerService
119+
.Setup(x => x.GetInvestmentsAsync(project.Id.Value))
120+
.ReturnsAsync(new List<ProjectInvestment>());
121+
122+
var handler = new GetProjectInvestments.GetProjectInvestmentsHandler(
123+
_mockAngorIndexerService.Object,
124+
_mockProjectService.Object,
125+
_fixture.NetworkConfiguration,
126+
_mockInvestmentHandshakeService.Object);
127+
128+
var request = new GetProjectInvestments.GetProjectInvestmentsRequest(walletId, project.Id);
129+
130+
// Act
131+
var result = await handler.Handle(request, CancellationToken.None);
132+
133+
// Assert
134+
result.IsSuccess.Should().BeTrue();
135+
result.Value.Investments.Should().BeEmpty();
136+
}
137+
138+
[Fact]
139+
public async Task GetProjectInvestmentsHandler_CallsProjectServiceWithCorrectId()
140+
{
141+
// Arrange
142+
var walletId = new WalletId(Guid.NewGuid().ToString());
143+
var projectId = new ProjectId("specific-project-id");
144+
145+
_mockProjectService
146+
.Setup(x => x.GetAsync(projectId))
147+
.ReturnsAsync(Result.Failure<Project>("Not found"));
148+
149+
var handler = new GetProjectInvestments.GetProjectInvestmentsHandler(
150+
_mockAngorIndexerService.Object,
151+
_mockProjectService.Object,
152+
_fixture.NetworkConfiguration,
153+
_mockInvestmentHandshakeService.Object);
154+
155+
var request = new GetProjectInvestments.GetProjectInvestmentsRequest(walletId, projectId);
156+
157+
// Act
158+
await handler.Handle(request, CancellationToken.None);
159+
160+
// Assert
161+
_mockProjectService.Verify(x => x.GetAsync(projectId), Times.Once);
162+
}
163+
164+
[Fact]
165+
public async Task GetProjectInvestmentsHandler_SyncsHandshakesFromNostr()
166+
{
167+
// Arrange
168+
var walletId = new WalletId(Guid.NewGuid().ToString());
169+
var project = TestDataBuilder.CreateProject().Build();
170+
171+
_mockProjectService
172+
.Setup(x => x.GetAsync(project.Id))
173+
.ReturnsAsync(Result.Success(project));
174+
175+
_mockInvestmentHandshakeService
176+
.Setup(x => x.SyncHandshakesFromNostrAsync(walletId, project.Id, project.NostrPubKey))
177+
.ReturnsAsync(Result.Success<IEnumerable<InvestmentHandshake>>(Enumerable.Empty<InvestmentHandshake>()));
178+
179+
_mockInvestmentHandshakeService
180+
.Setup(x => x.GetHandshakesAsync(walletId, project.Id))
181+
.ReturnsAsync(Result.Success<IEnumerable<InvestmentHandshake>>(Enumerable.Empty<InvestmentHandshake>()));
182+
183+
_mockAngorIndexerService
184+
.Setup(x => x.GetInvestmentsAsync(project.Id.Value))
185+
.ReturnsAsync(new List<ProjectInvestment>());
186+
187+
var handler = new GetProjectInvestments.GetProjectInvestmentsHandler(
188+
_mockAngorIndexerService.Object,
189+
_mockProjectService.Object,
190+
_fixture.NetworkConfiguration,
191+
_mockInvestmentHandshakeService.Object);
192+
193+
var request = new GetProjectInvestments.GetProjectInvestmentsRequest(walletId, project.Id);
194+
195+
// Act
196+
await handler.Handle(request, CancellationToken.None);
197+
198+
// Assert
199+
_mockInvestmentHandshakeService.Verify(
200+
x => x.SyncHandshakesFromNostrAsync(walletId, project.Id, project.NostrPubKey),
201+
Times.Once);
202+
}
203+
204+
[Fact]
205+
public async Task GetProjectInvestmentsHandler_LooksUpCurrentInvestmentsFromIndexer()
206+
{
207+
// Arrange
208+
var walletId = new WalletId(Guid.NewGuid().ToString());
209+
var project = TestDataBuilder.CreateProject().Build();
210+
211+
_mockProjectService
212+
.Setup(x => x.GetAsync(project.Id))
213+
.ReturnsAsync(Result.Success(project));
214+
215+
_mockInvestmentHandshakeService
216+
.Setup(x => x.SyncHandshakesFromNostrAsync(walletId, project.Id, project.NostrPubKey))
217+
.ReturnsAsync(Result.Success<IEnumerable<InvestmentHandshake>>(Enumerable.Empty<InvestmentHandshake>()));
218+
219+
_mockInvestmentHandshakeService
220+
.Setup(x => x.GetHandshakesAsync(walletId, project.Id))
221+
.ReturnsAsync(Result.Success<IEnumerable<InvestmentHandshake>>(Enumerable.Empty<InvestmentHandshake>()));
222+
223+
_mockAngorIndexerService
224+
.Setup(x => x.GetInvestmentsAsync(project.Id.Value))
225+
.ReturnsAsync(new List<ProjectInvestment>());
226+
227+
var handler = new GetProjectInvestments.GetProjectInvestmentsHandler(
228+
_mockAngorIndexerService.Object,
229+
_mockProjectService.Object,
230+
_fixture.NetworkConfiguration,
231+
_mockInvestmentHandshakeService.Object);
232+
233+
var request = new GetProjectInvestments.GetProjectInvestmentsRequest(walletId, project.Id);
234+
235+
// Act
236+
await handler.Handle(request, CancellationToken.None);
237+
238+
// Assert
239+
_mockAngorIndexerService.Verify(
240+
x => x.GetInvestmentsAsync(project.Id.Value),
241+
Times.Once);
242+
}
243+
244+
#endregion
245+
}

0 commit comments

Comments
 (0)