1import { asMock } from '../../__tests__/asMock';
2import { resolvePortAsync } from '../../utils/port';
3import { resolveHostType, resolveOptionsAsync, resolvePortsAsync } from '../resolveOptions';
4
5jest.mock('../../utils/port', () => {
6  return {
7    resolvePortAsync: jest.fn(),
8  };
9});
10jest.mock('../../utils/scheme', () => {
11  return {
12    getOptionalDevClientSchemeAsync: jest.fn(async () => []),
13  };
14});
15
16describe(resolveOptionsAsync, () => {
17  it(`prevents using --dev-client and --go together`, async () => {
18    await expect(
19      resolveOptionsAsync('/noop', {
20        '--dev-client': true,
21        '--go': true,
22      })
23    ).rejects.toThrowErrorMatchingInlineSnapshot(
24      `"Cannot use both --dev-client and --go together."`
25    );
26  });
27  it(`--go sets devClient to false`, async () => {
28    expect(
29      (
30        await resolveOptionsAsync('/noop', {
31          '--go': true,
32        })
33      ).devClient
34    ).toBe(false);
35  });
36  it(`defaults to devClient being false`, async () => {
37    expect((await resolveOptionsAsync('/noop', {})).devClient).toBe(false);
38  });
39  it(`sets devClient to true`, async () => {
40    expect((await resolveOptionsAsync('/noop', { '--dev-client': true })).devClient).toBe(true);
41  });
42});
43
44describe(resolveHostType, () => {
45  it(`resolves no options`, () => {
46    expect(resolveHostType({})).toBe('lan');
47  });
48  it(`resolves host type`, () => {
49    expect(resolveHostType({ lan: true })).toBe('lan');
50    expect(resolveHostType({ localhost: true })).toBe('localhost');
51    expect(resolveHostType({ tunnel: true })).toBe('tunnel');
52    expect(resolveHostType({ offline: true })).toBe('lan');
53    expect(resolveHostType({ host: 'tunnel' })).toBe('tunnel');
54    // Default
55    expect(resolveHostType({})).toBe('lan');
56  });
57  it(`asserts invalid host type`, () => {
58    expect(() => resolveHostType({ host: 'bacon' })).toThrow();
59  });
60  it(`asserts conflicting options`, () => {
61    expect(() => resolveHostType({ localhost: true, offline: true })).toThrow(/Specify at most/);
62    expect(() => resolveHostType({ localhost: true, host: 'lan' })).toThrow(/Specify at most/);
63    expect(() => resolveHostType({ localhost: true, lan: true })).toThrow(/Specify at most/);
64    expect(() => resolveHostType({ tunnel: true, lan: true })).toThrow(/Specify at most/);
65  });
66});
67
68describe(resolvePortsAsync, () => {
69  beforeEach(() => {
70    asMock(resolvePortAsync).mockImplementation(async (root, { defaultPort, fallbackPort }) => {
71      if (typeof defaultPort === 'string' && defaultPort) {
72        return parseInt(defaultPort, 10);
73      } else if (typeof defaultPort === 'number' && defaultPort) {
74        return defaultPort;
75      }
76      return fallbackPort;
77    });
78  });
79  it(`resolves default port for metro`, async () => {
80    await expect(resolvePortsAsync('/noop', {}, { webOnly: false })).resolves.toStrictEqual({
81      metroPort: 8081,
82    });
83  });
84  it(`resolves default port with given port`, async () => {
85    await expect(
86      resolvePortsAsync('/noop', { port: 1234 }, { webOnly: false })
87    ).resolves.toStrictEqual({
88      metroPort: 1234,
89    });
90    await expect(
91      resolvePortsAsync('/noop', { port: 1234, devClient: true }, { webOnly: false })
92    ).resolves.toStrictEqual({
93      metroPort: 1234,
94    });
95    await expect(
96      resolvePortsAsync('/noop', { port: 1234 }, { webOnly: true })
97    ).resolves.toStrictEqual({
98      webpackPort: 1234,
99    });
100  });
101  it(`resolves default port for metro with dev client`, async () => {
102    await expect(
103      resolvePortsAsync('/noop', { devClient: true }, { webOnly: false })
104    ).resolves.toStrictEqual({
105      metroPort: 8081,
106    });
107  });
108  it(`resolves default port for webpack`, async () => {
109    await expect(resolvePortsAsync('/noop', {}, { webOnly: true })).resolves.toStrictEqual({
110      webpackPort: 19006,
111    });
112    // dev client changes nothing on Webpack...
113    await expect(
114      resolvePortsAsync('/noop', { devClient: true }, { webOnly: true })
115    ).resolves.toStrictEqual({
116      webpackPort: 19006,
117    });
118  });
119});
120