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