From 4b3fb6dcca9e7e61f5dee5cc811a2d41c52f8efd Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Thu, 6 Aug 2020 08:27:00 -0700 Subject: [PATCH] chore(test): convert tests to typescript (1) (#3307) --- ...asic.spec.js => autowaiting-basic.spec.ts} | 6 ++-- ...ng.spec.js => autowaiting-no-hang.spec.ts} | 8 ++--- test/{browser.spec.js => browser.spec.ts} | 3 +- ....js => browsercontext-add-cookies.spec.ts} | 5 +-- ...c.spec.js => browsercontext-basic.spec.ts} | 6 ++-- ...js => browsercontext-clearcookies.spec.ts} | 2 +- ...spec.js => browsercontext-cookies.spec.ts} | 3 +- ....js => browsercontext-credentials.spec.ts} | 5 ++- ...csp.spec.js => browsercontext-csp.spec.ts} | 20 ++++++------ ....spec.js => browsercontext-device.spec.ts} | 6 ++-- ...=> browsercontext-expose-function.spec.ts} | 14 +++------ test/{pdf.spec.js => pdf.spec.ts} | 9 +++--- test/types.d.ts | 31 +++++++++---------- 13 files changed, 58 insertions(+), 60 deletions(-) rename test/{autowaiting-basic.spec.js => autowaiting-basic.spec.ts} (98%) rename test/{autowaiting-no-hang.spec.js => autowaiting-no-hang.spec.ts} (88%) rename test/{browser.spec.js => browser.spec.ts} (97%) rename test/{browsercontext-add-cookies.spec.js => browsercontext-add-cookies.spec.ts} (99%) rename test/{browsercontext-basic.spec.js => browsercontext-basic.spec.ts} (98%) rename test/{browsercontext-clearcookies.spec.js => browsercontext-clearcookies.spec.ts} (97%) rename test/{browsercontext-cookies.spec.js => browsercontext-cookies.spec.ts} (98%) rename test/{browsercontext-credentials.spec.js => browsercontext-credentials.spec.ts} (95%) rename test/{browsercontext-csp.spec.js => browsercontext-csp.spec.ts} (83%) rename test/{browsercontext-device.spec.js => browsercontext-device.spec.ts} (93%) rename test/{browsercontext-expose-function.spec.js => browsercontext-expose-function.spec.ts} (88%) rename test/{pdf.spec.js => pdf.spec.ts} (86%) diff --git a/test/autowaiting-basic.spec.js b/test/autowaiting-basic.spec.ts similarity index 98% rename from test/autowaiting-basic.spec.js rename to test/autowaiting-basic.spec.ts index 9e38cf1d8f..5b5b8a7134 100644 --- a/test/autowaiting-basic.spec.js +++ b/test/autowaiting-basic.spec.ts @@ -15,7 +15,9 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, USES_HOOKS} = testOptions; +export {}; + +const {USES_HOOKS} = testOptions; it('should await navigation when clicking anchor', async({page, server}) => { const messages = []; @@ -204,7 +206,7 @@ it('should work with goto following click', async({page, server}) => { it.skip(USES_HOOKS)('should report navigation in the log when clicking anchor', async({page, server}) => { await page.setContent(`click me`); const __testHookAfterPointerAction = () => new Promise(f => setTimeout(f, 6000)); - const error = await page.click('a', { timeout: 5000, __testHookAfterPointerAction }).catch(e => e); + const error = await page.click('a', { timeout: 5000, __testHookAfterPointerAction } as any).catch(e => e); expect(error.message).toContain('page.click: Timeout 5000ms exceeded.'); expect(error.message).toContain('waiting for scheduled navigations to finish'); expect(error.message).toContain(`navigated to "${server.PREFIX + '/frames/one-frame.html'}"`); diff --git a/test/autowaiting-no-hang.spec.js b/test/autowaiting-no-hang.spec.ts similarity index 88% rename from test/autowaiting-no-hang.spec.js rename to test/autowaiting-no-hang.spec.ts index d604ee8ee9..3f9226cad8 100644 --- a/test/autowaiting-no-hang.spec.js +++ b/test/autowaiting-no-hang.spec.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, USES_HOOKS} = testOptions; +export {}; it('clicking on links which do not commit navigation', async({page, server, httpsServer}) => { await page.goto(server.EMPTY_PAGE); @@ -23,7 +23,7 @@ it('clicking on links which do not commit navigation', async({page, server, http await page.click('a'); }); -it('calling window.stop async', async({page, server, httpsServer}) => { +it('calling window.stop async', async({page, server}) => { server.setRoute('/empty.html', async (req, res) => {}); await page.evaluate((url) => { window.location.href = url; @@ -31,7 +31,7 @@ it('calling window.stop async', async({page, server, httpsServer}) => { }, server.EMPTY_PAGE); }); -it('calling window.stop sync', async({page, server, httpsServer}) => { +it('calling window.stop sync', async({page, server}) => { await page.evaluate((url) => { window.location.href = url; window.stop(); @@ -62,6 +62,6 @@ it('opening a popup', async function({page, server}) { await page.goto(server.EMPTY_PAGE); await Promise.all([ page.waitForEvent('popup'), - page.evaluate(() => window._popup = window.open(window.location.href)), + page.evaluate(() => window.open(window.location.href) && 1), ]); }); diff --git a/test/browser.spec.js b/test/browser.spec.ts similarity index 97% rename from test/browser.spec.js rename to test/browser.spec.ts index 4f2406caa9..3fb1294f52 100644 --- a/test/browser.spec.js +++ b/test/browser.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT} = testOptions; +export {}; +const {CHROMIUM} = testOptions; it('should create new page', async function({browser}) { const page1 = await browser.newPage(); diff --git a/test/browsercontext-add-cookies.spec.js b/test/browsercontext-add-cookies.spec.ts similarity index 99% rename from test/browsercontext-add-cookies.spec.js rename to test/browsercontext-add-cookies.spec.ts index b2b0c028c6..23977cf15c 100644 --- a/test/browsercontext-add-cookies.spec.js +++ b/test/browsercontext-add-cookies.spec.ts @@ -15,7 +15,8 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, WIN} = testOptions; +export {}; +const {FFOX, CHROMIUM} = testOptions; it('should work', async({context, page, server}) => { await page.goto(server.EMPTY_PAGE); @@ -119,7 +120,7 @@ it('should isolate persistent cookies', async({context, server, browser}) => { }); it('should isolate send cookie header', async({server, context, browser}) => { - let cookie = []; + let cookie = ''; server.setRoute('/empty.html', (req, res) => { cookie = req.headers.cookie || ''; res.end(); diff --git a/test/browsercontext-basic.spec.js b/test/browsercontext-basic.spec.ts similarity index 98% rename from test/browsercontext-basic.spec.js rename to test/browsercontext-basic.spec.ts index 9592db628b..78b45f793b 100644 --- a/test/browsercontext-basic.spec.js +++ b/test/browsercontext-basic.spec.ts @@ -15,9 +15,9 @@ * limitations under the License. */ -const utils = require('./utils'); -const {FFOX, CHROMIUM, WEBKIT, MAC, CHANNEL, HEADLESS} = testOptions; -const {devices} = require('..'); +import utils from './utils'; + +const {WEBKIT} = testOptions; it('should create new context', async function({browser}) { expect(browser.contexts().length).toBe(0); diff --git a/test/browsercontext-clearcookies.spec.js b/test/browsercontext-clearcookies.spec.ts similarity index 97% rename from test/browsercontext-clearcookies.spec.js rename to test/browsercontext-clearcookies.spec.ts index 1476542481..c38fcf5e86 100644 --- a/test/browsercontext-clearcookies.spec.js +++ b/test/browsercontext-clearcookies.spec.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, WIN} = testOptions; +export {}; it('should clear cookies', async({context, page, server}) => { await page.goto(server.EMPTY_PAGE); diff --git a/test/browsercontext-cookies.spec.js b/test/browsercontext-cookies.spec.ts similarity index 98% rename from test/browsercontext-cookies.spec.js rename to test/browsercontext-cookies.spec.ts index 4a57510ba0..90bf06f3f0 100644 --- a/test/browsercontext-cookies.spec.js +++ b/test/browsercontext-cookies.spec.ts @@ -15,7 +15,8 @@ * limitations under the License. */ -const {FFOX, CHROMIUM, WEBKIT, WIN} = testOptions; +export {}; +const {WEBKIT, WIN} = testOptions; it('should return no cookies in pristine browser context', async({context, page, server}) => { expect(await context.cookies()).toEqual([]); diff --git a/test/browsercontext-credentials.spec.js b/test/browsercontext-credentials.spec.ts similarity index 95% rename from test/browsercontext-credentials.spec.js rename to test/browsercontext-credentials.spec.ts index 90f11bee19..a6daab9e68 100644 --- a/test/browsercontext-credentials.spec.js +++ b/test/browsercontext-credentials.spec.ts @@ -15,9 +15,8 @@ * limitations under the License. */ -const utils = require('./utils'); -const {FFOX, CHROMIUM, WEBKIT, MAC, CHANNEL, HEADLESS} = testOptions; -const {devices} = require('..'); +export {}; +const {CHROMIUM, HEADLESS} = testOptions; it.fail(CHROMIUM && !HEADLESS)('should fail without credentials', async({browser, server}) => { server.setAuth('/empty.html', 'user', 'pass'); diff --git a/test/browsercontext-csp.spec.js b/test/browsercontext-csp.spec.ts similarity index 83% rename from test/browsercontext-csp.spec.js rename to test/browsercontext-csp.spec.ts index 86351244c2..b25b848ab6 100644 --- a/test/browsercontext-csp.spec.js +++ b/test/browsercontext-csp.spec.ts @@ -15,9 +15,7 @@ * limitations under the License. */ -const utils = require('./utils'); -const {FFOX, CHROMIUM, WEBKIT, MAC, CHANNEL, HEADLESS} = testOptions; -const {devices} = require('..'); +import * as utils from './utils'; it('should bypass CSP meta tag', async({browser, server}) => { // Make sure CSP prohibits addScriptTag. @@ -26,7 +24,7 @@ it('should bypass CSP meta tag', async({browser, server}) => { const page = await context.newPage(); await page.goto(server.PREFIX + '/csp.html'); await page.addScriptTag({content: 'window.__injected = 42;'}).catch(e => void e); - expect(await page.evaluate(() => window.__injected)).toBe(undefined); + expect(await page.evaluate('window.__injected')).toBe(undefined); await context.close(); } @@ -36,7 +34,7 @@ it('should bypass CSP meta tag', async({browser, server}) => { const page = await context.newPage(); await page.goto(server.PREFIX + '/csp.html'); await page.addScriptTag({content: 'window.__injected = 42;'}); - expect(await page.evaluate(() => window.__injected)).toBe(42); + expect(await page.evaluate('window.__injected')).toBe(42); await context.close(); } }); @@ -50,7 +48,7 @@ it('should bypass CSP header', async({browser, server}) => { const page = await context.newPage(); await page.goto(server.EMPTY_PAGE); await page.addScriptTag({content: 'window.__injected = 42;'}).catch(e => void e); - expect(await page.evaluate(() => window.__injected)).toBe(undefined); + expect(await page.evaluate('window.__injected')).toBe(undefined); await context.close(); } @@ -60,7 +58,7 @@ it('should bypass CSP header', async({browser, server}) => { const page = await context.newPage(); await page.goto(server.EMPTY_PAGE); await page.addScriptTag({content: 'window.__injected = 42;'}); - expect(await page.evaluate(() => window.__injected)).toBe(42); + expect(await page.evaluate('window.__injected')).toBe(42); await context.close(); } }); @@ -70,11 +68,11 @@ it('should bypass after cross-process navigation', async({browser, server}) => { const page = await context.newPage(); await page.goto(server.PREFIX + '/csp.html'); await page.addScriptTag({content: 'window.__injected = 42;'}); - expect(await page.evaluate(() => window.__injected)).toBe(42); + expect(await page.evaluate('window.__injected')).toBe(42); await page.goto(server.CROSS_PROCESS_PREFIX + '/csp.html'); await page.addScriptTag({content: 'window.__injected = 42;'}); - expect(await page.evaluate(() => window.__injected)).toBe(42); + expect(await page.evaluate('window.__injected')).toBe(42); await context.close(); }); @@ -86,7 +84,7 @@ it('should bypass CSP in iframes as well', async({browser, server}) => { await page.goto(server.EMPTY_PAGE); const frame = await utils.attachFrame(page, 'frame1', server.PREFIX + '/csp.html'); await frame.addScriptTag({content: 'window.__injected = 42;'}).catch(e => void e); - expect(await frame.evaluate(() => window.__injected)).toBe(undefined); + expect(await frame.evaluate('window.__injected')).toBe(undefined); await context.close(); } @@ -97,7 +95,7 @@ it('should bypass CSP in iframes as well', async({browser, server}) => { await page.goto(server.EMPTY_PAGE); const frame = await utils.attachFrame(page, 'frame1', server.PREFIX + '/csp.html'); await frame.addScriptTag({content: 'window.__injected = 42;'}).catch(e => void e); - expect(await frame.evaluate(() => window.__injected)).toBe(42); + expect(await frame.evaluate('window.__injected')).toBe(42); await context.close(); } }); diff --git a/test/browsercontext-device.spec.js b/test/browsercontext-device.spec.ts similarity index 93% rename from test/browsercontext-device.spec.js rename to test/browsercontext-device.spec.ts index 7eadc0dd93..48ed4acaea 100644 --- a/test/browsercontext-device.spec.js +++ b/test/browsercontext-device.spec.ts @@ -15,8 +15,8 @@ * limitations under the License. */ -const utils = require('./utils'); -const {CHROMIUM, FFOX, MAC, HEADLESS} = testOptions; +export {}; +const {FFOX} = testOptions; it.skip(FFOX)('should work', async({playwright, browser, server}) => { const iPhone = playwright.devices['iPhone 6']; @@ -36,7 +36,7 @@ it.skip(FFOX)('should support clicking', async({playwright, browser, server}) => const button = await page.$('button'); await page.evaluate(button => button.style.marginTop = '200px', button); await button.click(); - expect(await page.evaluate(() => result)).toBe('Clicked'); + expect(await page.evaluate('result')).toBe('Clicked'); await context.close(); }); diff --git a/test/browsercontext-expose-function.spec.js b/test/browsercontext-expose-function.spec.ts similarity index 88% rename from test/browsercontext-expose-function.spec.js rename to test/browsercontext-expose-function.spec.ts index 6812efed66..f16a68742a 100644 --- a/test/browsercontext-expose-function.spec.js +++ b/test/browsercontext-expose-function.spec.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -const utils = require('./utils'); +export {}; const {FFOX, CHROMIUM, WEBKIT, MAC, CHANNEL, HEADLESS} = testOptions; const {devices} = require('..'); @@ -27,9 +27,7 @@ it('expose binding should work', async({browser}) => { return a + b; }); const page = await context.newPage(); - const result = await page.evaluate(async function() { - return add(5, 6); - }); + const result = await page.evaluate('add(5, 6)'); expect(bindingSource.context).toBe(context); expect(bindingSource.page).toBe(page); expect(bindingSource.frame).toBe(page.mainFrame()); @@ -47,9 +45,7 @@ it('should work', async({browser, server}) => { const handle = await frame.evaluateHandle(([a, b]) => a + b, [a, b]); return handle; }); - const result = await page.evaluate(async function() { - return { mul: await mul(9, 4), add: await add(9, 4), sub: await sub(9, 4), addHandle: await addHandle(5, 6) }; - }); + const result = await page.evaluate('(async () => ({ mul: await mul(9, 4), add: await add(9, 4), sub: await sub(9, 4), addHandle: await addHandle(5, 6) }))()'); expect(result).toEqual({ mul: 36, add: 13, sub: 5, addHandle: 11 }); await context.close(); }); @@ -75,9 +71,9 @@ it('should be callable from-inside addInitScript', async({browser, server}) => { await context.exposeFunction('woof', function(arg) { args.push(arg); }); - await context.addInitScript(() => woof('context')); + await context.addInitScript('woof("context")'); const page = await context.newPage(); - await page.addInitScript(() => woof('page')); + await page.addInitScript('woof("page")'); args = []; await page.reload(); expect(args).toEqual(['context', 'page']); diff --git a/test/pdf.spec.js b/test/pdf.spec.ts similarity index 86% rename from test/pdf.spec.js rename to test/pdf.spec.ts index 5258f4cbcc..27fe54c3ff 100644 --- a/test/pdf.spec.js +++ b/test/pdf.spec.ts @@ -14,18 +14,19 @@ * limitations under the License. */ -const fs = require('fs'); -const path = require('path'); +import fs from 'fs' +import path from 'path' + const {FFOX, CHROMIUM, WEBKIT, OUTPUT_DIR, HEADLESS} = testOptions; // Printing to pdf is currently only supported in headless chromium. -it.skip(!(HEADLESS && CHROMIUM))('should be able to save file', async({page, server}) => { +it.skip(!(HEADLESS && CHROMIUM))('should be able to save file', async({page}) => { const outputFile = path.join(OUTPUT_DIR, 'output.pdf'); await page.pdf({path: outputFile}); expect(fs.readFileSync(outputFile).byteLength).toBeGreaterThan(0); fs.unlinkSync(outputFile); }); -it.skip(CHROMIUM)('should be able to save file', async({page, server}) => { +it.skip(CHROMIUM)('should be able to save file', async({page}) => { expect(page.pdf).toBe(undefined); }); diff --git a/test/types.d.ts b/test/types.d.ts index 9331bf9f40..c8f1a9ec57 100644 --- a/test/types.d.ts +++ b/test/types.d.ts @@ -47,20 +47,9 @@ type TestRunner = { interface TestSetup { testRunner: TestRunner; product: 'Chromium'|'Firefox'|'WebKit'; - FFOX: boolean; - WEBKIT: boolean; - CHROMIUM: boolean; - MAC: boolean; - LINUX: boolean; - WIN: boolean; - playwright: typeof import('../index'); - browserType: import('../index').BrowserType; selectors: import('../index').Selectors; expect(value: T): Expect; - defaultBrowserOptions: import('../index').LaunchOptions; playwrightPath; - headless: boolean; - ASSETS_DIR: string; } type TestState = { @@ -70,8 +59,11 @@ type TestState = { }; type BrowserState = TestState & { + playwright: typeof import('../index'); + browserType: import('../index').BrowserType; browser: import('../index').Browser; browserServer: import('../index').BrowserServer; + defaultBrowserOptions: import('../index').LaunchOptions; }; type PageState = BrowserState & { @@ -81,10 +73,6 @@ type PageState = BrowserState & { type ChromiumPageState = PageState & { browser: import('../index').ChromiumBrowser; }; -type TestSuite = (setup: TestSetup) => void; -type BrowserTestSuite = (setup: TestSetup) => void; -type PageTestSuite = (setup: TestSetup) => void; -type ChromiumTestSuite = (setup: TestSetup) => void; interface TestServer { @@ -103,7 +91,6 @@ interface TestServer { PREFIX: string; CROSS_PROCESS_PREFIX: string; EMPTY_PAGE: string; - } declare const describe: DescribeFunction; @@ -118,6 +105,18 @@ declare const xit: ItFunction; declare const browserType: import('../index').BrowserType; // global variables in assets +declare const testOptions: { + FFOX: boolean; + WEBKIT: boolean; + CHROMIUM: boolean; + MAC: boolean; + LINUX: boolean; + WIN: boolean; + HEADLESS: boolean; + OUTPUT_DIR: string; + USES_HOOKS: boolean; + CHANNEL: boolean; +}; // keyboard.html declare function getResult(): string;