diff --git a/src/main/resources/swagger.api/schemas/tenant.json b/src/main/resources/swagger.api/schemas/tenant.json index b9c5e5c..de07df1 100644 --- a/src/main/resources/swagger.api/schemas/tenant.json +++ b/src/main/resources/swagger.api/schemas/tenant.json @@ -14,13 +14,14 @@ "name": { "description": "Tenant name", "type": "string", - "pattern": "[a-z][a-z0-9]{0,30}" + "pattern": "[a-z][a-z0-9_]{0,29}[a-z0-9]" }, "description": { "description": "Tenant description", "type": "string" }, "type": { + "description": "Tenant type", "$ref": "tenantType.json" }, "attributes": { diff --git a/src/test/java/org/folio/tm/it/TenantKeycloakIT.java b/src/test/java/org/folio/tm/it/TenantKeycloakIT.java index 7a6c6b2..61b9e19 100644 --- a/src/test/java/org/folio/tm/it/TenantKeycloakIT.java +++ b/src/test/java/org/folio/tm/it/TenantKeycloakIT.java @@ -120,12 +120,34 @@ void create_tenant_positive() throws Exception { assertThat(mappers).containsAll(expectedMappers); } - private Map requestBody() { - var loginRequest = new HashMap(); - loginRequest.put("client_id", clientId); - loginRequest.put("client_secret", clientSecret); - loginRequest.put("grant_type", grantType); - return loginRequest; + @Test + void createTenant_positive_nameContainingUnderscore() throws Exception { + var tenantName = "test_tenant"; + var tenant = new Tenant().name(tenantName).description("Test tenant with underscore in name"); + var token = keycloakClient.login(requestBody()); + mockMvc.perform(post("/tenants") + .contentType(APPLICATION_JSON) + .header(TOKEN, token.getAccessToken()) + .content(TestUtils.asJsonString(tenant))) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", is(notNullValue()))) + .andExpect(jsonPath("$.name", is(tenantName))) + .andExpect(jsonPath("$.description", is(tenant.getDescription()))) + .andExpect(jsonPath("$.type", is(tenant.getType().getValue()))) + .andExpect(jsonPath("$.metadata", is(notNullValue()))); + + assertTrue(keycloakRealmService.isRealmExist(tenantName)); + assertNull(okapiService); + + var client = keycloakClientService.findClientByClientId(tenantName, "impersonation-client"); + var mappers = client.getProtocolMappers(); + + var expectedMappers = List.of( + protocolMapper(USER_PROPERTY_MAPPER_TYPE, "username", "username", "sub"), + protocolMapper(USER_ATTRIBUTE_MAPPER_TYPE, "user_id mapper", "user_id", "user_id") + ); + + assertThat(mappers).containsAll(expectedMappers); } @Test @@ -192,4 +214,12 @@ private static Tenant copyFrom() { return result; } + + private Map requestBody() { + var loginRequest = new HashMap(); + loginRequest.put("client_id", clientId); + loginRequest.put("client_secret", clientSecret); + loginRequest.put("grant_type", grantType); + return loginRequest; + } }