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