1*8d307f52SEvan Baconimport { vol } from 'memfs'; 2*8d307f52SEvan Bacon 3*8d307f52SEvan Baconimport { createTemporaryProjectFile } from '../dotExpo'; 4*8d307f52SEvan Bacon 5*8d307f52SEvan BaconbeforeEach(() => { 6*8d307f52SEvan Bacon vol.reset(); 7*8d307f52SEvan Bacon}); 8*8d307f52SEvan Bacon 9*8d307f52SEvan Bacondescribe(createTemporaryProjectFile, () => { 10*8d307f52SEvan Bacon it(`creates persisted file`, async () => { 11*8d307f52SEvan Bacon const projectRoot = '/'; 12*8d307f52SEvan Bacon 13*8d307f52SEvan Bacon const creator = createTemporaryProjectFile<{ foo: string; baz?: boolean }>('foo.json', { 14*8d307f52SEvan Bacon foo: 'bar', 15*8d307f52SEvan Bacon }); 16*8d307f52SEvan Bacon 17*8d307f52SEvan Bacon // Ensure instantiation doesn't have side-effects. 18*8d307f52SEvan Bacon expect(vol.toJSON()).toEqual({}); 19*8d307f52SEvan Bacon 20*8d307f52SEvan Bacon // This has side-effects that ensure the directory. 21*8d307f52SEvan Bacon const file = creator.getFile(projectRoot); 22*8d307f52SEvan Bacon 23*8d307f52SEvan Bacon // README is bootstrapped. 24*8d307f52SEvan Bacon expect(vol.readFileSync('/.expo/README.md', 'utf8')).toMatch(/Why do I have a folder named/); 25*8d307f52SEvan Bacon 26*8d307f52SEvan Bacon // File is not automatically written... 27*8d307f52SEvan Bacon await expect(file.getAsync('foo', null)).rejects.toThrowError(/ENOENT/); 28*8d307f52SEvan Bacon 29*8d307f52SEvan Bacon // Matches defaults and doesn't fail when the file doesn't exist. 30*8d307f52SEvan Bacon expect(await creator.readAsync(projectRoot)).toEqual({ foo: 'bar' }); 31*8d307f52SEvan Bacon 32*8d307f52SEvan Bacon // Modify the file. 33*8d307f52SEvan Bacon await creator.setAsync(projectRoot, { foo: 'baz', baz: true }); 34*8d307f52SEvan Bacon 35*8d307f52SEvan Bacon // Persisted changes are reflected in the file. 36*8d307f52SEvan Bacon expect(await creator.readAsync(projectRoot)).toEqual({ foo: 'baz', baz: true }); 37*8d307f52SEvan Bacon }); 38*8d307f52SEvan Bacon}); 39