1*8d3f3824SCedric van Puttenimport spawnAsync from '@expo/spawn-async';
2*8d3f3824SCedric van Putten
3*8d3f3824SCedric van Puttenimport { mockSpawnPromise, STUB_SPAWN_CHILD, STUB_SPAWN_RESULT } from '../../__tests__/spawn-utils';
4*8d3f3824SCedric van Puttenimport { createPendingSpawnAsync } from '../spawn';
5*8d3f3824SCedric van Putten
6*8d3f3824SCedric van Puttenjest.mock('@expo/spawn-async');
7*8d3f3824SCedric van Putten
8*8d3f3824SCedric van Puttenconst mockedSpawnAsync = spawnAsync as jest.MockedFunction<typeof spawnAsync>;
9*8d3f3824SCedric van Putten
10*8d3f3824SCedric van Puttendescribe(createPendingSpawnAsync, () => {
11*8d3f3824SCedric van Putten  it('creates a promise with pending child promise', async () => {
12*8d3f3824SCedric van Putten    const pending = createPendingSpawnAsync(
13*8d3f3824SCedric van Putten      () => Promise.resolve(),
14*8d3f3824SCedric van Putten      () => spawnAsync('foo', ['bar'])
15*8d3f3824SCedric van Putten    );
16*8d3f3824SCedric van Putten
17*8d3f3824SCedric van Putten    expect(pending).toHaveProperty('child', expect.any(Promise));
18*8d3f3824SCedric van Putten  });
19*8d3f3824SCedric van Putten
20*8d3f3824SCedric van Putten  it('pipes return of async action to spawn action', async () => {
21*8d3f3824SCedric van Putten    const pending = createPendingSpawnAsync(
22*8d3f3824SCedric van Putten      () => Promise.resolve(['custom', 'flags']),
23*8d3f3824SCedric van Putten      (flags) => spawnAsync('foo', flags)
24*8d3f3824SCedric van Putten    );
25*8d3f3824SCedric van Putten
26*8d3f3824SCedric van Putten    await pending;
27*8d3f3824SCedric van Putten    expect(mockedSpawnAsync).toBeCalledWith('foo', ['custom', 'flags']);
28*8d3f3824SCedric van Putten  });
29*8d3f3824SCedric van Putten
30*8d3f3824SCedric van Putten  it('pending promises resolves when both actions resolves', async () => {
31*8d3f3824SCedric van Putten    const pending = createPendingSpawnAsync(
32*8d3f3824SCedric van Putten      () => Promise.resolve(),
33*8d3f3824SCedric van Putten      () => spawnAsync('foo', ['bar'])
34*8d3f3824SCedric van Putten    );
35*8d3f3824SCedric van Putten
36*8d3f3824SCedric van Putten    await expect(pending).resolves.toMatchObject(STUB_SPAWN_RESULT);
37*8d3f3824SCedric van Putten    await expect(pending.child).resolves.toMatchObject(STUB_SPAWN_CHILD);
38*8d3f3824SCedric van Putten  });
39*8d3f3824SCedric van Putten
40*8d3f3824SCedric van Putten  it('pending child promise resolves to `null` when async action rejects', async () => {
41*8d3f3824SCedric van Putten    const error = new Error('foo');
42*8d3f3824SCedric van Putten    const pending = createPendingSpawnAsync(
43*8d3f3824SCedric van Putten      () => Promise.reject(error),
44*8d3f3824SCedric van Putten      () => spawnAsync('foo', ['bar'])
45*8d3f3824SCedric van Putten    );
46*8d3f3824SCedric van Putten
47*8d3f3824SCedric van Putten    await expect(pending.child).resolves.toBeNull();
48*8d3f3824SCedric van Putten    await expect(pending).rejects.toBe(error);
49*8d3f3824SCedric van Putten  });
50*8d3f3824SCedric van Putten
51*8d3f3824SCedric van Putten  it('pending promise rejects when spawn action rejects', async () => {
52*8d3f3824SCedric van Putten    const error = new Error('foo');
53*8d3f3824SCedric van Putten    mockedSpawnAsync.mockImplementation(() => mockSpawnPromise(Promise.reject(error)));
54*8d3f3824SCedric van Putten
55*8d3f3824SCedric van Putten    const pending = createPendingSpawnAsync(
56*8d3f3824SCedric van Putten      () => Promise.resolve(['other', 'custom', 'flags']),
57*8d3f3824SCedric van Putten      (flags) => spawnAsync('foo', flags)
58*8d3f3824SCedric van Putten    );
59*8d3f3824SCedric van Putten
60*8d3f3824SCedric van Putten    await expect(pending).rejects.toBe(error);
61*8d3f3824SCedric van Putten    await expect(pending.child).resolves.toMatchObject(STUB_SPAWN_CHILD);
62*8d3f3824SCedric van Putten
63*8d3f3824SCedric van Putten    expect(mockedSpawnAsync).toBeCalledWith('foo', ['other', 'custom', 'flags']);
64*8d3f3824SCedric van Putten  });
65*8d3f3824SCedric van Putten});
66