1*c4ef02aeSEvan Baconimport { vol } from 'memfs'; 2*c4ef02aeSEvan Bacon 3*c4ef02aeSEvan Baconimport { Log } from '../../../log'; 4*c4ef02aeSEvan Baconimport rnFixture from '../../../prebuild/__tests__/fixtures/react-native-project'; 5*c4ef02aeSEvan Baconimport { logProjectLogsLocation } from '../../hints'; 6*c4ef02aeSEvan Baconimport { buildAsync } from '../XcodeBuild'; 7*c4ef02aeSEvan Baconimport { launchAppAsync } from '../launchApp'; 8*c4ef02aeSEvan Baconimport { isSimulatorDevice, resolveDeviceAsync } from '../options/resolveDevice'; 9*c4ef02aeSEvan Baconimport { resolveOptionsAsync } from '../options/resolveOptions'; 10*c4ef02aeSEvan Baconimport { runIosAsync } from '../runIosAsync'; 11*c4ef02aeSEvan Bacon 12*c4ef02aeSEvan Baconjest.mock('../../hints', () => ({ 13*c4ef02aeSEvan Bacon logProjectLogsLocation: jest.fn(), 14*c4ef02aeSEvan Bacon logDeviceArgument: jest.fn(), 15*c4ef02aeSEvan Bacon})); 16*c4ef02aeSEvan Bacon 17*c4ef02aeSEvan Baconjest.mock('../../../log'); 18*c4ef02aeSEvan Bacon 19*c4ef02aeSEvan Baconjest.mock('../../../utils/port'); 20*c4ef02aeSEvan Bacon 21*c4ef02aeSEvan Baconjest.mock('../options/resolveDevice', () => ({ 22*c4ef02aeSEvan Bacon isSimulatorDevice: jest.fn(() => true), 23*c4ef02aeSEvan Bacon resolveDeviceAsync: jest.fn(async () => ({ 24*c4ef02aeSEvan Bacon name: 'mock', 25*c4ef02aeSEvan Bacon udid: '123', 26*c4ef02aeSEvan Bacon })), 27*c4ef02aeSEvan Bacon})); 28*c4ef02aeSEvan Bacon 29*c4ef02aeSEvan Baconjest.mock('../../../utils/env', () => ({ 30*c4ef02aeSEvan Bacon env: { 31*c4ef02aeSEvan Bacon CI: false, 32*c4ef02aeSEvan Bacon }, 33*c4ef02aeSEvan Bacon})); 34*c4ef02aeSEvan Bacon 35*c4ef02aeSEvan Baconjest.mock('../../startBundler', () => ({ 36*c4ef02aeSEvan Bacon startBundlerAsync: jest.fn(() => ({ 37*c4ef02aeSEvan Bacon startAsync: jest.fn(), 38*c4ef02aeSEvan Bacon })), 39*c4ef02aeSEvan Bacon})); 40*c4ef02aeSEvan Bacon 41*c4ef02aeSEvan Baconjest.mock('../../../start/platforms/ios/AppleDeviceManager', () => ({ 42*c4ef02aeSEvan Bacon AppleDeviceManager: { 43*c4ef02aeSEvan Bacon resolveAsync: async () => ({ 44*c4ef02aeSEvan Bacon device: {}, 45*c4ef02aeSEvan Bacon }), 46*c4ef02aeSEvan Bacon }, 47*c4ef02aeSEvan Bacon})); 48*c4ef02aeSEvan Bacon 49*c4ef02aeSEvan Baconjest.mock('../XcodeBuild', () => ({ 50*c4ef02aeSEvan Bacon logPrettyItem: jest.fn(), 51*c4ef02aeSEvan Bacon buildAsync: jest.fn(async () => '...'), 52*c4ef02aeSEvan Bacon getAppBinaryPath: jest.fn(() => '/mock_binary'), 53*c4ef02aeSEvan Bacon})); 54*c4ef02aeSEvan Bacon 55*c4ef02aeSEvan Baconjest.mock('../launchApp', () => ({ 56*c4ef02aeSEvan Bacon launchAppAsync: jest.fn(async () => {}), 57*c4ef02aeSEvan Bacon})); 58*c4ef02aeSEvan Bacon 59*c4ef02aeSEvan Baconconst asMock = <T extends (...args: any[]) => any>(fn: T): jest.MockedFunction<T> => 60*c4ef02aeSEvan Bacon fn as jest.MockedFunction<T>; 61*c4ef02aeSEvan Bacon 62*c4ef02aeSEvan Baconconst mockPlatform = (value: typeof process.platform) => 63*c4ef02aeSEvan Bacon Object.defineProperty(process, 'platform', { 64*c4ef02aeSEvan Bacon value, 65*c4ef02aeSEvan Bacon }); 66*c4ef02aeSEvan Bacon 67*c4ef02aeSEvan Baconconst platform = process.platform; 68*c4ef02aeSEvan Bacon 69*c4ef02aeSEvan BaconafterEach(() => { 70*c4ef02aeSEvan Bacon mockPlatform(platform); 71*c4ef02aeSEvan Bacon}); 72*c4ef02aeSEvan Bacon 73*c4ef02aeSEvan Bacondescribe(resolveOptionsAsync, () => { 74*c4ef02aeSEvan Bacon afterEach(() => vol.reset()); 75*c4ef02aeSEvan Bacon 76*c4ef02aeSEvan Bacon it(`asserts that the function only runs on darwin machines`, async () => { 77*c4ef02aeSEvan Bacon mockPlatform('win32'); 78*c4ef02aeSEvan Bacon await expect(runIosAsync('/', {})).rejects.toThrow(/EXIT_CALLED/); 79*c4ef02aeSEvan Bacon expect(Log.exit).toBeCalledWith(expect.stringMatching(/eas build -p ios/)); 80*c4ef02aeSEvan Bacon }); 81*c4ef02aeSEvan Bacon 82*c4ef02aeSEvan Bacon it(`runs ios on simulator`, async () => { 83*c4ef02aeSEvan Bacon mockPlatform('darwin'); 84*c4ef02aeSEvan Bacon vol.fromJSON(rnFixture, '/'); 85*c4ef02aeSEvan Bacon 86*c4ef02aeSEvan Bacon await runIosAsync('/', {}); 87*c4ef02aeSEvan Bacon 88*c4ef02aeSEvan Bacon expect(buildAsync).toBeCalledWith({ 89*c4ef02aeSEvan Bacon buildCache: true, 90*c4ef02aeSEvan Bacon configuration: 'Debug', 91*c4ef02aeSEvan Bacon device: { name: 'mock', udid: '123' }, 92*c4ef02aeSEvan Bacon isSimulator: true, 93*c4ef02aeSEvan Bacon port: 8081, 94*c4ef02aeSEvan Bacon projectRoot: '/', 95*c4ef02aeSEvan Bacon scheme: 'ReactNativeProject', 96*c4ef02aeSEvan Bacon shouldSkipInitialBundling: false, 97*c4ef02aeSEvan Bacon shouldStartBundler: true, 98*c4ef02aeSEvan Bacon xcodeProject: { isWorkspace: false, name: '/ios/ReactNativeProject.xcodeproj' }, 99*c4ef02aeSEvan Bacon }); 100*c4ef02aeSEvan Bacon 101*c4ef02aeSEvan Bacon expect(launchAppAsync).toBeCalledWith('/mock_binary', expect.anything(), { 102*c4ef02aeSEvan Bacon device: { name: 'mock', udid: '123' }, 103*c4ef02aeSEvan Bacon isSimulator: true, 104*c4ef02aeSEvan Bacon shouldStartBundler: true, 105*c4ef02aeSEvan Bacon }); 106*c4ef02aeSEvan Bacon 107*c4ef02aeSEvan Bacon expect(logProjectLogsLocation).toBeCalled(); 108*c4ef02aeSEvan Bacon }); 109*c4ef02aeSEvan Bacon 110*c4ef02aeSEvan Bacon it(`runs ios on device`, async () => { 111*c4ef02aeSEvan Bacon asMock(resolveDeviceAsync).mockResolvedValueOnce({ 112*c4ef02aeSEvan Bacon name: "Evan's phone", 113*c4ef02aeSEvan Bacon model: 'iPhone13,4', 114*c4ef02aeSEvan Bacon osVersion: '15.4.1', 115*c4ef02aeSEvan Bacon deviceType: 'device', 116*c4ef02aeSEvan Bacon udid: '00008101-001964A22629003A', 117*c4ef02aeSEvan Bacon }); 118*c4ef02aeSEvan Bacon asMock(isSimulatorDevice).mockReturnValueOnce(false); 119*c4ef02aeSEvan Bacon mockPlatform('darwin'); 120*c4ef02aeSEvan Bacon vol.fromJSON(rnFixture, '/'); 121*c4ef02aeSEvan Bacon 122*c4ef02aeSEvan Bacon await runIosAsync('/', { device: '00008101-001964A22629003A' }); 123*c4ef02aeSEvan Bacon 124*c4ef02aeSEvan Bacon expect(buildAsync).toBeCalledWith({ 125*c4ef02aeSEvan Bacon buildCache: true, 126*c4ef02aeSEvan Bacon configuration: 'Debug', 127*c4ef02aeSEvan Bacon device: { 128*c4ef02aeSEvan Bacon deviceType: 'device', 129*c4ef02aeSEvan Bacon model: 'iPhone13,4', 130*c4ef02aeSEvan Bacon name: "Evan's phone", 131*c4ef02aeSEvan Bacon osVersion: '15.4.1', 132*c4ef02aeSEvan Bacon udid: '00008101-001964A22629003A', 133*c4ef02aeSEvan Bacon }, 134*c4ef02aeSEvan Bacon isSimulator: false, 135*c4ef02aeSEvan Bacon port: 8081, 136*c4ef02aeSEvan Bacon projectRoot: '/', 137*c4ef02aeSEvan Bacon scheme: 'ReactNativeProject', 138*c4ef02aeSEvan Bacon shouldSkipInitialBundling: true, 139*c4ef02aeSEvan Bacon shouldStartBundler: true, 140*c4ef02aeSEvan Bacon xcodeProject: { isWorkspace: false, name: '/ios/ReactNativeProject.xcodeproj' }, 141*c4ef02aeSEvan Bacon }); 142*c4ef02aeSEvan Bacon 143*c4ef02aeSEvan Bacon expect(launchAppAsync).toBeCalledWith('/mock_binary', expect.anything(), { 144*c4ef02aeSEvan Bacon device: { 145*c4ef02aeSEvan Bacon deviceType: 'device', 146*c4ef02aeSEvan Bacon model: 'iPhone13,4', 147*c4ef02aeSEvan Bacon name: "Evan's phone", 148*c4ef02aeSEvan Bacon osVersion: '15.4.1', 149*c4ef02aeSEvan Bacon udid: '00008101-001964A22629003A', 150*c4ef02aeSEvan Bacon }, 151*c4ef02aeSEvan Bacon isSimulator: false, 152*c4ef02aeSEvan Bacon shouldStartBundler: true, 153*c4ef02aeSEvan Bacon }); 154*c4ef02aeSEvan Bacon 155*c4ef02aeSEvan Bacon expect(logProjectLogsLocation).toBeCalled(); 156*c4ef02aeSEvan Bacon }); 157*c4ef02aeSEvan Bacon}); 158