1082815dcSEvan Baconimport { ExpoConfig } from '@expo/config-types';
2082815dcSEvan Baconimport { fs as memfs, vol } from 'memfs';
3082815dcSEvan Baconimport path from 'path';
4082815dcSEvan Bacon
5*ed3bd27bSEvan Baconimport rnFixture from '../../plugins/__tests__/fixtures/react-native-project';
6082815dcSEvan Baconimport {
7082815dcSEvan Bacon  getBundleIdentifier,
8082815dcSEvan Bacon  getBundleIdentifierFromPbxproj,
9082815dcSEvan Bacon  setBundleIdentifier,
10082815dcSEvan Bacon  setBundleIdentifierForPbxproj,
11082815dcSEvan Bacon} from '../BundleIdentifier';
12082815dcSEvan Bacon
13082815dcSEvan Baconconst baseExpoConfig: ExpoConfig = {
14082815dcSEvan Bacon  name: 'testproject',
15082815dcSEvan Bacon  slug: 'testproject',
16082815dcSEvan Bacon  platforms: ['ios'],
17082815dcSEvan Bacon  version: '1.0.0',
18082815dcSEvan Bacon};
19082815dcSEvan Bacon
20082815dcSEvan Baconjest.mock('fs');
21082815dcSEvan Bacon
22082815dcSEvan Baconconst originalFs = jest.requireActual('fs');
23082815dcSEvan Bacon
24082815dcSEvan Bacondescribe('BundleIdentifier module', () => {
25082815dcSEvan Bacon  describe(getBundleIdentifier, () => {
26082815dcSEvan Bacon    it('returns null if no bundleIdentifier is provided', () => {
27082815dcSEvan Bacon      expect(getBundleIdentifier(baseExpoConfig)).toBe(null);
28082815dcSEvan Bacon    });
29082815dcSEvan Bacon
30082815dcSEvan Bacon    it('returns the bundleIdentifier if provided', () => {
31082815dcSEvan Bacon      expect(
32082815dcSEvan Bacon        getBundleIdentifier({ ...baseExpoConfig, ios: { bundleIdentifier: 'com.example.xyz' } })
33082815dcSEvan Bacon      ).toBe('com.example.xyz');
34082815dcSEvan Bacon    });
35082815dcSEvan Bacon  });
36082815dcSEvan Bacon
37082815dcSEvan Bacon  describe(getBundleIdentifierFromPbxproj, () => {
38082815dcSEvan Bacon    const projectRoot = '/testproject';
39082815dcSEvan Bacon
40082815dcSEvan Bacon    afterEach(() => vol.reset());
41082815dcSEvan Bacon
42082815dcSEvan Bacon    it('returns null if no project.pbxproj exists', () => {
43082815dcSEvan Bacon      vol.mkdirpSync(projectRoot);
44082815dcSEvan Bacon      const bundleId = getBundleIdentifierFromPbxproj(projectRoot, { targetName: 'testproject' });
45082815dcSEvan Bacon      expect(bundleId).toBeNull();
46082815dcSEvan Bacon    });
47082815dcSEvan Bacon
48082815dcSEvan Bacon    it('returns the bundle identifier defined in project.pbxproj', () => {
49082815dcSEvan Bacon      vol.fromJSON(
50082815dcSEvan Bacon        {
51*ed3bd27bSEvan Bacon          'ios/HelloWorld.xcodeproj/project.pbxproj':
52*ed3bd27bSEvan Bacon            rnFixture['ios/HelloWorld.xcodeproj/project.pbxproj'],
53082815dcSEvan Bacon        },
54082815dcSEvan Bacon        projectRoot
55082815dcSEvan Bacon      );
56*ed3bd27bSEvan Bacon      const bundleId = getBundleIdentifierFromPbxproj(projectRoot, { targetName: 'HelloWorld' });
57*ed3bd27bSEvan Bacon      expect(bundleId).toBe('org.name.HelloWorld');
58082815dcSEvan Bacon    });
59082815dcSEvan Bacon
60082815dcSEvan Bacon    describe('multi-target project', () => {
61082815dcSEvan Bacon      it('returns correct bundle identifier for the default build configuration (Release)', () => {
62082815dcSEvan Bacon        vol.fromJSON(
63082815dcSEvan Bacon          {
64082815dcSEvan Bacon            'ios/testproject.xcodeproj/project.pbxproj': originalFs.readFileSync(
65082815dcSEvan Bacon              path.join(__dirname, 'fixtures/project-multitarget.pbxproj'),
66082815dcSEvan Bacon              'utf-8'
67082815dcSEvan Bacon            ),
68082815dcSEvan Bacon            'ios/testproject.xcodeproj/xcshareddata/xcschemes/multitarget.xcscheme':
69082815dcSEvan Bacon              originalFs.readFileSync(
70082815dcSEvan Bacon                path.join(__dirname, 'fixtures/multitarget.xcscheme'),
71082815dcSEvan Bacon                'utf-8'
72082815dcSEvan Bacon              ),
73082815dcSEvan Bacon          },
74082815dcSEvan Bacon          projectRoot
75082815dcSEvan Bacon        );
76082815dcSEvan Bacon        const bundleId = getBundleIdentifierFromPbxproj(projectRoot, {
77082815dcSEvan Bacon          targetName: 'multitarget',
78082815dcSEvan Bacon        });
79082815dcSEvan Bacon        expect(bundleId).toBe('com.swmansion.dominik.multitarget');
80082815dcSEvan Bacon      });
81082815dcSEvan Bacon
82082815dcSEvan Bacon      it('returns correct bundle identifier for Debug build configuration', () => {
83082815dcSEvan Bacon        vol.fromJSON(
84082815dcSEvan Bacon          {
85082815dcSEvan Bacon            'ios/testproject.xcodeproj/project.pbxproj': originalFs.readFileSync(
86082815dcSEvan Bacon              path.join(__dirname, 'fixtures/project-multitarget.pbxproj'),
87082815dcSEvan Bacon              'utf-8'
88082815dcSEvan Bacon            ),
89082815dcSEvan Bacon            'ios/testproject.xcodeproj/xcshareddata/xcschemes/multitarget.xcscheme':
90082815dcSEvan Bacon              originalFs.readFileSync(
91082815dcSEvan Bacon                path.join(__dirname, 'fixtures/multitarget.xcscheme'),
92082815dcSEvan Bacon                'utf-8'
93082815dcSEvan Bacon              ),
94082815dcSEvan Bacon          },
95082815dcSEvan Bacon          projectRoot
96082815dcSEvan Bacon        );
97082815dcSEvan Bacon        const bundleId = getBundleIdentifierFromPbxproj(projectRoot, {
98082815dcSEvan Bacon          targetName: 'multitarget',
99082815dcSEvan Bacon          buildConfiguration: 'Debug',
100082815dcSEvan Bacon        });
101082815dcSEvan Bacon        expect(bundleId).toBe('com.swmansion.dominik.multitarget.debug');
102082815dcSEvan Bacon      });
103082815dcSEvan Bacon    });
104082815dcSEvan Bacon  });
105082815dcSEvan Bacon
106082815dcSEvan Bacon  describe(setBundleIdentifier, () => {
107082815dcSEvan Bacon    it('sets the CFBundleShortVersionString if bundleIdentifier is given', () => {
108082815dcSEvan Bacon      expect(
109082815dcSEvan Bacon        setBundleIdentifier(
110082815dcSEvan Bacon          { ...baseExpoConfig, ios: { bundleIdentifier: 'host.exp.exponent' } },
111082815dcSEvan Bacon          {}
112082815dcSEvan Bacon        )
113082815dcSEvan Bacon      ).toMatchObject({
114082815dcSEvan Bacon        CFBundleIdentifier: 'host.exp.exponent',
115082815dcSEvan Bacon      });
116082815dcSEvan Bacon    });
117082815dcSEvan Bacon
118082815dcSEvan Bacon    it('makes no changes to the infoPlist no bundleIdentifier is provided', () => {
119082815dcSEvan Bacon      expect(setBundleIdentifier(baseExpoConfig, {})).toMatchObject({});
120082815dcSEvan Bacon    });
121082815dcSEvan Bacon  });
122082815dcSEvan Bacon
123082815dcSEvan Bacon  describe(setBundleIdentifierForPbxproj, () => {
124082815dcSEvan Bacon    const projectRoot = '/testproject';
125082815dcSEvan Bacon    const pbxProjPath = 'ios/testproject.xcodeproj/project.pbxproj';
126082815dcSEvan Bacon    const otherPbxProjPath = 'ios/otherproject.xcodeproj/project.pbxproj';
127082815dcSEvan Bacon
128082815dcSEvan Bacon    beforeEach(() => {
129082815dcSEvan Bacon      vol.fromJSON(
130082815dcSEvan Bacon        {
131*ed3bd27bSEvan Bacon          [pbxProjPath]: rnFixture['ios/HelloWorld.xcodeproj/project.pbxproj'],
132*ed3bd27bSEvan Bacon          [otherPbxProjPath]: rnFixture['ios/HelloWorld.xcodeproj/project.pbxproj'],
133082815dcSEvan Bacon        },
134082815dcSEvan Bacon        projectRoot
135082815dcSEvan Bacon      );
136082815dcSEvan Bacon    });
137082815dcSEvan Bacon    afterEach(() => vol.reset());
138082815dcSEvan Bacon
139082815dcSEvan Bacon    it('sets the bundle identifier in the pbxproj file', () => {
140082815dcSEvan Bacon      setBundleIdentifierForPbxproj(projectRoot, 'com.swmansion.dominik.abcd.v2');
141082815dcSEvan Bacon      const pbxprojContents = memfs.readFileSync(path.join(projectRoot, pbxProjPath), 'utf-8');
142082815dcSEvan Bacon      const otherPbxprojContents = memfs.readFileSync(
143082815dcSEvan Bacon        path.join(projectRoot, otherPbxProjPath),
144082815dcSEvan Bacon        'utf-8'
145082815dcSEvan Bacon      );
146082815dcSEvan Bacon      expect(pbxprojContents).toMatchSnapshot();
147082815dcSEvan Bacon      // Ensure all paths are modified
148082815dcSEvan Bacon      expect(pbxprojContents).toBe(otherPbxprojContents);
149082815dcSEvan Bacon    });
150082815dcSEvan Bacon  });
151082815dcSEvan Bacon});
152