merge(main): resolve PR #303 conflicts
This commit is contained in:
@@ -13,7 +13,28 @@ function jsonResponse(status: number, body: unknown) {
|
||||
} as unknown as Response;
|
||||
}
|
||||
|
||||
function sessionDetailPayload(status: string, options?: { answers?: string[]; players?: Array<{ id: number; nickname: string; score: number }>; roundQuestionId?: number | null }) {
|
||||
function sessionDetailPayload(
|
||||
status: string,
|
||||
options?: {
|
||||
answers?: string[];
|
||||
players?: Array<{ id: number; nickname: string; score: number }>;
|
||||
roundQuestionId?: number | null;
|
||||
reveal?: {
|
||||
correct_answer: string;
|
||||
prompt?: string;
|
||||
lies?: Array<{ player_id: number; nickname: string; text: string; created_at?: string }>;
|
||||
guesses?: Array<{
|
||||
player_id: number;
|
||||
nickname: string;
|
||||
selected_text: string;
|
||||
is_correct: boolean;
|
||||
fooled_player_id: number | null;
|
||||
fooled_player_nickname?: string;
|
||||
created_at?: string;
|
||||
}>;
|
||||
} | null;
|
||||
}
|
||||
) {
|
||||
const answers = options?.answers ?? [];
|
||||
const roundQuestionId = options?.roundQuestionId ?? 11;
|
||||
|
||||
@@ -39,6 +60,23 @@ function sessionDetailPayload(status: string, options?: { answers?: string[]; pl
|
||||
...player,
|
||||
is_connected: true,
|
||||
})),
|
||||
reveal:
|
||||
options?.reveal === undefined || options?.reveal === null
|
||||
? null
|
||||
: {
|
||||
round_question_id: roundQuestionId,
|
||||
round_number: 1,
|
||||
prompt: options.reveal.prompt ?? 'Q?',
|
||||
correct_answer: options.reveal.correct_answer,
|
||||
lies: (options.reveal.lies ?? []).map((lie) => ({
|
||||
...lie,
|
||||
created_at: lie.created_at ?? '2026-01-01T00:00:05Z',
|
||||
})),
|
||||
guesses: (options.reveal.guesses ?? []).map((guess) => ({
|
||||
...guess,
|
||||
created_at: guess.created_at ?? '2026-01-01T00:00:10Z',
|
||||
})),
|
||||
},
|
||||
phase_view_model: {
|
||||
status,
|
||||
round_number: 1,
|
||||
@@ -157,6 +195,63 @@ describe('PlayerShellComponent gameplay wiring', () => {
|
||||
expect(component.finalLeaderboard.map((entry) => entry.nickname)).toEqual(['Luna', 'Mads']);
|
||||
});
|
||||
|
||||
it('hydrates canonical reveal payload after guess -> reveal', async () => {
|
||||
const fetchMock: FetchMock = vi.fn().mockResolvedValue(
|
||||
jsonResponse(
|
||||
200,
|
||||
sessionDetailPayload('reveal', {
|
||||
answers: ['A', 'B'],
|
||||
reveal: {
|
||||
correct_answer: 'A',
|
||||
lies: [{ player_id: 3, nickname: 'Løgnhals', text: 'B' }],
|
||||
guesses: [
|
||||
{
|
||||
player_id: 9,
|
||||
nickname: 'Detektiv',
|
||||
selected_text: 'B',
|
||||
is_correct: false,
|
||||
fooled_player_id: 3,
|
||||
fooled_player_nickname: 'Løgnhals',
|
||||
},
|
||||
{
|
||||
player_id: 10,
|
||||
nickname: 'Sandhed',
|
||||
selected_text: 'A',
|
||||
is_correct: true,
|
||||
fooled_player_id: null,
|
||||
},
|
||||
],
|
||||
},
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
vi.stubGlobal('fetch', fetchMock);
|
||||
|
||||
const component = new PlayerShellComponent();
|
||||
component.sessionCode = 'ABCD12';
|
||||
|
||||
await component.refreshSession();
|
||||
|
||||
expect(component.session?.reveal?.correct_answer).toBe('A');
|
||||
expect(component.session?.reveal?.lies[0]).toMatchObject({ player_id: 3, nickname: 'Løgnhals', text: 'B' });
|
||||
expect(component.session?.reveal?.guesses[0]).toMatchObject({
|
||||
player_id: 9,
|
||||
nickname: 'Detektiv',
|
||||
selected_text: 'B',
|
||||
is_correct: false,
|
||||
fooled_player_id: 3,
|
||||
fooled_player_nickname: 'Løgnhals',
|
||||
});
|
||||
expect(component.session?.reveal?.guesses[1]).toMatchObject({
|
||||
player_id: 10,
|
||||
nickname: 'Sandhed',
|
||||
selected_text: 'A',
|
||||
is_correct: true,
|
||||
fooled_player_id: null,
|
||||
});
|
||||
});
|
||||
|
||||
it('surfaces guess submit error and retries with selected answer payload', async () => {
|
||||
const fetchMock: FetchMock = vi
|
||||
.fn()
|
||||
@@ -539,4 +634,28 @@ describe('PlayerShellComponent gameplay wiring', () => {
|
||||
expect(component.clientHasNoAudioOutput).toBe(false);
|
||||
});
|
||||
|
||||
it('keeps phone client controls phase-specific and low-complexity', () => {
|
||||
const component = new PlayerShellComponent();
|
||||
|
||||
expect(component.showJoinControls).toBe(true);
|
||||
expect(component.showLieControls).toBe(false);
|
||||
expect(component.showGuessControls).toBe(false);
|
||||
expect(component.showFinalLeaderboard).toBe(false);
|
||||
|
||||
component.session = sessionDetailPayload('lie') as any;
|
||||
component.playerId = 9;
|
||||
component.sessionToken = 'tok';
|
||||
expect(component.showJoinControls).toBe(false);
|
||||
expect(component.showLieControls).toBe(true);
|
||||
expect(component.showGuessControls).toBe(false);
|
||||
|
||||
component.session = sessionDetailPayload('guess', { answers: ['A', 'B'] }) as any;
|
||||
expect(component.showLieControls).toBe(false);
|
||||
expect(component.showGuessControls).toBe(true);
|
||||
|
||||
component.session = sessionDetailPayload('finished', { players: [{ id: 1, nickname: 'Luna', score: 8 }] }) as any;
|
||||
expect(component.showGuessControls).toBe(false);
|
||||
expect(component.showFinalLeaderboard).toBe(true);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user