1082815dcSEvan Baconimport { vol } from 'memfs';
2082815dcSEvan Bacon
3082815dcSEvan Baconimport rnFixture from '../../plugins/__tests__/fixtures/react-native-project';
4082815dcSEvan Baconimport {
5082815dcSEvan Bacon  getApplicationIdAsync,
6082815dcSEvan Bacon  getPackage,
7082815dcSEvan Bacon  renameJniOnDiskForType,
8082815dcSEvan Bacon  renamePackageOnDiskForType,
9082815dcSEvan Bacon  setPackageInBuildGradle,
10082815dcSEvan Bacon} from '../Package';
11082815dcSEvan Bacon
12082815dcSEvan Baconjest.mock('fs');
13082815dcSEvan Bacon
14082815dcSEvan Baconconst EXAMPLE_BUILD_GRADLE = `
15082815dcSEvan Bacon  android {
16082815dcSEvan Bacon      compileSdkVersion rootProject.ext.compileSdkVersion
17082815dcSEvan Bacon      buildToolsVersion rootProject.ext.buildToolsVersion
18082815dcSEvan Bacon
19399179d8SKudo Chien      namespace "com.helloworld"
20082815dcSEvan Bacon      defaultConfig {
21082815dcSEvan Bacon          applicationId "com.helloworld"
22082815dcSEvan Bacon          minSdkVersion rootProject.ext.minSdkVersion
23082815dcSEvan Bacon          targetSdkVersion rootProject.ext.targetSdkVersion
24082815dcSEvan Bacon          versionCode 1
25082815dcSEvan Bacon          versionName "1.0"
26082815dcSEvan Bacon      }
27082815dcSEvan Bacon  }
28082815dcSEvan Bacon  `;
29082815dcSEvan Bacon
30082815dcSEvan Bacondescribe('package', () => {
31082815dcSEvan Bacon  afterAll(async () => {
32082815dcSEvan Bacon    vol.reset();
33082815dcSEvan Bacon  });
34082815dcSEvan Bacon  it(`returns null if no package is provided`, () => {
35082815dcSEvan Bacon    expect(getPackage({})).toBe(null);
36082815dcSEvan Bacon  });
37082815dcSEvan Bacon
38082815dcSEvan Bacon  it(`returns the package if provided`, () => {
39082815dcSEvan Bacon    expect(getPackage({ android: { package: 'com.example.xyz' } })).toBe('com.example.xyz');
40082815dcSEvan Bacon  });
41082815dcSEvan Bacon
42082815dcSEvan Bacon  it(`returns the applicationId defined in build.gradle`, () => {
43082815dcSEvan Bacon    const projectRoot = '/';
44082815dcSEvan Bacon    vol.fromJSON(rnFixture, projectRoot);
45082815dcSEvan Bacon
46*ed3bd27bSEvan Bacon    expect(getApplicationIdAsync(projectRoot)).resolves.toBe('com.helloworld');
47082815dcSEvan Bacon  });
48082815dcSEvan Bacon
49082815dcSEvan Bacon  it(`sets the applicationId in build.gradle if package is given`, () => {
50082815dcSEvan Bacon    expect(
51082815dcSEvan Bacon      setPackageInBuildGradle({ android: { package: 'my.new.app' } }, EXAMPLE_BUILD_GRADLE)
52082815dcSEvan Bacon    ).toMatch("applicationId 'my.new.app'");
53082815dcSEvan Bacon  });
54082815dcSEvan Bacon
55399179d8SKudo Chien  it(`sets the namespace in build.gradle if package is given`, () => {
56399179d8SKudo Chien    expect(
57399179d8SKudo Chien      setPackageInBuildGradle({ android: { package: 'my.new.app' } }, EXAMPLE_BUILD_GRADLE)
58399179d8SKudo Chien    ).toMatch("namespace 'my.new.app'");
59399179d8SKudo Chien  });
60082815dcSEvan Bacon});
61082815dcSEvan Bacon
62082815dcSEvan Bacondescribe(renamePackageOnDiskForType, () => {
63082815dcSEvan Bacon  afterAll(async () => {
64082815dcSEvan Bacon    vol.reset();
65082815dcSEvan Bacon  });
66082815dcSEvan Bacon  it(`refactors a main project`, async () => {
67082815dcSEvan Bacon    const projectRoot = '/';
68082815dcSEvan Bacon    vol.fromJSON(rnFixture, projectRoot);
69082815dcSEvan Bacon
70082815dcSEvan Bacon    // Ensure the path that will be deleted exists before we
71082815dcSEvan Bacon    // delete it, this helps prevent the test from accidentally breaking.
72*ed3bd27bSEvan Bacon    const originalPath = '/android/app/src/main/java/com/helloworld/MainActivity.java';
73082815dcSEvan Bacon
74082815dcSEvan Bacon    expect(vol.toJSON()[originalPath]).toBeDefined();
75082815dcSEvan Bacon    await renamePackageOnDiskForType({
76082815dcSEvan Bacon      projectRoot,
77082815dcSEvan Bacon      type: 'main',
78082815dcSEvan Bacon      packageName: 'com.bacon.foobar',
79082815dcSEvan Bacon    });
80082815dcSEvan Bacon
81082815dcSEvan Bacon    const results = vol.toJSON();
82082815dcSEvan Bacon    // Ensure the file exists in the new location with the new package name
83082815dcSEvan Bacon    expect(results['/android/app/src/main/java/com/bacon/foobar/MainActivity.java']).toMatch(
84082815dcSEvan Bacon      /^package com.bacon.foobar;/
85082815dcSEvan Bacon    );
86082815dcSEvan Bacon    expect(results[originalPath]).toBeUndefined();
87082815dcSEvan Bacon    // Ensure the BUCK file is rewritten
88*ed3bd27bSEvan Bacon    // expect(results['/android/app/BUCK']).toMatch(/package = "com.bacon.foobar"/);
89082815dcSEvan Bacon  });
90082815dcSEvan Bacon  it(`refactors a debug project`, async () => {
91082815dcSEvan Bacon    const projectRoot = '/';
92082815dcSEvan Bacon    vol.fromJSON(rnFixture, projectRoot);
93082815dcSEvan Bacon    await renamePackageOnDiskForType({
94082815dcSEvan Bacon      projectRoot,
95082815dcSEvan Bacon      type: 'debug',
96082815dcSEvan Bacon      packageName: 'com.bacon.foobar',
97082815dcSEvan Bacon    });
98082815dcSEvan Bacon
99082815dcSEvan Bacon    const results = vol.toJSON();
100082815dcSEvan Bacon    expect(results['/android/app/src/debug/java/com/bacon/foobar/ReactNativeFlipper.java']).toMatch(
101082815dcSEvan Bacon      /package com.bacon.foobar;/
102082815dcSEvan Bacon    );
103082815dcSEvan Bacon  });
104082815dcSEvan Bacon});
105082815dcSEvan Bacon
106082815dcSEvan Bacondescribe(renameJniOnDiskForType, () => {
107082815dcSEvan Bacon  afterAll(async () => {
108082815dcSEvan Bacon    vol.reset();
109082815dcSEvan Bacon  });
110082815dcSEvan Bacon  it(`refactors a main project`, async () => {
111082815dcSEvan Bacon    const projectRoot = '/';
112082815dcSEvan Bacon    vol.fromJSON(rnFixture, projectRoot);
113082815dcSEvan Bacon    await renameJniOnDiskForType({
114082815dcSEvan Bacon      projectRoot,
115082815dcSEvan Bacon      type: 'main',
116082815dcSEvan Bacon      packageName: 'com.bacon.foobar',
117082815dcSEvan Bacon    });
118082815dcSEvan Bacon
119082815dcSEvan Bacon    const results = vol.toJSON();
120082815dcSEvan Bacon    expect(
121082815dcSEvan Bacon      results['/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.h']
122082815dcSEvan Bacon    ).toMatch(
123082815dcSEvan Bacon      /"Lcom\/bacon\/foobar\/newarchitecture\/modules\/MainApplicationTurboModuleManagerDelegate;";/
124082815dcSEvan Bacon    );
125082815dcSEvan Bacon  });
126082815dcSEvan Bacon});
127