test(combat): cover CombatService LOST persistence
CombatService only had engine-level coverage of the LOST transition. Add service-level tests that force a loss (character.baseHp: 1) and assert the persisted status, completedAt, further-action rejection, and getCombat refresh behavior for a LOST combat.
This commit is contained in:
@@ -497,6 +497,27 @@ describe('CombatService', () => {
|
||||
);
|
||||
});
|
||||
|
||||
it('ends the combat as LOST, stops persisting new rounds, and rejects further actions', async () => {
|
||||
const state = createState({
|
||||
characters: [character({ baseHp: 1 })],
|
||||
});
|
||||
const { dataSource, service, combatId } = await startedCombat(state);
|
||||
|
||||
const result = await service.performAction(
|
||||
CHARACTER_ID,
|
||||
combatId,
|
||||
CombatAction.ATTACK,
|
||||
);
|
||||
|
||||
expect(result.status).toBe('LOST');
|
||||
expect(dataSource.state.combats[0].status).toBe(CombatStatus.LOST);
|
||||
expect(dataSource.state.combats[0].completedAt).not.toBeNull();
|
||||
await expectCombatDomainError(
|
||||
service.performAction(CHARACTER_ID, combatId, CombatAction.ATTACK),
|
||||
'COMBAT_ALREADY_FINISHED',
|
||||
);
|
||||
});
|
||||
|
||||
it('rejects actions on an unknown combat id', async () => {
|
||||
const { service } = createService();
|
||||
|
||||
@@ -565,5 +586,29 @@ describe('CombatService', () => {
|
||||
'COMBAT_NOT_FOUND',
|
||||
);
|
||||
});
|
||||
|
||||
it('keeps returning LOST after the combat has ended', async () => {
|
||||
const state = createState({
|
||||
characters: [character({ baseHp: 1 })],
|
||||
});
|
||||
const context = createService({ state });
|
||||
const started = await context.service.startCombat(
|
||||
CHARACTER_ID,
|
||||
ENCOUNTER_ID,
|
||||
);
|
||||
await context.service.performAction(
|
||||
CHARACTER_ID,
|
||||
started.id,
|
||||
CombatAction.ATTACK,
|
||||
);
|
||||
|
||||
const reloaded = await context.service.getCombat(
|
||||
CHARACTER_ID,
|
||||
started.id,
|
||||
);
|
||||
|
||||
expect(reloaded.status).toBe('LOST');
|
||||
expect(reloaded.player.currentHp).toBe(0);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user