From a3e832d00731fbc8cf4d1316c06c6674b360ea5f Mon Sep 17 00:00:00 2001
From: Sergio Zharinov <zharinov@users.noreply.github.com>
Date: Mon, 22 Jul 2019 20:47:24 +0400
Subject: [PATCH] fix(maven): fix implicit grouping update policy (#4149)

---
 lib/manager/maven/update.js                   |  7 +--
 test/manager/maven/_fixtures/grouping.pom.xml | 28 ++++++++++
 test/manager/maven/index.spec.js              | 52 ++++++++++++++-----
 3 files changed, 69 insertions(+), 18 deletions(-)
 create mode 100644 test/manager/maven/_fixtures/grouping.pom.xml

diff --git a/lib/manager/maven/update.js b/lib/manager/maven/update.js
index aabffbbdc3..64a91f7f4b 100644
--- a/lib/manager/maven/update.js
+++ b/lib/manager/maven/update.js
@@ -16,13 +16,10 @@ function updateAtPosition(fileContent, upgrade, endingAnchor = '"') {
   if (version === newValue) {
     return fileContent;
   }
-  if (version === currentValue) {
-    const replacedPart = versionPart.replace(currentValue, newValue);
+  if (version === currentValue || upgrade.groupName) {
+    const replacedPart = versionPart.replace(version, newValue);
     return leftPart + replacedPart + restPart;
   }
-  if (upgrade.groupName) {
-    return fileContent;
-  }
   logger.debug({ depName, version, currentValue, newValue }, 'Unknown value');
   return null;
 }
diff --git a/test/manager/maven/_fixtures/grouping.pom.xml b/test/manager/maven/_fixtures/grouping.pom.xml
new file mode 100644
index 0000000000..179f9f6451
--- /dev/null
+++ b/test/manager/maven/_fixtures/grouping.pom.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>org.example</groupId>
+  <artifactId>ExamplePomFile</artifactId>
+
+  <properties>
+    <foo.version>1.0.0</foo.version>
+  </properties>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.example</groupId>
+      <artifactId>foo-1</artifactId>
+      <version>${foo.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.example</groupId>
+      <artifactId>foo-2</artifactId>
+      <version>${foo.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>org.example</groupId>
+      <artifactId>bar</artifactId>
+      <version>2.0.0</version>
+    </dependency>
+  </dependencies>
+</project>
diff --git a/test/manager/maven/index.spec.js b/test/manager/maven/index.spec.js
index 9f4edf4a99..412a1b27dc 100644
--- a/test/manager/maven/index.spec.js
+++ b/test/manager/maven/index.spec.js
@@ -23,6 +23,10 @@ const pomChild = fs.readFileSync(
   'test/manager/maven/_fixtures/child.pom.xml',
   'utf8'
 );
+const origContent = fs.readFileSync(
+  'test/manager/maven/_fixtures/grouping.pom.xml',
+  'utf8'
+);
 
 function selectDep(deps, name = 'org.example:quuz') {
   return deps.find(dep => dep.depName === name);
@@ -95,24 +99,46 @@ describe('manager/maven', () => {
       expect(pomContent).toBe(updatedContent);
     });
 
-    it('should not touch content for the second update of grouped dependency', async () => {
-      platform.getFile.mockReturnValueOnce(pomContent);
+    it('should update to version of the latest dep in implicit group', async () => {
+      platform.getFile.mockReturnValueOnce(origContent);
       const [{ deps }] = await extractAllPackageFiles({}, ['pom.xml']);
-      const dep1 = selectDep(deps, 'org.example:quux');
-      const dep2 = selectDep(deps, 'org.example:quux-test');
 
-      const upgrade1 = { ...dep1, newValue: '2.0.0', groupName: 'quuxVersion' };
-      const previouslyUpdatedContent = updateDependency(pomContent, upgrade1);
-      expect(previouslyUpdatedContent).toEqual(
-        pomContent.replace('1.2.3.4', '2.0.0')
+      const dep1 = selectDep(deps, 'org.example:foo-1');
+      const upgrade1 = { ...dep1, newValue: '1.0.2' };
+
+      const dep2 = selectDep(deps, 'org.example:foo-2');
+      const upgrade2 = { ...dep2, newValue: '1.0.3' };
+
+      const updatedOutside = origContent.replace('1.0.0', '1.0.1');
+
+      expect(updateDependency(origContent, upgrade1)).toEqual(
+        origContent.replace('1.0.0', '1.0.2')
+      );
+      expect(updateDependency(updatedOutside, upgrade1)).toEqual(
+        origContent.replace('1.0.0', '1.0.2')
+      );
+
+      const updatedByPrevious = updateDependency(origContent, upgrade1);
+
+      expect(updateDependency(updatedByPrevious, upgrade2)).toEqual(
+        origContent.replace('1.0.0', '1.0.3')
+      );
+      expect(updateDependency(updatedOutside, upgrade2)).toEqual(
+        origContent.replace('1.0.0', '1.0.3')
       );
 
-      const upgrade2 = { ...dep2, newValue: '1.9.9', groupName: 'quuxVersion' };
-      const updatedContent = updateDependency(
-        previouslyUpdatedContent,
-        upgrade2
+      expect(updateDependency(origContent, upgrade2)).toEqual(
+        origContent.replace('1.0.0', '1.0.3')
       );
-      expect(updatedContent).toBe(previouslyUpdatedContent);
+    });
+
+    it('should return null for ungrouped deps if content was updated outside', async () => {
+      platform.getFile.mockReturnValueOnce(origContent);
+      const [{ deps }] = await extractAllPackageFiles({}, ['pom.xml']);
+      const dep = selectDep(deps, 'org.example:bar');
+      const upgrade = { ...dep, newValue: '2.0.2' };
+      const updatedOutside = origContent.replace('2.0.0', '2.0.1');
+      expect(updateDependency(updatedOutside, upgrade)).toBeNull();
     });
 
     it('should return null if current versions in content and upgrade are not same', () => {
-- 
GitLab