1import { vol } from 'memfs';
2
3import rnFixture from './fixtures/react-native-project';
4import { clearNativeFolder, getMalformedNativeProjectsAsync } from '../clearNativeFolder';
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(`skips arbitrary platforms without verifiers`, async () => {
55    const projectRoot = '/';
56    vol.fromJSON(
57      {
58        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
59          // Skip ios project files
60          if (key.startsWith('ios')) return prev;
61          return {
62            ...prev,
63            [key]: value,
64          };
65        }, {}),
66      },
67      projectRoot
68    );
69    const malformed = await getMalformedNativeProjectsAsync(projectRoot, [
70      'windows',
71      'macos',
72      'tvos',
73      'androidtv',
74    ] as any);
75    expect(malformed).toStrictEqual([]);
76  });
77
78  it(`finds a single platform`, async () => {
79    const projectRoot = '/';
80    vol.fromJSON(rnFixture, projectRoot);
81    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios']);
82    expect(malformed).toStrictEqual([]);
83  });
84
85  it(`finds malformed projects`, async () => {
86    const projectRoot = '/';
87    vol.fromJSON(
88      {
89        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
90          // Skip core files to emulate a malformed project
91          if (
92            [
93              'ios/ReactNativeProject.xcodeproj/project.pbxproj',
94              'android/app/src/main/java/com/reactnativeproject/MainApplication.java',
95            ].includes(key)
96          ) {
97            return prev;
98          }
99          return {
100            ...prev,
101            [key]: value,
102          };
103        }, {}),
104      },
105      projectRoot
106    );
107
108    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
109    expect(malformed).toStrictEqual(['ios', 'android']);
110  });
111
112  // Most closely emulates the core use-case.
113  it(`finds malformed projects with empty folders`, async () => {
114    const projectRoot = '/';
115    vol.fromJSON(
116      {
117        'ios/foo': undefined,
118        'android/foo': undefined,
119      },
120      projectRoot
121    );
122    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
123    expect(malformed).toStrictEqual(['ios', 'android']);
124  });
125
126  it(`finds neither platform when no native projects exist`, async () => {
127    const projectRoot = '/';
128    vol.fromJSON({}, projectRoot);
129    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
130    expect(malformed).toStrictEqual([]);
131  });
132});
133