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