Skip to content

Commit 7e5be8a

Browse files
committed
chore: add test files and update domain/application code
1 parent 0338b77 commit 7e5be8a

189 files changed

Lines changed: 20694 additions & 176 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

package-lock.json

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/apps/ums.api/Ums.Application.Test/Approvals/AccessEnforcementPolicy/AccessEnforcementPolicyCommandHandlerTests.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,4 +165,71 @@ public async Task Deactivate_WhenAlreadyInactive_ReturnsFailure()
165165
}
166166

167167
#endregion
168+
169+
// =========================================================================
170+
#region UpdateAccessEnforcementActionCommandHandler
171+
// =========================================================================
172+
173+
[Fact]
174+
public async Task UpdateAction_WithValidCommand_ReturnsSuccess()
175+
{
176+
_ctx.Setup(u => u.UserId).Returns("user-001");
177+
var policy = MakePolicy();
178+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
179+
.ReturnsAsync(policy);
180+
181+
var cmd = new UpdateAccessEnforcementActionCommand(policy.Props.Id.GetValue(), "RestrictProfile");
182+
var handler = new UpdateAccessEnforcementActionCommandHandler(_repo.Object, _ctx.Object);
183+
var result = await handler.Handle(cmd, CancellationToken.None);
184+
185+
Assert.True(result.IsSuccess);
186+
_repo.Verify(r => r.UpdateAsync(policy, It.IsAny<CancellationToken>()), Times.Once);
187+
_uow.Verify(u => u.SaveEntitiesAsync(It.IsAny<CancellationToken>()), Times.Once);
188+
}
189+
190+
[Fact]
191+
public async Task UpdateAction_WhenNotFound_ReturnsFailure()
192+
{
193+
_ctx.Setup(u => u.UserId).Returns("user-001");
194+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
195+
.ReturnsAsync((AccessEnforcementPolicy?)null);
196+
197+
var cmd = new UpdateAccessEnforcementActionCommand(Guid.NewGuid(), "BlockUser");
198+
var handler = new UpdateAccessEnforcementActionCommandHandler(_repo.Object, _ctx.Object);
199+
var result = await handler.Handle(cmd, CancellationToken.None);
200+
201+
Assert.True(result.IsFailure);
202+
Assert.Contains("policy not found", result.Error, StringComparison.OrdinalIgnoreCase);
203+
}
204+
205+
[Fact]
206+
public async Task UpdateAction_WhenUnauthenticated_ReturnsFailure()
207+
{
208+
_ctx.Setup(u => u.UserId).Returns("");
209+
210+
var cmd = new UpdateAccessEnforcementActionCommand(Guid.NewGuid(), "BlockUser");
211+
var handler = new UpdateAccessEnforcementActionCommandHandler(_repo.Object, _ctx.Object);
212+
var result = await handler.Handle(cmd, CancellationToken.None);
213+
214+
Assert.True(result.IsFailure);
215+
Assert.Contains("authenticated user is required", result.Error, StringComparison.OrdinalIgnoreCase);
216+
}
217+
218+
[Fact]
219+
public async Task UpdateAction_WithInvalidAction_ReturnsFailure()
220+
{
221+
_ctx.Setup(u => u.UserId).Returns("user-001");
222+
var policy = MakePolicy();
223+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
224+
.ReturnsAsync(policy);
225+
226+
var cmd = new UpdateAccessEnforcementActionCommand(policy.Props.Id.GetValue(), "InvalidAction");
227+
var handler = new UpdateAccessEnforcementActionCommandHandler(_repo.Object, _ctx.Object);
228+
var result = await handler.Handle(cmd, CancellationToken.None);
229+
230+
Assert.True(result.IsFailure);
231+
Assert.Contains("Invalid action", result.Error, StringComparison.OrdinalIgnoreCase);
232+
}
233+
234+
#endregion
168235
}

src/apps/ums.api/Ums.Application.Test/Approvals/ApprovalWorkflow/ApprovalWorkflowCommandHandlerTests.cs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Ums.Application.Test.Approvals.ApprovalWorkflow;
99
using Moq;
1010
using Xunit;
1111
using System;
12+
using System.Linq;
1213
using System.Threading;
1314
using System.Threading.Tasks;
1415

@@ -25,6 +26,19 @@ public ApprovalWorkflowCommandHandlerTests()
2526
_ctx.Setup(u => u.UserId).Returns("user-001");
2627
}
2728

29+
private static ApprovalWorkflow MakeWorkflow(string code, string name)
30+
{
31+
return ApprovalWorkflow.Create(
32+
TenantId.Load(Guid.NewGuid()),
33+
Code.Create(code),
34+
Name.Create(name),
35+
Description.Create("Workflow Description"),
36+
UserCategory.Internal,
37+
requiresApproval: true,
38+
systemSuiteId: SystemSuiteId.Load(Guid.NewGuid()),
39+
createdBy: ActorId.Create("user-001")).Value;
40+
}
41+
2842
// =========================================================================
2943
#region CreateApprovalWorkflowCommandHandler
3044
// =========================================================================
@@ -73,4 +87,111 @@ public async Task Create_WhenUnauthenticated_ReturnsFailure()
7387
}
7488

7589
#endregion
90+
91+
// =========================================================================
92+
#region AddRequiredDocumentCommandHandler
93+
// =========================================================================
94+
95+
[Fact]
96+
public async Task AddRequiredDocument_WithValidCommand_ReturnsSuccess()
97+
{
98+
_ctx.Setup(u => u.UserId).Returns("user-001");
99+
var workflow = MakeWorkflow("WF-001", "Test Workflow");
100+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
101+
.ReturnsAsync(workflow);
102+
103+
var cmd = new AddRequiredDocumentCommand(workflow.Props.Id.GetValue(), Guid.NewGuid(), true);
104+
var handler = new AddRequiredDocumentCommandHandler(_repo.Object, _ctx.Object);
105+
var result = await handler.Handle(cmd, CancellationToken.None);
106+
107+
Assert.True(result.IsSuccess);
108+
_repo.Verify(r => r.UpdateAsync(workflow, It.IsAny<CancellationToken>()), Times.Once);
109+
_uow.Verify(u => u.SaveEntitiesAsync(It.IsAny<CancellationToken>()), Times.Once);
110+
}
111+
112+
[Fact]
113+
public async Task AddRequiredDocument_WhenNotFound_ReturnsFailure()
114+
{
115+
_ctx.Setup(u => u.UserId).Returns("user-001");
116+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
117+
.ReturnsAsync((ApprovalWorkflow?)null);
118+
119+
var cmd = new AddRequiredDocumentCommand(Guid.NewGuid(), Guid.NewGuid(), true);
120+
var handler = new AddRequiredDocumentCommandHandler(_repo.Object, _ctx.Object);
121+
var result = await handler.Handle(cmd, CancellationToken.None);
122+
123+
Assert.True(result.IsFailure);
124+
Assert.Contains("workflow not found", result.Error, StringComparison.OrdinalIgnoreCase);
125+
}
126+
127+
[Fact]
128+
public async Task AddRequiredDocument_WhenUnauthenticated_ReturnsFailure()
129+
{
130+
_ctx.Setup(u => u.UserId).Returns("");
131+
132+
var cmd = new AddRequiredDocumentCommand(Guid.NewGuid(), Guid.NewGuid(), true);
133+
var handler = new AddRequiredDocumentCommandHandler(_repo.Object, _ctx.Object);
134+
var result = await handler.Handle(cmd, CancellationToken.None);
135+
136+
Assert.True(result.IsFailure);
137+
Assert.Contains("authenticated user is required", result.Error, StringComparison.OrdinalIgnoreCase);
138+
}
139+
140+
#endregion
141+
142+
// =========================================================================
143+
#region RemoveRequiredDocumentCommandHandler
144+
// =========================================================================
145+
146+
[Fact]
147+
public async Task RemoveRequiredDocument_WithValidCommand_ReturnsSuccess()
148+
{
149+
_ctx.Setup(u => u.UserId).Returns("user-001");
150+
var workflow = MakeWorkflow("WF-002", "Test Workflow 2");
151+
var docTypeId = Guid.NewGuid();
152+
workflow.AddRequiredDocument(DocumentTypeId.Load(docTypeId), true, ActorId.Create("user-001"));
153+
var addedDoc = workflow.RequiredDocuments.First();
154+
var docId = addedDoc.Id.GetValue();
155+
156+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
157+
.ReturnsAsync(workflow);
158+
159+
var cmd = new RemoveRequiredDocumentCommand(workflow.Props.Id.GetValue(), docId);
160+
var handler = new RemoveRequiredDocumentCommandHandler(_repo.Object, _ctx.Object);
161+
var result = await handler.Handle(cmd, CancellationToken.None);
162+
163+
Assert.True(result.IsSuccess);
164+
_repo.Verify(r => r.UpdateAsync(workflow, It.IsAny<CancellationToken>()), Times.Once);
165+
_uow.Verify(u => u.SaveEntitiesAsync(It.IsAny<CancellationToken>()), Times.Once);
166+
}
167+
168+
[Fact]
169+
public async Task RemoveRequiredDocument_WhenNotFound_ReturnsFailure()
170+
{
171+
_ctx.Setup(u => u.UserId).Returns("user-001");
172+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
173+
.ReturnsAsync((ApprovalWorkflow?)null);
174+
175+
var cmd = new RemoveRequiredDocumentCommand(Guid.NewGuid(), Guid.NewGuid());
176+
var handler = new RemoveRequiredDocumentCommandHandler(_repo.Object, _ctx.Object);
177+
var result = await handler.Handle(cmd, CancellationToken.None);
178+
179+
Assert.True(result.IsFailure);
180+
Assert.Contains("workflow not found", result.Error, StringComparison.OrdinalIgnoreCase);
181+
}
182+
183+
[Fact]
184+
public async Task RemoveRequiredDocument_WhenUnauthenticated_ReturnsFailure()
185+
{
186+
_ctx.Setup(u => u.UserId).Returns("");
187+
188+
var cmd = new RemoveRequiredDocumentCommand(Guid.NewGuid(), Guid.NewGuid());
189+
var handler = new RemoveRequiredDocumentCommandHandler(_repo.Object, _ctx.Object);
190+
var result = await handler.Handle(cmd, CancellationToken.None);
191+
192+
Assert.True(result.IsFailure);
193+
Assert.Contains("authenticated user is required", result.Error, StringComparison.OrdinalIgnoreCase);
194+
}
195+
196+
#endregion
76197
}

src/apps/ums.api/Ums.Application.Test/Approvals/DocumentType/DocumentTypeCommandHandlerTests.cs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,66 @@ public async Task Create_WhenUnauthenticated_ReturnsFailure()
6969
}
7070

7171
#endregion
72+
73+
// =========================================================================
74+
#region UpdateDocumentTypeCommandHandler
75+
// =========================================================================
76+
77+
[Fact]
78+
public async Task Update_WithValidCommand_ReturnsSuccess()
79+
{
80+
_ctx.Setup(u => u.UserId).Returns("user-001");
81+
var entity = MakeDocumentType();
82+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
83+
.ReturnsAsync(entity);
84+
85+
var cmd = new UpdateDocumentTypeCommand(entity.Props.Id.GetValue(), "Updated Name", "Updated Description");
86+
var handler = new UpdateDocumentTypeCommandHandler(_repo.Object, _ctx.Object);
87+
var result = await handler.Handle(cmd, CancellationToken.None);
88+
89+
Assert.True(result.IsSuccess);
90+
_repo.Verify(r => r.UpdateAsync(entity, It.IsAny<CancellationToken>()), Times.Once);
91+
_uow.Verify(u => u.SaveEntitiesAsync(It.IsAny<CancellationToken>()), Times.Once);
92+
}
93+
94+
[Fact]
95+
public async Task Update_WhenNotFound_ReturnsFailure()
96+
{
97+
_ctx.Setup(u => u.UserId).Returns("user-001");
98+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
99+
.ReturnsAsync((DocumentType?)null);
100+
101+
var cmd = new UpdateDocumentTypeCommand(Guid.NewGuid(), "Updated Name", "Updated Description");
102+
var handler = new UpdateDocumentTypeCommandHandler(_repo.Object, _ctx.Object);
103+
var result = await handler.Handle(cmd, CancellationToken.None);
104+
105+
Assert.True(result.IsFailure);
106+
Assert.Contains("not found", result.Error, StringComparison.OrdinalIgnoreCase);
107+
}
108+
109+
[Fact]
110+
public async Task Update_WhenUnauthenticated_ReturnsFailure()
111+
{
112+
_ctx.Setup(u => u.UserId).Returns("");
113+
114+
var cmd = new UpdateDocumentTypeCommand(Guid.NewGuid(), "Updated Name", "Updated Description");
115+
var handler = new UpdateDocumentTypeCommandHandler(_repo.Object, _ctx.Object);
116+
var result = await handler.Handle(cmd, CancellationToken.None);
117+
118+
Assert.True(result.IsFailure);
119+
Assert.Contains("authenticated user is required", result.Error, StringComparison.OrdinalIgnoreCase);
120+
}
121+
122+
#endregion
123+
124+
private static DocumentType MakeDocumentType(string code = "DOCTYPE-001")
125+
{
126+
return DocumentType.Create(
127+
TenantId.Load(Guid.NewGuid()),
128+
Code.Create(code),
129+
Name.Create("Passport"),
130+
Description.Create("Passport Description"),
131+
DocumentCriticity.High,
132+
ActorId.Create("user-001")).Value;
133+
}
72134
}

src/apps/ums.api/Ums.Application.Test/Approvals/NotificationRule/NotificationRuleCommandHandlerTests.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,4 +153,55 @@ public async Task Deactivate_WhenNotFound_ReturnsFailure()
153153
}
154154

155155
#endregion
156+
157+
// =========================================================================
158+
#region UpdateNotificationRuleRecipientCommandHandler
159+
// =========================================================================
160+
161+
[Fact]
162+
public async Task UpdateRecipient_WithValidCommand_ReturnsSuccess()
163+
{
164+
_ctx.Setup(u => u.UserId).Returns("user-001");
165+
var rule = MakeNotificationRule();
166+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
167+
.ReturnsAsync(rule);
168+
169+
var cmd = new UpdateNotificationRuleRecipientCommand(rule.Props.Id.GetValue(), "new-recipient@test.com");
170+
var handler = new UpdateNotificationRuleRecipientCommandHandler(_repo.Object, _ctx.Object);
171+
var result = await handler.Handle(cmd, CancellationToken.None);
172+
173+
Assert.True(result.IsSuccess);
174+
_repo.Verify(r => r.UpdateAsync(rule, It.IsAny<CancellationToken>()), Times.Once);
175+
_uow.Verify(u => u.SaveEntitiesAsync(It.IsAny<CancellationToken>()), Times.Once);
176+
}
177+
178+
[Fact]
179+
public async Task UpdateRecipient_WhenNotFound_ReturnsFailure()
180+
{
181+
_ctx.Setup(u => u.UserId).Returns("user-001");
182+
_repo.Setup(r => r.GetByIdAsync(It.IsAny<Guid>(), It.IsAny<CancellationToken>()))
183+
.ReturnsAsync((NotificationRule?)null);
184+
185+
var cmd = new UpdateNotificationRuleRecipientCommand(Guid.NewGuid(), "new-recipient@test.com");
186+
var handler = new UpdateNotificationRuleRecipientCommandHandler(_repo.Object, _ctx.Object);
187+
var result = await handler.Handle(cmd, CancellationToken.None);
188+
189+
Assert.True(result.IsFailure);
190+
Assert.Contains("rule not found", result.Error, StringComparison.OrdinalIgnoreCase);
191+
}
192+
193+
[Fact]
194+
public async Task UpdateRecipient_WhenUnauthenticated_ReturnsFailure()
195+
{
196+
_ctx.Setup(u => u.UserId).Returns("");
197+
198+
var cmd = new UpdateNotificationRuleRecipientCommand(Guid.NewGuid(), "new-recipient@test.com");
199+
var handler = new UpdateNotificationRuleRecipientCommandHandler(_repo.Object, _ctx.Object);
200+
var result = await handler.Handle(cmd, CancellationToken.None);
201+
202+
Assert.True(result.IsFailure);
203+
Assert.Contains("authenticated user is required", result.Error, StringComparison.OrdinalIgnoreCase);
204+
}
205+
206+
#endregion
156207
}

0 commit comments

Comments
 (0)