Интеграционный тест для потока кода авторизации в весенней безопасности 5 - PullRequest
0 голосов
/ 29 августа 2018

Моя команда создает службу авторизации и пытается покрыть все потоки интеграционными тестами.

Я могу правильно использовать поток authorization_code с помощью браузера и почтальона. Тем не менее, я сталкиваюсь с проблемой при попытке проверить это с помощью интеграционного теста.

У меня есть этот тест, но он не проходит, потому что код esj0BG не может быть получен, AuthorizationCodeServices

  @Test
  public void should_create_token_and_return_200_when_request_is_valid_and_grant_type_is_authorization_code()
      throws Exception {
    final String basicDigestHeaderValue = "Basic " + new String(Base64.encodeBase64(("test_client" + ":" + "password").getBytes()));

    final MockHttpServletRequestBuilder requestBuilder = post(URI)
        .header(AUTHORIZATION, basicDigestHeaderValue)
        .param("grant_type", "authorization_code")
        .param("code", "esj0BG")
        .param("client_id", "test_client")
        .param("redirect_uri", "http://dummy.uri");

    mockMvc.perform(requestBuilder)
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.access_token").exists())
        .andExpect(jsonPath("$.token_type").value("bearer"))
        .andExpect(jsonPath("$.expires_in").exists())
        .andExpect(jsonPath("$.scope").value("read write trust"))
        .andExpect(jsonPath("$.jti").exists());
  }

Есть ли способ настроить тест так, чтобы код был действительным?

UPDATE

  private String authorizationCode;

  @Autowired
  private AuthorizationCodeServices authorizationCodeServices;

  @Before
  public void setup(){
    super.setup();

    final Map<String, String> requestParameters = new HashMap<>();
    requestParameters.put("grant_type", "authorization_code");
    requestParameters.put("client_id", "test_client");
    requestParameters.put("redirect_uri", "http://dummy.uri");

    final Set<String> authorizationCodeSet = Sets.newHashSet();
    authorizationCode.add("authorization_code");

    final Set<String> scopes = Sets.newHashSet();
    scopes.add("read");
    scopes.add("write");

    final List<GrantedAuthority> roles = Lists.newArrayList(new SimpleGrantedAuthority(ROLE_USER));

    final OAuth2Request oAuth2Request = new OAuth2Request(requestParameters, VALID_CLIENT_ID, roles,true, scopes,null, "http://dummy.uri", authorizationCodeSet, null);
    final Authentication userAuthentication  = new TestingAuthenticationToken("test", "pass", ROLE_USER);
    final OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, userAuthentication);
    this.authorizationCode = authorizationCodeServices.createAuthorizationCode(oAuth2Authentication);
  }

и используйте это authorizationCode в тесте, подобном этому

  @Test
  public void should_create_token_and_return_200_when_request_is_valid_and_grant_type_is_authorization_code()
      throws Exception {
    final String basicDigestHeaderValue = "Basic " + new String(Base64.encodeBase64(("test_client" + ":" + "password").getBytes()));

    final MockHttpServletRequestBuilder requestBuilder = post(URI)
        .header(AUTHORIZATION, basicDigestHeaderValue)
        .param("grant_type", "authorization_code")
        .param("code", this.authorizationCode)
        .param("client_id", "test_client")
        .param("redirect_uri", "http://dummy.uri");

    mockMvc.perform(requestBuilder)
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.access_token").exists())
        .andExpect(jsonPath("$.token_type").value("bearer"))
        .andExpect(jsonPath("$.expires_in").exists())
        .andExpect(jsonPath("$.scope").value("read write trust"))
        .andExpect(jsonPath("$.jti").exists());
  }

Это сделало тест пройденным, однако мне все еще интересно, есть ли более элегантный способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...