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