namespace RpgRoller.Tests; public sealed class ServiceSkillRollTests { [Fact] public void CharacterSkillAndRollOperations_CheckAuthorizationAndValidationBranches() { using var harness = ServiceTestSupport.CreateHarness(3, 4, 5, 6); var service = harness.Service; service.Register("gm", "Password123", "GM"); service.Register("owner", "Password123", "Owner"); service.Register("other", "Password123", "Other"); var gmSession = ServiceTestSupport.GetValue(service.Login("gm", "Password123")).SessionToken; var ownerSession = ServiceTestSupport.GetValue(service.Login("owner", "Password123")).SessionToken; var otherSession = ServiceTestSupport.GetValue(service.Login("other", "Password123")).SessionToken; var campaign = ServiceTestSupport.GetValue(service.CreateCampaign(gmSession, "Main", "dnd5e")); var character = ServiceTestSupport.GetValue(service.CreateCharacter(ownerSession, "Owner Char", campaign.Id)); var noPermissionUpdate = service.UpdateCharacter(otherSession, character.Id, "Renamed", campaign.Id); Assert.False(noPermissionUpdate.Succeeded); var invalidCharacterName = service.UpdateCharacter(ownerSession, character.Id, "", campaign.Id); Assert.False(invalidCharacterName.Succeeded); var missingTargetCampaign = service.UpdateCharacter(ownerSession, character.Id, "Renamed", Guid.NewGuid()); Assert.False(missingTargetCampaign.Succeeded); var noSkillName = service.CreateSkill(ownerSession, character.Id, "", "1d20", 0, false); Assert.False(noSkillName.Succeeded); var invalidExpression = service.CreateSkill(ownerSession, character.Id, "Skill", "5D+4", 0, false); Assert.False(invalidExpression.Succeeded); var skill = ServiceTestSupport.GetValue(service.CreateSkill(ownerSession, character.Id, "Skill", "1d20+2", 0, false)); var missingSkillUpdate = service.UpdateSkill(ownerSession, Guid.NewGuid(), "X", "1d20", 0, false); Assert.False(missingSkillUpdate.Succeeded); var forbiddenSkillUpdate = service.UpdateSkill(otherSession, skill.Id, "X", "1d20", 0, false); Assert.False(forbiddenSkillUpdate.Succeeded); var gmSkillUpdate = service.UpdateSkill(gmSession, skill.Id, "GM Edit", "2d6+1", 0, false); Assert.True(gmSkillUpdate.Succeeded); var missingRoll = service.RollSkill(ownerSession, Guid.NewGuid(), "public"); Assert.False(missingRoll.Succeeded); var invalidVisibility = service.RollSkill(ownerSession, skill.Id, "hidden"); Assert.False(invalidVisibility.Succeeded); var forbiddenRoll = service.RollSkill(otherSession, skill.Id, "public"); Assert.False(forbiddenRoll.Succeeded); var privateRoll = service.RollSkill(ownerSession, skill.Id, "private"); var publicRoll = service.RollSkill(ownerSession, skill.Id, "public"); Assert.True(privateRoll.Succeeded); Assert.True(publicRoll.Succeeded); var ownerLog = service.GetCampaignLog(ownerSession, campaign.Id); var gmLog = service.GetCampaignLog(gmSession, campaign.Id); var outsiderLog = service.GetCampaignLog(otherSession, campaign.Id); Assert.Equal(2, ServiceTestSupport.GetValue(ownerLog).Count); Assert.Equal(2, ServiceTestSupport.GetValue(gmLog).Count); Assert.False(outsiderLog.Succeeded); var version = service.GetCampaignVersion(ownerSession, campaign.Id); var missingVersion = service.GetCampaignVersion(ownerSession, Guid.NewGuid()); Assert.True(version.Succeeded); Assert.False(missingVersion.Succeeded); } }