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.xcodeproj/project.pbxproj', 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 84 const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']); 85 expect(malformed).toStrictEqual(['ios', 'android']); 86 }); 87 88 // Most closely emulates the core use-case. 89 it(`finds malformed projects with empty folders`, async () => { 90 const projectRoot = '/'; 91 vol.fromJSON( 92 { 93 'ios/foo': undefined, 94 'android/foo': undefined, 95 }, 96 projectRoot 97 ); 98 const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']); 99 expect(malformed).toStrictEqual(['ios', 'android']); 100 }); 101 102 it(`finds neither platform when no native projects exist`, async () => { 103 const projectRoot = '/'; 104 vol.fromJSON({}, projectRoot); 105 const malformed = await getMalformedNativeProjectsAsync(projectRoot, ['ios', 'android']); 106 expect(malformed).toStrictEqual([]); 107 }); 108}); 109