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