1*082815dcSEvan Baconimport { vol } from 'memfs';
2*082815dcSEvan Bacon
3*082815dcSEvan Baconimport { parseXMLAsync } from '../../utils/XML';
4*082815dcSEvan Baconimport { fileExistsAsync } from '../../utils/modules';
5*082815dcSEvan Baconimport { getResourceXMLPathAsync } from '../Paths';
6*082815dcSEvan Baconimport { getObjectAsResourceGroup, readResourcesXMLAsync } from '../Resources';
7*082815dcSEvan Bacon
8*082815dcSEvan Baconjest.mock('fs');
9*082815dcSEvan Bacon
10*082815dcSEvan Bacondescribe(getResourceXMLPathAsync, () => {
11*082815dcSEvan Bacon  beforeAll(async () => {
12*082815dcSEvan Bacon    vol.fromJSON(
13*082815dcSEvan Bacon      {
14*082815dcSEvan Bacon        './android/app/src/main/res/values/colors.xml': '<resources></resources>',
15*082815dcSEvan Bacon        // './android/app/src/main/res/values-night/colors.xml': '<resources></resources>',
16*082815dcSEvan Bacon      },
17*082815dcSEvan Bacon      '/app'
18*082815dcSEvan Bacon    );
19*082815dcSEvan Bacon    vol.fromJSON(
20*082815dcSEvan Bacon      {
21*082815dcSEvan Bacon        // no files -- specifically no android folder
22*082815dcSEvan Bacon      },
23*082815dcSEvan Bacon      '/managed'
24*082815dcSEvan Bacon    );
25*082815dcSEvan Bacon  });
26*082815dcSEvan Bacon  afterAll(async () => {
27*082815dcSEvan Bacon    vol.reset();
28*082815dcSEvan Bacon  });
29*082815dcSEvan Bacon
30*082815dcSEvan Bacon  it(`returns a fallback value for a missing file`, async () => {
31*082815dcSEvan Bacon    const path = await getResourceXMLPathAsync('/app', { name: 'colors', kind: 'values-night' });
32*082815dcSEvan Bacon    // ensure the file is missing so the test works as expected.
33*082815dcSEvan Bacon    expect(await fileExistsAsync(path)).toBe(false);
34*082815dcSEvan Bacon    // read the file with a default fallback
35*082815dcSEvan Bacon    expect(await readResourcesXMLAsync({ path })).toStrictEqual({ resources: {} });
36*082815dcSEvan Bacon  });
37*082815dcSEvan Bacon  it(`returns a default value for an XML file`, async () => {
38*082815dcSEvan Bacon    const path = await getResourceXMLPathAsync('/app', { name: 'colors', kind: 'values' });
39*082815dcSEvan Bacon    // ensure the file exists so the test works as expected.
40*082815dcSEvan Bacon    expect(await fileExistsAsync(path)).toBe(true);
41*082815dcSEvan Bacon    // read the file with a default fallback
42*082815dcSEvan Bacon    expect(await readResourcesXMLAsync({ path })).toStrictEqual({ resources: {} });
43*082815dcSEvan Bacon  });
44*082815dcSEvan Bacon});
45*082815dcSEvan Bacon
46*082815dcSEvan Bacondescribe(getObjectAsResourceGroup, () => {
47*082815dcSEvan Bacon  it(`matches parsed xml`, async () => {
48*082815dcSEvan Bacon    // Parsed from a string for DX readability
49*082815dcSEvan Bacon    const styles = await parseXMLAsync(
50*082815dcSEvan Bacon      [
51*082815dcSEvan Bacon        '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>',
52*082815dcSEvan Bacon        '<resources>',
53*082815dcSEvan Bacon        '  <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">',
54*082815dcSEvan Bacon        '    <item name="key">value</item>',
55*082815dcSEvan Bacon        '    <item name="foo">bar</item>',
56*082815dcSEvan Bacon        '  </style>',
57*082815dcSEvan Bacon        '</resources>',
58*082815dcSEvan Bacon      ].join('\n')
59*082815dcSEvan Bacon    );
60*082815dcSEvan Bacon
61*082815dcSEvan Bacon    expect(
62*082815dcSEvan Bacon      getObjectAsResourceGroup({
63*082815dcSEvan Bacon        name: 'AppTheme',
64*082815dcSEvan Bacon        parent: 'Theme.AppCompat.Light.NoActionBar',
65*082815dcSEvan Bacon        item: { key: 'value', foo: 'bar' },
66*082815dcSEvan Bacon      })
67*082815dcSEvan Bacon    ).toStrictEqual((styles.resources as any).style[0]);
68*082815dcSEvan Bacon  });
69*082815dcSEvan Bacon});
70