using FastEndpoints; using Microsoft.AspNetCore.Http; using MissionControl.Domain.Entities; using MissionControl.Server.Endpoints.Missions.MissionLaunches; using Shouldly; namespace MissionControl.Server.Tests.Endpoints.Missions.MissionLaunches; public class CreateMissionLaunchTests { [Fact] public async Task Returns_not_found_when_requested_mission_does_not_exist() { using var database = new TestDatabase(); var endpoint = Factory.Create(database.Context); var request = new CreateMissionLaunchRequest { MissionId = Guid.NewGuid(), ScheduledFor = DateTimeOffset.UtcNow, Status = MissionLaunchStatus.Pending, }; await endpoint.HandleAsync(request, CancellationToken.None); endpoint.HttpContext.Response.StatusCode.ShouldBe(StatusCodes.Status404NotFound); } [Fact] public void Rejects_empty_mission_id_guid() { var validator = new CreateMissionLaunchRequestValidator(); var result = validator.Validate( new CreateMissionLaunchRequest { MissionId = Guid.Empty, ScheduledFor = default, Status = MissionLaunchStatus.Pending, } ); result.IsValid.ShouldBeFalse(); result.Errors.ShouldContain(e => e.PropertyName == nameof(CreateMissionLaunchRequest.MissionId) ); } [Fact] public async Task Creates_mission_launch_when_request_is_valid_and_mission_exists() { var utcNow = DateTimeOffset.UtcNow; using var database = new TestDatabase(); var mission = await createMission(database); var endpoint = Factory.Create(database.Context); var request = new CreateMissionLaunchRequest { MissionId = mission.Id, ScheduledFor = utcNow, Status = MissionLaunchStatus.Cancelled, }; await endpoint.HandleAsync(request, CancellationToken.None); var response = endpoint.Response; endpoint.HttpContext.Response.StatusCode.ShouldBe(StatusCodes.Status200OK); response.Id.ShouldNotBe(Guid.Empty); response.ScheduledFor.ShouldBe(utcNow); response.Status.ShouldBe(MissionLaunchStatus.Cancelled); } private static async Task createMission(TestDatabase database) { var mission = new Mission { Name = "new mission", Description = "mission description", }; database.Context.Missions.Add(mission); await database.Context.SaveChangesAsync(); return mission; } }