|
| 1 | +/* eslint-disable max-lines */ |
1 | 2 | import "vitest-environment-puppeteer"; |
2 | 3 | import { compileForTests } from "../../shared/tooling/webpack-compile"; |
3 | 4 | import type { FCCTestRunner } from "../../main/src/index"; |
@@ -312,6 +313,21 @@ for(let i = 0; i < 3; i++) { |
312 | 313 | }); |
313 | 314 | }); |
314 | 315 |
|
| 316 | + it("should handle beforeEach expressions without trailing semicolons", async () => { |
| 317 | + const result = await page.evaluate(async (type) => { |
| 318 | + const runner = await window.FCCTestRunner.createTestRunner({ |
| 319 | + type, |
| 320 | + hooks: { |
| 321 | + beforeEach: "let x = 1;Array()", |
| 322 | + }, |
| 323 | + }); |
| 324 | + const one = await runner.runTest("(assert.equal(x, 1))"); |
| 325 | + return one; |
| 326 | + }, type); |
| 327 | + |
| 328 | + expect(result).toEqual({ pass: true }); |
| 329 | + }); |
| 330 | + |
315 | 331 | it("should evaluate the beforeEach hook before each test", async () => { |
316 | 332 | const result = await page.evaluate(async (type) => { |
317 | 333 | const runner = await window.FCCTestRunner.createTestRunner({ |
@@ -1146,6 +1162,27 @@ checkBtn.click(); |
1146 | 1162 |
|
1147 | 1163 | expect(result).toEqual({ pass: true }); |
1148 | 1164 | }); |
| 1165 | + |
| 1166 | + it("should make __helpers available in before hooks", async () => { |
| 1167 | + const result = await page.evaluate(async () => { |
| 1168 | + const runner = await window.FCCTestRunner.createTestRunner({ |
| 1169 | + type: "dom", |
| 1170 | + hooks: { |
| 1171 | + beforeEach: |
| 1172 | + "const before = __helpers.removeJSComments('before // this')", |
| 1173 | + beforeAll: |
| 1174 | + "const beforeall = __helpers.removeJSComments('before all // this')", |
| 1175 | + }, |
| 1176 | + }); |
| 1177 | + |
| 1178 | + return runner.runAllTests([ |
| 1179 | + "assert.equal(before, 'before ')", |
| 1180 | + "assert.equal(beforeall, 'before all ')", |
| 1181 | + ]); |
| 1182 | + }); |
| 1183 | + |
| 1184 | + expect(result).toEqual([{ pass: true }, { pass: true }]); |
| 1185 | + }); |
1149 | 1186 | }); |
1150 | 1187 |
|
1151 | 1188 | describe("Javascript evaluator", () => { |
@@ -1221,6 +1258,49 @@ checkBtn.click(); |
1221 | 1258 | }, |
1222 | 1259 | }); |
1223 | 1260 | }); |
| 1261 | + |
| 1262 | + it("should make __helpers available in before hooks", async () => { |
| 1263 | + const result = await page.evaluate(async () => { |
| 1264 | + const runner = await window.FCCTestRunner.createTestRunner({ |
| 1265 | + type: "javascript", |
| 1266 | + hooks: { |
| 1267 | + beforeEach: |
| 1268 | + "const before = __helpers.removeJSComments('before // this')", |
| 1269 | + beforeAll: |
| 1270 | + "globalThis.beforeall = __helpers.removeJSComments('before all // this')", |
| 1271 | + }, |
| 1272 | + }); |
| 1273 | + |
| 1274 | + return runner.runAllTests([ |
| 1275 | + "assert.equal(before, 'before ')", |
| 1276 | + "assert.equal(globalThis.beforeall, 'before all ')", |
| 1277 | + ]); |
| 1278 | + }); |
| 1279 | + |
| 1280 | + expect(result).toEqual([{ pass: true }, { pass: true }]); |
| 1281 | + }); |
| 1282 | + |
| 1283 | + // Weird edge case, but if the user code starts with an opening bracket and |
| 1284 | + // the beforeEach hook does not end with a semicolon, the combination of the |
| 1285 | + // two could be interpreted as a function call. In this case |
| 1286 | + // Array()( { key: 'value' }) ) |
| 1287 | + // and that's a TypeError. |
| 1288 | + it("should handle user code with leading brackets", async () => { |
| 1289 | + const source = `({ key: 'value' })`; |
| 1290 | + const result = await page.evaluate(async (source) => { |
| 1291 | + const runner = await window.FCCTestRunner.createTestRunner({ |
| 1292 | + source, |
| 1293 | + code: { contents: source }, |
| 1294 | + type: "javascript", |
| 1295 | + hooks: { |
| 1296 | + beforeEach: "Array()", |
| 1297 | + }, |
| 1298 | + }); |
| 1299 | + return runner.runTest("(assert.equal(code, '({ key: \\'value\\' })'))"); |
| 1300 | + }, source); |
| 1301 | + |
| 1302 | + expect(result).toEqual({ pass: true }); |
| 1303 | + }); |
1224 | 1304 | }); |
1225 | 1305 |
|
1226 | 1306 | describe("Python evaluator", () => { |
@@ -1530,5 +1610,27 @@ pattern = re.compile('l+')`; |
1530 | 1610 |
|
1531 | 1611 | expect(result).toEqual({ pass: true }); |
1532 | 1612 | }); |
| 1613 | + |
| 1614 | + it("should make __helpers available in before hooks", async () => { |
| 1615 | + const result = await page.evaluate(async () => { |
| 1616 | + const runner = await window.FCCTestRunner.createTestRunner({ |
| 1617 | + type: "python", |
| 1618 | + hooks: { |
| 1619 | + beforeEach: |
| 1620 | + "const before = __helpers.removeJSComments('before // this'); await ''", |
| 1621 | + beforeAll: |
| 1622 | + "globalThis.beforeall = __helpers.removeJSComments('before all // this')", |
| 1623 | + }, |
| 1624 | + }); |
| 1625 | + |
| 1626 | + return runner.runAllTests([ |
| 1627 | + "assert.equal(before, 'before ')", |
| 1628 | + "({test: () => { assert.equal(before, 'before ')}})", |
| 1629 | + "assert.equal(globalThis.beforeall, 'before all ')", |
| 1630 | + ]); |
| 1631 | + }); |
| 1632 | + |
| 1633 | + expect(result).toEqual([{ pass: true }, { pass: true }, { pass: true }]); |
| 1634 | + }); |
1533 | 1635 | }); |
1534 | 1636 | }); |
0 commit comments