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