Моя команда создает службу авторизации и пытается покрыть все потоки интеграционными тестами.
Я могу правильно использовать поток 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());
}
Это сделало тест пройденным, однако мне все еще интересно, есть ли более элегантный способ сделать это?