tangled
alpha
login
or
join now
tylur.dev
/
prototypey
prototypey.org - atproto lexicon typescript toolkit - mirror https://github.com/tylersayshi/prototypey
1
fork
atom
overview
issues
pulls
pipelines
fix ui tests
Tyler
3 months ago
7e744630
3f8ba0c9
+102
-25
6 changed files
expand all
collapse all
unified
split
packages
site
package.json
tests
components
Editor.test.tsx
OutputPanel.test.tsx
Playground.test.tsx
setup.ts
pnpm-lock.yaml
+1
packages/site/package.json
···
17
"react-dom": "^18.3.1"
18
},
19
"devDependencies": {
0
20
"@testing-library/react": "^16.1.0",
21
"@testing-library/user-event": "^14.5.2",
22
"@types/react": "^18.3.18",
···
17
"react-dom": "^18.3.1"
18
},
19
"devDependencies": {
20
+
"@testing-library/jest-dom": "^6.9.1",
21
"@testing-library/react": "^16.1.0",
22
"@testing-library/user-event": "^14.5.2",
23
"@types/react": "^18.3.18",
+27
-4
packages/site/tests/components/Editor.test.tsx
···
11
onChange={(e) => onChange(e.target.value)}
12
/>
13
),
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
14
}));
15
16
describe("Editor", () => {
17
-
it("renders with input label", () => {
18
const mockOnChange = vi.fn();
19
render(<Editor value="" onChange={mockOnChange} />);
20
expect(screen.getByText("Input")).toBeInTheDocument();
0
0
0
21
});
22
23
it("calls onChange when value changes", async () => {
24
const mockOnChange = vi.fn();
25
render(<Editor value="" onChange={mockOnChange} />);
26
27
-
const editor = screen.getByTestId("monaco-editor");
0
28
await userEvent.type(editor, "test");
29
30
expect(mockOnChange).toHaveBeenCalled();
31
});
32
33
-
it("displays the provided value", () => {
34
const mockOnChange = vi.fn();
35
render(<Editor value="const x = 1" onChange={mockOnChange} />);
36
37
-
const editor = screen.getByTestId("monaco-editor");
0
38
expect(editor).toHaveValue("const x = 1");
39
});
40
});
···
11
onChange={(e) => onChange(e.target.value)}
12
/>
13
),
14
+
loader: {
15
+
init: vi.fn(() =>
16
+
Promise.resolve({
17
+
languages: {
18
+
typescript: {
19
+
typescriptDefaults: {
20
+
setCompilerOptions: vi.fn(),
21
+
setDiagnosticsOptions: vi.fn(),
22
+
addExtraLib: vi.fn(),
23
+
},
24
+
ScriptTarget: { ES2020: 7 },
25
+
ModuleResolutionKind: { NodeJs: 2 },
26
+
ModuleKind: { ESNext: 99 },
27
+
},
28
+
},
29
+
}),
30
+
),
31
+
},
32
}));
33
34
describe("Editor", () => {
35
+
it("renders with input label", async () => {
36
const mockOnChange = vi.fn();
37
render(<Editor value="" onChange={mockOnChange} />);
38
expect(screen.getByText("Input")).toBeInTheDocument();
39
+
40
+
// Wait for loader to complete
41
+
await screen.findByTestId("monaco-editor");
42
});
43
44
it("calls onChange when value changes", async () => {
45
const mockOnChange = vi.fn();
46
render(<Editor value="" onChange={mockOnChange} />);
47
48
+
// Wait for loader to complete
49
+
const editor = await screen.findByTestId("monaco-editor");
50
await userEvent.type(editor, "test");
51
52
expect(mockOnChange).toHaveBeenCalled();
53
});
54
55
+
it("displays the provided value", async () => {
56
const mockOnChange = vi.fn();
57
render(<Editor value="const x = 1" onChange={mockOnChange} />);
58
59
+
// Wait for loader to complete
60
+
const editor = await screen.findByTestId("monaco-editor");
61
expect(editor).toHaveValue("const x = 1");
62
});
63
});
+3
-15
packages/site/tests/components/OutputPanel.test.tsx
···
14
error: "",
15
};
16
17
-
it("renders JSON Output tab by default", () => {
18
render(<OutputPanel output={mockOutput} />);
19
-
expect(screen.getByText("JSON Output")).toBeInTheDocument();
20
-
expect(screen.getByText("Type Info")).toBeInTheDocument();
21
});
22
23
-
it("displays json content by default", () => {
24
render(<OutputPanel output={mockOutput} />);
25
expect(screen.getByText('{"test": "value"}')).toBeInTheDocument();
26
-
});
27
-
28
-
it("switches to Type Info tab when clicked", async () => {
29
-
render(<OutputPanel output={mockOutput} />);
30
-
31
-
const typeInfoTab = screen.getByText("Type Info");
32
-
await userEvent.click(typeInfoTab);
33
-
34
-
expect(
35
-
screen.getByText("type Test = { test: string }"),
36
-
).toBeInTheDocument();
37
});
38
39
it("displays error message when error exists", () => {
···
14
error: "",
15
};
16
17
+
it("renders Output header", () => {
18
render(<OutputPanel output={mockOutput} />);
19
+
expect(screen.getByText("Output")).toBeInTheDocument();
0
20
});
21
22
+
it("displays json content", () => {
23
render(<OutputPanel output={mockOutput} />);
24
expect(screen.getByText('{"test": "value"}')).toBeInTheDocument();
0
0
0
0
0
0
0
0
0
0
0
25
});
26
27
it("displays error message when error exists", () => {
+10
-6
packages/site/tests/components/Playground.test.tsx
···
51
render(<Playground />);
52
53
expect(screen.getByText("Input")).toBeInTheDocument();
54
-
expect(screen.getByText("JSON Output")).toBeInTheDocument();
55
-
expect(screen.getByText("Type Info")).toBeInTheDocument();
56
});
57
58
-
it("starts with default code in editor", () => {
59
render(<Playground />);
60
0
0
0
0
0
61
const editors = screen.getAllByTestId("monaco-editor");
62
-
const inputEditor = editors[0];
63
64
-
expect(inputEditor).toHaveValue(
65
-
expect.stringContaining('lx.namespace("app.bsky.actor.profile"'),
66
);
67
});
68
···
51
render(<Playground />);
52
53
expect(screen.getByText("Input")).toBeInTheDocument();
54
+
expect(screen.getByText("Output")).toBeInTheDocument();
0
55
});
56
57
+
it("starts with default code in editor", async () => {
58
render(<Playground />);
59
60
+
// Wait for editors to be ready
61
+
await waitFor(() => {
62
+
expect(screen.getAllByTestId("monaco-editor").length).toBeGreaterThan(0);
63
+
});
64
+
65
const editors = screen.getAllByTestId("monaco-editor");
66
+
const inputEditor = editors[0] as HTMLTextAreaElement;
67
68
+
expect(inputEditor.value).toContain(
69
+
'lx.namespace("app.bsky.actor.profile"',
70
);
71
});
72
+1
packages/site/tests/setup.ts
···
1
import { vi } from "vitest";
0
2
3
global.fetch = vi.fn(
4
() =>
···
1
import { vi } from "vitest";
2
+
import "@testing-library/jest-dom/vitest";
3
4
global.fetch = vi.fn(
5
() =>
+60
pnpm-lock.yaml
···
85
specifier: ^18.3.1
86
version: 18.3.1(react@18.3.1)
87
devDependencies:
0
0
0
88
'@testing-library/react':
89
specifier: ^16.1.0
90
version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
···
114
version: 3.2.4(@types/node@24.0.4)(esbuild@0.25.10)(jiti@2.6.1)(jsdom@25.0.1)
115
116
packages:
0
0
0
117
118
'@ark/attest@0.49.0':
119
resolution: {integrity: sha512-LYAJe4iwgA4GY+WLcSZ2ObTgr7F9lSwoQm4hR+B5ko0TfB3gqolXv04hA+7UtoP5HrGR1lVS+0DdwtWNnaSGnQ==}
···
671
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
672
engines: {node: '>=18'}
673
0
0
0
0
674
'@testing-library/react@16.3.0':
675
resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==}
676
engines: {node: '>=18'}
···
972
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
973
engines: {node: '>= 8'}
974
0
0
0
975
cssstyle@4.6.0:
976
resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==}
977
engines: {node: '>=18'}
···
1024
dom-accessibility-api@0.5.16:
1025
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
1026
0
0
0
1027
dts-resolver@2.1.2:
1028
resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==}
1029
engines: {node: '>=20.18.0'}
···
1281
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1282
engines: {node: '>=0.8.19'}
1283
0
0
0
0
1284
inherits@2.0.4:
1285
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1286
···
1484
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
1485
engines: {node: '>= 0.6'}
1486
0
0
0
0
1487
minimatch@3.1.2:
1488
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1489
···
1615
readdirp@4.1.2:
1616
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
1617
engines: {node: '>= 14.18.0'}
0
0
0
0
1618
1619
require-directory@2.1.1:
1620
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
···
1768
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1769
engines: {node: '>=8'}
1770
0
0
0
0
1771
strip-json-comments@3.1.1:
1772
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1773
engines: {node: '>=8'}
···
2008
engines: {node: '>=10'}
2009
2010
snapshots:
0
0
2011
2012
'@ark/attest@0.49.0(typescript@5.8.3)':
2013
dependencies:
···
2486
picocolors: 1.1.1
2487
pretty-format: 27.5.1
2488
0
0
0
0
0
0
0
0
0
2489
'@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
2490
dependencies:
2491
'@babel/runtime': 7.28.4
···
2844
path-key: 3.1.1
2845
shebang-command: 2.0.0
2846
which: 2.0.2
0
0
2847
2848
cssstyle@4.6.0:
2849
dependencies:
···
2879
2880
dom-accessibility-api@0.5.16: {}
2881
0
0
2882
dts-resolver@2.1.2: {}
2883
2884
dunder-proto@1.0.1:
···
3165
3166
imurmurhash@0.1.4: {}
3167
0
0
3168
inherits@2.0.4: {}
3169
3170
is-extglob@2.1.1: {}
···
3335
dependencies:
3336
mime-db: 1.52.0
3337
0
0
3338
minimatch@3.1.2:
3339
dependencies:
3340
brace-expansion: 1.1.12
···
3442
3443
readdirp@4.1.2: {}
3444
0
0
0
0
0
3445
require-directory@2.1.1: {}
3446
3447
resolve-from@4.0.0: {}
···
3583
strip-ansi@6.0.1:
3584
dependencies:
3585
ansi-regex: 5.0.1
0
0
0
0
3586
3587
strip-json-comments@3.1.1: {}
3588
···
85
specifier: ^18.3.1
86
version: 18.3.1(react@18.3.1)
87
devDependencies:
88
+
'@testing-library/jest-dom':
89
+
specifier: ^6.9.1
90
+
version: 6.9.1
91
'@testing-library/react':
92
specifier: ^16.1.0
93
version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
···
117
version: 3.2.4(@types/node@24.0.4)(esbuild@0.25.10)(jiti@2.6.1)(jsdom@25.0.1)
118
119
packages:
120
+
121
+
'@adobe/css-tools@4.4.4':
122
+
resolution: {integrity: sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==}
123
124
'@ark/attest@0.49.0':
125
resolution: {integrity: sha512-LYAJe4iwgA4GY+WLcSZ2ObTgr7F9lSwoQm4hR+B5ko0TfB3gqolXv04hA+7UtoP5HrGR1lVS+0DdwtWNnaSGnQ==}
···
677
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
678
engines: {node: '>=18'}
679
680
+
'@testing-library/jest-dom@6.9.1':
681
+
resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==}
682
+
engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
683
+
684
'@testing-library/react@16.3.0':
685
resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==}
686
engines: {node: '>=18'}
···
982
resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
983
engines: {node: '>= 8'}
984
985
+
css.escape@1.5.1:
986
+
resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
987
+
988
cssstyle@4.6.0:
989
resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==}
990
engines: {node: '>=18'}
···
1037
dom-accessibility-api@0.5.16:
1038
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
1039
1040
+
dom-accessibility-api@0.6.3:
1041
+
resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
1042
+
1043
dts-resolver@2.1.2:
1044
resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==}
1045
engines: {node: '>=20.18.0'}
···
1297
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
1298
engines: {node: '>=0.8.19'}
1299
1300
+
indent-string@4.0.0:
1301
+
resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
1302
+
engines: {node: '>=8'}
1303
+
1304
inherits@2.0.4:
1305
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
1306
···
1504
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
1505
engines: {node: '>= 0.6'}
1506
1507
+
min-indent@1.0.1:
1508
+
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
1509
+
engines: {node: '>=4'}
1510
+
1511
minimatch@3.1.2:
1512
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
1513
···
1639
readdirp@4.1.2:
1640
resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
1641
engines: {node: '>= 14.18.0'}
1642
+
1643
+
redent@3.0.0:
1644
+
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
1645
+
engines: {node: '>=8'}
1646
1647
require-directory@2.1.1:
1648
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
···
1796
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1797
engines: {node: '>=8'}
1798
1799
+
strip-indent@3.0.0:
1800
+
resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
1801
+
engines: {node: '>=8'}
1802
+
1803
strip-json-comments@3.1.1:
1804
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1805
engines: {node: '>=8'}
···
2040
engines: {node: '>=10'}
2041
2042
snapshots:
2043
+
2044
+
'@adobe/css-tools@4.4.4': {}
2045
2046
'@ark/attest@0.49.0(typescript@5.8.3)':
2047
dependencies:
···
2520
picocolors: 1.1.1
2521
pretty-format: 27.5.1
2522
2523
+
'@testing-library/jest-dom@6.9.1':
2524
+
dependencies:
2525
+
'@adobe/css-tools': 4.4.4
2526
+
aria-query: 5.3.0
2527
+
css.escape: 1.5.1
2528
+
dom-accessibility-api: 0.6.3
2529
+
picocolors: 1.1.1
2530
+
redent: 3.0.0
2531
+
2532
'@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@18.3.7(@types/react@18.3.26))(@types/react@18.3.26)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
2533
dependencies:
2534
'@babel/runtime': 7.28.4
···
2887
path-key: 3.1.1
2888
shebang-command: 2.0.0
2889
which: 2.0.2
2890
+
2891
+
css.escape@1.5.1: {}
2892
2893
cssstyle@4.6.0:
2894
dependencies:
···
2924
2925
dom-accessibility-api@0.5.16: {}
2926
2927
+
dom-accessibility-api@0.6.3: {}
2928
+
2929
dts-resolver@2.1.2: {}
2930
2931
dunder-proto@1.0.1:
···
3212
3213
imurmurhash@0.1.4: {}
3214
3215
+
indent-string@4.0.0: {}
3216
+
3217
inherits@2.0.4: {}
3218
3219
is-extglob@2.1.1: {}
···
3384
dependencies:
3385
mime-db: 1.52.0
3386
3387
+
min-indent@1.0.1: {}
3388
+
3389
minimatch@3.1.2:
3390
dependencies:
3391
brace-expansion: 1.1.12
···
3493
3494
readdirp@4.1.2: {}
3495
3496
+
redent@3.0.0:
3497
+
dependencies:
3498
+
indent-string: 4.0.0
3499
+
strip-indent: 3.0.0
3500
+
3501
require-directory@2.1.1: {}
3502
3503
resolve-from@4.0.0: {}
···
3639
strip-ansi@6.0.1:
3640
dependencies:
3641
ansi-regex: 5.0.1
3642
+
3643
+
strip-indent@3.0.0:
3644
+
dependencies:
3645
+
min-indent: 1.0.1
3646
3647
strip-json-comments@3.1.1: {}
3648