From 26e925d2b344f702e4baa19ea4b4f08c4287e95d Mon Sep 17 00:00:00 2001 From: Muralidhar Basani Date: Fri, 14 Jun 2024 17:25:39 +0200 Subject: [PATCH 1/4] SSO login bug fix --- coral/pnpm-lock.yaml | 39 +++-- .../klaw/helpers/db/rdbms/InsertDataJdbc.java | 25 +++- .../klaw/helpers/db/rdbms/UpdateDataJdbc.java | 5 +- .../service/UsersTeamsControllerService.java | 3 +- .../test/java/io/aiven/klaw/MockMethods.java | 13 ++ .../SsoActiveDirectoryAuthenticationIT.java | 128 +++++++++++++++- .../io/aiven/klaw/UsersTeamsControllerIT.java | 137 +++++++++++++++++- ...indowsActiveDirectoryAuthenticationIT.java | 2 +- .../helpers/db/rdbms/InsertDataJdbcTest.java | 3 +- openapi.yaml | 26 +--- 10 files changed, 318 insertions(+), 63 deletions(-) diff --git a/coral/pnpm-lock.yaml b/coral/pnpm-lock.yaml index 292c8f5606..9eb45ed4dd 100644 --- a/coral/pnpm-lock.yaml +++ b/coral/pnpm-lock.yaml @@ -1478,6 +1478,7 @@ packages: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.19 + dev: true /@jridgewell/gen-mapping@0.3.5: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} @@ -1486,7 +1487,6 @@ packages: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.4.15 '@jridgewell/trace-mapping': 0.3.25 - dev: true /@jridgewell/resolve-uri@3.1.1: resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} @@ -1495,17 +1495,17 @@ packages: /@jridgewell/set-array@1.1.2: resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} engines: {node: '>=6.0.0'} + dev: true /@jridgewell/set-array@1.2.1: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - dev: true /@jridgewell/source-map@0.3.5: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 dev: false /@jridgewell/sourcemap-codec@1.4.15: @@ -1516,13 +1516,13 @@ packages: dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + dev: true /@jridgewell/trace-mapping@0.3.25: resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} dependencies: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 - dev: true /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} @@ -5358,11 +5358,11 @@ packages: dependencies: balanced-match: 1.0.2 - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} dependencies: - fill-range: 7.0.1 + fill-range: 7.1.1 dev: true /browserslist@4.21.10: @@ -5374,6 +5374,7 @@ packages: electron-to-chromium: 1.4.508 node-releases: 2.0.13 update-browserslist-db: 1.0.11(browserslist@4.21.10) + dev: true /browserslist@4.23.1: resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} @@ -5384,7 +5385,6 @@ packages: electron-to-chromium: 1.4.796 node-releases: 2.0.14 update-browserslist-db: 1.0.16(browserslist@4.23.1) - dev: true /bs-logger@0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -5424,10 +5424,10 @@ packages: /caniuse-lite@1.0.30001527: resolution: {integrity: sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ==} + dev: true /caniuse-lite@1.0.30001632: resolution: {integrity: sha512-udx3o7yHJfUxMLkGohMlVHCvFvWmirKh9JAH/d7WOLPetlH+LTL5cocMZ0t7oZx/mdlOWXti97xLZWc8uURRHg==} - dev: true /ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -5996,10 +5996,10 @@ packages: /electron-to-chromium@1.4.508: resolution: {integrity: sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg==} + dev: true /electron-to-chromium@1.4.796: resolution: {integrity: sha512-NglN/xprcM+SHD2XCli4oC6bWe6kHoytcyLKCWXmRL854F0qhPhaYgUswUsglnPxYaNQIg2uMY4BvaomIf3kLA==} - dev: true /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} @@ -6180,11 +6180,11 @@ packages: /escalade@3.1.1: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + dev: true /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} - dev: true /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} @@ -6614,8 +6614,8 @@ packages: ramda: 0.29.0 dev: false - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -8734,7 +8734,7 @@ packages: resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} engines: {node: '>=8.6'} dependencies: - braces: 3.0.2 + braces: 3.0.3 picomatch: 2.3.1 dev: true @@ -8887,10 +8887,10 @@ packages: /node-releases@2.0.13: resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true /node-releases@2.0.14: resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -9185,7 +9185,6 @@ packages: /picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} - dev: true /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -10425,7 +10424,7 @@ packages: uglify-js: optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.19 + '@jridgewell/trace-mapping': 0.3.25 esbuild: 0.18.17 jest-worker: 27.5.1 schema-utils: 3.3.0 @@ -10802,6 +10801,7 @@ packages: browserslist: 4.21.10 escalade: 3.1.1 picocolors: 1.0.0 + dev: true /update-browserslist-db@1.0.16(browserslist@4.23.1): resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} @@ -10812,7 +10812,6 @@ packages: browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.1 - dev: true /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -11041,7 +11040,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.10.0 acorn-import-assertions: 1.9.0(acorn@8.10.0) - browserslist: 4.21.10 + browserslist: 4.23.1 chrome-trace-event: 1.0.3 enhanced-resolve: 5.15.0 es-module-lexer: 1.3.1 diff --git a/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java index 7e09548ad0..062aef9ab0 100644 --- a/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java +++ b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbc.java @@ -1,9 +1,10 @@ package io.aiven.klaw.helpers.db.rdbms; +import static org.springframework.beans.BeanUtils.copyProperties; + import io.aiven.klaw.dao.*; import io.aiven.klaw.model.enums.ApiResultStatus; import io.aiven.klaw.model.enums.EntityType; -import io.aiven.klaw.model.enums.NewUserStatus; import io.aiven.klaw.model.enums.RequestStatus; import io.aiven.klaw.repository.*; import java.sql.Timestamp; @@ -380,13 +381,21 @@ public String insertIntoRegisterUsers(RegisterUserInfo userInfo) { Optional userNameExists = userInfoRepo.findById(userInfo.getUsername()); if (userNameExists.isPresent()) return "Failure. User already exists"; - // STAGING status comes from AD users - RegisterUserInfo userRegistration = - registerInfoRepo.findFirstByUsernameAndStatusIn( - userInfo.getUsername(), - List.of(NewUserStatus.PENDING.value, NewUserStatus.STAGING.value)); - if (userRegistration != null) { - return "Failure. Registration already exists"; + Optional optionalUserRegistration = + registerInfoRepo.findByUsername(userInfo.getUsername()); + if (optionalUserRegistration.isPresent()) { + if ("APPROVED".equals(optionalUserRegistration.get().getStatus())) { + // do nothing -- user is deleted + } else if (!"STAGING".equals(optionalUserRegistration.get().getStatus()) + && !"PENDING".equals(optionalUserRegistration.get().getStatus())) { + return "Failure. Registration already exists"; + } else { + int id = optionalUserRegistration.get().getId(); + copyProperties(userInfo, optionalUserRegistration.get()); + optionalUserRegistration.get().setId(id); + registerInfoRepo.save(optionalUserRegistration.get()); + return ApiResultStatus.SUCCESS.value; + } } registerInfoRepo.save(userInfo); diff --git a/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java index 85260e1c05..b53eec6a31 100644 --- a/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java +++ b/core/src/main/java/io/aiven/klaw/helpers/db/rdbms/UpdateDataJdbc.java @@ -488,7 +488,10 @@ public void updateNewUserRequest(String username, String approver, boolean isApp if (isApprove) { status = NewUserStatus.APPROVED.value; } else { - status = NewUserStatus.DECLINED.value; + // In case if user registration is declined, delete the record from db, so user can try to + // register again with any new data. + registerInfoRepo.deleteById("" + registerUser.getId()); + return; } if (registerUser != null) { if (NewUserStatus.PENDING.value.equals(registerUser.getStatus())) { diff --git a/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java b/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java index 7dedac05e2..05f957fd69 100644 --- a/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java +++ b/core/src/main/java/io/aiven/klaw/service/UsersTeamsControllerService.java @@ -620,7 +620,8 @@ public ApiResponse addNewUser(UserInfoModel newUser, boolean isExternal) throws if (isExternal) { - if ("".equals(newUser.getUserPassword())) { + if ("".equals(newUser.getUserPassword()) + || ACTIVE_DIRECTORY.value.equals(authenticationType)) { mailService.sendMail( newUser.getUsername(), newUser.getUserPassword(), diff --git a/core/src/test/java/io/aiven/klaw/MockMethods.java b/core/src/test/java/io/aiven/klaw/MockMethods.java index b9018b3aed..73c981a317 100644 --- a/core/src/test/java/io/aiven/klaw/MockMethods.java +++ b/core/src/test/java/io/aiven/klaw/MockMethods.java @@ -7,6 +7,7 @@ import io.aiven.klaw.model.requests.EnvModel; import io.aiven.klaw.model.requests.KwClustersModel; import io.aiven.klaw.model.requests.KwRolesPermissionsModel; +import io.aiven.klaw.model.requests.RegisterUserInfoModel; import io.aiven.klaw.model.requests.TeamModel; import io.aiven.klaw.model.requests.UserInfoModel; import io.aiven.klaw.model.response.EnvParams; @@ -53,6 +54,18 @@ public UserInfoModel getUserInfoModel(String username, String role, String team) return userInfoModel; } + public RegisterUserInfoModel getRegisterUserInfoModel(String username, String role) { + RegisterUserInfoModel userInfoModel = new RegisterUserInfoModel(); + userInfoModel.setUsername(username); + userInfoModel.setPwd("testpwd"); + userInfoModel.setRole(role); + userInfoModel.setTeamId(1001); + userInfoModel.setFullname("New User"); + userInfoModel.setMailid("test@test.com"); + + return userInfoModel; + } + public UserInfoModel getUserInfoModelSwitchTeams( String username, String role, int teamId, int switchTeamSize) { UserInfoModel userInfoModel = new UserInfoModel(); diff --git a/core/src/test/java/io/aiven/klaw/SsoActiveDirectoryAuthenticationIT.java b/core/src/test/java/io/aiven/klaw/SsoActiveDirectoryAuthenticationIT.java index 463f9ab452..ddf0812b36 100644 --- a/core/src/test/java/io/aiven/klaw/SsoActiveDirectoryAuthenticationIT.java +++ b/core/src/test/java/io/aiven/klaw/SsoActiveDirectoryAuthenticationIT.java @@ -1,15 +1,28 @@ package io.aiven.klaw; +import static io.aiven.klaw.UsersTeamsControllerIT.OBJECT_MAPPER; +import static io.aiven.klaw.UsersTeamsControllerIT.superAdmin; +import static io.aiven.klaw.helpers.KwConstants.STAGINGTEAM; +import static io.aiven.klaw.model.enums.NewUserStatus.PENDING; import static org.assertj.core.api.Assertions.assertThat; import static org.springframework.security.oauth2.core.oidc.endpoint.OidcParameterNames.ID_TOKEN; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.oidcLogin; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.aiven.klaw.model.ApiResponse; +import io.aiven.klaw.model.requests.RegisterUserInfoModel; +import io.aiven.klaw.model.response.RegisterUserInfoModelResponse; +import io.aiven.klaw.model.response.UserInfoModelResponse; import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.MethodOrderer; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; @@ -42,6 +55,13 @@ public class SsoActiveDirectoryAuthenticationIT { @Autowired private MockMvc mvc; + private static MockMethods mockMethods; + + @BeforeAll + public static void setup() { + mockMethods = new MockMethods(); + } + // Login with Oidc profile with success @Test @Order(1) @@ -53,8 +73,9 @@ public void invokeRootPageWithOidcLoginSuccess() { .with( oidcLogin() .oidcUser( - getOidcUser())) // oidc login with valid preferredName/claims and - // authorities + getOidcUser( + superAdmin))) // oidc login with valid preferredName/claims + // and authorities .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andReturn() @@ -77,9 +98,9 @@ public void invokeRootPageWithBasicLoginFailure() { mvc.perform( MockMvcRequestBuilders.get("/") .with( - user("superadmin") - .password("superAdminPwd")) // Invalid login for AD context - // authentication + user(superAdmin) + .password( + "superAdminPwd")) // Invalid login for AD context authentication .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andReturn() @@ -95,11 +116,104 @@ public void invokeRootPageWithBasicLoginFailure() { ; } - private OidcUser getOidcUser() { + /* + 1. Login with valid AD user, but user doesn't exist in klaw + 2. A record is created in kwregisterusers table in STAGING state and User is routed to register page to submit all details and signup. + 3. After user registers, record in kwregisterusers table has an updated status of PENDING + 4. superadmin now approves and the user should exist in kwusers + */ + @Test + @Order(3) + public void invokeRootPageWithOidcLoginFailure() { + String nonExistingUserInKlaw = "testuser"; + try { + // From browser, this triggers a user to be created in staging users table (kwregisterusers), + // if successful login in SSO but user doesn't exist in klaw + mvc.perform( + MockMvcRequestBuilders.get("/") + .with( + oidcLogin() + .oidcUser( + getOidcUser( + nonExistingUserInKlaw))) // oidc login with non existing user + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andReturn() + .getResponse(); + RegisterUserInfoModel userInfoModel = + mockMethods.getRegisterUserInfoModel(nonExistingUserInKlaw, "USER"); + String jsonReq = OBJECT_MAPPER.writer().writeValueAsString(userInfoModel); + + // Allow the user to signup + MockHttpServletResponse response2 = + mvc.perform( + MockMvcRequestBuilders.post("/registerUser") + .with(oidcLogin().oidcUser(getOidcUser(nonExistingUserInKlaw))) + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andReturn() + .getResponse(); + ApiResponse objectResponse = + new ObjectMapper().readValue(response2.getContentAsString(), ApiResponse.class); + assertThat(objectResponse.isSuccess()).isTrue(); + + // Allow the superadmin to fetch requests to approve + MockHttpServletResponse response3 = + mvc.perform( + MockMvcRequestBuilders.get("/getNewUserRequests") + .with(oidcLogin().oidcUser(getOidcUser(superAdmin))) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andReturn() + .getResponse(); + + List userInfoModelActualList = + new ObjectMapper().readValue(response3.getContentAsString(), new TypeReference<>() {}); + + assertThat(userInfoModelActualList.get(0).getUsername()).isEqualTo(nonExistingUserInKlaw); + assertThat(userInfoModelActualList.get(0).getStatus()).isEqualTo(PENDING.value); + + // Allow the superadmin to approve the user + MockHttpServletResponse response4 = + mvc.perform( + MockMvcRequestBuilders.post("/execNewUserRequestApprove") + .with(oidcLogin().oidcUser(getOidcUser(superAdmin))) + .param("username", nonExistingUserInKlaw) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andReturn() + .getResponse(); + ApiResponse objectResponse1 = + new ObjectMapper().readValue(response4.getContentAsString(), ApiResponse.class); + assertThat(objectResponse1.isSuccess()).isTrue(); + + // Fetch and see if user is now created + String userDetailsResponse = + mvc.perform( + MockMvcRequestBuilders.get("/getUserDetails") + .with(oidcLogin().oidcUser(getOidcUser(superAdmin))) + .param("userId", nonExistingUserInKlaw) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + UserInfoModelResponse userInfoModelActual = + new ObjectMapper().readValue(userDetailsResponse, new TypeReference<>() {}); + assertThat(userInfoModelActual.getTeam()).isEqualTo(STAGINGTEAM); + + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private OidcUser getOidcUser(String username) { Map claims = new HashMap<>(); claims.put("groups", "ROLE_USER"); claims.put("sub", 123); - claims.put("preferred_username", "superadmin"); // existing user with default installation + claims.put("preferred_username", username); // existing user with default installation OidcIdToken idToken = new OidcIdToken(ID_TOKEN, Instant.now(), Instant.now().plusSeconds(60), claims); Collection authorities = getAuthorities(); diff --git a/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java index 547c63fde9..f8fceef393 100644 --- a/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java +++ b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.aiven.klaw.model.ApiResponse; import io.aiven.klaw.model.enums.ApiResultStatus; +import io.aiven.klaw.model.requests.RegisterUserInfoModel; import io.aiven.klaw.model.requests.TeamModel; import io.aiven.klaw.model.requests.UserInfoModel; import io.aiven.klaw.model.response.TeamModelResponse; @@ -44,10 +45,12 @@ public class UsersTeamsControllerIT { @Autowired private MockMvc mvc; - private static String superAdmin = "superadmin"; + static String superAdmin = "superadmin"; private static String superAdminPwd = "welcometoklaw"; private static String user1 = "kwusera", user2 = "kwuserb", + user3 = "kwuserg", + user4 = "kwuserh", switchUser1 = "kwuserc", switchUser2 = "kwuserd", switchUser3 = "kwusere"; @@ -670,4 +673,136 @@ public void myProfileInfo() throws Exception { .hasSize(2) .containsExactlyInAnyOrder(1001, 1002); } + + @Test + @Order(22) + public void registerAndApproveUser() throws Exception { + String role = "USER"; + RegisterUserInfoModel userInfoModel = mockMethods.getRegisterUserInfoModel(user3, role); + String jsonReq = OBJECT_MAPPER.writer().writeValueAsString(userInfoModel); + + String registerUserResponse = + mvc.perform( + MockMvcRequestBuilders.post("/registerUser") + .with(user(superAdmin).password(superAdminPwd)) + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + ApiResponse apiResponse = + OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); + assertThat(apiResponse.isSuccess()).isTrue(); + + String approveUserResponse = + mvc.perform( + MockMvcRequestBuilders.post("/execNewUserRequestApprove") + .with(user(superAdmin).password(superAdminPwd)) + .param("username", user3) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + apiResponse = OBJECT_MAPPER.readValue(approveUserResponse, new TypeReference<>() {}); + assertThat(apiResponse.isSuccess()).isTrue(); + + String userDetailsResponse = + mvc.perform( + MockMvcRequestBuilders.get("/getUserDetails") + .with(user(superAdmin).password(superAdminPwd)) + .param("userId", user3) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + UserInfoModelResponse userInfoModelActual = + new ObjectMapper().readValue(userDetailsResponse, new TypeReference<>() {}); + assertThat(userInfoModelActual.getTeam()).isEqualTo(INFRATEAM); + } + + @Test + @Order(22) + public void registerAndDeclineAndReRegisterAndApproveUser() throws Exception { + String role = "USER"; + RegisterUserInfoModel userInfoModel = mockMethods.getRegisterUserInfoModel(user4, role); + String jsonReq = OBJECT_MAPPER.writer().writeValueAsString(userInfoModel); + + String registerUserResponse = + mvc.perform( + MockMvcRequestBuilders.post("/registerUser") + .with(user(superAdmin).password(superAdminPwd)) + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + ApiResponse apiResponse = + OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); + assertThat(apiResponse.isSuccess()).isTrue(); + + String declineUserResponse = + mvc.perform( + MockMvcRequestBuilders.post("/execNewUserRequestDecline") + .with(user(superAdmin).password(superAdminPwd)) + .param("username", user4) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + apiResponse = OBJECT_MAPPER.readValue(declineUserResponse, new TypeReference<>() {}); + assertThat(apiResponse.isSuccess()).isTrue(); + + registerUserResponse = + mvc.perform( + MockMvcRequestBuilders.post("/registerUser") + .with(user(superAdmin).password(superAdminPwd)) + .content(jsonReq) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + apiResponse = OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); + assertThat(apiResponse.isSuccess()).isTrue(); + + String approveUserResponse = + mvc.perform( + MockMvcRequestBuilders.post("/execNewUserRequestApprove") + .with(user(superAdmin).password(superAdminPwd)) + .param("username", user4) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + apiResponse = OBJECT_MAPPER.readValue(approveUserResponse, new TypeReference<>() {}); + assertThat(apiResponse.isSuccess()).isTrue(); + + String userDetailsResponse = + mvc.perform( + MockMvcRequestBuilders.get("/getUserDetails") + .with(user(superAdmin).password(superAdminPwd)) + .param("userId", user4) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn() + .getResponse() + .getContentAsString(); + UserInfoModelResponse userInfoModelActual = + new ObjectMapper().readValue(userDetailsResponse, new TypeReference<>() {}); + assertThat(userInfoModelActual.getTeam()).isEqualTo(INFRATEAM); + } } diff --git a/core/src/test/java/io/aiven/klaw/WindowsActiveDirectoryAuthenticationIT.java b/core/src/test/java/io/aiven/klaw/WindowsActiveDirectoryAuthenticationIT.java index 790aa3b779..24ca89b623 100644 --- a/core/src/test/java/io/aiven/klaw/WindowsActiveDirectoryAuthenticationIT.java +++ b/core/src/test/java/io/aiven/klaw/WindowsActiveDirectoryAuthenticationIT.java @@ -59,7 +59,7 @@ public void invokeRootPageWithADUserRegistration() { MockHttpServletResponse response = mvc.perform( MockMvcRequestBuilders.get("/") - .with(user("testuser").password("testpwd")) // User doesn't exist in klaw + .with(user("testuser1").password("testpwd")) // User doesn't exist in klaw // authentication .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) diff --git a/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java b/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java index 72427ec6fe..0584cc3c01 100644 --- a/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java +++ b/core/src/test/java/io/aiven/klaw/helpers/db/rdbms/InsertDataJdbcTest.java @@ -195,8 +195,7 @@ private static Stream insertIntoRegisterUsers() { Arguments.of( "octopus@klaw-project.io", "octopus@klaw-project.io", ApiResultStatus.SUCCESS.value), Arguments.of("Octopus2", "octopus@klaw-project.io", "Failure. User already exists"), - Arguments.of( - "Octopus3", "octopus@klaw-project.io", "Failure. Registration already exists")); + Arguments.of("Octopus3", "octopus@klaw-project.io", ApiResultStatus.SUCCESS.value)); } @ParameterizedTest diff --git a/openapi.yaml b/openapi.yaml index eef5dc56e5..48e281a55a 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -813,7 +813,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -826,7 +825,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -839,7 +837,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -852,7 +849,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -885,7 +881,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -898,7 +893,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -911,7 +905,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -924,7 +917,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -957,7 +949,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -970,7 +961,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -983,7 +973,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -996,7 +985,6 @@ "content" : { "application/json" : { "schema" : { - "type" : "array", "items" : { "$ref" : "#/components/schemas/ApiResponse" } @@ -5872,9 +5860,7 @@ "debugMessage" : { "type" : "string" }, - "data" : { - "type" : "object" - }, + "data" : { }, "timestamp" : { "type" : "string", "format" : "date-time" @@ -6130,9 +6116,7 @@ }, "topicDetails" : { "type" : "array", - "items" : { - "type" : "object" - } + "items" : { } }, "topicSearchFilter" : { "type" : "string" @@ -6927,15 +6911,13 @@ "acl_ip" : { "type" : "array", "items" : { - "type" : "string", - "pattern" : "^$|^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\\.(?!$)|$)){4}$" + "type" : "string" } }, "acl_ssl" : { "type" : "array", "items" : { - "type" : "string", - "pattern" : "^$|^[a-zA-Z 0-9_.,=-]{3,}$" + "type" : "string" } }, "aclPatternType" : { From 58f6d71fd478b8b65c23c13726eb30bca75eccca Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Jun 2024 15:27:20 +0000 Subject: [PATCH 2/4] =?UTF-8?q?=F0=9F=A4=96=20Auto-update=20API=20types=20?= =?UTF-8?q?for=20TypeScript=20usage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- coral/types/api.d.ts | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/coral/types/api.d.ts b/coral/types/api.d.ts index 8f7ffea14e..d26fe9a65c 100644 --- a/coral/types/api.d.ts +++ b/coral/types/api.d.ts @@ -546,7 +546,7 @@ export type components = { errCode?: string; message: string; debugMessage?: string; - data?: Record; + data?: unknown; /** Format: date-time */ timestamp?: string; }; @@ -629,7 +629,7 @@ export type components = { sourceEnv?: string; selectedTeam?: string; typeOfSync?: string; - topicDetails?: Record[]; + topicDetails?: unknown[]; topicSearchFilter?: string; }; SyncConnectorUpdates: { @@ -2230,25 +2230,25 @@ export type operations = { /** @description OK */ 200: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Multi Status */ 207: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Bad Request */ 405: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Internal Server Error */ 500: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; }; @@ -2267,25 +2267,25 @@ export type operations = { /** @description OK */ 200: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Multi Status */ 207: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Bad Request */ 405: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Internal Server Error */ 500: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; }; @@ -2304,25 +2304,25 @@ export type operations = { /** @description OK */ 200: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Multi Status */ 207: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Bad Request */ 405: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; /** @description Internal Server Error */ 500: { content: { - "application/json": components["schemas"]["ApiResponse"][]; + "application/json": unknown; }; }; }; From d14b27074a447eda4347a9a6a548ef6140902b4f Mon Sep 17 00:00:00 2001 From: Muralidhar Basani Date: Fri, 14 Jun 2024 17:36:07 +0200 Subject: [PATCH 3/4] Increment users list after adding users Signed-off-by: Muralidhar Basani --- core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java index f8fceef393..6d5a1efeb0 100644 --- a/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java +++ b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java @@ -636,7 +636,7 @@ public void showUserList() throws Exception { .getContentAsString(); List userInfoModelList = new ObjectMapper().readValue(response, new TypeReference<>() {}); - assertThat(userInfoModelList).hasSizeBetween(3, 6); // superadmin, kwuserb, kwuserc + assertThat(userInfoModelList).hasSizeBetween(3, 9); // superadmin, kwuserb, kwuserc assertThat( userInfoModelList.stream() .filter(userInfo -> userInfo.getUsername().equals(switchUser1)) From 24c5c6fd57e11f964a2f21bf1737b279623c5911 Mon Sep 17 00:00:00 2001 From: Muralidhar Basani Date: Wed, 26 Jun 2024 14:43:17 +0200 Subject: [PATCH 4/4] From review --- .../io/aiven/klaw/UsersTeamsControllerIT.java | 138 ++++++------------ 1 file changed, 41 insertions(+), 97 deletions(-) diff --git a/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java index 6d5a1efeb0..cce9f04c5d 100644 --- a/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java +++ b/core/src/test/java/io/aiven/klaw/UsersTeamsControllerIT.java @@ -340,17 +340,7 @@ public void deleteUserSuccess() throws Exception { ApiResponse response1 = OBJECT_MAPPER.readValue(response, new TypeReference<>() {}); assertThat(response1.isSuccess()).isTrue(); - response = - mvc.perform( - MockMvcRequestBuilders.get("/getUserDetails") - .with(user(superAdmin).password(superAdminPwd)) - .param("userId", user1) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); + response = getUserDetails(user1); assertThat(response).isEmpty(); } @@ -513,17 +503,7 @@ public void updateUserTeam() throws Exception { ApiResponse response1 = OBJECT_MAPPER.readValue(response, new TypeReference<>() {}); assertThat(response1.isSuccess()).isTrue(); - response = - mvc.perform( - MockMvcRequestBuilders.get("/getUserDetails") - .with(user(superAdmin).password(superAdminPwd)) - .param("userId", switchUser1) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); + response = getUserDetails(switchUser1); UserInfoModelResponse userInfoModelActual = new ObjectMapper().readValue(response, new TypeReference<>() {}); assertThat(userInfoModelActual.getTeamId()).isEqualTo(newTeamId); @@ -555,17 +535,7 @@ public void updateUserTeamInvalidSwitchTeam() throws Exception { .getContentAsString(); assertThat(response).contains(ApiResultStatus.NOT_AUTHORIZED.value); - response = - mvc.perform( - MockMvcRequestBuilders.get("/getUserDetails") - .with(user(superAdmin).password(superAdminPwd)) - .param("userId", switchUser1) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); + response = getUserDetails(switchUser1); UserInfoModelResponse userInfoModelActual = new ObjectMapper().readValue(response, new TypeReference<>() {}); assertThat(userInfoModelActual.getTeamId()).isEqualTo(1002); // no change @@ -681,46 +651,13 @@ public void registerAndApproveUser() throws Exception { RegisterUserInfoModel userInfoModel = mockMethods.getRegisterUserInfoModel(user3, role); String jsonReq = OBJECT_MAPPER.writer().writeValueAsString(userInfoModel); - String registerUserResponse = - mvc.perform( - MockMvcRequestBuilders.post("/registerUser") - .with(user(superAdmin).password(superAdminPwd)) - .content(jsonReq) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); - ApiResponse apiResponse = - OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); + ApiResponse apiResponse = getApiResponseForUserRegistration(jsonReq); assertThat(apiResponse.isSuccess()).isTrue(); - String approveUserResponse = - mvc.perform( - MockMvcRequestBuilders.post("/execNewUserRequestApprove") - .with(user(superAdmin).password(superAdminPwd)) - .param("username", user3) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); - apiResponse = OBJECT_MAPPER.readValue(approveUserResponse, new TypeReference<>() {}); + apiResponse = getApiResponseUserApprove(user3); assertThat(apiResponse.isSuccess()).isTrue(); - String userDetailsResponse = - mvc.perform( - MockMvcRequestBuilders.get("/getUserDetails") - .with(user(superAdmin).password(superAdminPwd)) - .param("userId", user3) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); + String userDetailsResponse = getUserDetails(user3); UserInfoModelResponse userInfoModelActual = new ObjectMapper().readValue(userDetailsResponse, new TypeReference<>() {}); assertThat(userInfoModelActual.getTeam()).isEqualTo(INFRATEAM); @@ -733,19 +670,7 @@ public void registerAndDeclineAndReRegisterAndApproveUser() throws Exception { RegisterUserInfoModel userInfoModel = mockMethods.getRegisterUserInfoModel(user4, role); String jsonReq = OBJECT_MAPPER.writer().writeValueAsString(userInfoModel); - String registerUserResponse = - mvc.perform( - MockMvcRequestBuilders.post("/registerUser") - .with(user(superAdmin).password(superAdminPwd)) - .content(jsonReq) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andReturn() - .getResponse() - .getContentAsString(); - ApiResponse apiResponse = - OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); + ApiResponse apiResponse = getApiResponseForUserRegistration(jsonReq); assertThat(apiResponse.isSuccess()).isTrue(); String declineUserResponse = @@ -762,47 +687,66 @@ public void registerAndDeclineAndReRegisterAndApproveUser() throws Exception { apiResponse = OBJECT_MAPPER.readValue(declineUserResponse, new TypeReference<>() {}); assertThat(apiResponse.isSuccess()).isTrue(); - registerUserResponse = + apiResponse = getApiResponseForUserRegistration(jsonReq); + assertThat(apiResponse.isSuccess()).isTrue(); + + apiResponse = getApiResponseUserApprove(user4); + assertThat(apiResponse.isSuccess()).isTrue(); + + String userDetailsResponse = getUserDetails(user4); + UserInfoModelResponse userInfoModelActual = + new ObjectMapper().readValue(userDetailsResponse, new TypeReference<>() {}); + assertThat(userInfoModelActual.getTeam()).isEqualTo(INFRATEAM); + } + + private ApiResponse getApiResponseUserApprove(String userToApprove) throws Exception { + ApiResponse apiResponse; + String approveUserResponse = mvc.perform( - MockMvcRequestBuilders.post("/registerUser") + MockMvcRequestBuilders.post("/execNewUserRequestApprove") .with(user(superAdmin).password(superAdminPwd)) - .content(jsonReq) + .param("username", userToApprove) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn() .getResponse() .getContentAsString(); - apiResponse = OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); - assertThat(apiResponse.isSuccess()).isTrue(); + apiResponse = OBJECT_MAPPER.readValue(approveUserResponse, new TypeReference<>() {}); + return apiResponse; + } - String approveUserResponse = + private ApiResponse getApiResponseForUserRegistration(String jsonReq) throws Exception { + ApiResponse apiResponse; + String registerUserResponse; + registerUserResponse = mvc.perform( - MockMvcRequestBuilders.post("/execNewUserRequestApprove") + MockMvcRequestBuilders.post("/registerUser") .with(user(superAdmin).password(superAdminPwd)) - .param("username", user4) + .content(jsonReq) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn() .getResponse() .getContentAsString(); - apiResponse = OBJECT_MAPPER.readValue(approveUserResponse, new TypeReference<>() {}); - assertThat(apiResponse.isSuccess()).isTrue(); + apiResponse = OBJECT_MAPPER.readValue(registerUserResponse, new TypeReference<>() {}); + return apiResponse; + } - String userDetailsResponse = + private String getUserDetails(String user) throws Exception { + String response; + response = mvc.perform( MockMvcRequestBuilders.get("/getUserDetails") .with(user(superAdmin).password(superAdminPwd)) - .param("userId", user4) + .param("userId", user) .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andReturn() .getResponse() .getContentAsString(); - UserInfoModelResponse userInfoModelActual = - new ObjectMapper().readValue(userDetailsResponse, new TypeReference<>() {}); - assertThat(userInfoModelActual.getTeam()).isEqualTo(INFRATEAM); + return response; } }