using Microsoft.AspNetCore.Mvc.Testing; namespace RpgRoller.Tests; public sealed class CampaignApiTests : ApiTestBase { public CampaignApiTests(WebApplicationFactory factory) : base(factory) { } [Fact] public async Task CampaignCharacterAndSkillFlow_EnforcesRulesetValidation() { using var factory = CreateFactory(6, 6, 6); using var gmClient = factory.CreateClient(new WebApplicationFactoryClientOptions { AllowAutoRedirect = false }); await RegisterAsync(gmClient, "gm", "Password123", "Game Master"); await LoginAsync(gmClient, "gm", "Password123"); var campaign = await PostAsync( gmClient, "/api/campaigns", new CreateCampaignRequest("Alpha Campaign", "dnd5e")); var gmCharacter = await PostAsync( gmClient, "/api/characters", new CreateCharacterRequest("Arin", campaign.Id)); var activateResponse = await gmClient.PostAsync($"/api/characters/{gmCharacter.Id}/activate", null); Assert.Equal(HttpStatusCode.OK, activateResponse.StatusCode); var createdSkill = await PostAsync( gmClient, $"/api/characters/{gmCharacter.Id}/skills", new CreateSkillRequest("Arcana", "2d12+2")); Assert.Equal("2d12+2", createdSkill.DiceRollDefinition); var updatedSkill = await PutAsync( gmClient, $"/api/skills/{createdSkill.Id}", new UpdateSkillRequest("Arcana Mastery", "2d12+3")); Assert.Equal("Arcana Mastery", updatedSkill.Name); Assert.Equal("2d12+3", updatedSkill.DiceRollDefinition); var invalidSkill = await gmClient.PostAsJsonAsync( $"/api/characters/{gmCharacter.Id}/skills", new CreateSkillRequest("Broken", "5D+4")); Assert.Equal(HttpStatusCode.BadRequest, invalidSkill.StatusCode); var details = await GetAsync(gmClient, $"/api/campaigns/{campaign.Id}"); Assert.Equal(campaign.Id, details.Id); Assert.Single(details.Characters); Assert.Single(details.Skills); var currentCampaignCharacters = await GetAsync>(gmClient, "/api/characters/current-campaign"); Assert.Single(currentCampaignCharacters); Assert.Equal(gmCharacter.Id, currentCampaignCharacters[0].Id); var otherCampaign = await PostAsync( gmClient, "/api/campaigns", new CreateCampaignRequest("Beta Campaign", "d6")); var updatedCharacter = await PutAsync( gmClient, $"/api/characters/{gmCharacter.Id}", new UpdateCharacterRequest("Arin Updated", otherCampaign.Id)); Assert.Equal("Arin Updated", updatedCharacter.Name); Assert.Equal(otherCampaign.Id, updatedCharacter.CampaignId); } }