1import { fs, vol } from 'memfs';
2
3import { renamePackageOnDisk } from '../Package';
4
5jest.mock('fs');
6
7describe('package', () => {
8  describe('renamePackageOnDisk', () => {
9    const EXAMPLE_MAIN_APPLICATION = `
10package com.lololol;
11
12public class MainApplication extends Application implements ReactApplication {
13}
14`;
15
16    const EXAMPLE_MAIN_ACTIVITY = `
17package com.lololol;
18
19public class MainActivity extends ReactActivity {
20}
21`;
22
23    const EXAMPLE_NESTED_CLASS = `
24package com.lololol.example;
25import com.lololol.example.hi.other;
26
27public class SomeClass {
28}
29`;
30
31    beforeEach(async () => {
32      const directoryJSON = {
33        './android/app/BUCK': 'package = "com.lololol"',
34        './android/app/src/main/java/com/lololol/MainApplication.java': EXAMPLE_MAIN_APPLICATION,
35        './android/app/src/main/java/com/lololol/MainActivity.java': EXAMPLE_MAIN_ACTIVITY,
36        './android/app/src/main/java/com/lololol/example/SomeClass.java': EXAMPLE_NESTED_CLASS,
37      };
38      vol.fromJSON(directoryJSON, '/myapp');
39    });
40
41    afterEach(() => vol.reset());
42
43    it('re-creates the directory structure and replaces occurrences of old package in files', async () => {
44      await renamePackageOnDisk({ android: { package: 'xyz.bront.app' } }, '/myapp');
45      const mainActivityPath = '/myapp/android/app/src/main/java/xyz/bront/app/MainActivity.java';
46      expect(fs.existsSync(mainActivityPath)).toBeTruthy();
47      expect(fs.readFileSync(mainActivityPath).toString()).toMatch('package xyz.bront.app');
48
49      const nestedClassPath =
50        '/myapp/android/app/src/main/java/xyz/bront/app/example/SomeClass.java';
51      expect(fs.existsSync(nestedClassPath)).toBeTruthy();
52      expect(fs.readFileSync(nestedClassPath).toString()).toMatch('package xyz.bront.app');
53      expect(fs.readFileSync(nestedClassPath).toString()).not.toMatch('com.lololol');
54
55      const buckPath = '/myapp/android/app/BUCK';
56      expect(fs.readFileSync(buckPath).toString()).toMatch('package = "xyz.bront.app"');
57      expect(fs.readFileSync(buckPath).toString()).not.toMatch('com.lololol');
58    });
59
60    it('does not clobber itself if package has similar parts', async () => {
61      await renamePackageOnDisk({ android: { package: 'com.bront' } }, '/myapp');
62      const mainActivityPath = '/myapp/android/app/src/main/java/com/bront/MainActivity.java';
63      expect(fs.existsSync(mainActivityPath)).toBeTruthy();
64      expect(fs.readFileSync(mainActivityPath).toString()).toMatch('package com.bront');
65    });
66  });
67});
68