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