ui/phase-17: ship-class CRUD without calc
Phase 17 lights up the ship-class table and designer active views, extends the order-draft pipeline with createShipClass and removeShipClass commands, and projects pending Save/Delete actions through applyOrderOverlay so the table reflects the player's intent before auto-sync lands. The plan is corrected in the same patch: per game/rules.txt, ship classes are designed once and cannot be edited — the engine has no Update command, so the UI exposes only Create + Delete. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
// Component tests for every Phase 10 active-view stub. Each stub
|
||||
// renders the localised view title plus the `coming soon` body copy
|
||||
// and exposes a stable `data-testid` so later phases can replace the
|
||||
// content without renaming the test hook. The table stub additionally
|
||||
// honours its `entity` prop and falls back to the snake_case i18n key
|
||||
// for an unknown slug.
|
||||
// Component tests for the remaining Phase 10 active-view stubs. Each
|
||||
// stub renders the localised view title plus the `coming soon` body
|
||||
// copy and exposes a stable `data-testid` so later phases can replace
|
||||
// the content without renaming the test hook. Phase 17 lit up the
|
||||
// ship-classes table and the ship-class designer, so the assertions
|
||||
// for those slugs / components moved to the dedicated suites
|
||||
// (`table-ship-classes.test.ts`, `designer-ship-class.test.ts`); the
|
||||
// `table.svelte` router still falls back to the stub for the
|
||||
// not-yet-implemented entities (planets, ship-groups, fleets,
|
||||
// sciences, races) and that fallback is exercised here.
|
||||
|
||||
import "@testing-library/jest-dom/vitest";
|
||||
import { render } from "@testing-library/svelte";
|
||||
@@ -16,7 +20,6 @@ import TableView from "../src/lib/active-view/table.svelte";
|
||||
import ReportView from "../src/lib/active-view/report.svelte";
|
||||
import BattleView from "../src/lib/active-view/battle.svelte";
|
||||
import MailView from "../src/lib/active-view/mail.svelte";
|
||||
import DesignerShipClass from "../src/lib/active-view/designer-ship-class.svelte";
|
||||
import DesignerScience from "../src/lib/active-view/designer-science.svelte";
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -38,20 +41,22 @@ describe("active-view stubs", () => {
|
||||
expect(ui.getByTestId("map-canvas-wrap")).toBeInTheDocument();
|
||||
});
|
||||
|
||||
test("table stub maps a kebab-case entity to the right i18n title", () => {
|
||||
const ui = render(TableView, { props: { entity: "ship-classes" } });
|
||||
test("table stub falls back for not-yet-implemented entities", () => {
|
||||
const ui = render(TableView, { props: { entity: "planets" } });
|
||||
const node = ui.getByTestId("active-view-table");
|
||||
expect(node).toHaveAttribute("data-entity", "ship-classes");
|
||||
expect(node).toHaveTextContent("ship classes");
|
||||
expect(node).toHaveAttribute("data-entity", "planets");
|
||||
expect(node).toHaveTextContent("planets");
|
||||
expect(node).toHaveTextContent("coming soon");
|
||||
});
|
||||
|
||||
test("table stub also handles a single-word entity", () => {
|
||||
const ui = render(TableView, { props: { entity: "planets" } });
|
||||
expect(ui.getByTestId("active-view-table")).toHaveTextContent("planets");
|
||||
test("table stub also handles multi-word entities", () => {
|
||||
const ui = render(TableView, { props: { entity: "ship-groups" } });
|
||||
const node = ui.getByTestId("active-view-table");
|
||||
expect(node).toHaveAttribute("data-entity", "ship-groups");
|
||||
expect(node).toHaveTextContent("ship groups");
|
||||
});
|
||||
|
||||
test("report / mail / designer stubs render their localised titles", () => {
|
||||
test("report / mail / designer-science stubs render their localised titles", () => {
|
||||
const r = render(ReportView);
|
||||
expect(r.getByTestId("active-view-report")).toHaveTextContent(
|
||||
"turn report",
|
||||
@@ -62,11 +67,6 @@ describe("active-view stubs", () => {
|
||||
"diplomatic mail",
|
||||
);
|
||||
|
||||
const sc = render(DesignerShipClass);
|
||||
expect(
|
||||
sc.getByTestId("active-view-designer-ship-class"),
|
||||
).toHaveTextContent("ship-class designer");
|
||||
|
||||
const sci = render(DesignerScience);
|
||||
expect(
|
||||
sci.getByTestId("active-view-designer-science"),
|
||||
|
||||
Reference in New Issue
Block a user