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