fix(frontend): restore session context behavior in vertical slice

This commit is contained in:
2026-03-01 12:50:29 +00:00
parent 093a928e6a
commit 24a319fd8f
2 changed files with 98 additions and 8 deletions

View File

@@ -1,5 +1,9 @@
import { describe, expect, it, vi } from 'vitest';
import { createVerticalSliceController } from '../src/spa/vertical-slice';
import {
createVerticalSliceController,
type SessionContext,
type SessionContextStore
} from '../src/spa/vertical-slice';
import type { ApiClient } from '../src/api/client';
function makeApiMock(overrides?: Partial<ApiClient>): ApiClient {
@@ -58,6 +62,16 @@ function makeApiMock(overrides?: Partial<ApiClient>): ApiClient {
return { ...base, ...overrides };
}
function makeSessionContextStore(initial: SessionContext | null = null): SessionContextStore {
let value = initial;
return {
get: vi.fn(() => value),
set: vi.fn((next: SessionContext) => {
value = next;
})
};
}
describe('vertical slice controller: lobby -> join -> start round', () => {
it('tracks loading and success state for join + start flow', async () => {
const api = makeApiMock();
@@ -80,6 +94,36 @@ describe('vertical slice controller: lobby -> join -> start round', () => {
expect(postStart.startRoundState).toBe('success');
});
it('persists session context after join and syncs normalized session code', async () => {
const api = makeApiMock();
const sessionContextStore = makeSessionContextStore();
const controller = createVerticalSliceController(api, sessionContextStore);
await controller.joinLobby('abcd12', 'Maja');
expect(sessionContextStore.set).toHaveBeenCalledWith({
sessionCode: 'ABCD12',
playerToken: 'token-1',
nickname: 'Maja'
});
expect(controller.getState().sessionCode).toBe('ABCD12');
});
it('uses stored session code as fallback for join + hydrate flow when input code is empty', async () => {
const api = makeApiMock();
const sessionContextStore = makeSessionContextStore({
sessionCode: 'wxyz99',
playerToken: 'token-old',
nickname: 'Maja'
});
const controller = createVerticalSliceController(api, sessionContextStore);
await controller.joinLobby(' ', 'Maja');
expect(api.joinSession).toHaveBeenCalledWith({ code: 'WXYZ99', nickname: 'Maja' });
expect(api.getSession).toHaveBeenCalledWith('ABCD12');
});
it('surfaces a friendly error when join fails', async () => {
const api = makeApiMock({
joinSession: vi.fn().mockResolvedValue({