/* tslint:disable no-string-literal no-console */ import * as fs from 'fs'; import * as path from 'path'; import * as puppeteer from 'puppeteer'; import { expect } from 'chai'; import { Suite } from 'mocha'; import { launchPuppeteer, sampleEvents as events } from './utils'; import { EventType } from '../src/types'; interface ISuite extends Suite { code: string; browser: puppeteer.Browser; page: puppeteer.Page; } describe('replayer', function (this: ISuite) { before(async () => { this.browser = await launchPuppeteer(); const bundlePath = path.resolve(__dirname, '../dist/rrweb.min.js'); this.code = fs.readFileSync(bundlePath, 'utf8'); }); beforeEach(async () => { const page: puppeteer.Page = await this.browser.newPage(); await page.goto('about:blank'); await page.evaluate(this.code); await page.evaluate(`const events = ${JSON.stringify(events)}`); this.page = page; page.on('console', (msg) => console.log('PAGE LOG:', msg.text())); }); afterEach(async () => { await this.page.close(); }); after(async () => { await this.browser.close(); }); it('can get meta data', async () => { const meta = await this.page.evaluate(` const { Replayer } = rrweb; const replayer = new Replayer(events); replayer.getMetaData(); `); expect(meta).to.deep.equal({ startTime: events[0].timestamp, endTime: events[events.length - 1].timestamp, totalTime: events[events.length - 1].timestamp - events[0].timestamp, }); }); it('will start actions when play', async () => { const actionLength = await this.page.evaluate(` const { Replayer } = rrweb; const replayer = new Replayer(events); replayer.play(); replayer['timer']['actions'].length; `); expect(actionLength).to.equal( events.filter( (e) => ![EventType.DomContentLoaded, EventType.Load].includes(e.type), ).length, ); }); it('will clean actions when pause', async () => { const actionLength = await this.page.evaluate(` const { Replayer } = rrweb; const replayer = new Replayer(events); replayer.play(); replayer.pause(); replayer['timer']['actions'].length; `); expect(actionLength).to.equal(0); }); it('can play at any time offset', async () => { const actionLength = await this.page.evaluate(` const { Replayer } = rrweb; const replayer = new Replayer(events); replayer.play(1500); replayer['timer']['actions'].length; `); expect(actionLength).to.equal( events.filter((e) => e.timestamp - events[0].timestamp >= 1500).length, ); }); it('can resume at any time offset', async () => { const actionLength = await this.page.evaluate(` const { Replayer } = rrweb; const replayer = new Replayer(events); replayer.play(1500); replayer.pause(); replayer.resume(1500); replayer['timer']['actions'].length; `); expect(actionLength).to.equal( events.filter((e) => e.timestamp - events[0].timestamp >= 1500).length, ); }); });