CodeOwnersPluginConfigSnapshotTest: Add more override approval tests

The tests are similar to the ones for required approvals.

We intent to change the way how inheritance works for list config
parameters, such as override approvals. With the new tests the changed
behavior will be covered and it will also make it easier for reviewers
to see what is changing.

Signed-off-by: Edwin Kempin <ekempin@google.com>
Change-Id: I305e3b24a5cb2319a0715a4cf4ab7d71b322116f
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigSnapshotTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigSnapshotTest.java
index aec93a6..37d4bc8 100644
--- a/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigSnapshotTest.java
+++ b/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigSnapshotTest.java
@@ -22,6 +22,7 @@
 import static com.google.gerrit.truth.OptionalSubject.assertThat;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.acceptance.TestAccount;
 import com.google.gerrit.acceptance.config.GerritConfig;
@@ -985,21 +986,43 @@
   }
 
   @Test
-  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "Code-Review+2")
-  public void getConfiguredDefaultOverrideApproval() throws Exception {
+  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "Owners-Override+1")
+  public void getConfiguredOverrideApproval() throws Exception {
+    createOwnersOverrideLabel();
     ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
     assertThat(requiredApproval).hasSize(1);
-    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Code-Review");
-    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(2);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Owners-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(1);
+  }
+
+  @Test
+  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "Foo-Bar+1")
+  public void getOverrideApprovalIfNonExistingLabelIsConfiguredAsOverrideApproval()
+      throws Exception {
+    assertThat(cfgSnapshot().getOverrideApproval()).isEmpty();
+  }
+
+  @Test
+  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "Code-Review+3")
+  public void getOverrideApprovalIfNonExistingLabelValueIsConfiguredAsOverrideApproval()
+      throws Exception {
+    assertThat(cfgSnapshot().getOverrideApproval()).isEmpty();
+  }
+
+  @Test
+  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "INVALID")
+  public void getOverrideApprovalIfInvalidOverrideApprovalIsConfigured() throws Exception {
+    assertThat(cfgSnapshot().getOverrideApproval()).isEmpty();
   }
 
   @Test
   public void getOverrideApprovalConfiguredOnProjectLevel() throws Exception {
-    configureOverrideApproval(project, "Code-Review+2");
+    createOwnersOverrideLabel();
+    configureOverrideApproval(project, "Owners-Override+1");
     ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
     assertThat(requiredApproval).hasSize(1);
-    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Code-Review");
-    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(2);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Owners-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(1);
   }
 
   @Test
@@ -1022,8 +1045,86 @@
   }
 
   @Test
-  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "INVALID")
-  public void getOverrideApprovalIfInvalidOverrideApprovalIsConfigured() throws Exception {
+  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "Owners-Override+1")
+  public void overrideApprovalConfiguredOnProjectLevelOverridesGloballyConfiguredOverrideApproval()
+      throws Exception {
+    createOwnersOverrideLabel();
+    createOwnersOverrideLabel("Other-Override");
+
+    configureOverrideApproval(project, "Other-Override+1");
+    ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
+    assertThat(requiredApproval).hasSize(1);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Other-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(1);
+  }
+
+  @Test
+  public void overrideApprovalIsInheritedFromParentProject() throws Exception {
+    createOwnersOverrideLabel();
+
+    configureOverrideApproval(allProjects, "Owners-Override+1");
+    ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
+    assertThat(requiredApproval).hasSize(1);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Owners-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(1);
+  }
+
+  @Test
+  @GerritConfig(name = "plugin.code-owners.overrideApproval", value = "Owners-Override+1")
+  public void inheritedOverrideApprovalOverridesGloballyConfiguredOverrideApproval()
+      throws Exception {
+    createOwnersOverrideLabel();
+    createOwnersOverrideLabel("Other-Override");
+
+    configureOverrideApproval(allProjects, "Other-Override+1");
+    ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
+    assertThat(requiredApproval).hasSize(1);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Other-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(1);
+  }
+
+  @Test
+  public void projectLevelOverrideApprovalOverridesInheritedOverrideApproval() throws Exception {
+    createOwnersOverrideLabel();
+    createOwnersOverrideLabel("Other-Override");
+
+    configureOverrideApproval(allProjects, "Owners-Override+1");
+    configureOverrideApproval(project, "Other-Override+1");
+    ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
+    assertThat(requiredApproval).hasSize(1);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Other-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(1);
+  }
+
+  @Test
+  public void
+      projectLevelOverrideApprovalOverridesInheritedOverrideApprovalWithDifferentLabelValue()
+          throws Exception {
+    LabelDefinitionInput input = new LabelDefinitionInput();
+    input.values = ImmutableMap.of("+2", "Super-Override", "+1", "Override", " 0", "No Override");
+    gApi.projects().name(project.get()).label("Owners-Override").create(input).get();
+
+    configureOverrideApproval(allProjects, "Owners-Override+1");
+    configureOverrideApproval(project, "Owners-Override+2");
+    ImmutableSet<RequiredApproval> requiredApproval = cfgSnapshot().getOverrideApproval();
+    assertThat(requiredApproval).hasSize(1);
+    assertThat(requiredApproval).element(0).hasLabelNameThat().isEqualTo("Owners-Override");
+    assertThat(requiredApproval).element(0).hasValueThat().isEqualTo(2);
+  }
+
+  @Test
+  public void getOverrideApprovalIfNonExistingLabelIsConfiguredAsOverrideApprovalOnProjectLevel()
+      throws Exception {
+    configureOverrideApproval(project, "Foo-Bar+1");
+    assertThat(cfgSnapshot().getOverrideApproval()).isEmpty();
+  }
+
+  @Test
+  public void
+      getOverrideApprovalIfNonExistingLabelValueIsConfiguredAsOverrideApprovalOnProjectLevel()
+          throws Exception {
+    createOwnersOverrideLabel();
+    configureOverrideApproval(project, "Owners-Override+2");
     assertThat(cfgSnapshot().getOverrideApproval()).isEmpty();
   }
 
@@ -1035,6 +1136,14 @@
   }
 
   @Test
+  public void projectLevelOverrideApprovalForOtherProjectHasNoEffect() throws Exception {
+    createOwnersOverrideLabel();
+    Project.NameKey otherProject = projectOperations.newProject().create();
+    configureOverrideApproval(otherProject, "Owners-Override+1");
+    assertThat(cfgSnapshot().getOverrideApproval()).isEmpty();
+  }
+
+  @Test
   public void getOverrideApprovalDuplicatesAreFilteredOut() throws Exception {
     setCodeOwnersConfig(
         project,