1import { unmockAllProperties, mockLinking } from 'jest-expo';
2
3import ExpoWebBrowser from '../ExpoWebBrowser';
4import * as WebBrowser from '../WebBrowser';
5
6const fakeReturnValue = {
7  type: 'cancel',
8};
9
10function applyMocks() {
11  mockLinking();
12  ExpoWebBrowser.openBrowserAsync.mockImplementation(async () => fakeReturnValue);
13}
14
15beforeEach(() => {
16  applyMocks();
17});
18
19afterEach(() => {
20  unmockAllProperties();
21});
22
23it(`openBrowserAsync returns correctly`, async () => {
24  const pageUrl = 'http://expo.io';
25  const openResult = await WebBrowser.openBrowserAsync(pageUrl);
26  expect(openResult).toEqual(fakeReturnValue);
27  expect(ExpoWebBrowser.openBrowserAsync).toHaveBeenCalledWith(pageUrl, {});
28});
29
30it(`dismissBrowser returns nothing`, () => {
31  const closeResult = WebBrowser.dismissBrowser();
32  expect(closeResult).toBeUndefined();
33  expect(ExpoWebBrowser.dismissBrowser).toHaveBeenCalledTimes(1);
34});
35
36it(`openAuthSessionAsync allows subsequent attempts if the browser never opens`, async () => {
37  ExpoWebBrowser.openBrowserAsync.mockRejectedValueOnce(new Error('No matching activity!'));
38  ExpoWebBrowser.openBrowserAsync.mockRejectedValueOnce(new Error('Current activity not found!'));
39  ExpoWebBrowser.openBrowserAsync.mockRejectedValueOnce(new Error('No package manager!'));
40  const pageUrl = 'http://expo.io';
41  const redirectUrl = 'exp://expo.io';
42  await expect(WebBrowser.openAuthSessionAsync(pageUrl, redirectUrl)).rejects.toThrowError(
43    'No matching activity!'
44  );
45  await expect(WebBrowser.openAuthSessionAsync(pageUrl, redirectUrl)).rejects.toThrowError(
46    'Current activity not found!'
47  );
48  await expect(WebBrowser.openAuthSessionAsync(pageUrl, redirectUrl)).rejects.toThrowError(
49    'No package manager!'
50  );
51});
52