Merge pull request 'fix(spa): preserve scoreboard phase in Angular state sync (#200)' (#213) from feat/issue-200-angular-host-handoff into main
All checks were successful
CI / test-and-quality (push) Successful in 2m34s
All checks were successful
CI / test-and-quality (push) Successful in 2m34s
This commit was merged in pull request #213.
This commit is contained in:
96
frontend/angular/src/app/gameplay-phase-machine.spec.ts
Normal file
96
frontend/angular/src/app/gameplay-phase-machine.spec.ts
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
import { describe, expect, it } from 'vitest';
|
||||||
|
|
||||||
|
import { deriveGameplayPhase, transitionGameplayPhase } from '../../../src/spa/gameplay-phase-machine';
|
||||||
|
|
||||||
|
describe('gameplay phase machine sync guards', () => {
|
||||||
|
it('keeps explicit scoreboard status as scoreboard phase', () => {
|
||||||
|
const phase = deriveGameplayPhase({
|
||||||
|
session: {
|
||||||
|
code: 'ABCD12',
|
||||||
|
status: 'scoreboard',
|
||||||
|
host_id: 1,
|
||||||
|
current_round: 1,
|
||||||
|
players_count: 2,
|
||||||
|
},
|
||||||
|
round_question: null,
|
||||||
|
players: [],
|
||||||
|
phase_view_model: {
|
||||||
|
status: 'scoreboard',
|
||||||
|
round_number: 1,
|
||||||
|
players_count: 2,
|
||||||
|
constraints: {
|
||||||
|
min_players_to_start: 2,
|
||||||
|
max_players_mvp: 8,
|
||||||
|
min_players_reached: true,
|
||||||
|
max_players_allowed: true,
|
||||||
|
},
|
||||||
|
host: {
|
||||||
|
can_start_round: false,
|
||||||
|
can_show_question: false,
|
||||||
|
can_mix_answers: false,
|
||||||
|
can_calculate_scores: false,
|
||||||
|
can_reveal_scoreboard: false,
|
||||||
|
can_start_next_round: true,
|
||||||
|
can_finish_game: true,
|
||||||
|
},
|
||||||
|
player: {
|
||||||
|
can_join: false,
|
||||||
|
can_submit_lie: false,
|
||||||
|
can_submit_guess: false,
|
||||||
|
can_view_final_result: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(phase).toBe('scoreboard');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('maps finished status to scoreboard phase fallback', () => {
|
||||||
|
const phase = deriveGameplayPhase({
|
||||||
|
session: {
|
||||||
|
code: 'ABCD12',
|
||||||
|
status: 'finished',
|
||||||
|
host_id: 1,
|
||||||
|
current_round: 1,
|
||||||
|
players_count: 2,
|
||||||
|
},
|
||||||
|
round_question: null,
|
||||||
|
players: [],
|
||||||
|
phase_view_model: {
|
||||||
|
status: 'finished',
|
||||||
|
round_number: 1,
|
||||||
|
players_count: 2,
|
||||||
|
constraints: {
|
||||||
|
min_players_to_start: 2,
|
||||||
|
max_players_mvp: 8,
|
||||||
|
min_players_reached: true,
|
||||||
|
max_players_allowed: true,
|
||||||
|
},
|
||||||
|
host: {
|
||||||
|
can_start_round: false,
|
||||||
|
can_show_question: false,
|
||||||
|
can_mix_answers: false,
|
||||||
|
can_calculate_scores: false,
|
||||||
|
can_reveal_scoreboard: false,
|
||||||
|
can_start_next_round: false,
|
||||||
|
can_finish_game: false,
|
||||||
|
},
|
||||||
|
player: {
|
||||||
|
can_join: false,
|
||||||
|
can_submit_lie: false,
|
||||||
|
can_submit_guess: false,
|
||||||
|
can_view_final_result: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(phase).toBe('scoreboard');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('transitions reveal -> scoreboard on SCOREBOARD_READY', () => {
|
||||||
|
expect(transitionGameplayPhase('reveal', 'SCOREBOARD_READY')).toEqual({
|
||||||
|
phase: 'scoreboard',
|
||||||
|
changed: true,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -46,7 +46,7 @@ export function deriveGameplayPhase(session: SessionDetailResponse | null): Game
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (status === 'lie' || status === 'guess' || status === 'reveal') {
|
if (status === 'lie' || status === 'guess' || status === 'reveal' || status === 'scoreboard') {
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user