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