16d6b81f9SEvan Baconimport { getConfig } from '@expo/config';
26d6b81f9SEvan Bacon
36d6b81f9SEvan Baconimport { asMock } from '../../__tests__/asMock';
4dc51e206SEvan Baconimport { resolveOptionsAsync } from '../resolveOptions';
5dc51e206SEvan Bacon
66d6b81f9SEvan Baconjest.mock('@expo/config', () => ({
76d6b81f9SEvan Bacon  getConfig: jest.fn(() => ({
86d6b81f9SEvan Bacon    pkg: {},
96d6b81f9SEvan Bacon    exp: {
106d6b81f9SEvan Bacon      sdkVersion: '45.0.0',
116d6b81f9SEvan Bacon      name: 'my-app',
126d6b81f9SEvan Bacon      slug: 'my-app',
136d6b81f9SEvan Bacon    },
146d6b81f9SEvan Bacon  })),
156d6b81f9SEvan Bacon}));
166d6b81f9SEvan Bacon
17dc51e206SEvan Bacondescribe(resolveOptionsAsync, () => {
18*8eba27a6SCedric van Putten  it(`asserts unknown platform`, async () => {
19*8eba27a6SCedric van Putten    await expect(resolveOptionsAsync('/', { '--platform': ['foobar'] })).rejects.toThrow(
20dc51e206SEvan Bacon      /^Unsupported platform "foobar"\./
21dc51e206SEvan Bacon    );
22dc51e206SEvan Bacon  });
23dc51e206SEvan Bacon
24*8eba27a6SCedric van Putten  it(`asserts not-configured platform`, async () => {
25*8eba27a6SCedric van Putten    await expect(resolveOptionsAsync('/', { '--platform': ['web'] })).rejects.toThrow(
26*8eba27a6SCedric van Putten      /^Platform "web" is not configured to use the Metro bundler in the project Expo config\./
27*8eba27a6SCedric van Putten    );
28*8eba27a6SCedric van Putten  });
29*8eba27a6SCedric van Putten
30*8eba27a6SCedric van Putten  it(`allows multiple platform flags`, async () => {
31*8eba27a6SCedric van Putten    await expect(
32*8eba27a6SCedric van Putten      resolveOptionsAsync('/', { '--platform': ['android', 'ios'] })
33*8eba27a6SCedric van Putten    ).resolves.toMatchObject({
34*8eba27a6SCedric van Putten      platforms: ['android', 'ios'],
35*8eba27a6SCedric van Putten    });
36*8eba27a6SCedric van Putten  });
37*8eba27a6SCedric van Putten
38*8eba27a6SCedric van Putten  it(`filters duplicated platform flags`, async () => {
39*8eba27a6SCedric van Putten    await expect(
40*8eba27a6SCedric van Putten      resolveOptionsAsync('/', { '--platform': ['android', 'android', 'ios', 'ios'] })
41*8eba27a6SCedric van Putten    ).resolves.toMatchObject({
42*8eba27a6SCedric van Putten      platforms: ['android', 'ios'],
43*8eba27a6SCedric van Putten    });
44*8eba27a6SCedric van Putten  });
45*8eba27a6SCedric van Putten
46*8eba27a6SCedric van Putten  it(`filters duplicated platform flags including all`, async () => {
47*8eba27a6SCedric van Putten    await expect(
48*8eba27a6SCedric van Putten      resolveOptionsAsync('/', { '--platform': ['android', 'all'] })
49*8eba27a6SCedric van Putten    ).resolves.toMatchObject({
50*8eba27a6SCedric van Putten      platforms: ['android', 'ios'],
51*8eba27a6SCedric van Putten    });
52*8eba27a6SCedric van Putten  });
53*8eba27a6SCedric van Putten
54dc51e206SEvan Bacon  it(`parses qualified options`, async () => {
55dc51e206SEvan Bacon    await expect(
566d6b81f9SEvan Bacon      resolveOptionsAsync('/', {
57dc51e206SEvan Bacon        '--output-dir': 'foobar',
58*8eba27a6SCedric van Putten        '--platform': ['android'],
59dc51e206SEvan Bacon        '--clear': true,
60dc51e206SEvan Bacon        '--dev': true,
61dc51e206SEvan Bacon        '--dump-assetmap': true,
62dc51e206SEvan Bacon        '--dump-sourcemap': true,
63dc51e206SEvan Bacon        '--max-workers': 2,
64dc51e206SEvan Bacon      })
65dc51e206SEvan Bacon    ).resolves.toEqual({
66dc51e206SEvan Bacon      clear: true,
67dc51e206SEvan Bacon      dev: true,
681a3d836eSEvan Bacon      minify: true,
69dc51e206SEvan Bacon      dumpAssetmap: true,
70dc51e206SEvan Bacon      dumpSourcemap: true,
71dc51e206SEvan Bacon      maxWorkers: 2,
72dc51e206SEvan Bacon      outputDir: 'foobar',
73dc51e206SEvan Bacon      platforms: ['android'],
74dc51e206SEvan Bacon    });
75dc51e206SEvan Bacon  });
76dc51e206SEvan Bacon
77dc51e206SEvan Bacon  it(`parses default options`, async () => {
786d6b81f9SEvan Bacon    await expect(resolveOptionsAsync('/', {})).resolves.toEqual({
79dc51e206SEvan Bacon      clear: false,
80dc51e206SEvan Bacon      dev: false,
811a3d836eSEvan Bacon      minify: true,
82dc51e206SEvan Bacon      dumpAssetmap: false,
83dc51e206SEvan Bacon      dumpSourcemap: false,
84dc51e206SEvan Bacon      maxWorkers: undefined,
85dc51e206SEvan Bacon      outputDir: 'dist',
866d6b81f9SEvan Bacon      platforms: ['ios', 'android'],
87dc51e206SEvan Bacon    });
88dc51e206SEvan Bacon  });
896d6b81f9SEvan Bacon  it(`parses default options with web enabled`, async () => {
906d6b81f9SEvan Bacon    asMock(getConfig).mockReturnValueOnce({
916d6b81f9SEvan Bacon      // @ts-expect-error
926d6b81f9SEvan Bacon      exp: { web: { bundler: 'metro' } },
936d6b81f9SEvan Bacon    });
946d6b81f9SEvan Bacon    await expect(resolveOptionsAsync('/', {})).resolves.toEqual(
956d6b81f9SEvan Bacon      expect.objectContaining({
966d6b81f9SEvan Bacon        platforms: ['ios', 'android', 'web'],
976d6b81f9SEvan Bacon      })
986d6b81f9SEvan Bacon    );
996d6b81f9SEvan Bacon  });
100dc51e206SEvan Bacon});
101