1*082815dcSEvan Baconimport * as WarningAggregator from '../../utils/warnings';
2*082815dcSEvan Baconimport {
3*082815dcSEvan Bacon  getVersionCode,
4*082815dcSEvan Bacon  getVersionName,
5*082815dcSEvan Bacon  setMinBuildScriptExtVersion,
6*082815dcSEvan Bacon  setVersionCode,
7*082815dcSEvan Bacon  setVersionName,
8*082815dcSEvan Bacon} from '../Version';
9*082815dcSEvan Bacon
10*082815dcSEvan Bacon// TODO: use fixtures for manifest/build.gradle instead of inline strings
11*082815dcSEvan Bacon
12*082815dcSEvan Baconconst EXAMPLE_BUILD_GRADLE = `
13*082815dcSEvan Baconandroid {
14*082815dcSEvan Bacon    compileSdkVersion rootProject.ext.compileSdkVersion
15*082815dcSEvan Bacon    buildToolsVersion rootProject.ext.buildToolsVersion
16*082815dcSEvan Bacon
17*082815dcSEvan Bacon    defaultConfig {
18*082815dcSEvan Bacon        applicationId "com.helloworld"
19*082815dcSEvan Bacon        minSdkVersion rootProject.ext.minSdkVersion
20*082815dcSEvan Bacon        targetSdkVersion rootProject.ext.targetSdkVersion
21*082815dcSEvan Bacon        versionCode 1
22*082815dcSEvan Bacon        versionName "1.2.3"
23*082815dcSEvan Bacon    }
24*082815dcSEvan Bacon}
25*082815dcSEvan Bacon`;
26*082815dcSEvan Bacon
27*082815dcSEvan Baconconst EXAMPLE_BUILD_GRADLE_2 = `
28*082815dcSEvan Baconandroid {
29*082815dcSEvan Bacon    compileSdkVersion rootProject.ext.compileSdkVersion
30*082815dcSEvan Bacon    buildToolsVersion rootProject.ext.buildToolsVersion
31*082815dcSEvan Bacon
32*082815dcSEvan Bacon    defaultConfig {
33*082815dcSEvan Bacon        applicationId "com.helloworld"
34*082815dcSEvan Bacon        minSdkVersion rootProject.ext.minSdkVersion
35*082815dcSEvan Bacon        targetSdkVersion rootProject.ext.targetSdkVersion
36*082815dcSEvan Bacon        versionCode 4
37*082815dcSEvan Bacon        versionName "2.0"
38*082815dcSEvan Bacon    }
39*082815dcSEvan Bacon}
40*082815dcSEvan Bacon`;
41*082815dcSEvan Bacon
42*082815dcSEvan Baconconst EXAMPLE_PROJECT_BUILD_GRADLE = `
43*082815dcSEvan Baconbuildscript {
44*082815dcSEvan Bacon    ext {
45*082815dcSEvan Bacon        buildToolsVersion = "29.0.3"
46*082815dcSEvan Bacon        minSdkVersion = 21
47*082815dcSEvan Bacon        compileSdkVersion = 30
48*082815dcSEvan Bacon        targetSdkVersion = 30
49*082815dcSEvan Bacon        oddFormat = 30.2
50*082815dcSEvan Bacon    }
51*082815dcSEvan Bacon    repositories {
52*082815dcSEvan Bacon    }
53*082815dcSEvan Bacon    dependencies {
54*082815dcSEvan Bacon    }
55*082815dcSEvan Bacon}
56*082815dcSEvan Bacon
57*082815dcSEvan Baconallprojects {
58*082815dcSEvan Bacon    repositories {
59*082815dcSEvan Bacon        mavenLocal()
60*082815dcSEvan Bacon        maven {
61*082815dcSEvan Bacon            // Android JSC is installed from npm
62*082815dcSEvan Bacon            url(new File(["node", "--print", "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), "../dist"))
63*082815dcSEvan Bacon        }
64*082815dcSEvan Bacon    }
65*082815dcSEvan Bacon}
66*082815dcSEvan Bacon`;
67*082815dcSEvan Bacon
68*082815dcSEvan Bacondescribe('versionName', () => {
69*082815dcSEvan Bacon  it(`returns null if no version is provided`, () => {
70*082815dcSEvan Bacon    expect(getVersionName({})).toBe(null);
71*082815dcSEvan Bacon  });
72*082815dcSEvan Bacon
73*082815dcSEvan Bacon  it(`returns the version name if provided`, () => {
74*082815dcSEvan Bacon    expect(getVersionName({ version: '1.2.3' })).toBe('1.2.3');
75*082815dcSEvan Bacon  });
76*082815dcSEvan Bacon
77*082815dcSEvan Bacon  it(`sets the version name in build.gradle if version name is given`, () => {
78*082815dcSEvan Bacon    expect(setVersionName({ version: '1.2.3' }, EXAMPLE_BUILD_GRADLE)).toMatch(
79*082815dcSEvan Bacon      'versionName "1.2.3"'
80*082815dcSEvan Bacon    );
81*082815dcSEvan Bacon  });
82*082815dcSEvan Bacon
83*082815dcSEvan Bacon  it(`replaces provided version name in build.gradle if version name is not the default`, () => {
84*082815dcSEvan Bacon    expect(setVersionName({ version: '1.2.3' }, EXAMPLE_BUILD_GRADLE_2)).toMatch(
85*082815dcSEvan Bacon      'versionName "1.2.3"'
86*082815dcSEvan Bacon    );
87*082815dcSEvan Bacon  });
88*082815dcSEvan Bacon});
89*082815dcSEvan Bacon
90*082815dcSEvan Bacondescribe('versionCode', () => {
91*082815dcSEvan Bacon  it(`returns 1 if no version code is provided`, () => {
92*082815dcSEvan Bacon    expect(getVersionCode({})).toBe(1);
93*082815dcSEvan Bacon  });
94*082815dcSEvan Bacon
95*082815dcSEvan Bacon  it(`returns the version code if provided`, () => {
96*082815dcSEvan Bacon    expect(getVersionCode({ android: { versionCode: 5 } })).toBe(5);
97*082815dcSEvan Bacon  });
98*082815dcSEvan Bacon
99*082815dcSEvan Bacon  it(`sets the version code in build.gradle if version code is given`, () => {
100*082815dcSEvan Bacon    expect(setVersionCode({ android: { versionCode: 5 } }, EXAMPLE_BUILD_GRADLE)).toMatch(
101*082815dcSEvan Bacon      'versionCode 5'
102*082815dcSEvan Bacon    );
103*082815dcSEvan Bacon  });
104*082815dcSEvan Bacon
105*082815dcSEvan Bacon  it(`replaces provided version code in build.gradle if version code is given`, () => {
106*082815dcSEvan Bacon    expect(setVersionCode({ android: { versionCode: 5 } }, EXAMPLE_BUILD_GRADLE_2)).toMatch(
107*082815dcSEvan Bacon      'versionCode 5'
108*082815dcSEvan Bacon    );
109*082815dcSEvan Bacon  });
110*082815dcSEvan Bacon});
111*082815dcSEvan Bacon
112*082815dcSEvan Bacondescribe(setMinBuildScriptExtVersion, () => {
113*082815dcSEvan Bacon  beforeEach(() => {
114*082815dcSEvan Bacon    // @ts-ignore: jest
115*082815dcSEvan Bacon    // eslint-disable-next-line import/namespace
116*082815dcSEvan Bacon    WarningAggregator.addWarningAndroid = jest.fn();
117*082815dcSEvan Bacon  });
118*082815dcSEvan Bacon
119*082815dcSEvan Bacon  it(`sets the minSdkVersion in build.gradle if minSdkVersion is given`, () => {
120*082815dcSEvan Bacon    expect(
121*082815dcSEvan Bacon      setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
122*082815dcSEvan Bacon        name: 'minSdkVersion',
123*082815dcSEvan Bacon        minVersion: 22,
124*082815dcSEvan Bacon      })
125*082815dcSEvan Bacon    ).toMatch(/minSdkVersion = 22/);
126*082815dcSEvan Bacon    expect(WarningAggregator.addWarningAndroid).not.toHaveBeenCalled();
127*082815dcSEvan Bacon  });
128*082815dcSEvan Bacon
129*082815dcSEvan Bacon  it(`sets the oddFormat in build.gradle if oddFormat is given`, () => {
130*082815dcSEvan Bacon    expect(
131*082815dcSEvan Bacon      setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
132*082815dcSEvan Bacon        name: 'oddFormat',
133*082815dcSEvan Bacon        minVersion: 30.3,
134*082815dcSEvan Bacon      })
135*082815dcSEvan Bacon    ).toMatch(/oddFormat = 30\.3/);
136*082815dcSEvan Bacon    expect(WarningAggregator.addWarningAndroid).not.toHaveBeenCalled();
137*082815dcSEvan Bacon  });
138*082815dcSEvan Bacon  it(`does not change the compileSdkVersion in build.gradle if compileSdkVersion is lower than the existing value`, () => {
139*082815dcSEvan Bacon    expect(
140*082815dcSEvan Bacon      setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
141*082815dcSEvan Bacon        name: 'compileSdkVersion',
142*082815dcSEvan Bacon        minVersion: 12,
143*082815dcSEvan Bacon      })
144*082815dcSEvan Bacon    ).toBe(EXAMPLE_PROJECT_BUILD_GRADLE);
145*082815dcSEvan Bacon    expect(WarningAggregator.addWarningAndroid).not.toHaveBeenCalled();
146*082815dcSEvan Bacon  });
147*082815dcSEvan Bacon  it(`warns when it cannot find the requested value`, () => {
148*082815dcSEvan Bacon    expect(
149*082815dcSEvan Bacon      setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
150*082815dcSEvan Bacon        name: 'foobar',
151*082815dcSEvan Bacon        minVersion: 12,
152*082815dcSEvan Bacon      })
153*082815dcSEvan Bacon    ).toBe(EXAMPLE_PROJECT_BUILD_GRADLE);
154*082815dcSEvan Bacon    expect(WarningAggregator.addWarningAndroid).toBeCalledWith(
155*082815dcSEvan Bacon      'withBuildScriptExtVersion',
156*082815dcSEvan Bacon      'Cannot set minimum buildscript.ext.foobar version because the property "foobar" cannot be found or does not have a numeric value.'
157*082815dcSEvan Bacon    );
158*082815dcSEvan Bacon  });
159*082815dcSEvan Bacon  it(`does warns when targeting a property with a string value`, () => {
160*082815dcSEvan Bacon    expect(
161*082815dcSEvan Bacon      setMinBuildScriptExtVersion(EXAMPLE_PROJECT_BUILD_GRADLE, {
162*082815dcSEvan Bacon        name: 'buildToolsVersion',
163*082815dcSEvan Bacon        minVersion: 12,
164*082815dcSEvan Bacon      })
165*082815dcSEvan Bacon    ).toBe(EXAMPLE_PROJECT_BUILD_GRADLE);
166*082815dcSEvan Bacon    expect(WarningAggregator.addWarningAndroid).toBeCalledWith(
167*082815dcSEvan Bacon      'withBuildScriptExtVersion',
168*082815dcSEvan Bacon      'Cannot set minimum buildscript.ext.buildToolsVersion version because the property "buildToolsVersion" cannot be found or does not have a numeric value.'
169*082815dcSEvan Bacon    );
170*082815dcSEvan Bacon  });
171*082815dcSEvan Bacon});
172