1import { asMock } from '../../__tests__/asMock';
2import { resolvePortAsync } from '../../utils/port';
3import { resolveHostType, resolvePortsAsync } from '../resolveOptions';
4
5jest.mock('../../utils/port', () => {
6  return {
7    resolvePortAsync: jest.fn(),
8  };
9});
10
11describe(resolveHostType, () => {
12  it(`resolves no options`, () => {
13    expect(resolveHostType({})).toBe('lan');
14  });
15  it(`resolves host type`, () => {
16    expect(resolveHostType({ lan: true })).toBe('lan');
17    expect(resolveHostType({ localhost: true })).toBe('localhost');
18    expect(resolveHostType({ tunnel: true })).toBe('tunnel');
19    expect(resolveHostType({ offline: true })).toBe('lan');
20    expect(resolveHostType({ host: 'tunnel' })).toBe('tunnel');
21    // Default
22    expect(resolveHostType({})).toBe('lan');
23  });
24  it(`asserts invalid host type`, () => {
25    expect(() => resolveHostType({ host: 'bacon' })).toThrow();
26  });
27  it(`asserts conflicting options`, () => {
28    expect(() => resolveHostType({ localhost: true, offline: true })).toThrow(/Specify at most/);
29    expect(() => resolveHostType({ localhost: true, host: 'lan' })).toThrow(/Specify at most/);
30    expect(() => resolveHostType({ localhost: true, lan: true })).toThrow(/Specify at most/);
31    expect(() => resolveHostType({ tunnel: true, lan: true })).toThrow(/Specify at most/);
32  });
33});
34
35describe(resolvePortsAsync, () => {
36  beforeEach(() => {
37    asMock(resolvePortAsync).mockImplementation(async (root, { defaultPort, fallbackPort }) => {
38      if (typeof defaultPort === 'string' && defaultPort) {
39        return parseInt(defaultPort, 10);
40      } else if (typeof defaultPort === 'number' && defaultPort) {
41        return defaultPort;
42      }
43      return fallbackPort;
44    });
45  });
46  it(`resolves default port for metro`, async () => {
47    await expect(resolvePortsAsync('/noop', {}, { webOnly: false })).resolves.toStrictEqual({
48      metroPort: 19000,
49    });
50  });
51  it(`resolves default port with given port`, async () => {
52    await expect(
53      resolvePortsAsync('/noop', { port: 1234 }, { webOnly: false })
54    ).resolves.toStrictEqual({
55      metroPort: 1234,
56    });
57    await expect(
58      resolvePortsAsync('/noop', { port: 1234, devClient: true }, { webOnly: false })
59    ).resolves.toStrictEqual({
60      metroPort: 1234,
61    });
62    await expect(
63      resolvePortsAsync('/noop', { port: 1234 }, { webOnly: true })
64    ).resolves.toStrictEqual({
65      webpackPort: 1234,
66    });
67  });
68  it(`resolves default port for metro with dev client`, async () => {
69    await expect(
70      resolvePortsAsync('/noop', { devClient: true }, { webOnly: false })
71    ).resolves.toStrictEqual({
72      metroPort: 8081,
73    });
74  });
75  it(`resolves default port for webpack`, async () => {
76    await expect(resolvePortsAsync('/noop', {}, { webOnly: true })).resolves.toStrictEqual({
77      webpackPort: 19006,
78    });
79    // dev client changes nothing on Webpack...
80    await expect(
81      resolvePortsAsync('/noop', { devClient: true }, { webOnly: true })
82    ).resolves.toStrictEqual({
83      webpackPort: 19006,
84    });
85  });
86});
87