1import { vol } from 'memfs';
2
3import { clearNativeFolder, getMalformedNativeProjectsAsync } from '../clearNativeFolder';
4import rnFixture from './fixtures/react-native-project';
5
6describe(clearNativeFolder, () => {
7  it(`clears folders`, async () => {
8    const platforms = ['android', 'ios'];
9    // mock out some non-empty ios and android folders.
10    vol.fromJSON(
11      {
12        'android/foobar': 'x',
13        'ios/Info.plist': 'xx',
14        'ios/another/file': 'xx',
15      },
16      '/'
17    );
18    await clearNativeFolder('/', platforms);
19    expect(vol.toJSON()).toEqual({});
20  });
21});
22
23describe(getMalformedNativeProjectsAsync, () => {
24  afterEach(() => {
25    vol.reset();
26  });
27
28  it(`gets fully qualified list of native projects to clear`, async () => {
29    const projectRoot = '/';
30    vol.fromJSON(rnFixture, projectRoot);
31    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['android', 'ios']);
32    expect(malformed).toStrictEqual([]);
33  });
34
35  it(`skips platforms that are missing native project folders`, async () => {
36    const projectRoot = '/';
37    vol.fromJSON(
38      {
39        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
40          // Skip ios project files
41          if (key.startsWith('ios')) return prev;
42          return {
43            ...prev,
44            [key]: value,
45          };
46        }, {}),
47      },
48      projectRoot
49    );
50    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['android', 'ios']);
51    expect(malformed).toStrictEqual([]);
52  });
53
54  it(`finds a single platform`, async () => {
55    const projectRoot = '/';
56    vol.fromJSON(rnFixture, projectRoot);
57    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios']);
58    expect(malformed).toStrictEqual([]);
59  });
60
61  it(`finds malformed projects`, async () => {
62    const projectRoot = '/';
63    vol.fromJSON(
64      {
65        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
66          // Skip core files to emulate a malformed project
67          if (
68            [
69              'ios/ReactNativeProject/Info.plist',
70              'android/app/src/main/java/com/reactnativeproject/MainApplication.java',
71            ].includes(key)
72          ) {
73            return prev;
74          }
75          return {
76            ...prev,
77            [key]: value,
78          };
79        }, {}),
80      },
81      projectRoot
82    );
83    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
84    expect(malformed).toStrictEqual(['ios', 'android']);
85  });
86
87  // Most closely emulates the core use-case.
88  it(`finds malformed projects with empty folders`, async () => {
89    const projectRoot = '/';
90    vol.fromJSON(
91      {
92        'ios/foo': undefined,
93        'android/foo': undefined,
94      },
95      projectRoot
96    );
97    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
98    expect(malformed).toStrictEqual(['ios', 'android']);
99  });
100
101  it(`finds neither platform when no native projects exist`, async () => {
102    const projectRoot = '/';
103    vol.fromJSON({}, projectRoot);
104    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
105    expect(malformed).toStrictEqual([]);
106  });
107});
108