initDOM.js 2.23 KB
Newer Older
1
2
3
4
5
6
7
8
9
/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */

10
11
12
13
14
const fs = require('fs');
const http = require('http');
const jsdom = require('jsdom');
const path = require('path');
const { expect } = require('chai');
15

16
17
let getMarkup;
let resourceLoader;
18
19
20
21

if (process.env.E2E_FILE) {
  const file = path.isAbsolute(process.env.E2E_FILE)
    ? process.env.E2E_FILE
22
    : path.join(process.cwd(), process.env.E2E_FILE);
23

24
25
  const markup = fs.readFileSync(file, 'utf8');
  getMarkup = () => markup;
26

27
  const pathPrefix = process.env.PUBLIC_URL.replace(/^https?:\/\/[^/]+\/?/, '');
28

29
30
31
32
33
34
35
36
37
38
39
  resourceLoader = (resource, callback) =>
    callback(
      null,
      fs.readFileSync(
        path.join(
          path.dirname(file),
          resource.url.pathname.replace(pathPrefix, '')
        ),
        'utf8'
      )
    );
40
} else if (process.env.E2E_URL) {
41
42
43
44
45
46
47
  getMarkup = () =>
    new Promise(resolve => {
      http.get(process.env.E2E_URL, res => {
        let rawData = '';
        res.on('data', chunk => (rawData += chunk));
        res.on('end', () => resolve(rawData));
      });
48
    });
49

50
  resourceLoader = (resource, callback) => resource.defaultFetch(callback);
51
} else {
52
53
54
55
56
57
58
59
  it.only(
    'can run jsdom (at least one of "E2E_FILE" or "E2E_URL" environment variables must be provided)',
    () => {
      expect(
        new Error("This isn't the error you are looking for.")
      ).to.be.undefined();
    }
  );
60
61
}

62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
export default feature =>
  new Promise(async resolve => {
    const markup = await getMarkup();
    const host = process.env.E2E_URL || 'http://www.example.org/spa:3000';
    const doc = jsdom.jsdom(markup, {
      features: {
        FetchExternalResources: ['script', 'css'],
        ProcessExternalResources: ['script'],
      },
      created: (_, win) =>
        win.addEventListener('ReactFeatureDidMount', () => resolve(doc), true),
      deferClose: true,
      resourceLoader,
      url: `${host}#${feature}`,
      virtualConsole: jsdom.createVirtualConsole().sendTo(console),
    });
78

79
80
    doc.close();
  });