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