From e8faf81e9cdaf683307f57dda997725b48f4e6f5 Mon Sep 17 00:00:00 2001 From: mrMoZ1 Date: Mon, 19 Dec 2022 04:30:25 +0200 Subject: [PATCH 1/6] control-service: graphql wildcard matching filter for team and job names Signed-off-by: mrMoZ1 --- .../graphql/strategy/FieldStrategy.java | 23 ++++++ .../datajob/JobFieldStrategyByName.java | 13 ++-- .../datajob/JobFieldStrategyByTeam.java | 14 ++-- .../graphql/GraphQLJobTeamFetcherIT.java | 78 +++++++++++++++++-- 4 files changed, 103 insertions(+), 25 deletions(-) diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java index 8d8ed123f9..4914aec9a8 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java @@ -10,6 +10,7 @@ import com.vmware.taurus.service.graphql.model.Filter; import org.springframework.data.domain.Sort; import org.springframework.lang.NonNull; +import org.apache.commons.io.FilenameUtils; import java.util.Comparator; import java.util.function.Predicate; @@ -119,4 +120,26 @@ protected Comparator detectSortingComparator( } return criteria.getComparator(); } + + /** + * + * Helper method which checks if the provided search string matches with a given matcher string. + * String capitalization is ignored. + * Supported operations are wildcard matching of '*' characters in the matcher string, or + * exact matches. If the matcher string contains '*' we will attempt to match wildcards, + * otherwise both strings are compared for equality. + * @param searchString + * @param matcherString + * @return + */ + protected boolean checkMatch(String searchString, String matcherString) { + if(matcherString.contains("*")) { + // Matching strings that contain * as wildcards. + return FilenameUtils.wildcardMatch(searchString.toLowerCase(), matcherString.toLowerCase()); + } else { + // exact matches + return searchString.equalsIgnoreCase(matcherString); + } + } + } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java index 79d1f7ea41..3a9eb62bd0 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java @@ -6,15 +6,13 @@ package com.vmware.taurus.service.graphql.strategy.datajob; import com.vmware.taurus.service.graphql.model.Criteria; +import com.vmware.taurus.service.graphql.model.Filter; import com.vmware.taurus.service.graphql.model.V2DataJob; import com.vmware.taurus.service.graphql.strategy.FieldStrategy; -import com.vmware.taurus.service.graphql.model.Filter; -import org.apache.commons.lang3.StringUtils; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Component; - import java.util.Comparator; import java.util.function.Predicate; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; @Component public class JobFieldStrategyByName extends FieldStrategy { @@ -34,14 +32,13 @@ public Criteria computeFilterCriteria( if (filterProvided(filter)) { predicate = predicate.and( - dataJob -> StringUtils.containsIgnoreCase(dataJob.getJobName(), filter.getPattern())); + dataJob -> checkMatch(dataJob.getJobName(), filter.getPattern())); } - return new Criteria<>(predicate, detectSortingComparator(filter, COMPARATOR_DEFAULT, criteria)); } @Override public Predicate computeSearchCriteria(@NonNull String searchStr) { - return dataJob -> StringUtils.containsIgnoreCase(dataJob.getJobName(), searchStr); + return dataJob -> dataJob.getJobName() != null && checkMatch(dataJob.getJobName(), searchStr); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java index 6e3ce736d9..37c9e0eaad 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java @@ -6,16 +6,14 @@ package com.vmware.taurus.service.graphql.strategy.datajob; import com.vmware.taurus.service.graphql.model.Criteria; +import com.vmware.taurus.service.graphql.model.Filter; import com.vmware.taurus.service.graphql.model.V2DataJob; import com.vmware.taurus.service.graphql.model.V2DataJobConfig; import com.vmware.taurus.service.graphql.strategy.FieldStrategy; -import com.vmware.taurus.service.graphql.model.Filter; -import org.apache.commons.lang3.StringUtils; -import org.springframework.lang.NonNull; -import org.springframework.stereotype.Component; - import java.util.Comparator; import java.util.function.Predicate; +import org.springframework.lang.NonNull; +import org.springframework.stereotype.Component; @Component public class JobFieldStrategyByTeam extends FieldStrategy { @@ -43,9 +41,7 @@ public Criteria computeFilterCriteria( part = part.replace("%", ".*").trim(); var configTeamLower = config.getTeam().toLowerCase(); var partLower = part.toLowerCase(); - - return configTeamLower.matches(partLower) - || configTeamLower.trim().equals(partLower.trim()); + return checkMatch(configTeamLower, partLower); }); } @@ -56,7 +52,7 @@ public Criteria computeFilterCriteria( public Predicate computeSearchCriteria(@NonNull String searchStr) { return dataJob -> dataJob.getConfig() != null - && StringUtils.containsIgnoreCase(dataJob.getConfig().getTeam(), searchStr); + && checkMatch(dataJob.getConfig().getTeam(), searchStr); } @Override diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java index a4d64d156b..dc4c8ae93d 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java @@ -10,6 +10,7 @@ import com.vmware.taurus.service.model.DataJob; import com.vmware.taurus.service.model.JobConfig; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -27,9 +28,11 @@ @AutoConfigureMockMvc(addFilters = false) public class GraphQLJobTeamFetcherIT { - @Autowired JobsRepository jobsRepository; + @Autowired + JobsRepository jobsRepository; - @Autowired private MockMvc mockMvc; + @Autowired + private MockMvc mockMvc; @AfterEach public void cleanup() { @@ -72,33 +75,92 @@ private static String getQuery(String jobTeam) { @Test public void testRetrieveJobNameWithParentheses() throws Exception { - testJobApiRetrievalWithTeamName("VIDA (Eco-system)"); + testJobApiRetrievalWithTeamName_retrieveExpected("VIDA (Eco-system)"); } @Test public void testRetrieveJobNameWithoutParentheses() throws Exception { - testJobApiRetrievalWithTeamName("VIDA"); + testJobApiRetrievalWithTeamName_retrieveExpected("VIDA"); + } + + @Test + public void testRetrieveJobNameWithTrailingWildcard() throws Exception { + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", + "some-*"); + } + + @Test + public void testRetrieveJobNameWithTrailingAndLeadingWildcard() throws Exception { + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", + "*-long-*"); + } + + @Test + public void testRetrieveJobNameWithLeadingWildcard() throws Exception { + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", + "*-name"); + } + + @Test + public void testRetrieveJobNameWithComplicatedWildcard() throws Exception { + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", + "*-long-*-name"); + } + + @Test + public void testRetrieveJobNameWithWildcard_shouldNotRetrieve() throws Exception { + + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("some-long-data-job-name", + "*-other-*"); + } /** * Re-usable test that creates a data job with a given team name and attempts to retrieve it via - * the graphQL API + * the graphQL API, expecting to find it. * - * @param jobTeam - the team name. + * @param jobTeam - the team name. + * @param searchString - the graphQl search string. * @throws Exception */ - private void testJobApiRetrievalWithTeamName(String jobTeam) throws Exception { + private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected(String jobTeam, + String searchString) throws Exception { createJobWithTeam(jobTeam); mockMvc .perform( MockMvcRequestBuilders.get(getJobsUri(jobTeam)) - .queryParam("query", getQuery(jobTeam)) + .queryParam("query", getQuery(searchString)) .with(user("test"))) .andExpect(status().is(200)) .andExpect(jsonPath("$.data.content[0].jobName").value("test-job")) .andExpect(jsonPath("$.data.content[0].config.team").value(jobTeam)); } + /** + * Re-usable test that creates a data job with a given team name and attempts to retrieve it via + * the graphQL API, expecting to not find it, due to the provided search string. + * + * @param jobTeam - the team name. + * @param searchString - the graphQl search string. + * @throws Exception + */ + private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected(String jobTeam, + String searchString) throws Exception { + createJobWithTeam(jobTeam); + mockMvc + .perform( + MockMvcRequestBuilders.get(getJobsUri(jobTeam)) + .queryParam("query", getQuery(searchString)) + .with(user("test"))) + .andExpect(status().is(200)) + .andExpect(jsonPath("$.data.content").isEmpty()); + } + + private void testJobApiRetrievalWithTeamName_retrieveExpected(String jobTeam) + throws Exception { + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected(jobTeam, jobTeam); + } + private void createJobWithTeam(String jobTeam) { DataJob dataJob = new DataJob(); JobConfig jobConfig = new JobConfig(); From 9e6bb3f176ea88b6da283ae6661e060c860eac40 Mon Sep 17 00:00:00 2001 From: mrMoZ1 Date: Mon, 19 Dec 2022 11:31:31 +0200 Subject: [PATCH 2/6] control-service: fix tests Signed-off-by: mrMoZ1 --- .../taurus/service/graphql/strategy/FieldStrategy.java | 8 +++++--- .../taurus/service/graphql/GraphQLDataFetchersTest.java | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java index 4914aec9a8..5d3408e8a7 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java @@ -133,12 +133,14 @@ protected Comparator detectSortingComparator( * @return */ protected boolean checkMatch(String searchString, String matcherString) { - if(matcherString.contains("*")) { + if (searchString == null || matcherString == null) { + return false; + } else if (matcherString.contains("*")) { // Matching strings that contain * as wildcards. return FilenameUtils.wildcardMatch(searchString.toLowerCase(), matcherString.toLowerCase()); } else { - // exact matches - return searchString.equalsIgnoreCase(matcherString); + // exact matches + return searchString.equalsIgnoreCase(matcherString); } } diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLDataFetchersTest.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLDataFetchersTest.java index cfd24cc953..2f4f830ff9 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLDataFetchersTest.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLDataFetchersTest.java @@ -125,7 +125,7 @@ void testDataFetcherOfJobs_whenSupportedFieldProvidedWithSorting_shouldReturnJob when(jobsRepository.findAll()).thenReturn(mockListOfDataJobs()); when(dataFetchingEnvironment.getSelectionSet()).thenReturn(dataFetchingFieldSelectionSet); when(dataFetchingEnvironment.getArgument("filter")) - .thenReturn(constructFilter(Filter.of("jobName", "sample-job", Sort.Direction.DESC))); + .thenReturn(constructFilter(Filter.of("jobName", "sample-job*", Sort.Direction.DESC))); DataJobPage dataJobPage = (DataJobPage) findDataJobs.get(dataFetchingEnvironment); From 3254d035bb339bed1da04af9e4ff08117f5e0b8a Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Mon, 19 Dec 2022 09:33:00 +0000 Subject: [PATCH 3/6] Google Java Format --- .../graphql/strategy/FieldStrategy.java | 10 ++--- .../datajob/JobFieldStrategyByName.java | 4 +- .../datajob/JobFieldStrategyByTeam.java | 3 +- .../graphql/GraphQLJobTeamFetcherIT.java | 43 ++++++++----------- 4 files changed, 25 insertions(+), 35 deletions(-) diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java index 5d3408e8a7..ffd3a605d0 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/FieldStrategy.java @@ -122,12 +122,11 @@ protected Comparator detectSortingComparator( } /** - * * Helper method which checks if the provided search string matches with a given matcher string. - * String capitalization is ignored. - * Supported operations are wildcard matching of '*' characters in the matcher string, or - * exact matches. If the matcher string contains '*' we will attempt to match wildcards, - * otherwise both strings are compared for equality. + * String capitalization is ignored. Supported operations are wildcard matching of '*' characters + * in the matcher string, or exact matches. If the matcher string contains '*' we will attempt to + * match wildcards, otherwise both strings are compared for equality. + * * @param searchString * @param matcherString * @return @@ -143,5 +142,4 @@ protected boolean checkMatch(String searchString, String matcherString) { return searchString.equalsIgnoreCase(matcherString); } } - } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java index 3a9eb62bd0..507a383a3c 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java @@ -30,9 +30,7 @@ public Criteria computeFilterCriteria( @NonNull Criteria criteria, @NonNull Filter filter) { Predicate predicate = criteria.getPredicate(); if (filterProvided(filter)) { - predicate = - predicate.and( - dataJob -> checkMatch(dataJob.getJobName(), filter.getPattern())); + predicate = predicate.and(dataJob -> checkMatch(dataJob.getJobName(), filter.getPattern())); } return new Criteria<>(predicate, detectSortingComparator(filter, COMPARATOR_DEFAULT, criteria)); } diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java index 37c9e0eaad..2c08f3faec 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByTeam.java @@ -51,8 +51,7 @@ public Criteria computeFilterCriteria( @Override public Predicate computeSearchCriteria(@NonNull String searchStr) { return dataJob -> - dataJob.getConfig() != null - && checkMatch(dataJob.getConfig().getTeam(), searchStr); + dataJob.getConfig() != null && checkMatch(dataJob.getConfig().getTeam(), searchStr); } @Override diff --git a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java index dc4c8ae93d..bfd2b9ea21 100644 --- a/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/test/java/com/vmware/taurus/service/graphql/GraphQLJobTeamFetcherIT.java @@ -10,7 +10,6 @@ import com.vmware.taurus.service.model.DataJob; import com.vmware.taurus.service.model.JobConfig; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; @@ -28,11 +27,9 @@ @AutoConfigureMockMvc(addFilters = false) public class GraphQLJobTeamFetcherIT { - @Autowired - JobsRepository jobsRepository; + @Autowired JobsRepository jobsRepository; - @Autowired - private MockMvc mockMvc; + @Autowired private MockMvc mockMvc; @AfterEach public void cleanup() { @@ -85,46 +82,45 @@ public void testRetrieveJobNameWithoutParentheses() throws Exception { @Test public void testRetrieveJobNameWithTrailingWildcard() throws Exception { - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", - "some-*"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "some-long-data-job-name", "some-*"); } @Test public void testRetrieveJobNameWithTrailingAndLeadingWildcard() throws Exception { - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", - "*-long-*"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "some-long-data-job-name", "*-long-*"); } @Test public void testRetrieveJobNameWithLeadingWildcard() throws Exception { - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", - "*-name"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "some-long-data-job-name", "*-name"); } @Test public void testRetrieveJobNameWithComplicatedWildcard() throws Exception { - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("some-long-data-job-name", - "*-long-*-name"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "some-long-data-job-name", "*-long-*-name"); } @Test public void testRetrieveJobNameWithWildcard_shouldNotRetrieve() throws Exception { - testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("some-long-data-job-name", - "*-other-*"); - + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + "some-long-data-job-name", "*-other-*"); } /** * Re-usable test that creates a data job with a given team name and attempts to retrieve it via * the graphQL API, expecting to find it. * - * @param jobTeam - the team name. + * @param jobTeam - the team name. * @param searchString - the graphQl search string. * @throws Exception */ - private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected(String jobTeam, - String searchString) throws Exception { + private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + String jobTeam, String searchString) throws Exception { createJobWithTeam(jobTeam); mockMvc .perform( @@ -140,12 +136,12 @@ private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected(Str * Re-usable test that creates a data job with a given team name and attempts to retrieve it via * the graphQL API, expecting to not find it, due to the provided search string. * - * @param jobTeam - the team name. + * @param jobTeam - the team name. * @param searchString - the graphQl search string. * @throws Exception */ - private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected(String jobTeam, - String searchString) throws Exception { + private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + String jobTeam, String searchString) throws Exception { createJobWithTeam(jobTeam); mockMvc .perform( @@ -156,8 +152,7 @@ private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( .andExpect(jsonPath("$.data.content").isEmpty()); } - private void testJobApiRetrievalWithTeamName_retrieveExpected(String jobTeam) - throws Exception { + private void testJobApiRetrievalWithTeamName_retrieveExpected(String jobTeam) throws Exception { testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected(jobTeam, jobTeam); } From 8be0f4da8e29495135ae8752de8cbca920986080 Mon Sep 17 00:00:00 2001 From: mrMoZ1 Date: Mon, 19 Dec 2022 15:35:47 +0200 Subject: [PATCH 4/6] control-service: add integration test Signed-off-by: mrMoZ1 --- .../GraphQLJobTeamAndNameFilterMatcherIT.java | 188 ++++++++++++++++++ 1 file changed, 188 insertions(+) create mode 100644 projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java new file mode 100644 index 0000000000..657b22c76b --- /dev/null +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java @@ -0,0 +1,188 @@ +package com.vmware.taurus.graphql.it; + +/* + * Copyright 2021 VMware, Inc. + * SPDX-License-Identifier: Apache-2.0 + */ + + +import com.vmware.taurus.ControlplaneApplication; +import com.vmware.taurus.datajobs.it.common.BaseIT; +import com.vmware.taurus.service.JobsRepository; +import com.vmware.taurus.service.model.DataJob; +import com.vmware.taurus.service.model.JobConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; + +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = ControlplaneApplication.class) +@AutoConfigureMockMvc(addFilters = false) +public class GraphQLJobTeamAndNameFilterMatcherIT extends BaseIT { + + @Autowired + JobsRepository jobsRepository; + + @Autowired + private MockMvc mockMvc; + + @AfterEach + public void cleanup() { + jobsRepository.deleteAll(); + } + + private static String getJobsUri(String teamName) { + return "/data-jobs/for-team/" + teamName + "/jobs"; + } + + private static String getQuery(String searchPattern, String searchProperty) { + return "{\n" + + " jobs(\n" + + " pageNumber: 1\n" + + " pageSize: 100\n" + + " filter: [\n" + + " { property: " + searchProperty + ", pattern: \"" + + searchPattern + + "\", sort: ASC }\n" + + " { property: \"jobName\", sort: ASC }\n" + + " ]\n" + + " ) {\n" + + " content {\n" + + " jobName\n" + + " config {\n" + + " team\n" + + " description\n" + + " schedule {\n" + + " scheduleCron\n" + + " }\n" + + " }\n" + + " deployments {\n" + + " enabled\n" + + " status\n" + + " }\n" + + " }\n" + + " }\n" + + "}"; + } + + @Test + public void testFilterByJobTeamExactMatch_shouldRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-team", + "\"config.team\""); + } + + @Test + public void testFilterByJobNameExactMatch_shouldRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-job", + "\"jobName\""); + } + + @Test + public void testFilterByJobTeamExactMatch_shouldNotRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "test-team1", + "\"config.team\""); + } + + @Test + public void testFilterByJobNameExactMatch_shouldNotRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "test-job1", + "\"jobName\""); + } + + @Test + public void testFilterByJobNameExactMatch_multipleJobs_shouldRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + createJobWithTeam("another-team", "another-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-job", + "\"jobName\""); + } + + @Test + public void testFilterByJobNameExactMatch_multipleJobs_shouldNotRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + createJobWithTeam("another-team", "another-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "test-job1", + "\"jobName\""); + } + + @Test + public void testFilterByJobNameWildcardMatch_multipleJobs_shouldRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + createJobWithTeam("another-team", "another-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-*", + "\"jobName\""); + + } + + @Test + public void testFilterByJobNameWildcardMatch_multipleJobs_shouldNotRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + createJobWithTeam("another-team", "another-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "unrelated-*", + "\"jobName\""); + + } + + @Test + public void testFilterByTeamNameWildcardMatch_multipleJobs_shouldRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + createJobWithTeam("another-team", "another-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-*", + "\"config.team\""); + + } + + @Test + public void testFilterByTeamNameWildcardMatch_multipleJobs_shouldNotRetrieve() throws Exception { + createJobWithTeam("test-team", "test-job"); + createJobWithTeam("another-team", "another-job"); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "unrelated-*", + "\"config.team\""); + + } + + private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + String jobTeam, String searchString, String searchProperty) throws Exception { + mockMvc + .perform( + MockMvcRequestBuilders.get(getJobsUri(jobTeam)) + .queryParam("query", getQuery(searchString, searchProperty)) + .with(user("test"))) + .andExpect(status().is(200)) + .andExpect(jsonPath("$.data.content[0].jobName").value("test-job")) + .andExpect(jsonPath("$.data.content[0].config.team").value(jobTeam)); + } + + private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + String jobTeam, String searchString, String searchProperty) throws Exception { + mockMvc + .perform( + MockMvcRequestBuilders.get(getJobsUri(jobTeam)) + .queryParam("query", getQuery(searchString, searchProperty)) + .with(user("test"))) + .andExpect(status().is(200)) + .andExpect(jsonPath("$.data.content").isEmpty()); + } + + private void createJobWithTeam(String jobTeam, String jobName) { + DataJob dataJob = new DataJob(); + JobConfig jobConfig = new JobConfig(); + jobConfig.setTeam(jobTeam); + dataJob.setName(jobName); + dataJob.setJobConfig(jobConfig); + jobsRepository.save(dataJob); + } +} From 5b67e7f3beacacfe41d95aa7bb20c0643b07d2a9 Mon Sep 17 00:00:00 2001 From: github-actions <> Date: Mon, 19 Dec 2022 13:36:32 +0000 Subject: [PATCH 5/6] Google Java Format --- .../GraphQLJobTeamAndNameFilterMatcherIT.java | 55 +++++++++---------- 1 file changed, 25 insertions(+), 30 deletions(-) diff --git a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java index 657b22c76b..5d3daaa46f 100644 --- a/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java +++ b/projects/control-service/projects/pipelines_control_service/src/integration-test/java/com/vmware/taurus/graphql/it/GraphQLJobTeamAndNameFilterMatcherIT.java @@ -5,7 +5,6 @@ * SPDX-License-Identifier: Apache-2.0 */ - import com.vmware.taurus.ControlplaneApplication; import com.vmware.taurus.datajobs.it.common.BaseIT; import com.vmware.taurus.service.JobsRepository; @@ -29,11 +28,9 @@ @AutoConfigureMockMvc(addFilters = false) public class GraphQLJobTeamAndNameFilterMatcherIT extends BaseIT { - @Autowired - JobsRepository jobsRepository; + @Autowired JobsRepository jobsRepository; - @Autowired - private MockMvc mockMvc; + @Autowired private MockMvc mockMvc; @AfterEach public void cleanup() { @@ -50,7 +47,9 @@ private static String getQuery(String searchPattern, String searchProperty) { + " pageNumber: 1\n" + " pageSize: 100\n" + " filter: [\n" - + " { property: " + searchProperty + ", pattern: \"" + + " { property: " + + searchProperty + + ", pattern: \"" + searchPattern + "\", sort: ASC }\n" + " { property: \"jobName\", sort: ASC }\n" @@ -77,81 +76,77 @@ private static String getQuery(String searchPattern, String searchProperty) { @Test public void testFilterByJobTeamExactMatch_shouldRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-team", - "\"config.team\""); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "test-team", "test-team", "\"config.team\""); } @Test public void testFilterByJobNameExactMatch_shouldRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-job", - "\"jobName\""); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "test-team", "test-job", "\"jobName\""); } @Test public void testFilterByJobTeamExactMatch_shouldNotRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "test-team1", - "\"config.team\""); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + "test-team", "test-team1", "\"config.team\""); } @Test public void testFilterByJobNameExactMatch_shouldNotRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "test-job1", - "\"jobName\""); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + "test-team", "test-job1", "\"jobName\""); } @Test public void testFilterByJobNameExactMatch_multipleJobs_shouldRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); createJobWithTeam("another-team", "another-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-job", - "\"jobName\""); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "test-team", "test-job", "\"jobName\""); } @Test public void testFilterByJobNameExactMatch_multipleJobs_shouldNotRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); createJobWithTeam("another-team", "another-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "test-job1", - "\"jobName\""); + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + "test-team", "test-job1", "\"jobName\""); } @Test public void testFilterByJobNameWildcardMatch_multipleJobs_shouldRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); createJobWithTeam("another-team", "another-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-*", - "\"jobName\""); - + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "test-team", "test-*", "\"jobName\""); } @Test public void testFilterByJobNameWildcardMatch_multipleJobs_shouldNotRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); createJobWithTeam("another-team", "another-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "unrelated-*", - "\"jobName\""); - + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + "test-team", "unrelated-*", "\"jobName\""); } @Test public void testFilterByTeamNameWildcardMatch_multipleJobs_shouldRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); createJobWithTeam("another-team", "another-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected("test-team", "test-*", - "\"config.team\""); - + testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( + "test-team", "test-*", "\"config.team\""); } @Test public void testFilterByTeamNameWildcardMatch_multipleJobs_shouldNotRetrieve() throws Exception { createJobWithTeam("test-team", "test-job"); createJobWithTeam("another-team", "another-job"); - testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected("test-team", "unrelated-*", - "\"config.team\""); - + testJobApiRetrievalWithTeamNameAndSearchString_retrieveNotExpected( + "test-team", "unrelated-*", "\"config.team\""); } private void testJobApiRetrievalWithTeamNameAndSearchString_retrieveExpected( From 88c0ef95e4414e40e236d275f6b746222d7599eb Mon Sep 17 00:00:00 2001 From: Miroslav Ivanov Date: Tue, 20 Dec 2022 13:52:53 +0200 Subject: [PATCH 6/6] Removed unnecessary null check --- .../graphql/strategy/datajob/JobFieldStrategyByName.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java index 507a383a3c..5aa1d335bb 100644 --- a/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java +++ b/projects/control-service/projects/pipelines_control_service/src/main/java/com/vmware/taurus/service/graphql/strategy/datajob/JobFieldStrategyByName.java @@ -37,6 +37,6 @@ public Criteria computeFilterCriteria( @Override public Predicate computeSearchCriteria(@NonNull String searchStr) { - return dataJob -> dataJob.getJobName() != null && checkMatch(dataJob.getJobName(), searchStr); + return dataJob -> checkMatch(dataJob.getJobName(), searchStr); } }