namespace RpgRoller.Tests; public sealed class ServiceCampaignTests { [Fact] public void CampaignAndCharacterOperations_CheckUnauthorizedAndNotFoundCases() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; var unauthorizedCampaign = service.CreateCampaign("missing", new CreateCampaignCommand("Name", "d6")); Assert.False(unauthorizedCampaign.Succeeded); service.Register(new RegisterCommand("gm", "Password123", "GM")); var gmSession = ServiceTestSupport.GetValue(service.Login(new LoginCommand("gm", "Password123"))).SessionToken; var campaign = ServiceTestSupport.GetValue(service.CreateCampaign(gmSession, new CreateCampaignCommand("Name", "d6"))); var invalidRuleset = service.CreateCampaign(gmSession, new CreateCampaignCommand("Name 2", "unknown")); Assert.False(invalidRuleset.Succeeded); var noCampaignCharacter = service.CreateCharacter(gmSession, new CreateCharacterCommand("Hero", Guid.NewGuid())); Assert.False(noCampaignCharacter.Succeeded); var character = ServiceTestSupport.GetValue(service.CreateCharacter(gmSession, new CreateCharacterCommand("Hero", campaign.Id))); var missingCharacterActivate = service.ActivateCharacter(gmSession, Guid.NewGuid()); Assert.False(missingCharacterActivate.Succeeded); var activateSuccess = service.ActivateCharacter(gmSession, character.Id); Assert.True(activateSuccess.Succeeded); var currentCharacters = service.GetCurrentCampaignCharacters(gmSession); Assert.True(currentCharacters.Succeeded); Assert.Single(ServiceTestSupport.GetValue(currentCharacters)); var missingCampaignGet = service.GetCampaign(gmSession, Guid.NewGuid()); Assert.False(missingCampaignGet.Succeeded); } [Fact] public void CurrentCampaignCharacters_ReturnsNoActiveCharacterWhenUnset() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; service.Register(new RegisterCommand("user", "Password123", "User")); var sessionToken = ServiceTestSupport.GetValue(service.Login(new LoginCommand("user", "Password123"))).SessionToken; var result = service.GetCurrentCampaignCharacters(sessionToken); Assert.False(result.Succeeded); } [Fact] public void GetCampaigns_ReturnsOwnedAndParticipatingCampaigns() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; service.Register(new RegisterCommand("gm", "Password123", "GM")); service.Register(new RegisterCommand("player", "Password123", "Player")); var gmSession = ServiceTestSupport.GetValue(service.Login(new LoginCommand("gm", "Password123"))).SessionToken; var playerSession = ServiceTestSupport.GetValue(service.Login(new LoginCommand("player", "Password123"))).SessionToken; var gmCampaign = ServiceTestSupport.GetValue(service.CreateCampaign(gmSession, new CreateCampaignCommand("Owned", "d6"))); _ = ServiceTestSupport.GetValue(service.CreateCampaign(gmSession, new CreateCampaignCommand("Owned 2", "d6"))); _ = service.CreateCharacter(playerSession, new CreateCharacterCommand("Joiner", gmCampaign.Id)); var playerCampaigns = service.GetCampaigns(playerSession); Assert.True(playerCampaigns.Succeeded); var campaigns = ServiceTestSupport.GetValue(playerCampaigns); Assert.Single(campaigns); Assert.Equal(gmCampaign.Id, campaigns[0].Id); } [Fact] public void GetCampaign_ForNonGm_ReturnsOnlyOwnedCharactersAndSkills() { using var harness = ServiceTestSupport.CreateHarness(); var service = harness.Service; service.Register(new RegisterCommand("gm", "Password123", "GM")); service.Register(new RegisterCommand("owner", "Password123", "Owner")); service.Register(new RegisterCommand("other", "Password123", "Other")); var gmSession = ServiceTestSupport.GetValue(service.Login(new LoginCommand("gm", "Password123"))).SessionToken; var ownerSession = ServiceTestSupport.GetValue(service.Login(new LoginCommand("owner", "Password123"))).SessionToken; var otherSession = ServiceTestSupport.GetValue(service.Login(new LoginCommand("other", "Password123"))).SessionToken; var campaign = ServiceTestSupport.GetValue(service.CreateCampaign(gmSession, new CreateCampaignCommand("Main", "d6"))); var ownerCharacter = ServiceTestSupport.GetValue(service.CreateCharacter(ownerSession, new CreateCharacterCommand("Owner Character", campaign.Id))); var otherCharacter = ServiceTestSupport.GetValue(service.CreateCharacter(otherSession, new CreateCharacterCommand("Other Character", campaign.Id))); var ownerSkill = ServiceTestSupport.GetValue(service.CreateSkill(ownerSession, ownerCharacter.Id, new CreateSkillCommand("Stealth", "2D+1"))); _ = ServiceTestSupport.GetValue(service.CreateSkill(otherSession, otherCharacter.Id, new CreateSkillCommand("Perception", "1D+2"))); var ownerView = ServiceTestSupport.GetValue(service.GetCampaign(ownerSession, campaign.Id)); Assert.Single(ownerView.Characters); Assert.Equal(ownerCharacter.Id, ownerView.Characters[0].Id); Assert.Single(ownerView.Skills); Assert.Equal(ownerSkill.Id, ownerView.Skills[0].Id); } }