16d6b81f9SEvan Baconimport { vol } from 'memfs';
26d6b81f9SEvan Bacon
36d6b81f9SEvan Baconimport { createTemplateHtmlFromExpoConfigAsync } from '../webTemplate';
46d6b81f9SEvan Bacon
56d6b81f9SEvan Baconconst fsReal = jest.requireActual('fs') as typeof import('fs');
66d6b81f9SEvan BaconbeforeEach(() => {
76d6b81f9SEvan Bacon  vol.reset();
86d6b81f9SEvan Bacon});
96d6b81f9SEvan Bacon
106d6b81f9SEvan Baconjest.mock('../../../customize/templates', () => ({
116d6b81f9SEvan Bacon  TEMPLATES: [{ id: 'index.html', file: () => '/mock/index.html' }],
126d6b81f9SEvan Bacon}));
136d6b81f9SEvan Bacon
146d6b81f9SEvan Bacondescribe(createTemplateHtmlFromExpoConfigAsync, () => {
156d6b81f9SEvan Bacon  it(`creates using the default template`, async () => {
166d6b81f9SEvan Bacon    const projectRoot = '/';
176d6b81f9SEvan Bacon    vol.fromJSON(
186d6b81f9SEvan Bacon      {
196d6b81f9SEvan Bacon        'mock/index.html': fsReal.readFileSync(
206d6b81f9SEvan Bacon          require.resolve('@expo/webpack-config/web-default/index.html'),
216d6b81f9SEvan Bacon          'utf-8'
226d6b81f9SEvan Bacon        ),
236d6b81f9SEvan Bacon      },
246d6b81f9SEvan Bacon      projectRoot
256d6b81f9SEvan Bacon    );
266d6b81f9SEvan Bacon
276d6b81f9SEvan Bacon    const contents = await createTemplateHtmlFromExpoConfigAsync(projectRoot, {
286d6b81f9SEvan Bacon      scripts: ['/script.js'],
29*9b2597baSEvan Bacon      cssLinks: ['/_expo/static/1.css', '/_expo/static/2.css'],
306d6b81f9SEvan Bacon      exp: {
316d6b81f9SEvan Bacon        name: 'My App',
326d6b81f9SEvan Bacon        slug: 'my-app',
336d6b81f9SEvan Bacon        web: {
346d6b81f9SEvan Bacon          description: 'my static app',
356d6b81f9SEvan Bacon          themeColor: '#123456',
366d6b81f9SEvan Bacon        },
376d6b81f9SEvan Bacon      },
386d6b81f9SEvan Bacon    });
396d6b81f9SEvan Bacon
406d6b81f9SEvan Bacon    // Standard replacements
416d6b81f9SEvan Bacon    expect(contents).toMatch(/<html lang="en">/);
426d6b81f9SEvan Bacon    expect(contents).toMatch(/<title>My App<\/title>/);
436d6b81f9SEvan Bacon    // Meta
446d6b81f9SEvan Bacon    expect(contents).toMatch(/<meta name="description" content="my static app">/);
456d6b81f9SEvan Bacon    expect(contents).toMatch(/<meta name="theme-color" content="#123456">/);
466d6b81f9SEvan Bacon    // Adds script tag
47*9b2597baSEvan Bacon    expect(contents).toMatch(/<script src="\/script\.js" defer><\/script>/);
48*9b2597baSEvan Bacon    // Adds css links
49*9b2597baSEvan Bacon    expect(contents).toMatch(/<link rel="stylesheet" href="\/_expo\/static\/1\.css">/);
50*9b2597baSEvan Bacon    expect(contents).toMatch(/<link rel="stylesheet" href="\/_expo\/static\/2\.css">/);
516d6b81f9SEvan Bacon
526d6b81f9SEvan Bacon    // Sanity
536d6b81f9SEvan Bacon    expect(contents).toMatchSnapshot();
546d6b81f9SEvan Bacon  });
556d6b81f9SEvan Bacon  it(`creates using an override project file`, async () => {
566d6b81f9SEvan Bacon    const projectRoot = '/';
576d6b81f9SEvan Bacon    vol.fromJSON(
586d6b81f9SEvan Bacon      {
596d6b81f9SEvan Bacon        // Custom file
606d6b81f9SEvan Bacon        'public/index.html': `<!DOCTYPE html><html lang="%LANG_ISO_CODE%"><head></head><body><div id="root"></div></body></html>`,
616d6b81f9SEvan Bacon      },
626d6b81f9SEvan Bacon      projectRoot
636d6b81f9SEvan Bacon    );
646d6b81f9SEvan Bacon
656d6b81f9SEvan Bacon    const contents = await createTemplateHtmlFromExpoConfigAsync(projectRoot, {
666d6b81f9SEvan Bacon      scripts: ['/script.js'],
676d6b81f9SEvan Bacon      exp: {
686d6b81f9SEvan Bacon        name: 'My App',
696d6b81f9SEvan Bacon        slug: 'my-app',
706d6b81f9SEvan Bacon        web: {
716d6b81f9SEvan Bacon          description: 'my static app',
726d6b81f9SEvan Bacon          themeColor: '#123456',
736d6b81f9SEvan Bacon        },
746d6b81f9SEvan Bacon      },
756d6b81f9SEvan Bacon    });
766d6b81f9SEvan Bacon
776d6b81f9SEvan Bacon    // Title won't be added because the template is missing.
786d6b81f9SEvan Bacon
796d6b81f9SEvan Bacon    // Standard replacements
806d6b81f9SEvan Bacon    expect(contents).toMatch(/<html lang="en">/);
816d6b81f9SEvan Bacon
826d6b81f9SEvan Bacon    // Meta
836d6b81f9SEvan Bacon    expect(contents).toMatch(/<meta name="description" content="my static app">/);
846d6b81f9SEvan Bacon    expect(contents).toMatch(/<meta name="theme-color" content="#123456">/);
856d6b81f9SEvan Bacon    // Adds script tag
86*9b2597baSEvan Bacon    expect(contents).toMatch(/<script src="\/script\.js" defer><\/script>/);
876d6b81f9SEvan Bacon
886d6b81f9SEvan Bacon    // Sanity
896d6b81f9SEvan Bacon    expect(contents).toMatchSnapshot();
906d6b81f9SEvan Bacon  });
916d6b81f9SEvan Bacon});
92