import { vol } from 'memfs';
import { writeXMLAsync } from '../../utils/XML';
import { buildResourceItem, readResourcesXMLAsync } from '../Resources';
import {
getProjectStylesXMLPathAsync,
getStyleParent,
getStylesItem,
removeStylesItem,
setStylesItem,
} from '../Styles';
jest.mock('fs');
const mockStyles = `
`;
describe('Styles', () => {
beforeAll(async () => {
const directoryJSON = {
'./app/android/app/src/main/res/values/styles.xml': mockStyles,
'./empty/android/app/src/main/res/values/styles.xml': '',
};
vol.fromJSON(directoryJSON, '/');
});
afterAll(async () => {
vol.reset();
});
it(`sets a style on an empty resource item`, async () => {
const stylesPath = await getProjectStylesXMLPathAsync('/empty')!;
const xml = await readResourcesXMLAsync({ path: stylesPath });
const parent = { name: 'AppTheme', parent: 'Theme.AppCompat.Light.NoActionBar' };
setStylesItem({
xml,
parent,
item: buildResourceItem({ name: 'android:textColor', value: '#fff000' }),
});
await writeXMLAsync({ path: stylesPath, xml });
const modifiedXml = await readResourcesXMLAsync({ path: stylesPath });
expect(getStyleParent(modifiedXml, parent)).toStrictEqual({
$: { name: 'AppTheme', parent: 'Theme.AppCompat.Light.NoActionBar' },
item: [{ $: { name: 'android:textColor' }, _: '#fff000' }],
});
});
it(`changes the value of a style`, async () => {
const stylesPath = await getProjectStylesXMLPathAsync('/app')!;
const xml = await readResourcesXMLAsync({ path: stylesPath });
const parent = { name: 'Theme.App.SplashScreen', parent: 'AppTheme' };
setStylesItem({
xml,
parent,
item: buildResourceItem({ name: 'android:textColor', value: '#ffffff' }),
});
await writeXMLAsync({ path: stylesPath, xml });
const modifiedXml = await readResourcesXMLAsync({ path: stylesPath });
expect(getStyleParent(modifiedXml, parent)).toStrictEqual({
$: { name: 'Theme.App.SplashScreen', parent: 'AppTheme' },
item: [
{ $: { name: 'android:windowBackground' }, _: '@drawable/splashscreen' },
{
$: {
name: 'android:textColor',
},
_: '#ffffff',
},
],
});
});
it(`removes a value`, async () => {
const stylesPath = await getProjectStylesXMLPathAsync('/app')!;
const xml = await readResourcesXMLAsync({ path: stylesPath });
const parent = { name: 'Theme.App.SplashScreen', parent: 'AppTheme' };
expect(getStylesItem({ xml, parent, name: 'android:textColor' })).toStrictEqual({
$: {
name: 'android:textColor',
},
_: '#ffffff',
});
removeStylesItem({
xml,
parent,
name: 'android:textColor',
});
expect(getStylesItem({ xml, parent, name: 'android:textColor' })).toBe(null);
});
});