1082815dcSEvan Baconimport { ExpoConfig } from '@expo/config-types'; 2082815dcSEvan Baconimport { vol } from 'memfs'; 3082815dcSEvan Bacon 4*8a424bebSJames Ideimport rnFixture from './fixtures/react-native-project'; 5082815dcSEvan Baconimport { addWarningIOS } from '../../utils/warnings'; 6082815dcSEvan Baconimport { createInfoPlistPluginWithPropertyGuard } from '../ios-plugins'; 7082815dcSEvan Baconimport { evalModsAsync } from '../mod-compiler'; 8082815dcSEvan Baconimport { getIosModFileProviders, withIosBaseMods } from '../withIosBaseMods'; 9082815dcSEvan Bacon 10082815dcSEvan Baconjest.mock('../../utils/warnings', () => ({ 11082815dcSEvan Bacon addWarningIOS: jest.fn(), 12082815dcSEvan Bacon})); 13082815dcSEvan Bacon 14082815dcSEvan Baconjest.mock('fs'); 15082815dcSEvan Bacon 16082815dcSEvan Baconexport const asMock = <T extends (...args: any[]) => any>(fn: T): jest.MockedFunction<T> => 17082815dcSEvan Bacon fn as jest.MockedFunction<T>; 18082815dcSEvan Bacondescribe(createInfoPlistPluginWithPropertyGuard, () => { 19082815dcSEvan Bacon const projectRoot = '/app'; 20082815dcSEvan Bacon 21082815dcSEvan Bacon beforeEach(async () => { 22082815dcSEvan Bacon asMock(addWarningIOS).mockClear(); 23ed3bd27bSEvan Bacon vol.fromJSON(rnFixture, projectRoot); 24082815dcSEvan Bacon }); 25082815dcSEvan Bacon 26082815dcSEvan Bacon afterEach(() => { 27082815dcSEvan Bacon vol.reset(); 28082815dcSEvan Bacon }); 29082815dcSEvan Bacon 30082815dcSEvan Bacon it(`respects info plist manual values`, async () => { 31082815dcSEvan Bacon const setter = jest.fn(); 32082815dcSEvan Bacon const withPlugin = createInfoPlistPluginWithPropertyGuard(setter, { 33082815dcSEvan Bacon infoPlistProperty: 'CFFakeValue', 34082815dcSEvan Bacon // Supports nesting 35082815dcSEvan Bacon expoConfigProperty: 'ios.appStoreUrl', 36082815dcSEvan Bacon }); 37082815dcSEvan Bacon 38082815dcSEvan Bacon let config: ExpoConfig = { 39082815dcSEvan Bacon name: 'hey', 40082815dcSEvan Bacon slug: '', 41082815dcSEvan Bacon ios: { 42082815dcSEvan Bacon appStoreUrl: 'underlying', 43082815dcSEvan Bacon infoPlist: { 44082815dcSEvan Bacon CFFakeValue: false, 45082815dcSEvan Bacon }, 46082815dcSEvan Bacon }, 47082815dcSEvan Bacon }; 48082815dcSEvan Bacon 49082815dcSEvan Bacon config = withPlugin(config); 50082815dcSEvan Bacon 51082815dcSEvan Bacon config = withIosBaseMods(config, { 52082815dcSEvan Bacon providers: { 53082815dcSEvan Bacon infoPlist: getIosModFileProviders().infoPlist, 54082815dcSEvan Bacon }, 55082815dcSEvan Bacon }); 56082815dcSEvan Bacon 57082815dcSEvan Bacon const results = await evalModsAsync(config, { 58082815dcSEvan Bacon projectRoot, 59082815dcSEvan Bacon platforms: ['ios'], 60082815dcSEvan Bacon introspect: true, 61082815dcSEvan Bacon assertMissingModProviders: true, 62082815dcSEvan Bacon }); 63082815dcSEvan Bacon 64082815dcSEvan Bacon expect(results.ios.infoPlist.CFFakeValue).toEqual(false); 65082815dcSEvan Bacon 66082815dcSEvan Bacon expect(setter).not.toBeCalled(); 67082815dcSEvan Bacon expect(addWarningIOS).toBeCalledWith( 68082815dcSEvan Bacon 'ios.appStoreUrl', 69082815dcSEvan Bacon '"ios.infoPlist.CFFakeValue" is set in the config. Ignoring abstract property "ios.appStoreUrl": underlying' 70082815dcSEvan Bacon ); 71082815dcSEvan Bacon }); 72082815dcSEvan Bacon 73082815dcSEvan Bacon it(`does not warn about info plist overrides if the abstract value is not defined`, async () => { 74082815dcSEvan Bacon const setter = jest.fn(); 75082815dcSEvan Bacon const withPlugin = createInfoPlistPluginWithPropertyGuard(setter, { 76082815dcSEvan Bacon infoPlistProperty: 'CFFakeValue', 77082815dcSEvan Bacon expoConfigProperty: 'foobar', 78082815dcSEvan Bacon }); 79082815dcSEvan Bacon 80082815dcSEvan Bacon let config: ExpoConfig = { 81082815dcSEvan Bacon name: 'hey', 82082815dcSEvan Bacon slug: '', 83082815dcSEvan Bacon ios: { 84082815dcSEvan Bacon infoPlist: { 85082815dcSEvan Bacon CFFakeValue: false, 86082815dcSEvan Bacon }, 87082815dcSEvan Bacon }, 88082815dcSEvan Bacon }; 89082815dcSEvan Bacon 90082815dcSEvan Bacon config = withPlugin(config); 91082815dcSEvan Bacon 92082815dcSEvan Bacon config = withIosBaseMods(config, { 93082815dcSEvan Bacon providers: { 94082815dcSEvan Bacon infoPlist: getIosModFileProviders().infoPlist, 95082815dcSEvan Bacon }, 96082815dcSEvan Bacon }); 97082815dcSEvan Bacon 98082815dcSEvan Bacon const results = await evalModsAsync(config, { 99082815dcSEvan Bacon projectRoot, 100082815dcSEvan Bacon platforms: ['ios'], 101082815dcSEvan Bacon introspect: true, 102082815dcSEvan Bacon assertMissingModProviders: true, 103082815dcSEvan Bacon }); 104082815dcSEvan Bacon 105082815dcSEvan Bacon expect(results.ios.infoPlist.CFFakeValue).toEqual(false); 106082815dcSEvan Bacon 107082815dcSEvan Bacon expect(setter).not.toBeCalled(); 108082815dcSEvan Bacon expect(addWarningIOS).not.toBeCalled(); 109082815dcSEvan Bacon }); 110082815dcSEvan Bacon 111082815dcSEvan Bacon it(`uses default behavior when not overwritten`, async () => { 112082815dcSEvan Bacon const setter = jest.fn(); 113082815dcSEvan Bacon const withPlugin = createInfoPlistPluginWithPropertyGuard(setter, { 114082815dcSEvan Bacon infoPlistProperty: 'CFFakeValue', 115082815dcSEvan Bacon expoConfigProperty: 'name', 116082815dcSEvan Bacon }); 117082815dcSEvan Bacon 118082815dcSEvan Bacon let config: ExpoConfig = { 119082815dcSEvan Bacon name: 'hey', 120082815dcSEvan Bacon slug: '', 121082815dcSEvan Bacon ios: { 122082815dcSEvan Bacon infoPlist: {}, 123082815dcSEvan Bacon }, 124082815dcSEvan Bacon }; 125082815dcSEvan Bacon 126082815dcSEvan Bacon config = withPlugin(config); 127082815dcSEvan Bacon 128082815dcSEvan Bacon config = withIosBaseMods(config, { 129082815dcSEvan Bacon providers: { 130082815dcSEvan Bacon infoPlist: getIosModFileProviders().infoPlist, 131082815dcSEvan Bacon }, 132082815dcSEvan Bacon }); 133082815dcSEvan Bacon 134082815dcSEvan Bacon await evalModsAsync(config, { 135082815dcSEvan Bacon projectRoot, 136082815dcSEvan Bacon platforms: ['ios'], 137082815dcSEvan Bacon introspect: true, 138082815dcSEvan Bacon assertMissingModProviders: true, 139082815dcSEvan Bacon }); 140082815dcSEvan Bacon 141082815dcSEvan Bacon expect(setter).toBeCalled(); 142082815dcSEvan Bacon expect(addWarningIOS).not.toBeCalled(); 143082815dcSEvan Bacon }); 144082815dcSEvan Bacon}); 145