1*082815dcSEvan Baconimport fs from 'fs'; 2*082815dcSEvan Baconimport { vol } from 'memfs'; 3*082815dcSEvan Baconimport path from 'path'; 4*082815dcSEvan Bacon 5*082815dcSEvan Baconimport { 6*082815dcSEvan Bacon getApplicationTargetNameForSchemeAsync, 7*082815dcSEvan Bacon getArchiveBuildConfigurationForSchemeAsync, 8*082815dcSEvan Bacon getRunnableSchemesFromXcodeproj, 9*082815dcSEvan Bacon} from '../BuildScheme'; 10*082815dcSEvan Bacon 11*082815dcSEvan Baconconst fsReal = jest.requireActual('fs') as typeof fs; 12*082815dcSEvan Bacon 13*082815dcSEvan Baconjest.mock('fs'); 14*082815dcSEvan Bacon 15*082815dcSEvan Bacondescribe(getRunnableSchemesFromXcodeproj, () => { 16*082815dcSEvan Bacon beforeAll(async () => { 17*082815dcSEvan Bacon vol.fromJSON( 18*082815dcSEvan Bacon { 19*082815dcSEvan Bacon 'ios/project.xcodeproj/project.pbxproj': fsReal.readFileSync( 20*082815dcSEvan Bacon path.join(__dirname, 'fixtures/project-multitarget.pbxproj'), 21*082815dcSEvan Bacon 'utf-8' 22*082815dcSEvan Bacon ), 23*082815dcSEvan Bacon }, 24*082815dcSEvan Bacon '/app' 25*082815dcSEvan Bacon ); 26*082815dcSEvan Bacon }); 27*082815dcSEvan Bacon 28*082815dcSEvan Bacon afterAll(() => { 29*082815dcSEvan Bacon vol.reset(); 30*082815dcSEvan Bacon }); 31*082815dcSEvan Bacon it(`parses for runnable schemes`, async () => { 32*082815dcSEvan Bacon const schemes = getRunnableSchemesFromXcodeproj('/app'); 33*082815dcSEvan Bacon expect(schemes).toStrictEqual([ 34*082815dcSEvan Bacon { name: 'multitarget', osType: 'iOS', type: 'com.apple.product-type.application' }, 35*082815dcSEvan Bacon { name: 'shareextension', osType: 'iOS', type: 'com.apple.product-type.app-extension' }, 36*082815dcSEvan Bacon ]); 37*082815dcSEvan Bacon }); 38*082815dcSEvan Bacon}); 39*082815dcSEvan Bacon 40*082815dcSEvan Bacondescribe(getApplicationTargetNameForSchemeAsync, () => { 41*082815dcSEvan Bacon describe('single build action entry', () => { 42*082815dcSEvan Bacon beforeAll(async () => { 43*082815dcSEvan Bacon vol.fromJSON( 44*082815dcSEvan Bacon { 45*082815dcSEvan Bacon 'ios/testproject.xcodeproj/xcshareddata/xcschemes/testproject.xcscheme': 46*082815dcSEvan Bacon fsReal.readFileSync(path.join(__dirname, 'fixtures/testproject.xcscheme'), 'utf-8'), 47*082815dcSEvan Bacon }, 48*082815dcSEvan Bacon '/app' 49*082815dcSEvan Bacon ); 50*082815dcSEvan Bacon }); 51*082815dcSEvan Bacon 52*082815dcSEvan Bacon afterAll(() => { 53*082815dcSEvan Bacon vol.reset(); 54*082815dcSEvan Bacon }); 55*082815dcSEvan Bacon 56*082815dcSEvan Bacon it('returns the target name for existing scheme', async () => { 57*082815dcSEvan Bacon const target = await getApplicationTargetNameForSchemeAsync('/app', 'testproject'); 58*082815dcSEvan Bacon expect(target).toBe('testproject'); 59*082815dcSEvan Bacon }); 60*082815dcSEvan Bacon 61*082815dcSEvan Bacon it('throws if the scheme does not exist', async () => { 62*082815dcSEvan Bacon await expect(() => 63*082815dcSEvan Bacon getApplicationTargetNameForSchemeAsync('/app', 'nonexistentscheme') 64*082815dcSEvan Bacon ).rejects.toThrow(/does not exist/); 65*082815dcSEvan Bacon }); 66*082815dcSEvan Bacon }); 67*082815dcSEvan Bacon describe('multiple build action entries', () => { 68*082815dcSEvan Bacon beforeAll(async () => { 69*082815dcSEvan Bacon vol.fromJSON( 70*082815dcSEvan Bacon { 71*082815dcSEvan Bacon 'ios/testproject.xcodeproj/xcshareddata/xcschemes/testproject.xcscheme': 72*082815dcSEvan Bacon fsReal.readFileSync(path.join(__dirname, 'fixtures/testproject-2.xcscheme'), 'utf-8'), 73*082815dcSEvan Bacon }, 74*082815dcSEvan Bacon '/app' 75*082815dcSEvan Bacon ); 76*082815dcSEvan Bacon }); 77*082815dcSEvan Bacon 78*082815dcSEvan Bacon afterAll(() => { 79*082815dcSEvan Bacon vol.reset(); 80*082815dcSEvan Bacon }); 81*082815dcSEvan Bacon 82*082815dcSEvan Bacon it('returns the target name for existing scheme', async () => { 83*082815dcSEvan Bacon const target = await getApplicationTargetNameForSchemeAsync('/app', 'testproject'); 84*082815dcSEvan Bacon expect(target).toBe('testproject'); 85*082815dcSEvan Bacon }); 86*082815dcSEvan Bacon 87*082815dcSEvan Bacon it('throws if the scheme does not exist', async () => { 88*082815dcSEvan Bacon await expect(() => 89*082815dcSEvan Bacon getApplicationTargetNameForSchemeAsync('/app', 'nonexistentscheme') 90*082815dcSEvan Bacon ).rejects.toThrow(/does not exist/); 91*082815dcSEvan Bacon }); 92*082815dcSEvan Bacon }); 93*082815dcSEvan Bacon}); 94*082815dcSEvan Bacon 95*082815dcSEvan Bacondescribe(getArchiveBuildConfigurationForSchemeAsync, () => { 96*082815dcSEvan Bacon beforeAll(async () => { 97*082815dcSEvan Bacon vol.fromJSON( 98*082815dcSEvan Bacon { 99*082815dcSEvan Bacon 'ios/testproject.xcodeproj/xcshareddata/xcschemes/testproject.xcscheme': 100*082815dcSEvan Bacon fsReal.readFileSync(path.join(__dirname, 'fixtures/testproject.xcscheme'), 'utf-8'), 101*082815dcSEvan Bacon }, 102*082815dcSEvan Bacon '/app' 103*082815dcSEvan Bacon ); 104*082815dcSEvan Bacon }); 105*082815dcSEvan Bacon 106*082815dcSEvan Bacon afterAll(() => { 107*082815dcSEvan Bacon vol.reset(); 108*082815dcSEvan Bacon }); 109*082815dcSEvan Bacon 110*082815dcSEvan Bacon it('returns build configuration name for existing scheme', async () => { 111*082815dcSEvan Bacon const buildConfiguration = await getArchiveBuildConfigurationForSchemeAsync( 112*082815dcSEvan Bacon '/app', 113*082815dcSEvan Bacon 'testproject' 114*082815dcSEvan Bacon ); 115*082815dcSEvan Bacon expect(buildConfiguration).toBe('Release'); 116*082815dcSEvan Bacon }); 117*082815dcSEvan Bacon 118*082815dcSEvan Bacon it('throws if the scheme does not exist', async () => { 119*082815dcSEvan Bacon await expect(() => 120*082815dcSEvan Bacon getArchiveBuildConfigurationForSchemeAsync('/app', 'nonexistentscheme') 121*082815dcSEvan Bacon ).rejects.toThrow(/does not exist/); 122*082815dcSEvan Bacon }); 123*082815dcSEvan Bacon}); 124