using FastEndpoints; using Microsoft.EntityFrameworkCore; using MissionControl.Domain.Entities; using MissionControl.Server.Endpoints.Missions; using Shouldly; namespace MissionControl.Server.Tests.Endpoints.Missions; public class CreateMissionTests { [Fact] public async Task Creates_a_planned_mission_and_saves_it() { using var database = new TestDatabase(); var endpoint = Factory.Create(database.Context); var request = new CreateMissionRequest { Name = "Orbital Bloom", Description = "Grow the first orchard in orbit.", }; await endpoint.HandleAsync(request, CancellationToken.None); var saved = await database.Context.Missions.SingleAsync(); saved.Name.ShouldBe("Orbital Bloom"); saved.Status.ShouldBe(MissionStatus.Planned); endpoint.Response.Id.ShouldBe(saved.Id); } [Theory] [InlineData(null)] [InlineData("")] [InlineData(" ")] public void Rejects_a_blank_or_null_mission_name(string? name) { var validator = new CreateMissionRequestValidator(); var result = validator.Validate(new CreateMissionRequest { Name = name! }); result.IsValid.ShouldBeFalse(); result.Errors.ShouldContain(e => e.PropertyName == nameof(CreateMissionRequest.Name)); } [Theory] [InlineData(101)] [InlineData(567)] [InlineData(1000)] [InlineData(10000)] public void Rejects_a_too_long_mission_name(int length) { var validator = new CreateMissionRequestValidator(); var name = new string('a', length); var result = validator.Validate(new CreateMissionRequest { Name = name }); result.IsValid.ShouldBeFalse(); result.Errors.ShouldContain(e => e.PropertyName == nameof(CreateMissionRequest.Name)); } [Theory] [InlineData(501)] [InlineData(567)] [InlineData(1000)] [InlineData(10000)] public void Rejects_a_too_long_mission_description(int length) { var validator = new CreateMissionRequestValidator(); var description = new string('a', length); var result = validator.Validate(new CreateMissionRequest { Name = "name", Description = description}); result.IsValid.ShouldBeFalse(); result.Errors.ShouldContain(e => e.PropertyName == nameof(CreateMissionRequest.Description)); } }