Allow GM play roster access
This commit is contained in:
@@ -13,26 +13,33 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(gmClient, "gm", "Password123", "Game Master");
|
||||
await LoginAsync(gmClient, "gm", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Alpha Campaign", "dnd5e"));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Alpha Campaign", "dnd5e"));
|
||||
|
||||
var gmCharacter = await PostAsync<CreateCharacterRequest, CharacterSummary>(gmClient, "/api/characters", new("Arin", campaign.Id));
|
||||
var gmCharacter =
|
||||
await PostAsync<CreateCharacterRequest, CharacterSummary>(gmClient, "/api/characters",
|
||||
new("Arin", campaign.Id));
|
||||
Assert.Equal("Game Master", gmCharacter.OwnerDisplayName);
|
||||
|
||||
var activateResponse = await gmClient.PostAsync($"/api/characters/{gmCharacter.Id}/activate", null);
|
||||
Assert.Equal(HttpStatusCode.OK, activateResponse.StatusCode);
|
||||
|
||||
var createdSkill = await PostAsync<CreateSkillRequest, SkillSummary>(gmClient, $"/api/characters/{gmCharacter.Id}/skills", new("Arcana", "2d12+2", 0, false));
|
||||
var createdSkill = await PostAsync<CreateSkillRequest, SkillSummary>(gmClient,
|
||||
$"/api/characters/{gmCharacter.Id}/skills", new("Arcana", "2d12+2", 0, false));
|
||||
Assert.Equal("2d12+2", createdSkill.DiceRollDefinition);
|
||||
Assert.Equal(0, createdSkill.WildDice);
|
||||
Assert.False(createdSkill.AllowFumble);
|
||||
|
||||
var updatedSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(gmClient, $"/api/skills/{createdSkill.Id}", new("Arcana Mastery", "2d12+3", 0, false));
|
||||
var updatedSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(gmClient, $"/api/skills/{createdSkill.Id}",
|
||||
new("Arcana Mastery", "2d12+3", 0, false));
|
||||
Assert.Equal("Arcana Mastery", updatedSkill.Name);
|
||||
Assert.Equal("2d12+3", updatedSkill.DiceRollDefinition);
|
||||
Assert.Equal(0, updatedSkill.WildDice);
|
||||
Assert.False(updatedSkill.AllowFumble);
|
||||
|
||||
var invalidSkill = await gmClient.PostAsJsonAsync($"/api/characters/{gmCharacter.Id}/skills", new CreateSkillRequest("Broken", "5D+4", 0, false));
|
||||
var invalidSkill = await gmClient.PostAsJsonAsync($"/api/characters/{gmCharacter.Id}/skills",
|
||||
new CreateSkillRequest("Broken", "5D+4", 0, false));
|
||||
Assert.Equal(HttpStatusCode.BadRequest, invalidSkill.StatusCode);
|
||||
|
||||
var details = await GetAsync<CampaignRoster>(gmClient, $"/api/campaigns/{campaign.Id}");
|
||||
@@ -53,14 +60,49 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
Assert.Equal(gmCharacter.Id, currentCampaignCharacters[0].Id);
|
||||
Assert.Equal("Game Master", currentCampaignCharacters[0].OwnerDisplayName);
|
||||
|
||||
var otherCampaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Beta Campaign", "d6"));
|
||||
var otherCampaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Beta Campaign", "d6"));
|
||||
|
||||
var updatedCharacter = await PutAsync<UpdateCharacterRequest, CharacterSummary>(gmClient, $"/api/characters/{gmCharacter.Id}", new("Arin Updated", otherCampaign.Id));
|
||||
var updatedCharacter = await PutAsync<UpdateCharacterRequest, CharacterSummary>(gmClient,
|
||||
$"/api/characters/{gmCharacter.Id}", new("Arin Updated", otherCampaign.Id));
|
||||
|
||||
Assert.Equal("Arin Updated", updatedCharacter.Name);
|
||||
Assert.Equal(otherCampaign.Id, updatedCharacter.CampaignId);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task GmCanActivateAnotherPlayersCharacter_AndMeReflectsCampaignContext()
|
||||
{
|
||||
using var factory = CreateFactory(3, 3, 3);
|
||||
using var gmClient = factory.CreateClient(new() { AllowAutoRedirect = false });
|
||||
using var playerClient = factory.CreateClient(new() { AllowAutoRedirect = false });
|
||||
using var outsiderClient = factory.CreateClient(new() { AllowAutoRedirect = false });
|
||||
|
||||
await RegisterAsync(gmClient, "gm-activate", "Password123", "GM");
|
||||
await RegisterAsync(playerClient, "player-activate", "Password123", "Player");
|
||||
await RegisterAsync(outsiderClient, "outsider-activate", "Password123", "Outsider");
|
||||
|
||||
await LoginAsync(gmClient, "gm-activate", "Password123");
|
||||
await LoginAsync(playerClient, "player-activate", "Password123");
|
||||
await LoginAsync(outsiderClient, "outsider-activate", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Activation Campaign", "d6"));
|
||||
var playerCharacter = await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters",
|
||||
new("Scout", campaign.Id));
|
||||
|
||||
var gmActivate = await gmClient.PostAsync($"/api/characters/{playerCharacter.Id}/activate", null);
|
||||
Assert.Equal(HttpStatusCode.OK, gmActivate.StatusCode);
|
||||
|
||||
var gmMe = await GetAsync<MeResponse>(gmClient, "/api/me");
|
||||
Assert.Equal(playerCharacter.Id, gmMe.ActiveCharacterId);
|
||||
Assert.Equal(campaign.Id, gmMe.CurrentCampaignId);
|
||||
|
||||
var outsiderActivate = await outsiderClient.PostAsync($"/api/characters/{playerCharacter.Id}/activate", null);
|
||||
Assert.Equal(HttpStatusCode.BadRequest, outsiderActivate.StatusCode);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task CampaignCreation_AcceptsRolemasterRuleset()
|
||||
{
|
||||
@@ -70,7 +112,9 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(gmClient, "gm-rm-api", "Password123", "Game Master");
|
||||
await LoginAsync(gmClient, "gm-rm-api", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Shadow World", "rolemaster"));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Shadow World", "rolemaster"));
|
||||
|
||||
Assert.Equal("rolemaster", campaign.RulesetId);
|
||||
}
|
||||
@@ -84,23 +128,32 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(gmClient, "gm-rm-skill", "Password123", "Game Master");
|
||||
await LoginAsync(gmClient, "gm-rm-skill", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Shadow World", "rolemaster"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(gmClient, "/api/characters", new("Kalen", campaign.Id));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Shadow World", "rolemaster"));
|
||||
var character =
|
||||
await PostAsync<CreateCharacterRequest, CharacterSummary>(gmClient, "/api/characters",
|
||||
new("Kalen", campaign.Id));
|
||||
|
||||
var missingFumbleRange = await gmClient.PostAsJsonAsync($"/api/characters/{character.Id}/skills", new CreateSkillRequest("Bad Open Ended", "d100!+35", 0, false));
|
||||
var missingFumbleRange = await gmClient.PostAsJsonAsync($"/api/characters/{character.Id}/skills",
|
||||
new CreateSkillRequest("Bad Open Ended", "d100!+35", 0, false));
|
||||
Assert.Equal(HttpStatusCode.BadRequest, missingFumbleRange.StatusCode);
|
||||
|
||||
var group = await PostAsync<CreateSkillGroupRequest, SkillGroupSummary>(gmClient, $"/api/characters/{character.Id}/skill-groups", new("Perception", "d100!+15", 0, false, 5));
|
||||
var group = await PostAsync<CreateSkillGroupRequest, SkillGroupSummary>(gmClient,
|
||||
$"/api/characters/{character.Id}/skill-groups", new("Perception", "d100!+15", 0, false, 5));
|
||||
Assert.Equal(5, group.FumbleRange);
|
||||
|
||||
var invalidRetry = await gmClient.PostAsJsonAsync($"/api/characters/{character.Id}/skills", new CreateSkillRequest("Bad Retry", "d100+35", 0, false, group.Id, null, true));
|
||||
var invalidRetry = await gmClient.PostAsJsonAsync($"/api/characters/{character.Id}/skills",
|
||||
new CreateSkillRequest("Bad Retry", "d100+35", 0, false, group.Id, null, true));
|
||||
Assert.Equal(HttpStatusCode.BadRequest, invalidRetry.StatusCode);
|
||||
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(gmClient, $"/api/characters/{character.Id}/skills", new("Awareness", "d100!+35", 0, false, group.Id, 3, true));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(gmClient,
|
||||
$"/api/characters/{character.Id}/skills", new("Awareness", "d100!+35", 0, false, group.Id, 3, true));
|
||||
Assert.Equal(3, skill.FumbleRange);
|
||||
Assert.True(skill.RolemasterAutoRetry);
|
||||
|
||||
var updatedSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(gmClient, $"/api/skills/{skill.Id}", new("Awareness", "d100!+45", 0, false, group.Id, 4, true));
|
||||
var updatedSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(gmClient, $"/api/skills/{skill.Id}",
|
||||
new("Awareness", "d100!+45", 0, false, group.Id, 4, true));
|
||||
Assert.Equal(4, updatedSkill.FumbleRange);
|
||||
Assert.True(updatedSkill.RolemasterAutoRetry);
|
||||
|
||||
@@ -128,23 +181,31 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(receiverClient, "receiver2", "Password123", "Receiver");
|
||||
await LoginAsync(receiverClient, "receiver2", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Grouped Campaign", "d6"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(ownerClient, "/api/characters", new("Grouped Hero", campaign.Id));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Grouped Campaign", "d6"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(ownerClient, "/api/characters",
|
||||
new("Grouped Hero", campaign.Id));
|
||||
|
||||
var createdGroup = await PostAsync<CreateSkillGroupRequest, SkillGroupSummary>(ownerClient, $"/api/characters/{character.Id}/skill-groups", new("Combat", "2D+1", 1, true));
|
||||
var renamedGroup = await PutAsync<UpdateSkillGroupRequest, SkillGroupSummary>(gmClient, $"/api/skill-groups/{createdGroup.Id}", new("Battle", "3D+2", 2, false));
|
||||
var createdGroup = await PostAsync<CreateSkillGroupRequest, SkillGroupSummary>(ownerClient,
|
||||
$"/api/characters/{character.Id}/skill-groups", new("Combat", "2D+1", 1, true));
|
||||
var renamedGroup = await PutAsync<UpdateSkillGroupRequest, SkillGroupSummary>(gmClient,
|
||||
$"/api/skill-groups/{createdGroup.Id}", new("Battle", "3D+2", 2, false));
|
||||
Assert.Equal("Battle", renamedGroup.Name);
|
||||
Assert.Equal("3D+2", renamedGroup.DiceRollDefinition);
|
||||
Assert.Equal(2, renamedGroup.WildDice);
|
||||
Assert.False(renamedGroup.AllowFumble);
|
||||
|
||||
var groupedSkill = await PostAsync<CreateSkillRequest, SkillSummary>(ownerClient, $"/api/characters/{character.Id}/skills", new("Strike", "2D+1", 1, true, renamedGroup.Id));
|
||||
var groupedSkill = await PostAsync<CreateSkillRequest, SkillSummary>(ownerClient,
|
||||
$"/api/characters/{character.Id}/skills", new("Strike", "2D+1", 1, true, renamedGroup.Id));
|
||||
Assert.Equal(renamedGroup.Id, groupedSkill.SkillGroupId);
|
||||
|
||||
var ungroupedSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(ownerClient, $"/api/skills/{groupedSkill.Id}", new("Strike", "2D+1", 1, true));
|
||||
var ungroupedSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(ownerClient,
|
||||
$"/api/skills/{groupedSkill.Id}", new("Strike", "2D+1", 1, true));
|
||||
Assert.Null(ungroupedSkill.SkillGroupId);
|
||||
|
||||
var groupedAgainSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(ownerClient, $"/api/skills/{groupedSkill.Id}", new("Strike", "2D+1", 1, true, renamedGroup.Id));
|
||||
var groupedAgainSkill = await PutAsync<UpdateSkillRequest, SkillSummary>(ownerClient,
|
||||
$"/api/skills/{groupedSkill.Id}", new("Strike", "2D+1", 1, true, renamedGroup.Id));
|
||||
Assert.Equal(renamedGroup.Id, groupedAgainSkill.SkillGroupId);
|
||||
|
||||
var deleteSkill = await ownerClient.DeleteAsync($"/api/skills/{groupedAgainSkill.Id}");
|
||||
@@ -153,7 +214,8 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
var deleteGroup = await ownerClient.DeleteAsync($"/api/skill-groups/{renamedGroup.Id}");
|
||||
Assert.Equal(HttpStatusCode.OK, deleteGroup.StatusCode);
|
||||
|
||||
var transferResult = await PutAsync<UpdateCharacterRequest, CharacterSummary>(gmClient, $"/api/characters/{character.Id}", new("Grouped Hero", campaign.Id, "receiver2"));
|
||||
var transferResult = await PutAsync<UpdateCharacterRequest, CharacterSummary>(gmClient,
|
||||
$"/api/characters/{character.Id}", new("Grouped Hero", campaign.Id, "receiver2"));
|
||||
Assert.Equal("Grouped Hero", transferResult.Name);
|
||||
Assert.Equal("Receiver", transferResult.OwnerDisplayName);
|
||||
|
||||
@@ -190,12 +252,17 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
Assert.Contains(adminEntry.Roles, role => string.Equals(role, "admin", StringComparison.OrdinalIgnoreCase));
|
||||
Assert.Empty(playerEntry.Roles);
|
||||
|
||||
var promotedPlayer = await PutAsync<UpdateUserRolesRequest, AdminUserSummary>(adminClient, $"/api/admin/users/{player.Id}/roles", new(["admin"]));
|
||||
var promotedPlayer = await PutAsync<UpdateUserRolesRequest, AdminUserSummary>(adminClient,
|
||||
$"/api/admin/users/{player.Id}/roles", new(["admin"]));
|
||||
Assert.Contains(promotedPlayer.Roles, role => string.Equals(role, "admin", StringComparison.OrdinalIgnoreCase));
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Disposable Campaign", "d6"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters", new("Disposable Hero", campaign.Id));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(playerClient, $"/api/characters/{character.Id}/skills", new("Stealth", "2D+1", 1, true));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Disposable Campaign", "d6"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters",
|
||||
new("Disposable Hero", campaign.Id));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(playerClient,
|
||||
$"/api/characters/{character.Id}/skills", new("Stealth", "2D+1", 1, true));
|
||||
_ = await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll", new("public"));
|
||||
|
||||
var deleteCampaign = await adminClient.DeleteAsync($"/api/campaigns/{campaign.Id}");
|
||||
@@ -267,13 +334,18 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(playerClient, "player-options", "Password123", "Player");
|
||||
await LoginAsync(playerClient, "player-options", "Password123");
|
||||
|
||||
var firstCampaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Alpha Visible", "d6"));
|
||||
var secondCampaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(otherGmClient, "/api/campaigns", new("Beta Available", "d6"));
|
||||
var firstCampaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Alpha Visible", "d6"));
|
||||
var secondCampaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(otherGmClient, "/api/campaigns",
|
||||
new("Beta Available", "d6"));
|
||||
|
||||
var playerVisibleCampaigns = await GetAsync<IReadOnlyList<CampaignSummary>>(playerClient, "/api/campaigns");
|
||||
Assert.Empty(playerVisibleCampaigns);
|
||||
|
||||
var playerCampaignOptions = await GetAsync<IReadOnlyList<CampaignOption>>(playerClient, "/api/campaigns/options");
|
||||
var playerCampaignOptions =
|
||||
await GetAsync<IReadOnlyList<CampaignOption>>(playerClient, "/api/campaigns/options");
|
||||
Assert.Equal(2, playerCampaignOptions.Count);
|
||||
Assert.Contains(playerCampaignOptions, option => option.Id == firstCampaign.Id);
|
||||
Assert.Contains(playerCampaignOptions, option => option.Id == secondCampaign.Id);
|
||||
@@ -300,9 +372,13 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(otherClient, "other-delete", "Password123", "Other");
|
||||
await LoginAsync(otherClient, "other-delete", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Deletion Campaign", "d6"));
|
||||
var ownerCharacter = await PostAsync<CreateCharacterRequest, CharacterSummary>(ownerClient, "/api/characters", new("Owner Character", campaign.Id));
|
||||
var otherCharacter = await PostAsync<CreateCharacterRequest, CharacterSummary>(otherClient, "/api/characters", new("Other Character", campaign.Id));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns",
|
||||
new("Deletion Campaign", "d6"));
|
||||
var ownerCharacter = await PostAsync<CreateCharacterRequest, CharacterSummary>(ownerClient, "/api/characters",
|
||||
new("Owner Character", campaign.Id));
|
||||
var otherCharacter = await PostAsync<CreateCharacterRequest, CharacterSummary>(otherClient, "/api/characters",
|
||||
new("Other Character", campaign.Id));
|
||||
|
||||
var gmDeleteAttempt = await gmClient.DeleteAsync($"/api/characters/{ownerCharacter.Id}");
|
||||
Assert.Equal(HttpStatusCode.BadRequest, gmDeleteAttempt.StatusCode);
|
||||
@@ -333,14 +409,19 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(playerClient, "player-log-cap", "Password123", "Player");
|
||||
await LoginAsync(playerClient, "player-log-cap", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Log Cap", "d6"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters", new("Roller", campaign.Id));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(playerClient, $"/api/characters/{character.Id}/skills", new("Stealth", "2D+1", 1, true));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Log Cap", "d6"));
|
||||
var character =
|
||||
await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters",
|
||||
new("Roller", campaign.Id));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(playerClient,
|
||||
$"/api/characters/{character.Id}/skills", new("Stealth", "2D+1", 1, true));
|
||||
|
||||
var rollIds = new List<Guid>();
|
||||
for (var i = 0; i < 105; i++)
|
||||
{
|
||||
var roll = await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll", new("public"));
|
||||
var roll = await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll",
|
||||
new("public"));
|
||||
rollIds.Add(roll.RollId);
|
||||
}
|
||||
|
||||
@@ -369,14 +450,19 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
await RegisterAsync(playerClient, "player-log-page", "Password123", "Player");
|
||||
await LoginAsync(playerClient, "player-log-page", "Password123");
|
||||
|
||||
var campaign = await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Log Page", "d6"));
|
||||
var character = await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters", new("Roller", campaign.Id));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(playerClient, $"/api/characters/{character.Id}/skills", new("Stealth", "2D+1", 1, true));
|
||||
var campaign =
|
||||
await PostAsync<CreateCampaignRequest, CampaignSummary>(gmClient, "/api/campaigns", new("Log Page", "d6"));
|
||||
var character =
|
||||
await PostAsync<CreateCharacterRequest, CharacterSummary>(playerClient, "/api/characters",
|
||||
new("Roller", campaign.Id));
|
||||
var skill = await PostAsync<CreateSkillRequest, SkillSummary>(playerClient,
|
||||
$"/api/characters/{character.Id}/skills", new("Stealth", "2D+1", 1, true));
|
||||
|
||||
var rollIds = new List<Guid>();
|
||||
for (var i = 0; i < 5; i++)
|
||||
{
|
||||
var roll = await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll", new("public"));
|
||||
var roll = await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll",
|
||||
new("public"));
|
||||
rollIds.Add(roll.RollId);
|
||||
}
|
||||
|
||||
@@ -393,8 +479,10 @@ public sealed class CampaignApiTests(WebApplicationFactory<Program> factory) : A
|
||||
Assert.False(string.IsNullOrWhiteSpace(entry.VisibilityLabel));
|
||||
});
|
||||
|
||||
var latestRoll = await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll", new("public"));
|
||||
var incrementalPage = await GetAsync<CampaignLogPage>(gmClient, $"/api/campaigns/{campaign.Id}/log/page?afterRollId={initialPage.Cursor}&limit=3");
|
||||
var latestRoll =
|
||||
await PostAsync<RollSkillRequest, RollResult>(playerClient, $"/api/skills/{skill.Id}/roll", new("public"));
|
||||
var incrementalPage = await GetAsync<CampaignLogPage>(gmClient,
|
||||
$"/api/campaigns/{campaign.Id}/log/page?afterRollId={initialPage.Cursor}&limit=3");
|
||||
|
||||
Assert.Single(incrementalPage.Entries);
|
||||
Assert.Equal(latestRoll.RollId, incrementalPage.Entries[0].RollId);
|
||||
|
||||
Reference in New Issue
Block a user