18d307f52SEvan Baconimport { vol } from 'memfs';
28d307f52SEvan Bacon
38d307f52SEvan Baconimport rnFixture from './fixtures/react-native-project';
4*8a424bebSJames Ideimport { clearNativeFolder, getMalformedNativeProjectsAsync } from '../clearNativeFolder';
58d307f52SEvan Bacon
68d307f52SEvan Bacondescribe(clearNativeFolder, () => {
78d307f52SEvan Bacon  it(`clears folders`, async () => {
88d307f52SEvan Bacon    const platforms = ['android', 'ios'];
98d307f52SEvan Bacon    // mock out some non-empty ios and android folders.
108d307f52SEvan Bacon    vol.fromJSON(
118d307f52SEvan Bacon      {
128d307f52SEvan Bacon        'android/foobar': 'x',
138d307f52SEvan Bacon        'ios/Info.plist': 'xx',
148d307f52SEvan Bacon        'ios/another/file': 'xx',
158d307f52SEvan Bacon      },
168d307f52SEvan Bacon      '/'
178d307f52SEvan Bacon    );
188d307f52SEvan Bacon    await clearNativeFolder('/', platforms);
198d307f52SEvan Bacon    expect(vol.toJSON()).toEqual({});
208d307f52SEvan Bacon  });
218d307f52SEvan Bacon});
228d307f52SEvan Bacon
238d307f52SEvan Bacondescribe(getMalformedNativeProjectsAsync, () => {
248d307f52SEvan Bacon  afterEach(() => {
258d307f52SEvan Bacon    vol.reset();
268d307f52SEvan Bacon  });
278d307f52SEvan Bacon
288d307f52SEvan Bacon  it(`gets fully qualified list of native projects to clear`, async () => {
298d307f52SEvan Bacon    const projectRoot = '/';
308d307f52SEvan Bacon    vol.fromJSON(rnFixture, projectRoot);
318d307f52SEvan Bacon    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['android', 'ios']);
328d307f52SEvan Bacon    expect(malformed).toStrictEqual([]);
338d307f52SEvan Bacon  });
348d307f52SEvan Bacon
358d307f52SEvan Bacon  it(`skips platforms that are missing native project folders`, async () => {
368d307f52SEvan Bacon    const projectRoot = '/';
378d307f52SEvan Bacon    vol.fromJSON(
388d307f52SEvan Bacon      {
398d307f52SEvan Bacon        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
408d307f52SEvan Bacon          // Skip ios project files
418d307f52SEvan Bacon          if (key.startsWith('ios')) return prev;
428d307f52SEvan Bacon          return {
438d307f52SEvan Bacon            ...prev,
448d307f52SEvan Bacon            [key]: value,
458d307f52SEvan Bacon          };
468d307f52SEvan Bacon        }, {}),
478d307f52SEvan Bacon      },
488d307f52SEvan Bacon      projectRoot
498d307f52SEvan Bacon    );
508d307f52SEvan Bacon    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['android', 'ios']);
518d307f52SEvan Bacon    expect(malformed).toStrictEqual([]);
528d307f52SEvan Bacon  });
538d307f52SEvan Bacon
54608dafddSCedric van Putten  it(`skips arbitrary platforms without verifiers`, async () => {
55608dafddSCedric van Putten    const projectRoot = '/';
56608dafddSCedric van Putten    vol.fromJSON(
57608dafddSCedric van Putten      {
58608dafddSCedric van Putten        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
59608dafddSCedric van Putten          // Skip ios project files
60608dafddSCedric van Putten          if (key.startsWith('ios')) return prev;
61608dafddSCedric van Putten          return {
62608dafddSCedric van Putten            ...prev,
63608dafddSCedric van Putten            [key]: value,
64608dafddSCedric van Putten          };
65608dafddSCedric van Putten        }, {}),
66608dafddSCedric van Putten      },
67608dafddSCedric van Putten      projectRoot
68608dafddSCedric van Putten    );
69608dafddSCedric van Putten    const malformed = await getMalformedNativeProjectsAsync(projectRoot, [
70608dafddSCedric van Putten      'windows',
71608dafddSCedric van Putten      'macos',
72608dafddSCedric van Putten      'tvos',
73608dafddSCedric van Putten      'androidtv',
74608dafddSCedric van Putten    ] as any);
75608dafddSCedric van Putten    expect(malformed).toStrictEqual([]);
76608dafddSCedric van Putten  });
77608dafddSCedric van Putten
788d307f52SEvan Bacon  it(`finds a single platform`, async () => {
798d307f52SEvan Bacon    const projectRoot = '/';
808d307f52SEvan Bacon    vol.fromJSON(rnFixture, projectRoot);
818d307f52SEvan Bacon    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios']);
828d307f52SEvan Bacon    expect(malformed).toStrictEqual([]);
838d307f52SEvan Bacon  });
848d307f52SEvan Bacon
858d307f52SEvan Bacon  it(`finds malformed projects`, async () => {
868d307f52SEvan Bacon    const projectRoot = '/';
878d307f52SEvan Bacon    vol.fromJSON(
888d307f52SEvan Bacon      {
898d307f52SEvan Bacon        ...Object.entries(rnFixture).reduce((prev, [key, value]) => {
908d307f52SEvan Bacon          // Skip core files to emulate a malformed project
918d307f52SEvan Bacon          if (
928d307f52SEvan Bacon            [
93def098a4SEvan Bacon              'ios/ReactNativeProject.xcodeproj/project.pbxproj',
948d307f52SEvan Bacon              'android/app/src/main/java/com/reactnativeproject/MainApplication.java',
958d307f52SEvan Bacon            ].includes(key)
968d307f52SEvan Bacon          ) {
978d307f52SEvan Bacon            return prev;
988d307f52SEvan Bacon          }
998d307f52SEvan Bacon          return {
1008d307f52SEvan Bacon            ...prev,
1018d307f52SEvan Bacon            [key]: value,
1028d307f52SEvan Bacon          };
1038d307f52SEvan Bacon        }, {}),
1048d307f52SEvan Bacon      },
1058d307f52SEvan Bacon      projectRoot
1068d307f52SEvan Bacon    );
107def098a4SEvan Bacon
1088d307f52SEvan Bacon    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
1098d307f52SEvan Bacon    expect(malformed).toStrictEqual(['ios', 'android']);
1108d307f52SEvan Bacon  });
1118d307f52SEvan Bacon
1128d307f52SEvan Bacon  // Most closely emulates the core use-case.
1138d307f52SEvan Bacon  it(`finds malformed projects with empty folders`, async () => {
1148d307f52SEvan Bacon    const projectRoot = '/';
1158d307f52SEvan Bacon    vol.fromJSON(
1168d307f52SEvan Bacon      {
1178d307f52SEvan Bacon        'ios/foo': undefined,
1188d307f52SEvan Bacon        'android/foo': undefined,
1198d307f52SEvan Bacon      },
1208d307f52SEvan Bacon      projectRoot
1218d307f52SEvan Bacon    );
1228d307f52SEvan Bacon    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
1238d307f52SEvan Bacon    expect(malformed).toStrictEqual(['ios', 'android']);
1248d307f52SEvan Bacon  });
1258d307f52SEvan Bacon
1268d307f52SEvan Bacon  it(`finds neither platform when no native projects exist`, async () => {
1278d307f52SEvan Bacon    const projectRoot = '/';
1288d307f52SEvan Bacon    vol.fromJSON({}, projectRoot);
1298d307f52SEvan Bacon    const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']);
1308d307f52SEvan Bacon    expect(malformed).toStrictEqual([]);
1318d307f52SEvan Bacon  });
1328d307f52SEvan Bacon});
133