1fa5bc561SWill Schurmanimport { asMock } from '../../__tests__/asMock';
2*8df9096fSEvan Baconimport { hasDirectDevClientDependency } from '../../utils/analytics/getDevClientProperties';
38d307f52SEvan Baconimport { resolvePortAsync } from '../../utils/port';
441c91838SEvan Baconimport { resolveHostType, resolveOptionsAsync, resolvePortsAsync } from '../resolveOptions';
58d307f52SEvan Bacon
68d307f52SEvan Baconjest.mock('../../utils/port', () => {
78d307f52SEvan Bacon  return {
88d307f52SEvan Bacon    resolvePortAsync: jest.fn(),
98d307f52SEvan Bacon  };
108d307f52SEvan Bacon});
1141c91838SEvan Baconjest.mock('../../utils/scheme', () => {
1241c91838SEvan Bacon  return {
1341c91838SEvan Bacon    getOptionalDevClientSchemeAsync: jest.fn(async () => []),
1441c91838SEvan Bacon  };
1541c91838SEvan Bacon});
16*8df9096fSEvan Baconjest.mock('../../utils/analytics/getDevClientProperties', () => {
17*8df9096fSEvan Bacon  return {
18*8df9096fSEvan Bacon    hasDirectDevClientDependency: jest.fn(() => false),
19*8df9096fSEvan Bacon  };
20*8df9096fSEvan Bacon});
2141c91838SEvan Bacon
2241c91838SEvan Bacondescribe(resolveOptionsAsync, () => {
2341c91838SEvan Bacon  it(`prevents using --dev-client and --go together`, async () => {
2441c91838SEvan Bacon    await expect(
2541c91838SEvan Bacon      resolveOptionsAsync('/noop', {
2641c91838SEvan Bacon        '--dev-client': true,
2741c91838SEvan Bacon        '--go': true,
2841c91838SEvan Bacon      })
2941c91838SEvan Bacon    ).rejects.toThrowErrorMatchingInlineSnapshot(
3041c91838SEvan Bacon      `"Cannot use both --dev-client and --go together."`
3141c91838SEvan Bacon    );
3241c91838SEvan Bacon  });
3341c91838SEvan Bacon  it(`--go sets devClient to false`, async () => {
3441c91838SEvan Bacon    expect(
3541c91838SEvan Bacon      (
3641c91838SEvan Bacon        await resolveOptionsAsync('/noop', {
3741c91838SEvan Bacon          '--go': true,
3841c91838SEvan Bacon        })
3941c91838SEvan Bacon      ).devClient
4041c91838SEvan Bacon    ).toBe(false);
4141c91838SEvan Bacon  });
4241c91838SEvan Bacon  it(`defaults to devClient being false`, async () => {
4341c91838SEvan Bacon    expect((await resolveOptionsAsync('/noop', {})).devClient).toBe(false);
4441c91838SEvan Bacon  });
4541c91838SEvan Bacon  it(`sets devClient to true`, async () => {
4641c91838SEvan Bacon    expect((await resolveOptionsAsync('/noop', { '--dev-client': true })).devClient).toBe(true);
4741c91838SEvan Bacon  });
48*8df9096fSEvan Bacon  it(`infers that devClient should be true`, async () => {
49*8df9096fSEvan Bacon    jest.mocked(hasDirectDevClientDependency).mockReturnValueOnce(true);
50*8df9096fSEvan Bacon    expect((await resolveOptionsAsync('/noop', {})).devClient).toBe(true);
51*8df9096fSEvan Bacon  });
52*8df9096fSEvan Bacon  it(`--go forces devClient to false`, async () => {
53*8df9096fSEvan Bacon    jest.mocked(hasDirectDevClientDependency).mockReturnValueOnce(true);
54*8df9096fSEvan Bacon    expect((await resolveOptionsAsync('/noop', { '--go': true })).devClient).toBe(false);
55*8df9096fSEvan Bacon  });
5641c91838SEvan Bacon});
578d307f52SEvan Bacon
588d307f52SEvan Bacondescribe(resolveHostType, () => {
598d307f52SEvan Bacon  it(`resolves no options`, () => {
608d307f52SEvan Bacon    expect(resolveHostType({})).toBe('lan');
618d307f52SEvan Bacon  });
628d307f52SEvan Bacon  it(`resolves host type`, () => {
638d307f52SEvan Bacon    expect(resolveHostType({ lan: true })).toBe('lan');
648d307f52SEvan Bacon    expect(resolveHostType({ localhost: true })).toBe('localhost');
658d307f52SEvan Bacon    expect(resolveHostType({ tunnel: true })).toBe('tunnel');
668d307f52SEvan Bacon    expect(resolveHostType({ offline: true })).toBe('lan');
678d307f52SEvan Bacon    expect(resolveHostType({ host: 'tunnel' })).toBe('tunnel');
688d307f52SEvan Bacon    // Default
698d307f52SEvan Bacon    expect(resolveHostType({})).toBe('lan');
708d307f52SEvan Bacon  });
718d307f52SEvan Bacon  it(`asserts invalid host type`, () => {
728d307f52SEvan Bacon    expect(() => resolveHostType({ host: 'bacon' })).toThrow();
738d307f52SEvan Bacon  });
748d307f52SEvan Bacon  it(`asserts conflicting options`, () => {
758d307f52SEvan Bacon    expect(() => resolveHostType({ localhost: true, offline: true })).toThrow(/Specify at most/);
768d307f52SEvan Bacon    expect(() => resolveHostType({ localhost: true, host: 'lan' })).toThrow(/Specify at most/);
778d307f52SEvan Bacon    expect(() => resolveHostType({ localhost: true, lan: true })).toThrow(/Specify at most/);
788d307f52SEvan Bacon    expect(() => resolveHostType({ tunnel: true, lan: true })).toThrow(/Specify at most/);
798d307f52SEvan Bacon  });
808d307f52SEvan Bacon});
818d307f52SEvan Bacon
828d307f52SEvan Bacondescribe(resolvePortsAsync, () => {
838d307f52SEvan Bacon  beforeEach(() => {
84fa5bc561SWill Schurman    asMock(resolvePortAsync).mockImplementation(async (root, { defaultPort, fallbackPort }) => {
85fa5bc561SWill Schurman      if (typeof defaultPort === 'string' && defaultPort) {
86fa5bc561SWill Schurman        return parseInt(defaultPort, 10);
87fa5bc561SWill Schurman      } else if (typeof defaultPort === 'number' && defaultPort) {
88fa5bc561SWill Schurman        return defaultPort;
89fa5bc561SWill Schurman      }
90fa5bc561SWill Schurman      return fallbackPort;
91fa5bc561SWill Schurman    });
928d307f52SEvan Bacon  });
938d307f52SEvan Bacon  it(`resolves default port for metro`, async () => {
948d307f52SEvan Bacon    await expect(resolvePortsAsync('/noop', {}, { webOnly: false })).resolves.toStrictEqual({
9547d62600SKudo Chien      metroPort: 8081,
968d307f52SEvan Bacon    });
978d307f52SEvan Bacon  });
988d307f52SEvan Bacon  it(`resolves default port with given port`, async () => {
998d307f52SEvan Bacon    await expect(
1008d307f52SEvan Bacon      resolvePortsAsync('/noop', { port: 1234 }, { webOnly: false })
1018d307f52SEvan Bacon    ).resolves.toStrictEqual({
1028d307f52SEvan Bacon      metroPort: 1234,
1038d307f52SEvan Bacon    });
1048d307f52SEvan Bacon    await expect(
1058d307f52SEvan Bacon      resolvePortsAsync('/noop', { port: 1234, devClient: true }, { webOnly: false })
1068d307f52SEvan Bacon    ).resolves.toStrictEqual({
1078d307f52SEvan Bacon      metroPort: 1234,
1088d307f52SEvan Bacon    });
1098d307f52SEvan Bacon    await expect(
1108d307f52SEvan Bacon      resolvePortsAsync('/noop', { port: 1234 }, { webOnly: true })
1118d307f52SEvan Bacon    ).resolves.toStrictEqual({
1128d307f52SEvan Bacon      webpackPort: 1234,
1138d307f52SEvan Bacon    });
1148d307f52SEvan Bacon  });
1158d307f52SEvan Bacon  it(`resolves default port for metro with dev client`, async () => {
1168d307f52SEvan Bacon    await expect(
1178d307f52SEvan Bacon      resolvePortsAsync('/noop', { devClient: true }, { webOnly: false })
1188d307f52SEvan Bacon    ).resolves.toStrictEqual({
1198d307f52SEvan Bacon      metroPort: 8081,
1208d307f52SEvan Bacon    });
1218d307f52SEvan Bacon  });
1228d307f52SEvan Bacon  it(`resolves default port for webpack`, async () => {
1238d307f52SEvan Bacon    await expect(resolvePortsAsync('/noop', {}, { webOnly: true })).resolves.toStrictEqual({
1248d307f52SEvan Bacon      webpackPort: 19006,
1258d307f52SEvan Bacon    });
1268d307f52SEvan Bacon    // dev client changes nothing on Webpack...
1278d307f52SEvan Bacon    await expect(
1288d307f52SEvan Bacon      resolvePortsAsync('/noop', { devClient: true }, { webOnly: true })
1298d307f52SEvan Bacon    ).resolves.toStrictEqual({
1308d307f52SEvan Bacon      webpackPort: 19006,
1318d307f52SEvan Bacon    });
1328d307f52SEvan Bacon  });
1338d307f52SEvan Bacon});
134