From 0854faccc1466909b36194a14957d6ba90c1c1b5 Mon Sep 17 00:00:00 2001 From: Yaojia Wang Date: Tue, 4 Nov 2025 17:25:00 +0100 Subject: [PATCH] test(backend): Fix all compilation errors in Domain.Tests after Day 15 multi-tenant changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixed 73 compilation errors caused by Epic/Story/WorkTask.Create() now requiring TenantId parameter. Changes: - Created TestDataBuilder helper class for test data creation - Updated EpicTests.cs: Added TenantId to all Epic.Create() calls (10 tests) - Updated StoryTests.cs: Added TenantId to all Story.Create() calls (26 tests) - Updated WorkTaskTests.cs: Added TenantId to all WorkTask.Create() calls (37 tests) - Added using ColaFlow.Domain.Tests.Builders to all test files Test Results: - Build: 0 errors, 9 warnings (xUnit analyzer warnings only) - Tests: 192/192 passed in ColaFlow.Domain.Tests - Full Suite: 427/431 passed (4 skipped as expected) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../Aggregates/EpicTests.cs | 55 +++++++---- .../Aggregates/StoryTests.cs | 53 +++++----- .../Aggregates/WorkTaskTests.cs | 59 +++++------ .../Builders/TestDataBuilder.cs | 99 +++++++++++++++++++ 4 files changed, 193 insertions(+), 73 deletions(-) create mode 100644 colaflow-api/tests/ColaFlow.Domain.Tests/Builders/TestDataBuilder.cs diff --git a/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/EpicTests.cs b/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/EpicTests.cs index 98dfdb6..8067e99 100644 --- a/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/EpicTests.cs +++ b/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/EpicTests.cs @@ -1,6 +1,7 @@ using ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate; using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; using ColaFlow.Modules.ProjectManagement.Domain.Exceptions; +using ColaFlow.Domain.Tests.Builders; using FluentAssertions; namespace ColaFlow.Domain.Tests.Aggregates; @@ -16,16 +17,18 @@ public class EpicTests public void Create_WithValidData_ShouldCreateEpic() { // Arrange + var tenantId = TestDataBuilder.CreateTestTenantId(); var name = "Epic 1"; var description = "Epic Description"; var projectId = ProjectId.Create(); var createdBy = UserId.Create(); // Act - var epic = Epic.Create(name, description, projectId, createdBy); + var epic = Epic.Create(tenantId, name, description, projectId, createdBy); // Assert epic.Should().NotBeNull(); + epic.TenantId.Should().Be(tenantId); epic.Name.Should().Be(name); epic.Description.Should().Be(description); epic.ProjectId.Should().Be(projectId); @@ -41,13 +44,14 @@ public class EpicTests public void Create_WithNullDescription_ShouldCreateEpicWithEmptyDescription() { // Arrange + var tenantId = TestDataBuilder.CreateTestTenantId(); var name = "Epic 1"; string? description = null; var projectId = ProjectId.Create(); var createdBy = UserId.Create(); // Act - var epic = Epic.Create(name, description!, projectId, createdBy); + var epic = Epic.Create(tenantId, name, description!, projectId, createdBy); // Assert epic.Should().NotBeNull(); @@ -61,11 +65,12 @@ public class EpicTests public void Create_WithEmptyName_ShouldThrowDomainException(string invalidName) { // Arrange + var tenantId = TestDataBuilder.CreateTestTenantId(); var projectId = ProjectId.Create(); var createdBy = UserId.Create(); // Act - Action act = () => Epic.Create(invalidName, "Description", projectId, createdBy); + Action act = () => Epic.Create(tenantId, invalidName, "Description", projectId, createdBy); // Assert act.Should().Throw() @@ -76,12 +81,13 @@ public class EpicTests public void Create_WithNameExceeding200Characters_ShouldThrowDomainException() { // Arrange + var tenantId = TestDataBuilder.CreateTestTenantId(); var name = new string('A', 201); var projectId = ProjectId.Create(); var createdBy = UserId.Create(); // Act - Action act = () => Epic.Create(name, "Description", projectId, createdBy); + Action act = () => Epic.Create(tenantId, name, "Description", projectId, createdBy); // Assert act.Should().Throw() @@ -92,12 +98,13 @@ public class EpicTests public void Create_WithNameExactly200Characters_ShouldSucceed() { // Arrange + var tenantId = TestDataBuilder.CreateTestTenantId(); var name = new string('A', 200); var projectId = ProjectId.Create(); var createdBy = UserId.Create(); // Act - var epic = Epic.Create(name, "Description", projectId, createdBy); + var epic = Epic.Create(tenantId, name, "Description", projectId, createdBy); // Assert epic.Should().NotBeNull(); @@ -112,7 +119,8 @@ public class EpicTests public void CreateStory_WithValidData_ShouldCreateStory() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); var storyTitle = "Story 1"; var storyDescription = "Story Description"; var priority = TaskPriority.High; @@ -136,7 +144,8 @@ public class EpicTests public void CreateStory_MultipleStories_ShouldAddToCollection() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); var createdBy = UserId.Create(); // Act @@ -157,7 +166,8 @@ public class EpicTests public void UpdateDetails_WithValidData_ShouldUpdateEpic() { // Arrange - var epic = Epic.Create("Original Name", "Original Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Original Name", "Original Description", ProjectId.Create(), UserId.Create()); var originalCreatedAt = epic.CreatedAt; var newName = "Updated Name"; var newDescription = "Updated Description"; @@ -177,7 +187,8 @@ public class EpicTests public void UpdateDetails_WithNullDescription_ShouldSetEmptyDescription() { // Arrange - var epic = Epic.Create("Original Name", "Original Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Original Name", "Original Description", ProjectId.Create(), UserId.Create()); // Act epic.UpdateDetails("Updated Name", null!); @@ -193,7 +204,8 @@ public class EpicTests public void UpdateDetails_WithEmptyName_ShouldThrowDomainException(string invalidName) { // Arrange - var epic = Epic.Create("Original Name", "Original Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Original Name", "Original Description", ProjectId.Create(), UserId.Create()); // Act Action act = () => epic.UpdateDetails(invalidName, "Updated Description"); @@ -207,7 +219,8 @@ public class EpicTests public void UpdateDetails_WithNameExceeding200Characters_ShouldThrowDomainException() { // Arrange - var epic = Epic.Create("Original Name", "Original Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Original Name", "Original Description", ProjectId.Create(), UserId.Create()); var name = new string('A', 201); // Act @@ -226,7 +239,8 @@ public class EpicTests public void UpdateStatus_WithValidStatus_ShouldUpdateStatus() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); var newStatus = WorkItemStatus.InProgress; // Act @@ -242,7 +256,8 @@ public class EpicTests public void UpdateStatus_ToAllStatuses_ShouldSucceed() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); // Act & Assert epic.UpdateStatus(WorkItemStatus.InProgress); @@ -269,7 +284,8 @@ public class EpicTests public void UpdatePriority_WithValidPriority_ShouldUpdatePriority() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); var newPriority = TaskPriority.Urgent; // Act @@ -285,7 +301,8 @@ public class EpicTests public void UpdatePriority_ToAllPriorities_ShouldSucceed() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); // Act & Assert epic.UpdatePriority(TaskPriority.Low); @@ -309,7 +326,8 @@ public class EpicTests public void Stories_Collection_ShouldBeReadOnly() { // Arrange - var epic = Epic.Create("Epic 1", "Description", ProjectId.Create(), UserId.Create()); + var tenantId = TestDataBuilder.CreateTestTenantId(); + var epic = Epic.Create(tenantId, "Epic 1", "Description", ProjectId.Create(), UserId.Create()); // Act & Assert epic.Stories.Should().BeAssignableTo>(); @@ -319,10 +337,11 @@ public class EpicTests public void Epic_ShouldHaveUniqueId() { // Arrange & Act + var tenantId = TestDataBuilder.CreateTestTenantId(); var projectId = ProjectId.Create(); var createdBy = UserId.Create(); - var epic1 = Epic.Create("Epic 1", "Description", projectId, createdBy); - var epic2 = Epic.Create("Epic 2", "Description", projectId, createdBy); + var epic1 = Epic.Create(tenantId, "Epic 1", "Description", projectId, createdBy); + var epic2 = Epic.Create(tenantId, "Epic 2", "Description", projectId, createdBy); // Assert epic1.Id.Should().NotBe(epic2.Id); diff --git a/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/StoryTests.cs b/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/StoryTests.cs index 40a0488..72256a4 100644 --- a/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/StoryTests.cs +++ b/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/StoryTests.cs @@ -1,6 +1,7 @@ using ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate; using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; using ColaFlow.Modules.ProjectManagement.Domain.Exceptions; +using ColaFlow.Domain.Tests.Builders; using FluentAssertions; namespace ColaFlow.Domain.Tests.Aggregates; @@ -23,7 +24,7 @@ public class StoryTests var createdBy = UserId.Create(); // Act - var story = Story.Create(title, description, epicId, priority, createdBy); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), title, description, epicId, priority, createdBy); // Assert story.Should().NotBeNull(); @@ -52,7 +53,7 @@ public class StoryTests var createdBy = UserId.Create(); // Act - var story = Story.Create(title, description!, epicId, priority, createdBy); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), title, description!, epicId, priority, createdBy); // Assert story.Should().NotBeNull(); @@ -71,7 +72,7 @@ public class StoryTests var createdBy = UserId.Create(); // Act - Action act = () => Story.Create(invalidTitle, "Description", epicId, priority, createdBy); + Action act = () => Story.Create(TestDataBuilder.CreateTestTenantId(), invalidTitle, "Description", epicId, priority, createdBy); // Assert act.Should().Throw() @@ -88,7 +89,7 @@ public class StoryTests var createdBy = UserId.Create(); // Act - Action act = () => Story.Create(title, "Description", epicId, priority, createdBy); + Action act = () => Story.Create(TestDataBuilder.CreateTestTenantId(), title, "Description", epicId, priority, createdBy); // Assert act.Should().Throw() @@ -105,7 +106,7 @@ public class StoryTests var createdBy = UserId.Create(); // Act - var story = Story.Create(title, "Description", epicId, priority, createdBy); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), title, "Description", epicId, priority, createdBy); // Assert story.Should().NotBeNull(); @@ -120,7 +121,7 @@ public class StoryTests public void CreateTask_WithValidData_ShouldCreateTask() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var taskTitle = "Task 1"; var taskDescription = "Task Description"; var priority = TaskPriority.Urgent; @@ -144,7 +145,7 @@ public class StoryTests public void CreateTask_MultipleTasks_ShouldAddToCollection() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var createdBy = UserId.Create(); // Act @@ -165,7 +166,7 @@ public class StoryTests public void UpdateDetails_WithValidData_ShouldUpdateStory() { // Arrange - var story = Story.Create("Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var originalCreatedAt = story.CreatedAt; var newTitle = "Updated Title"; var newDescription = "Updated Description"; @@ -185,7 +186,7 @@ public class StoryTests public void UpdateDetails_WithNullDescription_ShouldSetEmptyDescription() { // Arrange - var story = Story.Create("Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act story.UpdateDetails("Updated Title", null!); @@ -201,7 +202,7 @@ public class StoryTests public void UpdateDetails_WithEmptyTitle_ShouldThrowDomainException(string invalidTitle) { // Arrange - var story = Story.Create("Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act Action act = () => story.UpdateDetails(invalidTitle, "Updated Description"); @@ -215,7 +216,7 @@ public class StoryTests public void UpdateDetails_WithTitleExceeding200Characters_ShouldThrowDomainException() { // Arrange - var story = Story.Create("Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var title = new string('A', 201); // Act @@ -234,7 +235,7 @@ public class StoryTests public void UpdateStatus_WithValidStatus_ShouldUpdateStatus() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var newStatus = WorkItemStatus.InProgress; // Act @@ -250,7 +251,7 @@ public class StoryTests public void UpdateStatus_ToAllStatuses_ShouldSucceed() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act & Assert story.UpdateStatus(WorkItemStatus.InProgress); @@ -277,7 +278,7 @@ public class StoryTests public void AssignTo_WithValidUserId_ShouldAssignStory() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var assigneeId = UserId.Create(); // Act @@ -293,7 +294,7 @@ public class StoryTests public void AssignTo_ReassignToDifferentUser_ShouldUpdateAssignee() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var firstAssignee = UserId.Create(); var secondAssignee = UserId.Create(); @@ -313,7 +314,7 @@ public class StoryTests public void UpdateEstimate_WithValidHours_ShouldUpdateEstimate() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var hours = 8.5m; // Act @@ -329,7 +330,7 @@ public class StoryTests public void UpdateEstimate_WithZeroHours_ShouldSucceed() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act story.UpdateEstimate(0); @@ -342,7 +343,7 @@ public class StoryTests public void UpdateEstimate_WithNegativeHours_ShouldThrowDomainException() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act Action act = () => story.UpdateEstimate(-1); @@ -356,7 +357,7 @@ public class StoryTests public void UpdateEstimate_MultipleUpdates_ShouldOverwritePreviousValue() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act story.UpdateEstimate(8); @@ -374,7 +375,7 @@ public class StoryTests public void LogActualHours_WithValidHours_ShouldLogHours() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); var hours = 10.5m; // Act @@ -390,7 +391,7 @@ public class StoryTests public void LogActualHours_WithZeroHours_ShouldSucceed() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act story.LogActualHours(0); @@ -403,7 +404,7 @@ public class StoryTests public void LogActualHours_WithNegativeHours_ShouldThrowDomainException() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act Action act = () => story.LogActualHours(-1); @@ -417,7 +418,7 @@ public class StoryTests public void LogActualHours_MultipleUpdates_ShouldOverwritePreviousValue() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act story.LogActualHours(8); @@ -435,7 +436,7 @@ public class StoryTests public void Tasks_Collection_ShouldBeReadOnly() { // Arrange - var story = Story.Create("Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); + var story = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", EpicId.Create(), TaskPriority.Medium, UserId.Create()); // Act & Assert story.Tasks.Should().BeAssignableTo>(); @@ -447,8 +448,8 @@ public class StoryTests // Arrange & Act var epicId = EpicId.Create(); var createdBy = UserId.Create(); - var story1 = Story.Create("Story 1", "Description", epicId, TaskPriority.Medium, createdBy); - var story2 = Story.Create("Story 2", "Description", epicId, TaskPriority.Medium, createdBy); + var story1 = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 1", "Description", epicId, TaskPriority.Medium, createdBy); + var story2 = Story.Create(TestDataBuilder.CreateTestTenantId(), "Story 2", "Description", epicId, TaskPriority.Medium, createdBy); // Assert story1.Id.Should().NotBe(story2.Id); diff --git a/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/WorkTaskTests.cs b/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/WorkTaskTests.cs index bdd80ee..183894b 100644 --- a/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/WorkTaskTests.cs +++ b/colaflow-api/tests/ColaFlow.Domain.Tests/Aggregates/WorkTaskTests.cs @@ -1,6 +1,7 @@ using ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate; using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; using ColaFlow.Modules.ProjectManagement.Domain.Exceptions; +using ColaFlow.Domain.Tests.Builders; using FluentAssertions; namespace ColaFlow.Domain.Tests.Aggregates; @@ -23,7 +24,7 @@ public class WorkTaskTests var createdBy = UserId.Create(); // Act - var task = WorkTask.Create(title, description, storyId, priority, createdBy); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), title, description, storyId, priority, createdBy); // Assert task.Should().NotBeNull(); @@ -51,7 +52,7 @@ public class WorkTaskTests var createdBy = UserId.Create(); // Act - var task = WorkTask.Create(title, description!, storyId, priority, createdBy); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), title, description!, storyId, priority, createdBy); // Assert task.Should().NotBeNull(); @@ -70,7 +71,7 @@ public class WorkTaskTests var createdBy = UserId.Create(); // Act - Action act = () => WorkTask.Create(invalidTitle, "Description", storyId, priority, createdBy); + Action act = () => WorkTask.Create(TestDataBuilder.CreateTestTenantId(), invalidTitle, "Description", storyId, priority, createdBy); // Assert act.Should().Throw() @@ -87,7 +88,7 @@ public class WorkTaskTests var createdBy = UserId.Create(); // Act - Action act = () => WorkTask.Create(title, "Description", storyId, priority, createdBy); + Action act = () => WorkTask.Create(TestDataBuilder.CreateTestTenantId(), title, "Description", storyId, priority, createdBy); // Assert act.Should().Throw() @@ -104,7 +105,7 @@ public class WorkTaskTests var createdBy = UserId.Create(); // Act - var task = WorkTask.Create(title, "Description", storyId, priority, createdBy); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), title, "Description", storyId, priority, createdBy); // Assert task.Should().NotBeNull(); @@ -119,10 +120,10 @@ public class WorkTaskTests var createdBy = UserId.Create(); // Act - var taskLow = WorkTask.Create("Task Low", "Desc", storyId, TaskPriority.Low, createdBy); - var taskMedium = WorkTask.Create("Task Medium", "Desc", storyId, TaskPriority.Medium, createdBy); - var taskHigh = WorkTask.Create("Task High", "Desc", storyId, TaskPriority.High, createdBy); - var taskUrgent = WorkTask.Create("Task Urgent", "Desc", storyId, TaskPriority.Urgent, createdBy); + var taskLow = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task Low", "Desc", storyId, TaskPriority.Low, createdBy); + var taskMedium = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task Medium", "Desc", storyId, TaskPriority.Medium, createdBy); + var taskHigh = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task High", "Desc", storyId, TaskPriority.High, createdBy); + var taskUrgent = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task Urgent", "Desc", storyId, TaskPriority.Urgent, createdBy); // Assert taskLow.Priority.Should().Be(TaskPriority.Low); @@ -139,7 +140,7 @@ public class WorkTaskTests public void UpdateDetails_WithValidData_ShouldUpdateTask() { // Arrange - var task = WorkTask.Create("Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var originalCreatedAt = task.CreatedAt; var newTitle = "Updated Title"; var newDescription = "Updated Description"; @@ -159,7 +160,7 @@ public class WorkTaskTests public void UpdateDetails_WithNullDescription_ShouldSetEmptyDescription() { // Arrange - var task = WorkTask.Create("Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act task.UpdateDetails("Updated Title", null!); @@ -175,7 +176,7 @@ public class WorkTaskTests public void UpdateDetails_WithEmptyTitle_ShouldThrowDomainException(string invalidTitle) { // Arrange - var task = WorkTask.Create("Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act Action act = () => task.UpdateDetails(invalidTitle, "Updated Description"); @@ -189,7 +190,7 @@ public class WorkTaskTests public void UpdateDetails_WithTitleExceeding200Characters_ShouldThrowDomainException() { // Arrange - var task = WorkTask.Create("Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Original Title", "Original Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var title = new string('A', 201); // Act @@ -208,7 +209,7 @@ public class WorkTaskTests public void UpdateStatus_WithValidStatus_ShouldUpdateStatus() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var newStatus = WorkItemStatus.InProgress; // Act @@ -224,7 +225,7 @@ public class WorkTaskTests public void UpdateStatus_ToAllStatuses_ShouldSucceed() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act & Assert task.UpdateStatus(WorkItemStatus.InProgress); @@ -251,7 +252,7 @@ public class WorkTaskTests public void AssignTo_WithValidUserId_ShouldAssignTask() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var assigneeId = UserId.Create(); // Act @@ -267,7 +268,7 @@ public class WorkTaskTests public void AssignTo_ReassignToDifferentUser_ShouldUpdateAssignee() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var firstAssignee = UserId.Create(); var secondAssignee = UserId.Create(); @@ -287,7 +288,7 @@ public class WorkTaskTests public void UpdatePriority_WithValidPriority_ShouldUpdatePriority() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Low, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Low, UserId.Create()); var newPriority = TaskPriority.Urgent; // Act @@ -303,7 +304,7 @@ public class WorkTaskTests public void UpdatePriority_ToAllPriorities_ShouldSucceed() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act & Assert task.UpdatePriority(TaskPriority.Low); @@ -327,7 +328,7 @@ public class WorkTaskTests public void UpdateEstimate_WithValidHours_ShouldUpdateEstimate() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var hours = 4.5m; // Act @@ -343,7 +344,7 @@ public class WorkTaskTests public void UpdateEstimate_WithZeroHours_ShouldSucceed() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act task.UpdateEstimate(0); @@ -356,7 +357,7 @@ public class WorkTaskTests public void UpdateEstimate_WithNegativeHours_ShouldThrowDomainException() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act Action act = () => task.UpdateEstimate(-1); @@ -370,7 +371,7 @@ public class WorkTaskTests public void UpdateEstimate_MultipleUpdates_ShouldOverwritePreviousValue() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act task.UpdateEstimate(4); @@ -388,7 +389,7 @@ public class WorkTaskTests public void LogActualHours_WithValidHours_ShouldLogHours() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); var hours = 5.5m; // Act @@ -404,7 +405,7 @@ public class WorkTaskTests public void LogActualHours_WithZeroHours_ShouldSucceed() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act task.LogActualHours(0); @@ -417,7 +418,7 @@ public class WorkTaskTests public void LogActualHours_WithNegativeHours_ShouldThrowDomainException() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act Action act = () => task.LogActualHours(-1); @@ -431,7 +432,7 @@ public class WorkTaskTests public void LogActualHours_MultipleUpdates_ShouldOverwritePreviousValue() { // Arrange - var task = WorkTask.Create("Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); + var task = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", StoryId.Create(), TaskPriority.Medium, UserId.Create()); // Act task.LogActualHours(4); @@ -451,8 +452,8 @@ public class WorkTaskTests // Arrange & Act var storyId = StoryId.Create(); var createdBy = UserId.Create(); - var task1 = WorkTask.Create("Task 1", "Description", storyId, TaskPriority.Medium, createdBy); - var task2 = WorkTask.Create("Task 2", "Description", storyId, TaskPriority.Medium, createdBy); + var task1 = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 1", "Description", storyId, TaskPriority.Medium, createdBy); + var task2 = WorkTask.Create(TestDataBuilder.CreateTestTenantId(), "Task 2", "Description", storyId, TaskPriority.Medium, createdBy); // Assert task1.Id.Should().NotBe(task2.Id); diff --git a/colaflow-api/tests/ColaFlow.Domain.Tests/Builders/TestDataBuilder.cs b/colaflow-api/tests/ColaFlow.Domain.Tests/Builders/TestDataBuilder.cs new file mode 100644 index 0000000..1bd35f3 --- /dev/null +++ b/colaflow-api/tests/ColaFlow.Domain.Tests/Builders/TestDataBuilder.cs @@ -0,0 +1,99 @@ +using ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate; +using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; + +namespace ColaFlow.Domain.Tests.Builders; + +/// +/// Test Data Builder for creating test entities with default values. +/// Simplifies test setup by providing consistent test data. +/// +public static class TestDataBuilder +{ + /// + /// Creates a test TenantId with a random GUID. + /// + public static TenantId CreateTestTenantId() + => TenantId.From(Guid.NewGuid()); + + /// + /// Creates a test ProjectId with a random GUID. + /// + public static ProjectId CreateTestProjectId() + => ProjectId.From(Guid.NewGuid()); + + /// + /// Creates a test UserId with a random GUID. + /// + public static UserId CreateTestUserId() + => UserId.From(Guid.NewGuid()); + + /// + /// Creates a test EpicId with a random GUID. + /// + public static EpicId CreateTestEpicId() + => EpicId.Create(); + + /// + /// Creates a test StoryId with a random GUID. + /// + public static StoryId CreateTestStoryId() + => StoryId.Create(); + + /// + /// Creates a test Epic with default or provided values. + /// + public static Epic CreateTestEpic( + TenantId? tenantId = null, + string name = "Test Epic", + string description = "Test Epic Description", + ProjectId? projectId = null, + UserId? createdBy = null) + { + return Epic.Create( + tenantId ?? CreateTestTenantId(), + name, + description, + projectId ?? CreateTestProjectId(), + createdBy ?? CreateTestUserId()); + } + + /// + /// Creates a test Story with default or provided values. + /// + public static Story CreateTestStory( + TenantId? tenantId = null, + string title = "Test Story", + string description = "Test Story Description", + EpicId? epicId = null, + TaskPriority? priority = null, + UserId? createdBy = null) + { + return Story.Create( + tenantId ?? CreateTestTenantId(), + title, + description, + epicId ?? CreateTestEpicId(), + priority ?? TaskPriority.Medium, + createdBy ?? CreateTestUserId()); + } + + /// + /// Creates a test WorkTask with default or provided values. + /// + public static WorkTask CreateTestTask( + TenantId? tenantId = null, + string title = "Test Task", + string description = "Test Task Description", + StoryId? storyId = null, + TaskPriority? priority = null, + UserId? createdBy = null) + { + return WorkTask.Create( + tenantId ?? CreateTestTenantId(), + title, + description, + storyId ?? CreateTestStoryId(), + priority ?? TaskPriority.Medium, + createdBy ?? CreateTestUserId()); + } +}