diff --git a/apps/api/src/combat/combat.service.spec.ts b/apps/api/src/combat/combat.service.spec.ts index 539a5ff..e0ee9ac 100644 --- a/apps/api/src/combat/combat.service.spec.ts +++ b/apps/api/src/combat/combat.service.spec.ts @@ -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); + }); }); });