aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/components/GolfPlayApps/GolfPlayAppGaming.test.tsx
blob: ae5381bf03d7b552a6646e9951c9bbd54d2f5209 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/**
 * @vitest-environment jsdom
 */
import { cleanup, render, screen } from "@testing-library/react";
import { createStore, Provider } from "jotai";
import { afterEach, describe, expect, test } from "vitest";
import {
  setCurrentTimestampAtom,
  setDurationSecondsAtom,
  setGameStartedAtAtom,
  setLatestGameStateAtom,
} from "../../states/play";
import GolfPlayAppGaming from "./GolfPlayAppGaming";

afterEach(() => {
  cleanup();
});

function createTestStore() {
  const store = createStore();
  const now = Math.floor(Date.now() / 1000);
  store.set(setCurrentTimestampAtom);
  store.set(setDurationSecondsAtom, 600);
  store.set(setGameStartedAtAtom, now - 60);
  store.set(setLatestGameStateAtom, {
    status: "none",
    code: "",
    score: null,
    best_score_submitted_at: null,
  });
  return store;
}

const defaultProps = {
  gameDisplayName: "Test Game",
  playerProfile: {
    id: 1,
    displayName: "Test Player",
    iconPath: null,
  },
  problemTitle: "Test Problem",
  problemDescription: "Description",
  problemLanguage: "php" as const,
  sampleCode: "<?php echo 1;",
  initialCode: "",
  onCodeChange: () => {},
  onCodeSubmit: () => {},
  isFinished: false,
};

describe("GolfPlayAppGaming submission history", () => {
  test("shows placeholder row when no submissions", () => {
    const store = createTestStore();
    render(
      <Provider store={store}>
        <GolfPlayAppGaming {...defaultProps} submissions={[]} />
      </Provider>,
    );
    expect(screen.getByText("提出待ち")).toBeDefined();
    const dashes = screen.getAllByText("-");
    expect(dashes.length).toBe(3);
  });

  test("renders submission rows with status and code size", () => {
    const store = createTestStore();
    const submissions = [
      {
        submission_id: 1,
        game_id: 1,
        status: "success" as const,
        code: "<?php echo 1;",
        code_size: 7,
        created_at: 1740000000,
      },
      {
        submission_id: 2,
        game_id: 1,
        status: "wrong_answer" as const,
        code: "<?php echo 2;",
        code_size: 10,
        created_at: 1740000060,
      },
    ];
    render(
      <Provider store={store}>
        <GolfPlayAppGaming {...defaultProps} submissions={submissions} />
      </Provider>,
    );
    expect(screen.getByText("成功")).toBeDefined();
    expect(screen.getByText("テスト失敗")).toBeDefined();
    expect(screen.getByText("7")).toBeDefined();
    expect(screen.getByText("10")).toBeDefined();
  });

  test("renders table headers", () => {
    const store = createTestStore();
    render(
      <Provider store={store}>
        <GolfPlayAppGaming {...defaultProps} submissions={[]} />
      </Provider>,
    );
    expect(screen.getByText("ステータス")).toBeDefined();
    expect(screen.getByText("スコア")).toBeDefined();
    expect(screen.getByText("提出時刻")).toBeDefined();
    expect(screen.getByText("コード")).toBeDefined();
  });
});