1import { getConfig } from '@expo/config';
2import { AndroidConfig } from '@expo/config-plugins';
3
4import { asMock } from '../../../../__tests__/asMock';
5import { AndroidAppIdResolver } from '../AndroidAppIdResolver';
6
7jest.mock('@expo/config-plugins', () => ({
8  AndroidConfig: {
9    Package: {
10      getApplicationIdAsync: jest.fn(),
11    },
12    Paths: {
13      getProjectPathOrThrowAsync: jest.fn(async () => '/path/to/file'),
14    },
15  },
16}));
17jest.mock('@expo/config', () => ({
18  getConfig: jest.fn(() => ({
19    pkg: {},
20    exp: {
21      sdkVersion: '45.0.0',
22      name: 'my-app',
23      slug: 'my-app',
24    },
25  })),
26}));
27
28// Most cases are tested in the superclass.
29
30describe('getAppIdAsync', () => {
31  it('resolves the app id from native files', async () => {
32    const resolver = new AndroidAppIdResolver('/');
33    resolver.hasNativeProjectAsync = jest.fn(resolver.hasNativeProjectAsync);
34    resolver.getAppIdFromNativeAsync = jest.fn(resolver.getAppIdFromNativeAsync);
35    asMock(AndroidConfig.Package.getApplicationIdAsync).mockResolvedValueOnce('dev.bacon.myapp');
36    expect(await resolver.getAppIdAsync()).toBe('dev.bacon.myapp');
37    expect(resolver.getAppIdFromNativeAsync).toBeCalledTimes(1);
38    expect(resolver.hasNativeProjectAsync).toBeCalledTimes(1);
39  });
40
41  it('resolves the app id from project config', async () => {
42    const resolver = new AndroidAppIdResolver('/');
43    resolver.hasNativeProjectAsync = jest.fn(async () => false);
44    resolver.getAppIdFromConfigAsync = jest.fn(resolver.getAppIdFromConfigAsync);
45
46    asMock(getConfig).mockReturnValueOnce({
47      exp: {
48        android: {
49          package: 'dev.bacon.myapp',
50        },
51      },
52    } as any);
53    expect(await resolver.getAppIdAsync()).toBe('dev.bacon.myapp');
54    expect(resolver.getAppIdFromConfigAsync).toBeCalledTimes(1);
55    expect(resolver.hasNativeProjectAsync).toBeCalledTimes(1);
56  });
57});
58