1import { AndroidConfig, IOSConfig } from '@expo/config-plugins';
2import { getInfoPlistPathFromPbxproj } from '@expo/config-plugins/build/ios/utils/getInfoPlistPath';
3import { vol } from 'memfs';
4import path from 'path';
5
6import { getSchemesForAndroidAsync, getSchemesForIosAsync } from '../scheme';
7
8jest.mock('fs');
9jest.mock('@expo/config-plugins');
10jest.mock('@expo/config-plugins/build/ios/utils/getInfoPlistPath');
11
12// TODO: replace with `jest.mocked`, when updating Jest
13const asMock = (fn: any): jest.Mock => fn;
14
15describe(getSchemesForAndroidAsync, () => {
16  it('resolves longest scheme without known expo schemes', async () => {
17    asMock(AndroidConfig.Scheme.getSchemesFromManifest).mockResolvedValue([
18      'com.expo.test',
19      'com.expo.longertest',
20      'com.expo.longesttest',
21    ]);
22
23    await expect(getSchemesForAndroidAsync('/fake-project')).resolves.toEqual([
24      'com.expo.longesttest',
25      'com.expo.longertest',
26      'com.expo.test',
27    ]);
28  });
29
30  it('resolves known expo schemes before longest schemes', async () => {
31    asMock(AndroidConfig.Scheme.getSchemesFromManifest).mockResolvedValue([
32      'com.expo.longesttest',
33      'exp+com.expo.test',
34    ]);
35
36    await expect(getSchemesForAndroidAsync('/fake-project')).resolves.toEqual([
37      'exp+com.expo.test',
38    ]);
39  });
40});
41
42describe(getSchemesForIosAsync, () => {
43  beforeAll(() => {
44    const fakePlist = `
45      <?xml version="1.0" encoding="UTF-8"?>
46      <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
47      <plist version="1.0">
48        <dict>
49          <key>fake</key>
50          <string>plist</string>
51        </dic>
52      </plist>
53    `;
54
55    vol.fromJSON({
56      [path.join('fake-project', 'ios', 'fake-pbxproject')]: fakePlist,
57    });
58  });
59
60  afterAll(() => {
61    vol.reset();
62  });
63
64  it('resolves longest scheme without known expo schemes', async () => {
65    asMock(getInfoPlistPathFromPbxproj).mockReturnValue('fake-pbxproject');
66    asMock(IOSConfig.Scheme.getSchemesFromPlist).mockReturnValue([
67      'com.expo.test',
68      'com.expo.longertest',
69      'com.expo.longesttest',
70    ]);
71
72    await expect(getSchemesForIosAsync('fake-project')).resolves.toEqual([
73      'com.expo.longesttest',
74      'com.expo.longertest',
75      'com.expo.test',
76    ]);
77  });
78
79  it('resolves known expo schemes before longest schemes', async () => {
80    asMock(getInfoPlistPathFromPbxproj).mockReturnValue('fake-pbxproject');
81    asMock(IOSConfig.Scheme.getSchemesFromPlist).mockReturnValue([
82      'com.expo.longesttest',
83      'exp+com.expo.test',
84    ]);
85
86    await expect(getSchemesForIosAsync('fake-project')).resolves.toEqual(['exp+com.expo.test']);
87  });
88});
89