1*082815dcSEvan Baconimport { compileMockModWithResultsAsync } from '../../plugins/__tests__/mockMods';
2*082815dcSEvan Baconimport { withPodfileProperties } from '../../plugins/ios-plugins';
3*082815dcSEvan Baconimport {
4*082815dcSEvan Bacon  updateIosBuildPropertiesFromConfig,
5*082815dcSEvan Bacon  updateIosBuildProperty,
6*082815dcSEvan Bacon  withJsEnginePodfileProps,
7*082815dcSEvan Bacon} from '../BuildProperties';
8*082815dcSEvan Bacon
9*082815dcSEvan Baconjest.mock('../../plugins/ios-plugins');
10*082815dcSEvan Bacon
11*082815dcSEvan Bacondescribe(withJsEnginePodfileProps, () => {
12*082815dcSEvan Bacon  const JS_ENGINE_PROP_KEY = 'expo.jsEngine';
13*082815dcSEvan Bacon
14*082815dcSEvan Bacon  it('set the property from shared `jsEngine` config', async () => {
15*082815dcSEvan Bacon    const { modResults } = await compileMockModWithResultsAsync(
16*082815dcSEvan Bacon      { jsEngine: 'hermes' },
17*082815dcSEvan Bacon      {
18*082815dcSEvan Bacon        plugin: withJsEnginePodfileProps,
19*082815dcSEvan Bacon        mod: withPodfileProperties,
20*082815dcSEvan Bacon        modResults: {},
21*082815dcSEvan Bacon      }
22*082815dcSEvan Bacon    );
23*082815dcSEvan Bacon    expect(modResults).toMatchObject({
24*082815dcSEvan Bacon      [JS_ENGINE_PROP_KEY]: 'hermes',
25*082815dcSEvan Bacon    });
26*082815dcSEvan Bacon  });
27*082815dcSEvan Bacon
28*082815dcSEvan Bacon  it('set the property from platform override `jsEngine`', async () => {
29*082815dcSEvan Bacon    const { modResults } = await compileMockModWithResultsAsync(
30*082815dcSEvan Bacon      { jsEngine: 'hermes', ios: { jsEngine: 'jsc' } },
31*082815dcSEvan Bacon      {
32*082815dcSEvan Bacon        plugin: withJsEnginePodfileProps,
33*082815dcSEvan Bacon        mod: withPodfileProperties,
34*082815dcSEvan Bacon        modResults: {},
35*082815dcSEvan Bacon      }
36*082815dcSEvan Bacon    );
37*082815dcSEvan Bacon    expect(modResults).toMatchObject({
38*082815dcSEvan Bacon      [JS_ENGINE_PROP_KEY]: 'jsc',
39*082815dcSEvan Bacon    });
40*082815dcSEvan Bacon  });
41*082815dcSEvan Bacon
42*082815dcSEvan Bacon  it('overwrite the property if an old property is existed', async () => {
43*082815dcSEvan Bacon    const { modResults } = await compileMockModWithResultsAsync(
44*082815dcSEvan Bacon      { jsEngine: 'hermes' },
45*082815dcSEvan Bacon      {
46*082815dcSEvan Bacon        plugin: withJsEnginePodfileProps,
47*082815dcSEvan Bacon        mod: withPodfileProperties,
48*082815dcSEvan Bacon        modResults: { [JS_ENGINE_PROP_KEY]: 'jsc' } as Record<string, string>,
49*082815dcSEvan Bacon      }
50*082815dcSEvan Bacon    );
51*082815dcSEvan Bacon    expect(modResults).toMatchObject({
52*082815dcSEvan Bacon      [JS_ENGINE_PROP_KEY]: 'hermes',
53*082815dcSEvan Bacon    });
54*082815dcSEvan Bacon  });
55*082815dcSEvan Bacon});
56*082815dcSEvan Bacon
57*082815dcSEvan Bacondescribe(updateIosBuildPropertiesFromConfig, () => {
58*082815dcSEvan Bacon  it('should respect `propValueGetter` order', () => {
59*082815dcSEvan Bacon    const podfileProperties = {};
60*082815dcSEvan Bacon    const configToPropertyRules = [
61*082815dcSEvan Bacon      {
62*082815dcSEvan Bacon        propName: 'expo.jsEngine',
63*082815dcSEvan Bacon        propValueGetter: (config) => config.ios?.jsEngine ?? config.jsEngine ?? 'NOTFOUND',
64*082815dcSEvan Bacon      },
65*082815dcSEvan Bacon    ];
66*082815dcSEvan Bacon
67*082815dcSEvan Bacon    expect(
68*082815dcSEvan Bacon      updateIosBuildPropertiesFromConfig(
69*082815dcSEvan Bacon        { jsEngine: 'hermes', ios: { jsEngine: 'jsc' } },
70*082815dcSEvan Bacon        podfileProperties,
71*082815dcSEvan Bacon        configToPropertyRules
72*082815dcSEvan Bacon      )
73*082815dcSEvan Bacon    ).toMatchObject({
74*082815dcSEvan Bacon      'expo.jsEngine': 'jsc',
75*082815dcSEvan Bacon    });
76*082815dcSEvan Bacon
77*082815dcSEvan Bacon    expect(
78*082815dcSEvan Bacon      updateIosBuildPropertiesFromConfig(
79*082815dcSEvan Bacon        { jsEngine: 'jsc' },
80*082815dcSEvan Bacon        podfileProperties,
81*082815dcSEvan Bacon        configToPropertyRules
82*082815dcSEvan Bacon      )
83*082815dcSEvan Bacon    ).toMatchObject({
84*082815dcSEvan Bacon      'expo.jsEngine': 'jsc',
85*082815dcSEvan Bacon    });
86*082815dcSEvan Bacon
87*082815dcSEvan Bacon    expect(
88*082815dcSEvan Bacon      updateIosBuildPropertiesFromConfig({}, podfileProperties, configToPropertyRules)
89*082815dcSEvan Bacon    ).toMatchObject({
90*082815dcSEvan Bacon      'expo.jsEngine': 'NOTFOUND',
91*082815dcSEvan Bacon    });
92*082815dcSEvan Bacon  });
93*082815dcSEvan Bacon});
94*082815dcSEvan Bacon
95*082815dcSEvan Bacondescribe(updateIosBuildProperty, () => {
96*082815dcSEvan Bacon  it('should merge properties', () => {
97*082815dcSEvan Bacon    const podfileProperties = {
98*082815dcSEvan Bacon      foo: 'foo',
99*082815dcSEvan Bacon      bar: 'bar',
100*082815dcSEvan Bacon      name: 'oldName',
101*082815dcSEvan Bacon    };
102*082815dcSEvan Bacon    expect(updateIosBuildProperty(podfileProperties, 'name', 'newName')).toEqual({
103*082815dcSEvan Bacon      foo: 'foo',
104*082815dcSEvan Bacon      bar: 'bar',
105*082815dcSEvan Bacon      name: 'newName',
106*082815dcSEvan Bacon    });
107*082815dcSEvan Bacon  });
108*082815dcSEvan Bacon
109*082815dcSEvan Bacon  it('should keep original property when `value` is null by default', () => {
110*082815dcSEvan Bacon    const podfileProperties = {
111*082815dcSEvan Bacon      foo: 'foo',
112*082815dcSEvan Bacon      bar: 'bar',
113*082815dcSEvan Bacon    };
114*082815dcSEvan Bacon    expect(updateIosBuildProperty(podfileProperties, 'bar', null)).toEqual({
115*082815dcSEvan Bacon      foo: 'foo',
116*082815dcSEvan Bacon      bar: 'bar',
117*082815dcSEvan Bacon    });
118*082815dcSEvan Bacon  });
119*082815dcSEvan Bacon
120*082815dcSEvan Bacon  it('should remove original property when `value` is null when `removePropWhenValueIsNull` is true', () => {
121*082815dcSEvan Bacon    const podfileProperties = {
122*082815dcSEvan Bacon      foo: 'foo',
123*082815dcSEvan Bacon      bar: 'bar',
124*082815dcSEvan Bacon    };
125*082815dcSEvan Bacon    expect(
126*082815dcSEvan Bacon      updateIosBuildProperty(podfileProperties, 'bar', null, { removePropWhenValueIsNull: true })
127*082815dcSEvan Bacon    ).toEqual({
128*082815dcSEvan Bacon      foo: 'foo',
129*082815dcSEvan Bacon    });
130*082815dcSEvan Bacon  });
131*082815dcSEvan Bacon});
132