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