1*082815dcSEvan Baconimport { vol } from 'memfs';
2*082815dcSEvan Baconimport { resolve } from 'path';
3*082815dcSEvan Bacon
4*082815dcSEvan Baconimport { copyFilePathToPathAsync } from '../../utils/fs';
5*082815dcSEvan Baconimport {
6*082815dcSEvan Bacon  applyPlugin,
7*082815dcSEvan Bacon  getGoogleServicesFilePath,
8*082815dcSEvan Bacon  setClassPath,
9*082815dcSEvan Bacon  setGoogleServicesFile,
10*082815dcSEvan Bacon} from '../GoogleServices';
11*082815dcSEvan Bacon
12*082815dcSEvan Baconjest.mock('fs');
13*082815dcSEvan Baconjest.mock('fs/promises');
14*082815dcSEvan Bacon
15*082815dcSEvan Baconjest.mock('../../utils/fs', () => ({
16*082815dcSEvan Bacon  copyFilePathToPathAsync: jest.fn(),
17*082815dcSEvan Bacon}));
18*082815dcSEvan Bacon
19*082815dcSEvan Bacondescribe(getGoogleServicesFilePath, () => {
20*082815dcSEvan Bacon  it(`returns null if no googleServicesFile is provided`, () => {
21*082815dcSEvan Bacon    expect(getGoogleServicesFilePath({})).toBe(null);
22*082815dcSEvan Bacon  });
23*082815dcSEvan Bacon
24*082815dcSEvan Bacon  it(`returns googleServicesFile path if provided`, () => {
25*082815dcSEvan Bacon    expect(
26*082815dcSEvan Bacon      getGoogleServicesFilePath({
27*082815dcSEvan Bacon        android: {
28*082815dcSEvan Bacon          googleServicesFile: 'path/to/google-services.json',
29*082815dcSEvan Bacon        },
30*082815dcSEvan Bacon      })
31*082815dcSEvan Bacon    ).toBe('path/to/google-services.json');
32*082815dcSEvan Bacon  });
33*082815dcSEvan Bacon});
34*082815dcSEvan Bacon
35*082815dcSEvan Bacondescribe(setGoogleServicesFile, () => {
36*082815dcSEvan Bacon  afterAll(() => {
37*082815dcSEvan Bacon    vol.reset();
38*082815dcSEvan Bacon  });
39*082815dcSEvan Bacon
40*082815dcSEvan Bacon  const projectRoot = '/';
41*082815dcSEvan Bacon  beforeEach(() => {
42*082815dcSEvan Bacon    vol.fromJSON(
43*082815dcSEvan Bacon      {
44*082815dcSEvan Bacon        'google-services.json': '{}',
45*082815dcSEvan Bacon      },
46*082815dcSEvan Bacon      projectRoot
47*082815dcSEvan Bacon    );
48*082815dcSEvan Bacon  });
49*082815dcSEvan Bacon
50*082815dcSEvan Bacon  it(`copies google services file to android/app`, async () => {
51*082815dcSEvan Bacon    expect(
52*082815dcSEvan Bacon      await setGoogleServicesFile(
53*082815dcSEvan Bacon        {
54*082815dcSEvan Bacon          android: {
55*082815dcSEvan Bacon            googleServicesFile: './google-services.json',
56*082815dcSEvan Bacon          },
57*082815dcSEvan Bacon        },
58*082815dcSEvan Bacon        projectRoot
59*082815dcSEvan Bacon      )
60*082815dcSEvan Bacon    ).toBe(true);
61*082815dcSEvan Bacon
62*082815dcSEvan Bacon    expect(copyFilePathToPathAsync).toHaveBeenLastCalledWith(
63*082815dcSEvan Bacon      '/google-services.json',
64*082815dcSEvan Bacon      '/android/app/google-services.json'
65*082815dcSEvan Bacon    );
66*082815dcSEvan Bacon  });
67*082815dcSEvan Bacon
68*082815dcSEvan Bacon  it(`copies google services file to custom target path`, async () => {
69*082815dcSEvan Bacon    const customTargetPath = './not/sure/why/youd/do/this/google-services.json';
70*082815dcSEvan Bacon    expect(
71*082815dcSEvan Bacon      await setGoogleServicesFile(
72*082815dcSEvan Bacon        {
73*082815dcSEvan Bacon          android: {
74*082815dcSEvan Bacon            googleServicesFile: './google-services.json',
75*082815dcSEvan Bacon          },
76*082815dcSEvan Bacon        },
77*082815dcSEvan Bacon        projectRoot,
78*082815dcSEvan Bacon        customTargetPath
79*082815dcSEvan Bacon      )
80*082815dcSEvan Bacon    ).toBe(true);
81*082815dcSEvan Bacon
82*082815dcSEvan Bacon    expect(copyFilePathToPathAsync).toHaveBeenCalledWith(
83*082815dcSEvan Bacon      resolve(projectRoot, 'google-services.json'),
84*082815dcSEvan Bacon      resolve(projectRoot, customTargetPath)
85*082815dcSEvan Bacon    );
86*082815dcSEvan Bacon  });
87*082815dcSEvan Bacon});
88*082815dcSEvan Bacon
89*082815dcSEvan Bacondescribe(setClassPath, () => {
90*082815dcSEvan Bacon  const validConfig = { android: { googleServicesFile: 'g.json' } };
91*082815dcSEvan Bacon  const EXAMPLE_BUILD_GRADLE = `
92*082815dcSEvan Baconbuildscript {
93*082815dcSEvan Bacon    ext {
94*082815dcSEvan Bacon        buildToolsVersion = "28.0.3"
95*082815dcSEvan Bacon    }
96*082815dcSEvan Bacon    repositories {
97*082815dcSEvan Bacon        google()
98*082815dcSEvan Bacon        jcenter()
99*082815dcSEvan Bacon    }
100*082815dcSEvan Bacon    dependencies {
101*082815dcSEvan Bacon        classpath 'com.android.tools.build:gradle:3.5.3'
102*082815dcSEvan Bacon
103*082815dcSEvan Bacon    }
104*082815dcSEvan Bacon}
105*082815dcSEvan Bacon`;
106*082815dcSEvan Bacon
107*082815dcSEvan Bacon  const EXPECTED_BUILD_GRADLE = `
108*082815dcSEvan Baconbuildscript {
109*082815dcSEvan Bacon    ext {
110*082815dcSEvan Bacon        buildToolsVersion = "28.0.3"
111*082815dcSEvan Bacon    }
112*082815dcSEvan Bacon    repositories {
113*082815dcSEvan Bacon        google()
114*082815dcSEvan Bacon        jcenter()
115*082815dcSEvan Bacon    }
116*082815dcSEvan Bacon    dependencies {
117*082815dcSEvan Bacon        classpath 'com.google.gms:google-services:4.3.3'
118*082815dcSEvan Bacon        classpath 'com.android.tools.build:gradle:3.5.3'
119*082815dcSEvan Bacon
120*082815dcSEvan Bacon    }
121*082815dcSEvan Bacon}
122*082815dcSEvan Bacon`;
123*082815dcSEvan Bacon  it(`sets classpath in build.gradle if needed`, () => {
124*082815dcSEvan Bacon    expect(setClassPath(validConfig, EXAMPLE_BUILD_GRADLE)).toEqual(EXPECTED_BUILD_GRADLE);
125*082815dcSEvan Bacon  });
126*082815dcSEvan Bacon
127*082815dcSEvan Bacon  it(`does not set classpath in build.gradle multiple times`, () => {
128*082815dcSEvan Bacon    expect(setClassPath(validConfig, EXPECTED_BUILD_GRADLE)).toEqual(EXPECTED_BUILD_GRADLE);
129*082815dcSEvan Bacon  });
130*082815dcSEvan Bacon});
131*082815dcSEvan Bacon
132*082815dcSEvan Bacondescribe(applyPlugin, () => {
133*082815dcSEvan Bacon  const validConfig = { android: { googleServicesFile: 'g.json' } };
134*082815dcSEvan Bacon  const EXAMPLE_APP_BUILD_GRADLE = `
135*082815dcSEvan Bacon// Blah blah blah
136*082815dcSEvan Bacontask copyDownloadableDepsToLibs(type: Copy) {
137*082815dcSEvan Bacon    from configurations.compile
138*082815dcSEvan Bacon    into 'libs'
139*082815dcSEvan Bacon}
140*082815dcSEvan Bacon
141*082815dcSEvan Baconapply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle");
142*082815dcSEvan BaconapplyNativeModulesAppBuildGradle(project)`;
143*082815dcSEvan Bacon
144*082815dcSEvan Bacon  const EXPECTED_APP_BUILD_GRADLE = `
145*082815dcSEvan Bacon// Blah blah blah
146*082815dcSEvan Bacontask copyDownloadableDepsToLibs(type: Copy) {
147*082815dcSEvan Bacon    from configurations.compile
148*082815dcSEvan Bacon    into 'libs'
149*082815dcSEvan Bacon}
150*082815dcSEvan Bacon
151*082815dcSEvan Baconapply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle");
152*082815dcSEvan BaconapplyNativeModulesAppBuildGradle(project)
153*082815dcSEvan Baconapply plugin: 'com.google.gms.google-services'`;
154*082815dcSEvan Bacon
155*082815dcSEvan Bacon  it(`applies the plugin in app/build.gradle if needed`, () => {
156*082815dcSEvan Bacon    expect(applyPlugin(validConfig, EXAMPLE_APP_BUILD_GRADLE)).toEqual(EXPECTED_APP_BUILD_GRADLE);
157*082815dcSEvan Bacon  });
158*082815dcSEvan Bacon
159*082815dcSEvan Bacon  it(`does not apply the plugin multiple times`, () => {
160*082815dcSEvan Bacon    expect(applyPlugin(validConfig, EXPECTED_APP_BUILD_GRADLE)).toEqual(EXPECTED_APP_BUILD_GRADLE);
161*082815dcSEvan Bacon  });
162*082815dcSEvan Bacon});
163