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