import type { SpawndChildProcess } from 'spawnd'; import type { Browser, Page } from 'puppeteer'; import { vi } from 'vitest'; import devServer from 'jest-dev-server'; import { createBrowser, sleep } from '~/tests/utils'; describe(' | E2E', () => { let server: SpawndChildProcess[]; let browser: Browser; beforeAll(async () => { process.env.TEST_PORT = '63002'; server = await devServer.setup({ command: 'yarn example:basic', host: 'localhost', port: 63002, launchTimeout: 30000, }); browser = await createBrowser(); }); describe('Premium content', () => { let page: Page; beforeAll(async () => { page = await browser.newPage(); await page.goto('http://localhost:63002/premium'); }); it('should render a full paywall when used with all necessary' + 'siblings', async () => { await page.waitForSelector('iframe.p3-outlet'); const src = await page.evaluate(() => document.querySelector('iframe.p3-outlet').src ); expect(src).toBe('https://assets.poool.fr/paywall-frame.html'); }); it('should fire onIdentityAvailable event handler', async () => { await page.waitForSelector('#on-identity-available'); const identity = await page.evaluate(() => JSON.parse(document .querySelector('#on-identity-available').innerText) ); expect(identity).toBeDefined(); expect(identity.user_id).toBeDefined(); }); it('should fire onReady event handler', async () => { await page.waitForSelector('#on-ready'); const ready = await page.evaluate(() => JSON.parse(document .querySelector('#on-ready').innerText) ); expect(ready).toBe(true); }); afterAll(async () => { await page.close(); }); }); describe('Consent', () => { let page: Page; beforeAll(async () => { page = await browser.newPage(); await page.goto('http://localhost:63002/consent'); }); // TODO: this one fails for no reason (verified working live) it.todo('should automatically rerender paywall when giving ' + 'consent', async () => { vi.useRealTimers(); await page.waitForSelector('#on-ready'); const content = await page.evaluate(() => document.querySelector('#restricted-content').innerText ); expect(content) .toBe('This sentence should be almost complete....'); await sleep(11); await page.evaluate(() => document.querySelector('#consent-button').click() ); await sleep(11); const contentAfterConsent = await page.evaluate(() => document.querySelector('#restricted-content').innerText ); expect(contentAfterConsent) .toBe('This sentence should be almost complete....'); }); afterAll(async () => { await page.close(); }); }); describe('Routing', () => { let page: Page; beforeAll(async () => { page = await browser.newPage(); await page.goto('http://localhost:63002/alt-home'); }); it('should not re-render paywall multiple times on route ' + 'change', async () => { await page.click('#consent-link'); await page.waitForSelector('#on-ready'); const content = await page.evaluate(() => document.querySelector('#mounted').innerText ); expect(content).toBe('1'); }); afterAll(async () => { await page.close(); }); }); afterAll(async () => { await devServer.teardown(server); await browser.close(); }); });