From 7aec78ae7fb860be679aa2e41b0b581c6a5ee779 Mon Sep 17 00:00:00 2001 From: stianst Date: Wed, 31 Jan 2024 08:38:08 +0100 Subject: [PATCH] Filter values for teams without team prefix Signed-off-by: stianst --- .../gh/bot/representations/Teams.java | 15 +++++- .../gh/bot/representations/TeamsTest.java | 30 +++++++++++ .../keycloak/gh/bot/representations/teams.yml | 52 +++++++++++++++++++ 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/keycloak/gh/bot/representations/TeamsTest.java create mode 100644 src/test/resources/org/keycloak/gh/bot/representations/teams.yml diff --git a/src/main/java/org/keycloak/gh/bot/representations/Teams.java b/src/main/java/org/keycloak/gh/bot/representations/Teams.java index c66a9f7..e06bc07 100644 --- a/src/main/java/org/keycloak/gh/bot/representations/Teams.java +++ b/src/main/java/org/keycloak/gh/bot/representations/Teams.java @@ -7,6 +7,7 @@ import java.io.IOException; import java.net.URL; import java.util.HashMap; +import java.util.LinkedList; import java.util.List; public class Teams extends HashMap> { @@ -21,15 +22,27 @@ public class Teams extends HashMap> { private static final Logger log = Logger.getLogger(Teams.class); public synchronized static Teams getTeams() throws IOException { + return getTeams(new URL(TEAMS_URL)); + } + + public synchronized static Teams getTeams(URL url) throws IOException { if (teams == null || lastUpdated + EXPIRATION < System.currentTimeMillis()) { ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory()); - teams = yamlMapper.readValue(new URL(TEAMS_URL), Teams.class); + teams = yamlMapper.readValue(url, Teams.class); + + teams.keySet().removeIf(s -> !s.startsWith("team/")); + lastUpdated = System.currentTimeMillis(); log.infov("Updating teams list from {0}", TEAMS_URL); } return teams; } + public synchronized static void clearInstance() { + teams = null; + lastUpdated = 0; + } + public Teams() { } diff --git a/src/test/java/org/keycloak/gh/bot/representations/TeamsTest.java b/src/test/java/org/keycloak/gh/bot/representations/TeamsTest.java new file mode 100644 index 0000000..aff557d --- /dev/null +++ b/src/test/java/org/keycloak/gh/bot/representations/TeamsTest.java @@ -0,0 +1,30 @@ +package org.keycloak.gh.bot.representations; + +import org.junit.jupiter.api.*; + +import java.io.IOException; + +public class TeamsTest { + + @BeforeEach + @AfterEach + public void resetTeams() { + Teams.clearInstance(); + } + + @Test + public void testRemote() throws IOException { + Teams teams = Teams.getTeams(); + Assertions.assertFalse(teams.isEmpty()); + Assertions.assertFalse(teams.values().iterator().next().isEmpty()); + } + + @Test + public void testNotPrefixedRemoved() throws IOException { + Teams teams = Teams.getTeams(getClass().getResource("teams.yml")); + Assertions.assertFalse(teams.isEmpty()); + Assertions.assertFalse(teams.containsKey("no-team")); + Assertions.assertTrue(teams.containsKey("team/core-shared")); + } + +} diff --git a/src/test/resources/org/keycloak/gh/bot/representations/teams.yml b/src/test/resources/org/keycloak/gh/bot/representations/teams.yml new file mode 100644 index 0000000..9341ef5 --- /dev/null +++ b/src/test/resources/org/keycloak/gh/bot/representations/teams.yml @@ -0,0 +1,52 @@ +team/cloud-native: + - area/admin/cli + - area/dist/quarkus + - area/operator + +team/continuous-testing: + - area/ci + - area/testsuite + +team/core-clients: + - area/adapter/fuse + - area/adapter/java-cli + - area/adapter/jee + - area/adapter/jee-saml + - area/adapter/spring + - area/authentication + - area/authentication/webauthn + - area/login/ui + - area/oidc + - area/oid4vc + - area/saml + +team/core-iam: + - area/admin/fine-grained-permissions + - area/authorization-services + - area/identity-brokering + - area/user-profile + +team/core-shared: + - area/account/api + - area/admin/api + - area/admin/client-java + - area/core + - area/import-export + - area/infinispan + - area/ldap + - area/storage + - area/token-exchange + +team/ui: + - area/account/ui + - area/adapter/javascript + - area/admin/client-js + - area/admin/ui + - area/welcome/ui + +team/community: + - area/translations + +no-team: + - area/docs + - area/dependencies