1import { vol } from 'memfs';
2
3import {
4  getMainActivityAsync,
5  getProjectBuildGradleAsync,
6  getResourceXMLPathAsync,
7} from '../Paths';
8
9jest.mock('fs');
10
11describe(getMainActivityAsync, () => {
12  beforeAll(async () => {
13    vol.fromJSON(
14      {
15        './android/app/src/main/java/com/bacon/app/MainActivity.java': '...',
16      },
17      '/app'
18    );
19    vol.fromJSON(
20      {
21        './android/app/src/main/java/com/bacon/app/MainActivity.kt': '...',
22      },
23      '/kt'
24    );
25  });
26  afterAll(async () => {
27    vol.reset();
28  });
29
30  it(`gets a java project`, async () => {
31    const mainActivity = await getMainActivityAsync('/app');
32    expect(mainActivity.path).toBe(
33      '/app/android/app/src/main/java/com/bacon/app/MainActivity.java'
34    );
35    expect(mainActivity.language).toBe('java');
36    expect(mainActivity.contents).toBe('...');
37  });
38  it(`gets a kotlin project`, async () => {
39    const mainActivity = await getMainActivityAsync('/kt');
40    expect(mainActivity.path).toBe('/kt/android/app/src/main/java/com/bacon/app/MainActivity.kt');
41    expect(mainActivity.language).toBe('kt');
42    expect(mainActivity.contents).toBe('...');
43  });
44});
45
46describe(getProjectBuildGradleAsync, () => {
47  beforeAll(async () => {
48    vol.fromJSON(
49      {
50        './android/build.gradle': '...',
51      },
52      '/app'
53    );
54    vol.fromJSON(
55      {
56        './android/build.gradle.kts': '...',
57      },
58      '/kt'
59    );
60  });
61  afterAll(async () => {
62    vol.reset();
63  });
64
65  it(`gets a groovy gradle`, async () => {
66    const file = await getProjectBuildGradleAsync('/app');
67    expect(file.path).toBe('/app/android/build.gradle');
68    expect(file.language).toBe('groovy');
69    expect(file.contents).toBe('...');
70  });
71  it(`gets a kotlin gradle`, async () => {
72    const file = await getProjectBuildGradleAsync('/kt');
73    expect(file.path).toBe('/kt/android/build.gradle.kts');
74    expect(file.language).toBe('kt');
75    expect(file.contents).toBe('...');
76  });
77});
78
79describe(getResourceXMLPathAsync, () => {
80  beforeAll(async () => {
81    vol.fromJSON(
82      {
83        './android/app/src/main/res/values/colors.xml': '<resources></resources>',
84        // './android/app/src/main/res/values-night/colors.xml': '<resources></resources>',
85      },
86      '/app'
87    );
88    vol.fromJSON(
89      {
90        // no files -- specifically no android folder
91      },
92      '/managed'
93    );
94  });
95  afterAll(async () => {
96    vol.reset();
97  });
98
99  it(`gets a resource that defaults to values`, async () => {
100    const path = await getResourceXMLPathAsync('/app', { name: 'colors' });
101    expect(path).toBe('/app/android/app/src/main/res/values/colors.xml');
102  });
103  it(`gets a themed resource`, async () => {
104    const path = await getResourceXMLPathAsync('/app', { name: 'colors', kind: 'values-night' });
105    expect(path).toBe('/app/android/app/src/main/res/values-night/colors.xml');
106  });
107
108  it(`throws when the android folder is missing`, async () => {
109    await expect(getResourceXMLPathAsync('/managed', { name: 'somn' })).rejects.toThrow(
110      /Android project folder is missing in project/
111    );
112  });
113});
114