@test2doc/playwright 1.4.0 → 1.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DocMeta.test.d.ts +2 -0
- package/dist/DocMeta.test.d.ts.map +1 -0
- package/dist/DocMeta.test.js +46 -0
- package/dist/DocMeta.test.js.map +1 -0
- package/dist/Test2DocReporter.test.d.ts +2 -0
- package/dist/Test2DocReporter.test.d.ts.map +1 -0
- package/dist/Test2DocReporter.test.js +450 -0
- package/dist/Test2DocReporter.test.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -9
- package/dist/index.js.map +1 -1
- package/dist/screenshots.d.ts +2 -0
- package/dist/screenshots.d.ts.map +1 -1
- package/dist/screenshots.js +18 -6
- package/dist/screenshots.js.map +1 -1
- package/dist/testUtils/fixtures.d.ts +17 -0
- package/dist/testUtils/fixtures.d.ts.map +1 -0
- package/dist/testUtils/fixtures.js +391 -0
- package/dist/testUtils/fixtures.js.map +1 -0
- package/dist/testUtils/index.d.ts +6 -0
- package/dist/testUtils/index.d.ts.map +1 -0
- package/dist/testUtils/index.js +25 -0
- package/dist/testUtils/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocMeta.test.d.ts","sourceRoot":"","sources":["../src/DocMeta.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { test, expect, describe, vi } from "vitest";
|
|
2
|
+
describe("withDocMeta", () => {
|
|
3
|
+
test("returns title without config data if test2doc is not enabled", async () => {
|
|
4
|
+
const { withDocMeta } = await import("./DocMeta.js");
|
|
5
|
+
const title = withDocMeta("My Test Title", { title: "My Test Title" });
|
|
6
|
+
expect(title).toBe("My Test Title");
|
|
7
|
+
});
|
|
8
|
+
test("returns title with config data if test2doc is enabled", async () => {
|
|
9
|
+
const { activateTest2Doc, withDocMeta } = await import("./DocMeta.js");
|
|
10
|
+
activateTest2Doc();
|
|
11
|
+
const title = withDocMeta("My Test Title", { title: "My Test Title" });
|
|
12
|
+
expect(title).toBe('My Test Title[test2doc_page]:{"title":"My Test Title"}');
|
|
13
|
+
});
|
|
14
|
+
test("returns title with config data when test2doc flag is provided on the command line", async () => {
|
|
15
|
+
vi.resetModules();
|
|
16
|
+
const originalEnv = { ...process.env };
|
|
17
|
+
process.env.TEST2DOC = "true";
|
|
18
|
+
const { withDocMeta } = await import("./DocMeta.js");
|
|
19
|
+
const title = withDocMeta("My Test Title", {
|
|
20
|
+
title: "My Test Title",
|
|
21
|
+
});
|
|
22
|
+
expect(title).toBe('My Test Title[test2doc_page]:{"title":"My Test Title"}');
|
|
23
|
+
process.env = originalEnv;
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
describe("withDocCategory", () => {
|
|
27
|
+
test("returns title without category metadata when test2doc is not active", async () => {
|
|
28
|
+
vi.resetModules();
|
|
29
|
+
const { withDocCategory } = await import("./DocMeta.js");
|
|
30
|
+
const title = withDocCategory("My Category", {
|
|
31
|
+
label: "My Label",
|
|
32
|
+
link: { type: "generated-index", title: "Index" },
|
|
33
|
+
});
|
|
34
|
+
expect(title).toBe("My Category");
|
|
35
|
+
});
|
|
36
|
+
test("returns title with category metadata when test2doc is active", async () => {
|
|
37
|
+
const { activateTest2Doc, withDocCategory } = await import("./DocMeta.js");
|
|
38
|
+
activateTest2Doc();
|
|
39
|
+
const title = withDocCategory("My Category", {
|
|
40
|
+
label: "My Label",
|
|
41
|
+
link: { type: "generated-index", title: "Index" },
|
|
42
|
+
});
|
|
43
|
+
expect(title).toBe('My Category[test2doc_category]:{"label":"My Label","link":{"type":"generated-index","title":"Index"}}');
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
//# sourceMappingURL=DocMeta.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DocMeta.test.js","sourceRoot":"","sources":["../src/DocMeta.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEnD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;QACtE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;QACvE,MAAM,EAAE,gBAAgB,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACtE,gBAAgB,EAAE,CAAA;QAClB,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAA;QACtE,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mFAAmF,EAAE,KAAK,IAAI,EAAE;QACnG,EAAE,CAAC,YAAY,EAAE,CAAA;QACjB,MAAM,WAAW,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;QACtC,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAA;QAE7B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,EAAE;YACzC,KAAK,EAAE,eAAe;SACvB,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;QAE5E,OAAO,CAAC,GAAG,GAAG,WAAW,CAAA;IAC3B,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACrF,EAAE,CAAC,YAAY,EAAE,CAAA;QACjB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QACxD,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,EAAE;YAC3C,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;SAClD,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8DAA8D,EAAE,KAAK,IAAI,EAAE;QAC9E,MAAM,EAAE,gBAAgB,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAA;QAC1E,gBAAgB,EAAE,CAAA;QAClB,MAAM,KAAK,GAAG,eAAe,CAAC,aAAa,EAAE;YAC3C,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE;SAClD,CAAC,CAAA;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAChB,uGAAuG,CACxG,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Test2DocReporter.test.d.ts","sourceRoot":"","sources":["../src/Test2DocReporter.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,450 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach, afterEach, } from "vitest";
|
|
2
|
+
import { mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { withDocMeta } from "./DocMeta.js";
|
|
5
|
+
import { setup, tempDir, testCleanup, mockSuiteForPages, mockSuiteForCategories, mockTestSuccess, mockTestFail, mockTestPrivacyPolicyLogin, mockTestPrivacyPolicyRegistration, mockStep, baseSuite, mockSuiteWithMultiProjects, mockTestNewUserRegistration, mockTestLoggedInUser, mockTestLoggedOutUser, mockSingleSetupFileSuite, mockSetupTest, mockAuthenticatedTest, } from "./testUtils/index.js";
|
|
6
|
+
const mockFullConfig = {};
|
|
7
|
+
describe("Test2DocReporter", () => {
|
|
8
|
+
let mockLogging;
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
vi.useFakeTimers();
|
|
11
|
+
vi.setSystemTime(new Date("2024-01-01T00:00:00Z"));
|
|
12
|
+
// Mock print to terminal
|
|
13
|
+
mockLogging = vi
|
|
14
|
+
.spyOn(process.stdout, "write")
|
|
15
|
+
.mockImplementation(() => true);
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.useRealTimers();
|
|
19
|
+
// Clean up the temporary directory
|
|
20
|
+
testCleanup();
|
|
21
|
+
mockLogging.mockRestore();
|
|
22
|
+
});
|
|
23
|
+
// TODO: remove this later
|
|
24
|
+
describe("withDocMeta", () => {
|
|
25
|
+
it("loading the reporter file should enable the withDocMeta JSON stringify for Docusaurus Page Header Data", () => {
|
|
26
|
+
expect(withDocMeta("test title", { title: "Test" })).toBe('test title[test2doc_page]:{"title":"Test"}');
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
it("should generate markdown for each root describe block in a file", () => {
|
|
30
|
+
const reporter = setup();
|
|
31
|
+
let bufferCounter = 0;
|
|
32
|
+
const createMockScreenshotBuffer = () => Buffer.from(`mock image data ${bufferCounter++}`);
|
|
33
|
+
writeFileSync(join(tempDir, "test2doc-1704067218000-1.png"), createMockScreenshotBuffer());
|
|
34
|
+
writeFileSync(join(tempDir, "test2doc-old.md"), "# Old Documentation");
|
|
35
|
+
mkdirSync(join(tempDir, "test2doc-old-dir"));
|
|
36
|
+
mkdirSync(join(tempDir, "test2doc-old-category-dir"));
|
|
37
|
+
writeFileSync(join(tempDir, "test2doc-old-category-dir/_category_.json"), JSON.stringify({
|
|
38
|
+
label: "This needs to be cleaned up",
|
|
39
|
+
position: 1,
|
|
40
|
+
}, null, 2));
|
|
41
|
+
reporter.onBegin(mockFullConfig, mockSuiteForPages);
|
|
42
|
+
reporter.onStepBegin(mockTestSuccess, {}, mockStep);
|
|
43
|
+
const mockScreenshotName1 = `test2doc-${Date.now() + 500}-1.png`;
|
|
44
|
+
const mockScreenshotName2 = `test2doc-${Date.now() + 999}-2.png`;
|
|
45
|
+
const mockScreenshotName3WithAltText = `test2doc-${Date.now() + 1001}-3.png:Alt Text`;
|
|
46
|
+
const mockScreenshotName4 = `test2doc-${Date.now() + 1101}-4.png`;
|
|
47
|
+
const mockScreenshotName5 = `test2doc-${Date.now() + 1201}-5.png`;
|
|
48
|
+
const buffer1 = createMockScreenshotBuffer();
|
|
49
|
+
const buffer2 = createMockScreenshotBuffer();
|
|
50
|
+
const buffer3 = createMockScreenshotBuffer();
|
|
51
|
+
const buffer4 = createMockScreenshotBuffer();
|
|
52
|
+
const buffer5 = createMockScreenshotBuffer();
|
|
53
|
+
const mockAttachmentSuccess = [
|
|
54
|
+
{
|
|
55
|
+
name: mockScreenshotName1,
|
|
56
|
+
body: buffer1,
|
|
57
|
+
contentType: "image/png",
|
|
58
|
+
},
|
|
59
|
+
];
|
|
60
|
+
const mockAttachmentFail = [
|
|
61
|
+
...mockAttachmentSuccess,
|
|
62
|
+
{
|
|
63
|
+
name: mockScreenshotName2,
|
|
64
|
+
body: buffer2,
|
|
65
|
+
contentType: "image/png",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: mockScreenshotName3WithAltText,
|
|
69
|
+
body: buffer3,
|
|
70
|
+
contentType: "image/png",
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
const mockAttachmentPrivacyPolicyLogin = [
|
|
74
|
+
...mockAttachmentFail,
|
|
75
|
+
{
|
|
76
|
+
name: mockScreenshotName4,
|
|
77
|
+
body: buffer4,
|
|
78
|
+
contentType: "image/png",
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
const mockAttachmentPrivacyPolicyRegistration = [
|
|
82
|
+
...mockAttachmentPrivacyPolicyLogin,
|
|
83
|
+
{
|
|
84
|
+
name: mockScreenshotName5,
|
|
85
|
+
body: buffer5,
|
|
86
|
+
contentType: "image/png",
|
|
87
|
+
},
|
|
88
|
+
];
|
|
89
|
+
vi.advanceTimersByTime(600);
|
|
90
|
+
reporter.onStepEnd(mockTestSuccess, {
|
|
91
|
+
attachments: mockAttachmentSuccess,
|
|
92
|
+
}, mockStep);
|
|
93
|
+
reporter.onTestEnd(mockTestSuccess, { status: "passed" });
|
|
94
|
+
vi.advanceTimersByTime(400);
|
|
95
|
+
reporter.onStepBegin(mockTestFail, {}, mockStep);
|
|
96
|
+
reporter.onStepEnd(mockTestFail, {
|
|
97
|
+
attachments: mockAttachmentSuccess,
|
|
98
|
+
}, mockStep);
|
|
99
|
+
reporter.onTestEnd(mockTestFail, { status: "passed" });
|
|
100
|
+
vi.advanceTimersByTime(100);
|
|
101
|
+
reporter.onStepEnd(mockTestFail, {
|
|
102
|
+
attachments: mockAttachmentFail,
|
|
103
|
+
}, mockStep);
|
|
104
|
+
reporter.onStepBegin(mockTestPrivacyPolicyLogin, {}, mockStep);
|
|
105
|
+
vi.advanceTimersByTime(100);
|
|
106
|
+
reporter.onStepEnd(mockTestPrivacyPolicyLogin, {
|
|
107
|
+
attachments: mockAttachmentPrivacyPolicyLogin,
|
|
108
|
+
}, mockStep);
|
|
109
|
+
reporter.onTestEnd(mockTestPrivacyPolicyLogin, {
|
|
110
|
+
status: "passed",
|
|
111
|
+
});
|
|
112
|
+
reporter.onTestEnd(mockTestNewUserRegistration, {
|
|
113
|
+
status: "passed",
|
|
114
|
+
});
|
|
115
|
+
reporter.onStepBegin(mockTestPrivacyPolicyRegistration, {}, mockStep);
|
|
116
|
+
vi.advanceTimersByTime(100);
|
|
117
|
+
reporter.onStepEnd(mockTestPrivacyPolicyRegistration, {
|
|
118
|
+
attachments: mockAttachmentPrivacyPolicyRegistration,
|
|
119
|
+
}, mockStep);
|
|
120
|
+
reporter.onTestEnd(mockTestPrivacyPolicyRegistration, {
|
|
121
|
+
status: "passed",
|
|
122
|
+
});
|
|
123
|
+
reporter.onTestEnd(mockTestLoggedInUser, { status: "passed" });
|
|
124
|
+
reporter.onTestEnd(mockTestLoggedOutUser, {
|
|
125
|
+
status: "passed",
|
|
126
|
+
});
|
|
127
|
+
expect(readdirSync(tempDir)).toHaveLength(4);
|
|
128
|
+
reporter.onEnd();
|
|
129
|
+
expect(readdirSync(tempDir)).toHaveLength(8);
|
|
130
|
+
expect(readFileSync(`${tempDir}/test2doc-registration-page.mdx`, "utf8")).toEqual(`---
|
|
131
|
+
title: Registration Page Documentation
|
|
132
|
+
description: The registration page for new users.
|
|
133
|
+
sidebar_position: 1
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
# Registration Page
|
|
137
|
+
|
|
138
|
+
## New User Registration
|
|
139
|
+
|
|
140
|
+
### should register a new user successfully
|
|
141
|
+
|
|
142
|
+
## link to privacy policy
|
|
143
|
+
|
|
144
|
+
### should open privacy policy in new tab
|
|
145
|
+
|
|
146
|
+
Given user is on login page
|
|
147
|
+

|
|
148
|
+
|
|
149
|
+
`);
|
|
150
|
+
expect(readFileSync(`${tempDir}/test2doc-login-page.mdx`, "utf8")).toEqual(`---
|
|
151
|
+
title: Login Page Documentation
|
|
152
|
+
keywords:
|
|
153
|
+
- login
|
|
154
|
+
- password
|
|
155
|
+
- username
|
|
156
|
+
description: The different login scenarios for the login page.
|
|
157
|
+
sidebar_position: 1
|
|
158
|
+
parse_number_prefixes: true
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
# Login Page
|
|
162
|
+
|
|
163
|
+
## Successful Login
|
|
164
|
+
|
|
165
|
+
### should redirect to dashboard on successful login
|
|
166
|
+
|
|
167
|
+
Given user is on login page
|
|
168
|
+

|
|
169
|
+
|
|
170
|
+
## Failed Login
|
|
171
|
+
|
|
172
|
+
### should display error message on failed login
|
|
173
|
+
|
|
174
|
+
Given user is on login page
|
|
175
|
+

|
|
176
|
+

|
|
177
|
+
|
|
178
|
+
## link to privacy policy
|
|
179
|
+
|
|
180
|
+
### should open privacy policy in new tab
|
|
181
|
+
|
|
182
|
+
Given user is on login page
|
|
183
|
+

|
|
184
|
+
|
|
185
|
+
`);
|
|
186
|
+
expect(readFileSync(`${tempDir}/test2doc-dashboard-page.mdx`, "utf8")).toEqual(`---
|
|
187
|
+
title: Dashboard Documentation
|
|
188
|
+
description: The dashboard of todo stuff.
|
|
189
|
+
sidebar_position: 2
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
# Dashboard Page
|
|
193
|
+
|
|
194
|
+
## Logged In User
|
|
195
|
+
|
|
196
|
+
### should display a list of todos
|
|
197
|
+
|
|
198
|
+
## Logged Out User
|
|
199
|
+
|
|
200
|
+
### should redirect to login page
|
|
201
|
+
|
|
202
|
+
`);
|
|
203
|
+
expect(readFileSync(`${tempDir}/test2doc-fc6a5aa2918b.png`)).toEqual(buffer1);
|
|
204
|
+
expect(readFileSync(`${tempDir}/test2doc-be826aa977e6.png`)).toEqual(buffer2);
|
|
205
|
+
expect(readFileSync(`${tempDir}/test2doc-df78fdc04e9c.png`)).toEqual(buffer3);
|
|
206
|
+
expect(readFileSync(`${tempDir}/test2doc-89d4efdc31b3.png`)).toEqual(buffer4);
|
|
207
|
+
expect(readFileSync(`${tempDir}/test2doc-0d5626c46ad3.png`)).toEqual(buffer5);
|
|
208
|
+
// Logging expectations
|
|
209
|
+
expect(mockLogging).toHaveBeenCalledWith("Starting documentation generation for 7 tests...\n");
|
|
210
|
+
expect(mockLogging).toHaveBeenCalledWith("Found 3 documentation sections\n\n");
|
|
211
|
+
// Progress bar updates
|
|
212
|
+
expect(mockLogging).toHaveBeenCalledWith("\r\x1b[K"); // Clear line
|
|
213
|
+
expect(mockLogging).toHaveBeenCalledWith("[.......] 0/7 (0%)");
|
|
214
|
+
expect(mockLogging).toHaveBeenCalledWith("[P......] 1/7 (14%)");
|
|
215
|
+
expect(mockLogging).toHaveBeenCalledWith("[PP.....] 2/7 (29%)");
|
|
216
|
+
expect(mockLogging).toHaveBeenCalledWith("[PPP....] 3/7 (43%)");
|
|
217
|
+
expect(mockLogging).toHaveBeenCalledWith("[PPPP...] 4/7 (57%)");
|
|
218
|
+
expect(mockLogging).toHaveBeenCalledWith("[PPPPP..] 5/7 (71%)");
|
|
219
|
+
expect(mockLogging).toHaveBeenCalledWith("[PPPPPP.] 6/7 (86%)");
|
|
220
|
+
expect(mockLogging).toHaveBeenCalledWith("[PPPPPPP] 7/7 (100%)");
|
|
221
|
+
expect(mockLogging).toHaveBeenCalledWith("\n\n");
|
|
222
|
+
expect(mockLogging).toHaveBeenCalledWith("Cleaning up old generated files...\n");
|
|
223
|
+
expect(mockLogging).toHaveBeenCalledWith("Generating documentation files...\n");
|
|
224
|
+
expect(mockLogging).toHaveBeenCalledWith("Documentation generation completed.\n");
|
|
225
|
+
expect(mockLogging).toHaveBeenCalledWith(`Output directory: ${tempDir}\n`);
|
|
226
|
+
expect(mockLogging).toHaveBeenCalledWith("Processed 5 screenshots\n");
|
|
227
|
+
});
|
|
228
|
+
it("should generate a directory and a _category_.json, and a page for each describe block child under the category describe", () => {
|
|
229
|
+
const reporter = setup();
|
|
230
|
+
reporter.onBegin(mockFullConfig, mockSuiteForCategories);
|
|
231
|
+
reporter.onStepBegin(mockTestSuccess, {}, mockStep);
|
|
232
|
+
reporter.onStepBegin(mockTestFail, {}, mockStep);
|
|
233
|
+
reporter.onEnd();
|
|
234
|
+
expect(readFileSync(`${tempDir}/test2doc-login-page/_category_.json`, "utf8")).toEqual(JSON.stringify({
|
|
235
|
+
label: "Login Page Documentation Label",
|
|
236
|
+
position: 1,
|
|
237
|
+
className: "login-page",
|
|
238
|
+
link: {
|
|
239
|
+
type: "generated-index",
|
|
240
|
+
title: "Login Page Documentation Title",
|
|
241
|
+
description: "The different login scenarios for the login page.",
|
|
242
|
+
slug: "login-page",
|
|
243
|
+
},
|
|
244
|
+
}, null, 2));
|
|
245
|
+
expect(readFileSync(`${tempDir}/test2doc-login-page/test2doc-successful-login.mdx`, "utf8")).toEqual(`---
|
|
246
|
+
sidebar_position: 1
|
|
247
|
+
---
|
|
248
|
+
|
|
249
|
+
# Successful Login
|
|
250
|
+
|
|
251
|
+
## should redirect to dashboard on successful login
|
|
252
|
+
|
|
253
|
+
Given user is on login page
|
|
254
|
+
|
|
255
|
+
`);
|
|
256
|
+
expect(readdirSync(`${tempDir}/test2doc-login-page`)).toHaveLength(3);
|
|
257
|
+
expect(readFileSync(`${tempDir}/test2doc-login-page/test2doc-failed-login.mdx`, "utf8")).toEqual(`# Failed Login
|
|
258
|
+
|
|
259
|
+
## should display error message on failed login
|
|
260
|
+
|
|
261
|
+
Given user is on login page
|
|
262
|
+
|
|
263
|
+
`);
|
|
264
|
+
});
|
|
265
|
+
it("should generate markdown if there is no root describe block", () => {
|
|
266
|
+
const reporter = setup();
|
|
267
|
+
const mockSuiteWithoutRootDescribe = {
|
|
268
|
+
...baseSuite,
|
|
269
|
+
title: "", // Root Suite
|
|
270
|
+
type: "root",
|
|
271
|
+
suites: [
|
|
272
|
+
{
|
|
273
|
+
...baseSuite,
|
|
274
|
+
title: "chromium", // or firefox, webkit, etc.
|
|
275
|
+
type: "project",
|
|
276
|
+
suites: [
|
|
277
|
+
{
|
|
278
|
+
...baseSuite,
|
|
279
|
+
title: "login.test.ts", // Test file name
|
|
280
|
+
type: "file",
|
|
281
|
+
suites: [],
|
|
282
|
+
tests: [mockTestSuccess, mockTestFail],
|
|
283
|
+
},
|
|
284
|
+
],
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
};
|
|
288
|
+
reporter.onBegin(mockFullConfig, mockSuiteWithoutRootDescribe);
|
|
289
|
+
reporter.onEnd();
|
|
290
|
+
expect(readFileSync(`${tempDir}/test2doc-login.mdx`, "utf8")).toEqual(`# login
|
|
291
|
+
|
|
292
|
+
## should redirect to dashboard on successful login
|
|
293
|
+
|
|
294
|
+
## should display error message on failed login
|
|
295
|
+
|
|
296
|
+
`);
|
|
297
|
+
});
|
|
298
|
+
describe("exit test run", () => {
|
|
299
|
+
let mockExit;
|
|
300
|
+
beforeEach(() => {
|
|
301
|
+
mockExit = vi.spyOn(process, "exit").mockImplementation(() => {
|
|
302
|
+
throw new Error("process.exit called");
|
|
303
|
+
});
|
|
304
|
+
});
|
|
305
|
+
afterEach(() => {
|
|
306
|
+
mockExit.mockRestore();
|
|
307
|
+
});
|
|
308
|
+
it("when there are failed tests", () => {
|
|
309
|
+
const reporter = setup();
|
|
310
|
+
const mockFailedResult = {
|
|
311
|
+
status: "failed",
|
|
312
|
+
};
|
|
313
|
+
expect(() => reporter.onTestEnd(mockTestSuccess, mockFailedResult)).toThrow("process.exit called");
|
|
314
|
+
expect(mockLogging).toHaveBeenCalledWith(`Documentation generation aborted due to test failure: ${mockTestSuccess.title}\n`);
|
|
315
|
+
expect(mockExit).toHaveBeenCalledWith(1);
|
|
316
|
+
expect(mockExit).toHaveBeenCalledTimes(1);
|
|
317
|
+
});
|
|
318
|
+
it("when there are tests that timeout", () => {
|
|
319
|
+
const reporter = setup();
|
|
320
|
+
const mockTimeoutResult = {
|
|
321
|
+
status: "timedOut",
|
|
322
|
+
};
|
|
323
|
+
expect(() => reporter.onTestEnd(mockTestSuccess, mockTimeoutResult)).toThrow("process.exit called");
|
|
324
|
+
expect(mockLogging).toHaveBeenCalledWith(`Documentation generation aborted due to test failure: ${mockTestSuccess.title}\n`);
|
|
325
|
+
expect(mockExit).toHaveBeenCalledWith(1);
|
|
326
|
+
expect(mockExit).toHaveBeenCalledTimes(1);
|
|
327
|
+
});
|
|
328
|
+
it("when there are failed tests but the command flag to ignore is set, we run tests anyway.", () => {
|
|
329
|
+
process.env.IGNORE_TEST_FAILURES = "true";
|
|
330
|
+
const reporter = setup();
|
|
331
|
+
const mockFailedResult = {
|
|
332
|
+
status: "failed",
|
|
333
|
+
};
|
|
334
|
+
expect(() => reporter.onTestEnd(mockTestSuccess, mockFailedResult)).not.toThrow("process.exit called");
|
|
335
|
+
expect(mockLogging).toHaveBeenCalledWith(`Documentation generation aborted due to test failure: ${mockTestSuccess.title}\n`);
|
|
336
|
+
expect(mockExit).toHaveBeenCalledTimes(0);
|
|
337
|
+
delete process.env.IGNORE_TEST_FAILURES;
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
it("should generate documentation for each project (except for .setup.ts files)", () => {
|
|
341
|
+
const reporter = setup();
|
|
342
|
+
reporter.onBegin(mockFullConfig, mockSuiteWithMultiProjects);
|
|
343
|
+
reporter.onEnd();
|
|
344
|
+
expect(readdirSync(tempDir)).toHaveLength(2);
|
|
345
|
+
expect(readFileSync(`${tempDir}/test2doc-login.mdx`, "utf8")).toEqual(`# login
|
|
346
|
+
|
|
347
|
+
## how to login
|
|
348
|
+
|
|
349
|
+
## how to logout
|
|
350
|
+
|
|
351
|
+
`);
|
|
352
|
+
expect(readFileSync(`${tempDir}/test2doc-authenticated.mdx`, "utf8")).toEqual(`# authenticated
|
|
353
|
+
|
|
354
|
+
## user name and profile should be visible
|
|
355
|
+
|
|
356
|
+
## setting button should set
|
|
357
|
+
|
|
358
|
+
`);
|
|
359
|
+
// Progress bar should count the setup file
|
|
360
|
+
expect(mockLogging).toHaveBeenCalledWith("[........] 0/8 (0%)");
|
|
361
|
+
});
|
|
362
|
+
it("progress bar should count setup files towards total tests", () => {
|
|
363
|
+
const reporter = setup();
|
|
364
|
+
reporter.onBegin(mockFullConfig, mockSingleSetupFileSuite);
|
|
365
|
+
reporter.onTestEnd(mockSetupTest, {
|
|
366
|
+
status: "passed",
|
|
367
|
+
});
|
|
368
|
+
reporter.onTestEnd(mockAuthenticatedTest, {
|
|
369
|
+
status: "passed",
|
|
370
|
+
});
|
|
371
|
+
reporter.onEnd();
|
|
372
|
+
expect(mockLogging).toHaveBeenCalledWith("[..] 0/2 (0%)");
|
|
373
|
+
expect(mockLogging).toHaveBeenCalledWith("[P.] 1/2 (50%)");
|
|
374
|
+
expect(mockLogging).toHaveBeenCalledWith("[PP] 2/2 (100%)");
|
|
375
|
+
});
|
|
376
|
+
it("should not clean up user directories with generated files", () => {
|
|
377
|
+
const reporter = setup();
|
|
378
|
+
writeFileSync(join(tempDir, "test2doc-old.md"), "# Old Documentation");
|
|
379
|
+
mkdirSync(join(tempDir, "test2doc-clean-me-up-dir"));
|
|
380
|
+
mkdirSync(join(tempDir, "test2doc-login-page"));
|
|
381
|
+
mkdirSync(join(tempDir, "test2doc-orphan-dir"));
|
|
382
|
+
writeFileSync(join(tempDir, "test2doc-login-page/_category_.json"), JSON.stringify({
|
|
383
|
+
label: "This needs to be cleaned up",
|
|
384
|
+
position: 1,
|
|
385
|
+
}, null, 2));
|
|
386
|
+
const handWrittenContent = "# Hand-Written Documentation\n\nThis is some hand-written documentation for the login feature.";
|
|
387
|
+
writeFileSync(join(tempDir, "test2doc-login-page/hand-written-file.md"), handWrittenContent);
|
|
388
|
+
const anotherHandWrittenContent = "# Another Hand-Written Documentation\n\nThis is some hand-written documentation for the category feature.";
|
|
389
|
+
writeFileSync(join(tempDir, "test2doc-orphan-dir/another-hand-written-file.md"), anotherHandWrittenContent);
|
|
390
|
+
reporter.onBegin(mockFullConfig, mockSuiteForCategories);
|
|
391
|
+
expect(readdirSync(tempDir)).toHaveLength(4);
|
|
392
|
+
reporter.onEnd();
|
|
393
|
+
expect(readdirSync(tempDir)).toHaveLength(2);
|
|
394
|
+
expect(readdirSync(join(tempDir, "test2doc-login-page"))).toHaveLength(4);
|
|
395
|
+
expect(readFileSync(join(tempDir, "test2doc-login-page/hand-written-file.md"), "utf8")).toBe(handWrittenContent);
|
|
396
|
+
expect(readdirSync(join(tempDir, "test2doc-orphan-dir"))).toHaveLength(1);
|
|
397
|
+
expect(readFileSync(join(tempDir, "test2doc-orphan-dir/another-hand-written-file.md"), "utf8")).toBe(anotherHandWrittenContent);
|
|
398
|
+
});
|
|
399
|
+
it("should generate figure and figcaption HTML for screenshots with figure metadata", () => {
|
|
400
|
+
const reporter = setup();
|
|
401
|
+
let bufferCounter = 0;
|
|
402
|
+
const createMockScreenshotBuffer = () => Buffer.from(`mock image data ${bufferCounter++}`);
|
|
403
|
+
reporter.onBegin(mockFullConfig, mockSuiteForPages);
|
|
404
|
+
reporter.onStepBegin(mockTestSuccess, {}, mockStep);
|
|
405
|
+
const mockScreenshotName1 = `test2doc-${Date.now() + 500}-1.png`;
|
|
406
|
+
const mockScreenshotName2WithFigure = `test2doc-${Date.now() + 600}-2.png[test2doc_screenshot]:${JSON.stringify({ figure: true, caption: "User login screen" })}`;
|
|
407
|
+
const mockScreenshotName3FigureNoCaption = `test2doc-${Date.now() + 700}-3.png[test2doc_screenshot]:${JSON.stringify({ figure: true })}`;
|
|
408
|
+
const buffer1 = createMockScreenshotBuffer();
|
|
409
|
+
const buffer2 = createMockScreenshotBuffer();
|
|
410
|
+
const buffer3 = createMockScreenshotBuffer();
|
|
411
|
+
const mockAttachmentWithFigure = [
|
|
412
|
+
{
|
|
413
|
+
name: mockScreenshotName1,
|
|
414
|
+
body: buffer1,
|
|
415
|
+
contentType: "image/png",
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
name: mockScreenshotName2WithFigure,
|
|
419
|
+
body: buffer2,
|
|
420
|
+
contentType: "image/png",
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
name: mockScreenshotName3FigureNoCaption,
|
|
424
|
+
body: buffer3,
|
|
425
|
+
contentType: "image/png",
|
|
426
|
+
},
|
|
427
|
+
];
|
|
428
|
+
vi.advanceTimersByTime(800);
|
|
429
|
+
reporter.onStepEnd(mockTestSuccess, {
|
|
430
|
+
attachments: mockAttachmentWithFigure,
|
|
431
|
+
}, mockStep);
|
|
432
|
+
reporter.onTestEnd(mockTestSuccess, { status: "passed" });
|
|
433
|
+
reporter.onEnd();
|
|
434
|
+
const content = readFileSync(`${tempDir}/test2doc-login-page.mdx`, "utf8");
|
|
435
|
+
// Regular screenshot without figure should still work with standard markdown
|
|
436
|
+
expect(content).toContain("");
|
|
437
|
+
// Screenshot with figure and caption should include figcaption
|
|
438
|
+
expect(content).toContain(`<figure>
|
|
439
|
+
|
|
440
|
+

|
|
441
|
+
<figcaption>User login screen</figcaption>
|
|
442
|
+
</figure>`);
|
|
443
|
+
// Screenshot with figure but no caption should not include figcaption
|
|
444
|
+
expect(content).toContain(`<figure>
|
|
445
|
+
|
|
446
|
+

|
|
447
|
+
</figure>`);
|
|
448
|
+
});
|
|
449
|
+
});
|
|
450
|
+
//# sourceMappingURL=Test2DocReporter.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Test2DocReporter.test.js","sourceRoot":"","sources":["../src/Test2DocReporter.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -26,12 +26,13 @@ declare class Test2DocReporter implements Reporter {
|
|
|
26
26
|
private updateProgressBar;
|
|
27
27
|
onEnd(): void;
|
|
28
28
|
private buildDocFiles;
|
|
29
|
-
private
|
|
29
|
+
private generateHashedScreenshotFilename;
|
|
30
30
|
private generateScreenshots;
|
|
31
31
|
private cleanupTest2DocFiles;
|
|
32
32
|
private extractDocMetadata;
|
|
33
33
|
private generateHeader;
|
|
34
34
|
private generateTitle;
|
|
35
|
+
private parseScreenshotMetadata;
|
|
35
36
|
private generateMarkdown;
|
|
36
37
|
}
|
|
37
38
|
export default Test2DocReporter;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAU,EACV,QAAQ,EACT,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,UAAU,EACV,QAAQ,EACT,MAAM,2BAA2B,CAAA;AAuClC,UAAU,uBAAuB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAwBD;;;GAGG;AACH,cAAM,gBAAiB,YAAW,QAAQ;IACxC,OAAO,CAAC,IAAI,CAAgB;IAC5B,OAAO,CAAC,MAAM,CAA4C;IAC1D,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,cAAc,CAAoB;IAC1C,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,WAAW,CAAgC;gBAGjD,OAAO,GAAE,uBAER;IAKH,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK;IA+BzC,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,aAAa;IAYrB,OAAO,CAAC,YAAY;IAmBpB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAOtE,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI;IAqBnE,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU;IAqB5C,OAAO,CAAC,iBAAiB;IAczB,KAAK;IAeL,OAAO,CAAC,aAAa;IA8BrB,OAAO,CAAC,gCAAgC;IAIxC,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,oBAAoB;IAqB5B,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,aAAa;IAQrB,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,gBAAgB;CAsDzB;AAOD,eAAe,gBAAgB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -2,6 +2,7 @@ import { mkdirSync, readdirSync, rmdirSync, rmSync, statSync, unlinkSync, writeF
|
|
|
2
2
|
import { activateTest2Doc } from "./DocMeta.js";
|
|
3
3
|
import { convertToKebabCase } from "./utils.js";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import crypto from "node:crypto";
|
|
5
6
|
// TODO: remove this later, here right now as a hacky solution for testing
|
|
6
7
|
activateTest2Doc();
|
|
7
8
|
/**
|
|
@@ -145,7 +146,7 @@ class Test2DocReporter {
|
|
|
145
146
|
if (metaType === "page") {
|
|
146
147
|
const markdownHeader = this.generateHeader(metadata);
|
|
147
148
|
const markdown = markdownHeader + this.generateMarkdown({ ...doc, title }, 1);
|
|
148
|
-
const filePath = `${outputDir}/test2doc-${convertToKebabCase(title)}.
|
|
149
|
+
const filePath = `${outputDir}/test2doc-${convertToKebabCase(title)}.mdx`;
|
|
149
150
|
writeFileSync(filePath, markdown);
|
|
150
151
|
this.generateScreenshots(outputDir);
|
|
151
152
|
}
|
|
@@ -160,17 +161,17 @@ class Test2DocReporter {
|
|
|
160
161
|
}
|
|
161
162
|
else {
|
|
162
163
|
const markdown = this.generateMarkdown(doc, 1);
|
|
163
|
-
const filePath = `${outputDir}/test2doc-${convertToKebabCase(doc.title)}.
|
|
164
|
+
const filePath = `${outputDir}/test2doc-${convertToKebabCase(doc.title)}.mdx`;
|
|
164
165
|
writeFileSync(filePath, markdown);
|
|
165
166
|
this.generateScreenshots(outputDir);
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
|
-
|
|
169
|
-
return
|
|
169
|
+
generateHashedScreenshotFilename(image) {
|
|
170
|
+
return `test2doc-${crypto.createHash("sha256").update(image).digest("hex").slice(0, 12)}.png`;
|
|
170
171
|
}
|
|
171
172
|
generateScreenshots(output) {
|
|
172
|
-
this.screenshotMoveQueue.forEach(({
|
|
173
|
-
const filename = this.
|
|
173
|
+
this.screenshotMoveQueue.forEach(({ buffer }) => {
|
|
174
|
+
const filename = this.generateHashedScreenshotFilename(buffer);
|
|
174
175
|
const dest = `${output}/${filename}`;
|
|
175
176
|
writeFileSync(dest, buffer);
|
|
176
177
|
});
|
|
@@ -242,6 +243,21 @@ class Test2DocReporter {
|
|
|
242
243
|
}
|
|
243
244
|
return `${titleMarkdown} ${title}\n\n`;
|
|
244
245
|
}
|
|
246
|
+
parseScreenshotMetadata(screenshotName) {
|
|
247
|
+
// Check for JSON metadata format: filename.png[test2doc_screenshot]:{"figure":true,"caption":"text"}
|
|
248
|
+
const jsonMatch = screenshotName.match(/\[test2doc_screenshot\]:(.+)$/);
|
|
249
|
+
if (jsonMatch?.[1]) {
|
|
250
|
+
try {
|
|
251
|
+
return JSON.parse(jsonMatch[1]);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// If JSON parsing fails, fall through to legacy format
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Legacy format: filename.png:altText
|
|
258
|
+
const [, caption] = screenshotName.split(":") ?? [];
|
|
259
|
+
return caption ? { caption } : {};
|
|
260
|
+
}
|
|
245
261
|
generateMarkdown(docNode, depth) {
|
|
246
262
|
let markdown = this.generateTitle(docNode.title, depth);
|
|
247
263
|
if (docNode.tests) {
|
|
@@ -254,9 +270,25 @@ class Test2DocReporter {
|
|
|
254
270
|
}
|
|
255
271
|
if (step.screenshot) {
|
|
256
272
|
this.screenshotMoveQueue.push(step.screenshot);
|
|
257
|
-
const
|
|
258
|
-
|
|
259
|
-
|
|
273
|
+
const transformedFilename = this.generateHashedScreenshotFilename(step.screenshot.buffer);
|
|
274
|
+
// Parse screenshot metadata (supports both legacy :altText and new JSON format)
|
|
275
|
+
const { caption, figure } = this.parseScreenshotMetadata(step.screenshot.name);
|
|
276
|
+
if (figure) {
|
|
277
|
+
// Generate figure/figcaption format
|
|
278
|
+
const altText = caption ?? "screenshot";
|
|
279
|
+
markdown += `<figure>
|
|
280
|
+
|
|
281
|
+
${caption
|
|
282
|
+
? `
|
|
283
|
+
<figcaption>${caption}</figcaption>`
|
|
284
|
+
: ""}
|
|
285
|
+
</figure>
|
|
286
|
+
`;
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
// Generate standard markdown image
|
|
290
|
+
markdown += `\n`;
|
|
291
|
+
}
|
|
260
292
|
}
|
|
261
293
|
}
|
|
262
294
|
markdown += "\n";
|