using FluentAssertions; using Moq; using ColaFlow.Modules.ProjectManagement.Application.Commands.UpdateStory; using ColaFlow.Modules.ProjectManagement.Domain.Aggregates.ProjectAggregate; using ColaFlow.Modules.ProjectManagement.Domain.Repositories; using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; using ColaFlow.Modules.ProjectManagement.Domain.Exceptions; namespace ColaFlow.Application.Tests.Commands.UpdateStory; public class UpdateStoryCommandHandlerTests { private readonly Mock _projectRepositoryMock; private readonly Mock _unitOfWorkMock; private readonly UpdateStoryCommandHandler _handler; public UpdateStoryCommandHandlerTests() { _projectRepositoryMock = new Mock(); _unitOfWorkMock = new Mock(); _handler = new UpdateStoryCommandHandler(_projectRepositoryMock.Object, _unitOfWorkMock.Object); } [Fact] public async Task Should_Update_Story_Successfully() { // Arrange var userId = UserId.Create(); var project = Project.Create("Test Project", "Description", "TST", userId); var epic = project.CreateEpic("Test Epic", "Epic Description", userId); var story = epic.CreateStory("Original Title", "Original Description", TaskPriority.Low, userId); var storyId = story.Id; _projectRepositoryMock .Setup(x => x.GetProjectWithStoryAsync(storyId, It.IsAny())) .ReturnsAsync(project); var command = new UpdateStoryCommand { StoryId = storyId.Value, Title = "Updated Title", Description = "Updated Description", Status = "In Progress", Priority = "High", EstimatedHours = 16 }; // Act var result = await _handler.Handle(command, CancellationToken.None); // Assert result.Should().NotBeNull(); result.Title.Should().Be("Updated Title"); result.Description.Should().Be("Updated Description"); result.Status.Should().Be("In Progress"); result.Priority.Should().Be("High"); result.EstimatedHours.Should().Be(16); _projectRepositoryMock.Verify(x => x.Update(project), Times.Once); _unitOfWorkMock.Verify(x => x.SaveChangesAsync(It.IsAny()), Times.Once); } [Fact] public async Task Should_Fail_When_Story_Not_Found() { // Arrange var storyId = StoryId.Create(); _projectRepositoryMock .Setup(x => x.GetProjectWithStoryAsync(storyId, It.IsAny())) .ReturnsAsync((Project?)null); var command = new UpdateStoryCommand { StoryId = storyId.Value, Title = "Updated Title", Description = "Updated Description" }; // Act Func act = async () => await _handler.Handle(command, CancellationToken.None); // Assert await act.Should().ThrowAsync() .WithMessage("*Story*"); } [Fact] public async Task Should_Update_All_Fields_Correctly() { // Arrange var userId = UserId.Create(); var project = Project.Create("Test Project", "Description", "TST", userId); var epic = project.CreateEpic("Test Epic", "Epic Description", userId); var story = epic.CreateStory("Original", "Original", TaskPriority.Low, userId); _projectRepositoryMock .Setup(x => x.GetProjectWithStoryAsync(story.Id, It.IsAny())) .ReturnsAsync(project); var command = new UpdateStoryCommand { StoryId = story.Id.Value, Title = "New Title", Description = "New Description", Status = "Done", Priority = "Urgent", EstimatedHours = 24 }; // Act var result = await _handler.Handle(command, CancellationToken.None); // Assert story.Title.Should().Be("New Title"); story.Description.Should().Be("New Description"); story.Status.Should().Be(WorkItemStatus.Done); story.Priority.Should().Be(TaskPriority.Urgent); story.EstimatedHours.Should().Be(24); } }