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