Skip to content

Commit 2dd916a

Browse files
feat: add Workflow Playground page and integrate workflow mock functionality
1 parent a4af5fb commit 2dd916a

File tree

7 files changed

+328
-77
lines changed

7 files changed

+328
-77
lines changed

src/App.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { AppShell } from "@/components/layout/AppShell";
22
import { Navigate, Route, Routes } from "react-router-dom";
33
import { HomePage } from "@/pages/home/Home";
44
import { GeneratePage } from "@/pages/generate/GeneratePage";
5+
import WorkflowPlayground from "@/pages/dev/WorkflowPlayground";
56

67
function App() {
78
return (
@@ -10,6 +11,10 @@ function App() {
1011
<Route path="/" element={<Navigate to="/home" replace />} />
1112
<Route path="/home" element={<HomePage />} />
1213
<Route path="/generate" element={<GeneratePage />} />
14+
<Route
15+
path="/dev/workflow-playground"
16+
element={<WorkflowPlayground />}
17+
/>
1318
<Route path="/fix" element={<PageBox title="Fix" />} />
1419
<Route path="/run" element={<PageBox title="Run" />} />
1520
<Route path="/plugins" element={<PageBox title="Plugins" />} />
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { render, screen, waitFor } from "@testing-library/react";
2+
import { Provider as AppProvider } from "@/components/ui/provider";
3+
import type { Workflow } from "@/gen/sapphillon/v1/workflow_pb";
4+
import { describe, expect, it } from "vitest";
5+
import { WorkflowCanvas } from "./WorkflowCanvas";
6+
7+
import { makeWorkflowMock } from "@/test/mocks/workflowMock";
8+
9+
// Use the reusable mock factory
10+
const makeMockWorkflow = (code: string): Workflow => makeWorkflowMock(code);
11+
12+
const simpleWorkflowCode =
13+
`function workflow() {\n const x = 1;\n if (x > 0) {\n console.log("positive");\n } else {\n console.log("non-positive");\n }\n return x;\n}\n`;
14+
15+
describe("WorkflowCanvas", () => {
16+
it("renders steps view for a simple workflow", () => {
17+
const wf = makeMockWorkflow(simpleWorkflowCode);
18+
render(
19+
<AppProvider>
20+
<WorkflowCanvas workflow={wf} />
21+
</AppProvider>,
22+
);
23+
24+
// Steps view should show the top-level node titles
25+
expect(screen.getByText("変数を準備")).toBeTruthy();
26+
expect(screen.getByText("条件分岐")).toBeTruthy();
27+
expect(screen.getByText("結果を返す")).toBeTruthy();
28+
29+
// The toggle 'Code' button should be present
30+
expect(screen.getByRole("button", { name: /Code/ })).toBeTruthy();
31+
});
32+
33+
it("renders code view", async () => {
34+
const wf = makeMockWorkflow(simpleWorkflowCode);
35+
render(
36+
<AppProvider>
37+
<WorkflowCanvas workflow={wf} />
38+
</AppProvider>,
39+
);
40+
41+
// Click the Code button to switch view
42+
const codeBtn = screen.getByRole("button", { name: /Code/ });
43+
codeBtn.click();
44+
45+
// Now the raw JS should be visible (wait for re-render)
46+
await waitFor(() => {
47+
expect(screen.getByText(/function workflow\(\)/)).toBeTruthy();
48+
});
49+
});
50+
});

0 commit comments

Comments
 (0)