1082815dcSEvan Bacon// Tests that require physical fixtures due to their complex nature.
2082815dcSEvan Baconimport { join, resolve } from 'path';
3082815dcSEvan Bacon
4*97e1898cSEvan Baconimport { getConfig } from '../Config';
5082815dcSEvan Baconimport { getDynamicConfig } from '../getConfig';
6082815dcSEvan Bacon
7082815dcSEvan Baconconst mockConfigContext = {} as any;
8082815dcSEvan Bacon
9082815dcSEvan Baconjest.unmock('resolve-from');
10082815dcSEvan Bacon
11082815dcSEvan Bacondescribe(getDynamicConfig, () => {
12082815dcSEvan Bacon  describe('process.cwd in a child process', () => {
13082815dcSEvan Bacon    const originalCwd = process.cwd();
14082815dcSEvan Bacon    const projectRoot = join(__dirname, 'fixtures/dynamic-cwd');
15082815dcSEvan Bacon
16082815dcSEvan Bacon    beforeEach(() => {
17082815dcSEvan Bacon      process.chdir(__dirname);
18082815dcSEvan Bacon    });
19082815dcSEvan Bacon
20082815dcSEvan Bacon    afterEach(() => {
21082815dcSEvan Bacon      process.chdir(originalCwd);
22082815dcSEvan Bacon    });
23082815dcSEvan Bacon
24082815dcSEvan Bacon    // Test that hot evaluation is spawned in the expected location
25082815dcSEvan Bacon    // https://github.com/expo/expo-cli/pull/2220
26082815dcSEvan Bacon    it('process.cwd in read-config script is not equal to the project root', () => {
27082815dcSEvan Bacon      const configPath = join(projectRoot, 'app.config.ts');
28082815dcSEvan Bacon
29082815dcSEvan Bacon      const { config } = getDynamicConfig(configPath, mockConfigContext);
30082815dcSEvan Bacon
31*97e1898cSEvan Bacon      expect(config?.extra.processCwd).toBe(__dirname);
32082815dcSEvan Bacon      expect(
33082815dcSEvan Bacon        getDynamicConfig(configPath, {
34082815dcSEvan Bacon          projectRoot,
35*97e1898cSEvan Bacon        } as any).config?.extra.processCwd
36082815dcSEvan Bacon      ).toBe(__dirname);
37082815dcSEvan Bacon    });
38082815dcSEvan Bacon  });
39082815dcSEvan Bacon});
40082815dcSEvan Bacon
41082815dcSEvan Bacondescribe(getConfig, () => {
42082815dcSEvan Bacon  it('parses a js config with import', () => {
43082815dcSEvan Bacon    const projectRoot = resolve(__dirname, './fixtures/require-file');
44082815dcSEvan Bacon
45082815dcSEvan Bacon    const { exp } = getConfig(projectRoot, {
46082815dcSEvan Bacon      skipSDKVersionRequirement: true,
47082815dcSEvan Bacon    });
48082815dcSEvan Bacon    // @ts-ignore: foo property is not defined
49082815dcSEvan Bacon    expect(exp.foo).toBe('bar');
50082815dcSEvan Bacon  });
51082815dcSEvan Bacon
52082815dcSEvan Bacon  it('throws a useful error for a project with an external syntax error', () => {
53082815dcSEvan Bacon    const projectRoot = resolve(__dirname, './fixtures/external-error');
54082815dcSEvan Bacon
55082815dcSEvan Bacon    expect(() =>
56082815dcSEvan Bacon      getConfig(projectRoot, {
57082815dcSEvan Bacon        skipSDKVersionRequirement: true,
58082815dcSEvan Bacon      })
59e93c6b62SBrent Vatne    ).toThrow(/Error reading Expo config.*?app.config.js/);
60082815dcSEvan Bacon  });
61082815dcSEvan Bacon
62082815dcSEvan Bacon  it('resolves plugins', () => {
63082815dcSEvan Bacon    const projectRoot = resolve(__dirname, './fixtures/plugins');
64082815dcSEvan Bacon    const { exp } = getConfig(projectRoot, {
65082815dcSEvan Bacon      skipSDKVersionRequirement: true,
66082815dcSEvan Bacon    });
67082815dcSEvan Bacon
68082815dcSEvan Bacon    expect(exp.name).toBe('custom-name');
69082815dcSEvan Bacon    expect(exp.slug).toBe('from-custom-plugin');
70*97e1898cSEvan Bacon    expect(exp.plugins?.[0]).toStrictEqual('./my-plugin');
71082815dcSEvan Bacon    // Ensure the plugin method is serialized into its original name
72*97e1898cSEvan Bacon    expect(exp.plugins?.[1][0]).toBe('withCustom');
73082815dcSEvan Bacon  });
74082815dcSEvan Bacon});
75