1082815dcSEvan Baconimport { vol } from 'memfs';
2082815dcSEvan Bacon
3*97e1898cSEvan Baconimport { getConfig, getProjectConfigDescriptionWithPaths } from '../Config';
4082815dcSEvan Bacon
5082815dcSEvan Baconjest.mock('fs');
6082815dcSEvan Bacon
7082815dcSEvan Bacondescribe(getProjectConfigDescriptionWithPaths, () => {
8082815dcSEvan Bacon  it(`describes a project using both a static and dynamic config`, () => {
9082815dcSEvan Bacon    const message = getProjectConfigDescriptionWithPaths('/', {
10082815dcSEvan Bacon      dynamicConfigPath: '/app.config.js',
11082815dcSEvan Bacon      staticConfigPath: '/app.config.json',
12082815dcSEvan Bacon    });
13082815dcSEvan Bacon    expect(message).toMatch(`app.config.js`);
14082815dcSEvan Bacon    expect(message).toMatch(`app.config.json`);
15082815dcSEvan Bacon  });
16082815dcSEvan Bacon  it(`describes a project using only a static config`, () => {
17082815dcSEvan Bacon    const message = getProjectConfigDescriptionWithPaths('/', {
18082815dcSEvan Bacon      dynamicConfigPath: null,
19082815dcSEvan Bacon      staticConfigPath: '/app.json',
20082815dcSEvan Bacon    });
21082815dcSEvan Bacon    expect(message).toMatch(`app.json`);
22082815dcSEvan Bacon  });
23082815dcSEvan Bacon  it(`describes a project using only a dynamic config`, () => {
24082815dcSEvan Bacon    const message = getProjectConfigDescriptionWithPaths('/', {
25082815dcSEvan Bacon      dynamicConfigPath: '/app.config.ts',
26082815dcSEvan Bacon      staticConfigPath: null,
27082815dcSEvan Bacon    });
28082815dcSEvan Bacon    expect(message).toMatch(`app.config.ts`);
29082815dcSEvan Bacon  });
30082815dcSEvan Bacon  it(`describes a project with no configs using a default value`, () => {
31082815dcSEvan Bacon    const message = getProjectConfigDescriptionWithPaths('/', {
32082815dcSEvan Bacon      dynamicConfigPath: null,
33082815dcSEvan Bacon      staticConfigPath: null,
34082815dcSEvan Bacon    });
35082815dcSEvan Bacon    expect(message).toBe('app.json');
36082815dcSEvan Bacon  });
37082815dcSEvan Bacon});
38082815dcSEvan Bacon
39082815dcSEvan Bacondescribe('getConfig public config', () => {
40082815dcSEvan Bacon  const appJsonWithPrivateData = {
41082815dcSEvan Bacon    name: 'testing 123',
42082815dcSEvan Bacon    version: '0.1.0',
43082815dcSEvan Bacon    slug: 'testing-123',
44082815dcSEvan Bacon    sdkVersion: '100.0.0',
45082815dcSEvan Bacon    hooks: {
46082815dcSEvan Bacon      postPublish: [],
47082815dcSEvan Bacon    },
48082815dcSEvan Bacon    android: {
49082815dcSEvan Bacon      config: {
50082815dcSEvan Bacon        googleMaps: {
51082815dcSEvan Bacon          apiKey: 'test-key',
52082815dcSEvan Bacon        },
53082815dcSEvan Bacon      },
54082815dcSEvan Bacon      versionCode: 1,
55082815dcSEvan Bacon    },
56082815dcSEvan Bacon    ios: {
57082815dcSEvan Bacon      config: {
58082815dcSEvan Bacon        googleMapsApiKey: 'test-key',
59082815dcSEvan Bacon      },
60082815dcSEvan Bacon      buildNumber: '1.0',
61082815dcSEvan Bacon    },
62082815dcSEvan Bacon  };
63082815dcSEvan Bacon
64082815dcSEvan Bacon  const appJsonNoPrivateData = {
65082815dcSEvan Bacon    name: 'testing 123',
66082815dcSEvan Bacon    version: '0.1.0',
67082815dcSEvan Bacon    slug: 'testing-123',
68082815dcSEvan Bacon    sdkVersion: '100.0.0',
69082815dcSEvan Bacon    ios: {
70082815dcSEvan Bacon      buildNumber: '1.0',
71082815dcSEvan Bacon    },
72082815dcSEvan Bacon  };
73082815dcSEvan Bacon
74082815dcSEvan Bacon  beforeAll(() => {
75082815dcSEvan Bacon    const packageJson = JSON.stringify(
76082815dcSEvan Bacon      {
77082815dcSEvan Bacon        name: 'testing123',
78082815dcSEvan Bacon        version: '0.1.0',
79082815dcSEvan Bacon        description: 'fake description',
80082815dcSEvan Bacon        main: 'index.js',
81082815dcSEvan Bacon      },
82082815dcSEvan Bacon      null,
83082815dcSEvan Bacon      2
84082815dcSEvan Bacon    );
85082815dcSEvan Bacon
86082815dcSEvan Bacon    vol.fromJSON({
87082815dcSEvan Bacon      '/private-data/package.json': packageJson,
88082815dcSEvan Bacon      '/private-data/app.json': JSON.stringify({ expo: appJsonWithPrivateData }),
89082815dcSEvan Bacon      '/no-private-data/package.json': packageJson,
90082815dcSEvan Bacon      '/no-private-data/app.json': JSON.stringify({ expo: appJsonNoPrivateData }),
91082815dcSEvan Bacon    });
92082815dcSEvan Bacon  });
93082815dcSEvan Bacon
94082815dcSEvan Bacon  afterAll(() => vol.reset());
95082815dcSEvan Bacon
96082815dcSEvan Bacon  it('removes only private data from the config', () => {
97082815dcSEvan Bacon    const { exp } = getConfig('/private-data', { isPublicConfig: true });
98082815dcSEvan Bacon
99082815dcSEvan Bacon    expect(exp.hooks).toBeUndefined();
100082815dcSEvan Bacon
101082815dcSEvan Bacon    expect(exp.ios).toBeDefined();
102*97e1898cSEvan Bacon    expect(exp.ios!.buildNumber).toEqual(appJsonWithPrivateData.ios.buildNumber);
103*97e1898cSEvan Bacon    expect(exp.ios!.config).toBeUndefined();
104082815dcSEvan Bacon
105082815dcSEvan Bacon    expect(exp.android).toBeDefined();
106*97e1898cSEvan Bacon    expect(exp.android!.versionCode).toEqual(appJsonWithPrivateData.android.versionCode);
107*97e1898cSEvan Bacon    expect(exp.android!.config).toBeUndefined();
108082815dcSEvan Bacon    expect(exp._internal).toBeUndefined();
109082815dcSEvan Bacon  });
110082815dcSEvan Bacon
111082815dcSEvan Bacon  it('does not remove properties from a config with no private data', () => {
112082815dcSEvan Bacon    const { exp } = getConfig('/no-private-data', { isPublicConfig: true });
113082815dcSEvan Bacon    expect(exp).toMatchObject(appJsonNoPrivateData);
114082815dcSEvan Bacon  });
115082815dcSEvan Bacon});
116082815dcSEvan Bacon
117082815dcSEvan Bacondescribe('readConfigJson', () => {
118082815dcSEvan Bacon  describe('sdkVersion', () => {
119082815dcSEvan Bacon    beforeAll(() => {
120082815dcSEvan Bacon      const packageJson = JSON.stringify(
121082815dcSEvan Bacon        {
122082815dcSEvan Bacon          name: 'testing123',
123082815dcSEvan Bacon          version: '0.1.0',
124082815dcSEvan Bacon          description: 'fake description',
125082815dcSEvan Bacon          main: 'index.js',
126082815dcSEvan Bacon        },
127082815dcSEvan Bacon        null,
128082815dcSEvan Bacon        2
129082815dcSEvan Bacon      );
130082815dcSEvan Bacon
131082815dcSEvan Bacon      const appJson = {
132082815dcSEvan Bacon        name: 'testing 123',
133082815dcSEvan Bacon        version: '0.1.0',
134082815dcSEvan Bacon        slug: 'testing-123',
135082815dcSEvan Bacon        sdkVersion: '100.0.0',
136082815dcSEvan Bacon      };
137082815dcSEvan Bacon
138082815dcSEvan Bacon      const expoPackageJson = JSON.stringify({
139082815dcSEvan Bacon        name: 'expo',
140082815dcSEvan Bacon        version: '650.x.x',
141082815dcSEvan Bacon      });
142082815dcSEvan Bacon
143082815dcSEvan Bacon      vol.fromJSON({
144082815dcSEvan Bacon        '/from-config/package.json': packageJson,
145082815dcSEvan Bacon        '/from-config/app.json': JSON.stringify({ expo: appJson }),
146082815dcSEvan Bacon        '/from-config/node_modules/expo/package.json': expoPackageJson,
147082815dcSEvan Bacon
148082815dcSEvan Bacon        '/from-package/package.json': packageJson,
149082815dcSEvan Bacon        '/from-package/app.json': JSON.stringify({ expo: { ...appJson, sdkVersion: undefined } }),
150082815dcSEvan Bacon        '/from-package/node_modules/expo/package.json': expoPackageJson,
151082815dcSEvan Bacon
152082815dcSEvan Bacon        '/no-version/package.json': packageJson,
153082815dcSEvan Bacon        '/no-version/app.json': JSON.stringify({ expo: { ...appJson, sdkVersion: undefined } }),
154082815dcSEvan Bacon      });
155082815dcSEvan Bacon    });
156082815dcSEvan Bacon    afterAll(() => vol.reset());
157082815dcSEvan Bacon
158082815dcSEvan Bacon    it('reads the SDK version from the config', () => {
159*97e1898cSEvan Bacon      const { exp } = getConfig('/from-config');
160082815dcSEvan Bacon      expect(exp.sdkVersion).toBe('100.0.0');
161082815dcSEvan Bacon    });
162082815dcSEvan Bacon
163082815dcSEvan Bacon    it('reads the SDK version from the installed version of expo', () => {
164*97e1898cSEvan Bacon      const { exp } = getConfig('/from-package');
165082815dcSEvan Bacon      expect(exp.sdkVersion).toBe('650.0.0');
166082815dcSEvan Bacon    });
167082815dcSEvan Bacon  });
168082815dcSEvan Bacon
169082815dcSEvan Bacon  describe('validation', () => {
170082815dcSEvan Bacon    beforeAll(() => {
171082815dcSEvan Bacon      const packageJson = JSON.stringify({
172082815dcSEvan Bacon        name: 'testing123',
173082815dcSEvan Bacon        version: '0.1.0',
174082815dcSEvan Bacon        main: 'index.js',
175082815dcSEvan Bacon      });
176082815dcSEvan Bacon
177082815dcSEvan Bacon      const expoPackageJson = JSON.stringify({
178082815dcSEvan Bacon        name: 'expo',
179082815dcSEvan Bacon        version: '650.x.x',
180082815dcSEvan Bacon      });
181082815dcSEvan Bacon
182082815dcSEvan Bacon      vol.fromJSON({
183082815dcSEvan Bacon        '/no-config/package.json': packageJson,
184082815dcSEvan Bacon        '/no-config/node_modules/expo/package.json': expoPackageJson,
185082815dcSEvan Bacon
186082815dcSEvan Bacon        '/no-package/package.json': packageJson,
187082815dcSEvan Bacon      });
188082815dcSEvan Bacon    });
189082815dcSEvan Bacon    afterAll(() => vol.reset());
190082815dcSEvan Bacon
191082815dcSEvan Bacon    it(`can skip throwing when the app.json is missing and expo isn't installed`, () => {
192*97e1898cSEvan Bacon      const { exp, pkg } = getConfig('/no-package', { skipSDKVersionRequirement: true });
193082815dcSEvan Bacon      expect(exp.name).toBe(pkg.name);
194082815dcSEvan Bacon      expect(exp.description).toBe(pkg.description);
195082815dcSEvan Bacon    });
196082815dcSEvan Bacon
197*97e1898cSEvan Bacon    it(`will not throw if the app.json is missing`, () => {
198082815dcSEvan Bacon      // No config is required for new method
199082815dcSEvan Bacon      expect(() => getConfig('/no-config')).not.toThrow();
200082815dcSEvan Bacon    });
201082815dcSEvan Bacon
202*97e1898cSEvan Bacon    it(`will not throw if the expo package is missing when skipSDKVersionRequirement is enabled`, () => {
203082815dcSEvan Bacon      expect(() => getConfig('/no-package', { skipSDKVersionRequirement: false })).toThrow(
204082815dcSEvan Bacon        /Cannot determine which native SDK version your project uses/
205082815dcSEvan Bacon      );
206082815dcSEvan Bacon    });
207082815dcSEvan Bacon  });
208082815dcSEvan Bacon});
209