From f4ff85164e9477a7c63a54a626f4e369afbc8a79 Mon Sep 17 00:00:00 2001 From: Michael Clarke Date: Wed, 22 Mar 2023 17:28:12 +0000 Subject: [PATCH] Clean-up unit tests for CommunityBranchPlugin class The tests for CommunityBranchPlugin were using argument captors against repeated calls to the varargs `addExtensions` method, but were only verifying some of the calls, and were not taking into account the types passed into the methods. Version 5 of Mockito has a slight change in how it handles varargs capturing, so will not correctly match the varargs invocations where the same matcher has been used to try and match a subset of arguments, or where the method is only using one argument for the varargs section. By switching to verifying all the values directly on each method call the tests now provide meaningful coverage as well as allowing for a clean upgrade to Mockito 5. --- .../plugin/CommunityBranchPluginTest.java | 119 ++++++++++++------ 1 file changed, 84 insertions(+), 35 deletions(-) diff --git a/src/test/java/com/github/mc1arke/sonarqube/plugin/CommunityBranchPluginTest.java b/src/test/java/com/github/mc1arke/sonarqube/plugin/CommunityBranchPluginTest.java index 8ebdc01..22fd3a2 100644 --- a/src/test/java/com/github/mc1arke/sonarqube/plugin/CommunityBranchPluginTest.java +++ b/src/test/java/com/github/mc1arke/sonarqube/plugin/CommunityBranchPluginTest.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2020-2022 Michael Clarke + * Copyright (C) 2020-2023 Michael Clarke * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,31 +18,59 @@ */ package com.github.mc1arke.sonarqube.plugin; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import java.util.Arrays; -import java.util.List; - -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Mockito; -import org.sonar.api.Plugin; -import org.sonar.api.SonarQubeSide; -import org.sonar.core.extension.CoreExtension; - +import com.github.mc1arke.sonarqube.plugin.almclient.DefaultLinkHeaderReader; +import com.github.mc1arke.sonarqube.plugin.almclient.azuredevops.DefaultAzureDevopsClientFactory; +import com.github.mc1arke.sonarqube.plugin.almclient.bitbucket.DefaultBitbucketClientFactory; +import com.github.mc1arke.sonarqube.plugin.almclient.bitbucket.HttpClientBuilderFactory; +import com.github.mc1arke.sonarqube.plugin.almclient.github.DefaultGithubClientFactory; +import com.github.mc1arke.sonarqube.plugin.almclient.github.v3.DefaultUrlConnectionProvider; +import com.github.mc1arke.sonarqube.plugin.almclient.github.v3.RestApplicationAuthenticationProvider; +import com.github.mc1arke.sonarqube.plugin.almclient.github.v4.DefaultGraphqlProvider; +import com.github.mc1arke.sonarqube.plugin.almclient.gitlab.DefaultGitlabClientFactory; import com.github.mc1arke.sonarqube.plugin.ce.CommunityReportAnalysisComponentProvider; +import com.github.mc1arke.sonarqube.plugin.scanner.BranchConfigurationFactory; import com.github.mc1arke.sonarqube.plugin.scanner.CommunityBranchConfigurationLoader; import com.github.mc1arke.sonarqube.plugin.scanner.CommunityBranchParamsValidator; import com.github.mc1arke.sonarqube.plugin.scanner.CommunityProjectBranchesLoader; import com.github.mc1arke.sonarqube.plugin.scanner.ScannerPullRequestPropertySensor; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.AzureDevopsAutoConfigurer; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.BitbucketPipelinesAutoConfigurer; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.CirrusCiAutoConfigurer; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.CodeMagicAutoConfigurer; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.GithubActionsAutoConfigurer; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.GitlabCiAutoConfigurer; +import com.github.mc1arke.sonarqube.plugin.scanner.autoconfiguration.JenkinsAutoConfigurer; import com.github.mc1arke.sonarqube.plugin.server.CommunityBranchFeatureExtension; import com.github.mc1arke.sonarqube.plugin.server.CommunityBranchSupportDelegate; +import com.github.mc1arke.sonarqube.plugin.server.MonoRepoFeature; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.validator.AzureDevopsValidator; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.validator.BitbucketValidator; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.validator.GithubValidator; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.validator.GitlabValidator; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.DeleteBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.SetAzureBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.SetBitbucketBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.SetBitbucketCloudBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.SetGithubBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.SetGitlabBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.binding.action.ValidateBindingAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.pullrequest.PullRequestWs; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.pullrequest.action.DeleteAction; +import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.pullrequest.action.ListAction; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.sonar.api.Plugin; +import org.sonar.api.SonarQubeSide; +import org.sonar.api.config.PropertyDefinition; +import org.sonar.core.extension.CoreExtension; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; /** * @author Michael Clarke @@ -58,13 +86,13 @@ class CommunityBranchPluginTest { testCase.define(context); - final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Object.class); - verify(context) - .addExtensions(argumentCaptor.capture(), argumentCaptor.capture(), argumentCaptor.capture()); - - - assertThat(argumentCaptor.getAllValues().subList(0, 4)).isEqualTo(Arrays.asList(CommunityProjectBranchesLoader.class, - CommunityBranchConfigurationLoader.class, CommunityBranchParamsValidator.class, ScannerPullRequestPropertySensor.class)); + verify(context).addExtensions(CommunityProjectBranchesLoader.class, + CommunityBranchConfigurationLoader.class, CommunityBranchParamsValidator.class, + ScannerPullRequestPropertySensor.class, BranchConfigurationFactory.class, + AzureDevopsAutoConfigurer.class, BitbucketPipelinesAutoConfigurer.class, + CirrusCiAutoConfigurer.class, CodeMagicAutoConfigurer.class, + GithubActionsAutoConfigurer.class, GitlabCiAutoConfigurer.class, + JenkinsAutoConfigurer.class); } @Test @@ -88,11 +116,8 @@ class CommunityBranchPluginTest { testCase.load(context); - final ArgumentCaptor> argumentCaptor = ArgumentCaptor.forClass(Class.class); - verify(context, times(2)).addExtensions(argumentCaptor.capture(), argumentCaptor.capture()); - - - assertThat(argumentCaptor.getAllValues().subList(0, 1)).isEqualTo(List.of(CommunityReportAnalysisComponentProvider.class)); + verify(context).addExtensions(CommunityReportAnalysisComponentProvider.class); + verify(context).addExtensions(any(PropertyDefinition.class), eq(MonoRepoFeature.class)); } @@ -105,12 +130,36 @@ class CommunityBranchPluginTest { testCase.load(context); - final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(Object.class); - verify(context, times(2)).addExtensions(argumentCaptor.capture(), argumentCaptor.capture()); - assertThat(argumentCaptor.getAllValues()).hasSize(29); + verify(context).addExtensions(eq(CommunityBranchFeatureExtension.class), + eq(CommunityBranchSupportDelegate.class), + eq(DeleteBindingAction.class), + eq(SetGithubBindingAction.class), + eq(SetAzureBindingAction.class), + eq(SetBitbucketBindingAction.class), + eq(SetBitbucketCloudBindingAction.class), + eq(SetGitlabBindingAction.class), + eq(ValidateBindingAction.class), + eq(DeleteAction.class), + eq(ListAction.class), + eq(PullRequestWs.class), + eq(GithubValidator.class), + eq(DefaultGraphqlProvider.class), + eq(DefaultGithubClientFactory.class), + eq(DefaultLinkHeaderReader.class), + eq(DefaultUrlConnectionProvider.class), + eq(RestApplicationAuthenticationProvider.class), + eq(HttpClientBuilderFactory.class), + eq(DefaultBitbucketClientFactory.class), + eq(BitbucketValidator.class), + eq(GitlabValidator.class), + eq(DefaultGitlabClientFactory.class), + eq(DefaultAzureDevopsClientFactory.class), + eq(AzureDevopsValidator.class), + any(PropertyDefinition.class), + any(PropertyDefinition.class)); - assertThat(argumentCaptor.getAllValues().subList(0, 2)).isEqualTo(List.of(CommunityBranchFeatureExtension.class, CommunityBranchSupportDelegate.class)); + verify(context).addExtensions(any(PropertyDefinition.class), eq(MonoRepoFeature.class)); } @Test