Stage 7 (wip): tests + UI CI
- Vitest units: board replay, placement machine, premium parity, i18n key parity, FlatBuffers codec round-trips (19 tests) - Playwright smoke (mock transport): guest -> lobby -> board -> place tile -> preview - ui-test.yaml workflow: check/unit/build + bundle-size budget (67.5KB gzip < 100KB) + chromium e2e - gateway transcode tests for games.list (seat display_name), pass, hint - backend integration test for game.ListForAccount
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
import { Builder, ByteBuffer } from 'flatbuffers';
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import * as fb from '../gen/fbs/scrabblefb';
|
||||
import { decodeGameList, decodeSession, encodeSubmitPlay } from './codec';
|
||||
|
||||
describe('codec', () => {
|
||||
it('encodes a SubmitPlayRequest the gateway can read', () => {
|
||||
const buf = encodeSubmitPlay('g1', 'H', [
|
||||
{ row: 7, col: 7, letter: 'A', blank: false },
|
||||
{ row: 7, col: 8, letter: 'B', blank: true },
|
||||
]);
|
||||
const r = fb.SubmitPlayRequest.getRootAsSubmitPlayRequest(new ByteBuffer(buf));
|
||||
expect(r.gameId()).toBe('g1');
|
||||
expect(r.dir()).toBe('H');
|
||||
expect(r.tilesLength()).toBe(2);
|
||||
expect(r.tiles(0)?.letter()).toBe('A');
|
||||
expect(r.tiles(1)?.blank()).toBe(true);
|
||||
});
|
||||
|
||||
it('decodes a Session', () => {
|
||||
const b = new Builder(64);
|
||||
const token = b.createString('tok');
|
||||
const uid = b.createString('u1');
|
||||
const name = b.createString('Me');
|
||||
fb.Session.startSession(b);
|
||||
fb.Session.addToken(b, token);
|
||||
fb.Session.addUserId(b, uid);
|
||||
fb.Session.addIsGuest(b, true);
|
||||
fb.Session.addDisplayName(b, name);
|
||||
b.finish(fb.Session.endSession(b));
|
||||
expect(decodeSession(b.asUint8Array())).toEqual({
|
||||
token: 'tok',
|
||||
userId: 'u1',
|
||||
isGuest: true,
|
||||
displayName: 'Me',
|
||||
});
|
||||
});
|
||||
|
||||
it('decodes a GameList including nested seat display names', () => {
|
||||
const b = new Builder(256);
|
||||
const aid = b.createString('a1');
|
||||
const dn = b.createString('Ann');
|
||||
fb.SeatView.startSeatView(b);
|
||||
fb.SeatView.addSeat(b, 1);
|
||||
fb.SeatView.addAccountId(b, aid);
|
||||
fb.SeatView.addScore(b, 13);
|
||||
fb.SeatView.addHintsUsed(b, 0);
|
||||
fb.SeatView.addIsWinner(b, false);
|
||||
fb.SeatView.addDisplayName(b, dn);
|
||||
const seat = fb.SeatView.endSeatView(b);
|
||||
const seats = fb.GameView.createSeatsVector(b, [seat]);
|
||||
const id = b.createString('g1');
|
||||
const variant = b.createString('english');
|
||||
const dv = b.createString('v1');
|
||||
const status = b.createString('active');
|
||||
const er = b.createString('');
|
||||
fb.GameView.startGameView(b);
|
||||
fb.GameView.addId(b, id);
|
||||
fb.GameView.addVariant(b, variant);
|
||||
fb.GameView.addDictVersion(b, dv);
|
||||
fb.GameView.addStatus(b, status);
|
||||
fb.GameView.addPlayers(b, 2);
|
||||
fb.GameView.addToMove(b, 0);
|
||||
fb.GameView.addTurnTimeoutSecs(b, 86400);
|
||||
fb.GameView.addMoveCount(b, 4);
|
||||
fb.GameView.addEndReason(b, er);
|
||||
fb.GameView.addSeats(b, seats);
|
||||
const game = fb.GameView.endGameView(b);
|
||||
const games = fb.GameList.createGamesVector(b, [game]);
|
||||
fb.GameList.startGameList(b);
|
||||
fb.GameList.addGames(b, games);
|
||||
b.finish(fb.GameList.endGameList(b));
|
||||
|
||||
const gl = decodeGameList(b.asUint8Array());
|
||||
expect(gl.games).toHaveLength(1);
|
||||
expect(gl.games[0].id).toBe('g1');
|
||||
expect(gl.games[0].seats[0].displayName).toBe('Ann');
|
||||
expect(gl.games[0].seats[0].score).toBe(13);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user