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