From b3e68069d240df6cea0d130cebdf52286bc49ce7 Mon Sep 17 00:00:00 2001 From: Stedoss <29103029+Stedoss@users.noreply.github.com> Date: Tue, 28 Jul 2026 00:28:25 +0100 Subject: [PATCH] Don't seperately parse status, let the JSON decoder do this for now --- .../MissionLaunches/CreateMissionLaunch.cs | 8 ++------ .../CreateMissionLaunchTests.cs | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/MissionControl.Server/Endpoints/Missions/MissionLaunches/CreateMissionLaunch.cs b/src/MissionControl.Server/Endpoints/Missions/MissionLaunches/CreateMissionLaunch.cs index d8de0a1..53d620e 100644 --- a/src/MissionControl.Server/Endpoints/Missions/MissionLaunches/CreateMissionLaunch.cs +++ b/src/MissionControl.Server/Endpoints/Missions/MissionLaunches/CreateMissionLaunch.cs @@ -26,8 +26,7 @@ public class CreateMissionLaunch(MissionControlContext dbContext) var missionLaunch = new MissionLaunch { ScheduledFor = req.ScheduledFor, - // Validated in `CreateMissionLaunchRequestValidator` - Status = Enum.Parse(req.Status, true), + Status = req.Status, MissionId = req.MissionId, }; @@ -43,9 +42,7 @@ public record CreateMissionLaunchRequest public Guid MissionId { get; init; } public required DateTimeOffset ScheduledFor { get; init; } - // Define as a string here so it can be safely deserialized into its enum type, with a validation message when unable to do so - // Otherwise, we return a serialization error that is not assigned to a specific field - public required string Status { get; init; } + public required MissionLaunchStatus Status { get; init; } } public class CreateMissionLaunchRequestValidator : Validator @@ -55,6 +52,5 @@ public class CreateMissionLaunchRequestValidator : Validator req.MissionId) .NotEqual(Guid.Empty) .WithMessage("Please provide a non-zero GUID."); - RuleFor(req => req.Status).IsEnumName(typeof(MissionLaunchStatus), false); } } diff --git a/test/MissionControl.Server.Tests/Endpoints/Missions/MissionLaunches/CreateMissionLaunchTests.cs b/test/MissionControl.Server.Tests/Endpoints/Missions/MissionLaunches/CreateMissionLaunchTests.cs index 88e8d03..58deddf 100644 --- a/test/MissionControl.Server.Tests/Endpoints/Missions/MissionLaunches/CreateMissionLaunchTests.cs +++ b/test/MissionControl.Server.Tests/Endpoints/Missions/MissionLaunches/CreateMissionLaunchTests.cs @@ -18,7 +18,7 @@ public class CreateMissionLaunchTests { MissionId = Guid.NewGuid(), ScheduledFor = DateTimeOffset.UtcNow, - Status = "Pending", + Status = MissionLaunchStatus.Pending, }; await endpoint.HandleAsync(request, CancellationToken.None); @@ -27,4 +27,21 @@ public class CreateMissionLaunchTests (await database.Context.MissionLaunches.AnyAsync()).ShouldBeFalse(); } + + [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)); + } + }