1*ed3bd27bSEvan Baconimport rnFixture from '../../plugins/__tests__/fixtures/react-native-project';
2*ed3bd27bSEvan Baconimport * as XML from '../../utils/XML';
3082815dcSEvan Baconimport { getGoogleMapsApiKey, setGoogleMapsApiKey } from '../GoogleMapsApiKey';
4*ed3bd27bSEvan Baconimport { AndroidManifest, getMainApplicationOrThrow } from '../Manifest';
5082815dcSEvan Bacon
6*ed3bd27bSEvan Baconasync function getFixtureManifestAsync() {
7*ed3bd27bSEvan Bacon  return (await XML.parseXMLAsync(
8*ed3bd27bSEvan Bacon    rnFixture['android/app/src/main/AndroidManifest.xml']
9*ed3bd27bSEvan Bacon  )) as AndroidManifest;
10*ed3bd27bSEvan Bacon}
11082815dcSEvan Bacon
12082815dcSEvan Bacondescribe(getGoogleMapsApiKey, () => {
13082815dcSEvan Bacon  it(`returns null if no android google maps API key is provided`, () => {
14082815dcSEvan Bacon    expect(getGoogleMapsApiKey({ android: { config: { googleMaps: {} } } })).toBe(null);
15082815dcSEvan Bacon  });
16082815dcSEvan Bacon
17082815dcSEvan Bacon  it(`returns API key if android google maps api key is provided`, () => {
18082815dcSEvan Bacon    expect(
19082815dcSEvan Bacon      getGoogleMapsApiKey({ android: { config: { googleMaps: { apiKey: 'MY-API-KEY' } } } })
20082815dcSEvan Bacon    ).toBe('MY-API-KEY');
21082815dcSEvan Bacon  });
22082815dcSEvan Bacon});
23082815dcSEvan Bacon
24082815dcSEvan Bacondescribe(setGoogleMapsApiKey, () => {
25082815dcSEvan Bacon  it('adds and removes google maps key', async () => {
26082815dcSEvan Bacon    function hasSingleEntry(androidManifest: AndroidManifest) {
27082815dcSEvan Bacon      const mainApplication = getMainApplicationOrThrow(androidManifest);
28082815dcSEvan Bacon
29*ed3bd27bSEvan Bacon      const apiKeyItem = mainApplication!['meta-data']!.filter(
30082815dcSEvan Bacon        (e) => e.$['android:name'] === 'com.google.android.geo.API_KEY'
31082815dcSEvan Bacon      );
32082815dcSEvan Bacon      expect(apiKeyItem).toHaveLength(1);
33082815dcSEvan Bacon      expect(apiKeyItem[0].$['android:value']).toMatch('MY-API-KEY');
34082815dcSEvan Bacon
35*ed3bd27bSEvan Bacon      const usesLibraryItem = mainApplication['uses-library']!.filter(
36082815dcSEvan Bacon        (e) => e.$['android:name'] === 'org.apache.http.legacy'
37082815dcSEvan Bacon      );
38082815dcSEvan Bacon      expect(usesLibraryItem).toHaveLength(1);
39082815dcSEvan Bacon      expect(usesLibraryItem[0].$['android:required']).toBe(false);
40082815dcSEvan Bacon    }
41082815dcSEvan Bacon    function isRemoved(androidManifest: AndroidManifest) {
42082815dcSEvan Bacon      const mainApplication = getMainApplicationOrThrow(androidManifest);
43082815dcSEvan Bacon
44*ed3bd27bSEvan Bacon      const apiKeyItem = mainApplication['meta-data']!.filter(
45082815dcSEvan Bacon        (e) => e.$['android:name'] === 'com.google.android.geo.API_KEY'
46082815dcSEvan Bacon      );
47082815dcSEvan Bacon      expect(apiKeyItem).toHaveLength(0);
48082815dcSEvan Bacon
49*ed3bd27bSEvan Bacon      const usesLibraryItem = mainApplication['uses-library']!.filter(
50082815dcSEvan Bacon        (e) => e.$['android:name'] === 'org.apache.http.legacy'
51082815dcSEvan Bacon      );
52082815dcSEvan Bacon      expect(usesLibraryItem).toHaveLength(0);
53082815dcSEvan Bacon    }
54082815dcSEvan Bacon
55*ed3bd27bSEvan Bacon    let manifest = await getFixtureManifestAsync();
56082815dcSEvan Bacon
57082815dcSEvan Bacon    // Add the key once
58082815dcSEvan Bacon    manifest = setGoogleMapsApiKey(
59082815dcSEvan Bacon      { android: { config: { googleMaps: { apiKey: 'MY-API-KEY' } } } },
60082815dcSEvan Bacon      manifest
61082815dcSEvan Bacon    );
62082815dcSEvan Bacon
63082815dcSEvan Bacon    hasSingleEntry(manifest);
64082815dcSEvan Bacon
65082815dcSEvan Bacon    // Test that adding it twice doesn't cause duplicate entries
66082815dcSEvan Bacon    manifest = setGoogleMapsApiKey(
67082815dcSEvan Bacon      { android: { config: { googleMaps: { apiKey: 'MY-API-KEY' } } } },
68082815dcSEvan Bacon      manifest
69082815dcSEvan Bacon    );
70082815dcSEvan Bacon
71082815dcSEvan Bacon    hasSingleEntry(manifest);
72082815dcSEvan Bacon
73082815dcSEvan Bacon    // Remove meta
74082815dcSEvan Bacon    manifest = setGoogleMapsApiKey({}, manifest);
75082815dcSEvan Bacon
76082815dcSEvan Bacon    isRemoved(manifest);
77082815dcSEvan Bacon  });
78082815dcSEvan Bacon});
79