package org.springframework.security.oauth2.common;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Before;
import org.junit.Test;
import org.powermock.core.classloader.annotations.PrepareForTest;
import java.io.IOException;
import static org.junit.Assert.assertEquals;
/**
* Tests serialization of an {@link org.springframework.security.oauth2.common.OAuth2AccessToken} using jackson.
*
* @author Rob Winch
*/
@PrepareForTest(OAuth2AccessTokenJackson2Serializer.class)
public class TestOAuth2AccessTokenJackson2Serializer extends BaseOAuth2AccessTokenJacksonTest {
protected ObjectMapper mapper;
@Before
public void createObjectMapper() {
mapper = new ObjectMapper();
}
@Test
public void writeValueAsStringNoRefresh() throws JsonGenerationException, JsonMappingException, IOException {
accessToken.setRefreshToken(null);
accessToken.setScope(null);
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(BaseOAuth2AccessTokenJacksonTest.ACCESS_TOKEN_NOREFRESH, encodedAccessToken);
}
@Test
public void writeValueAsStringWithRefresh() throws JsonGenerationException, JsonMappingException, IOException {
accessToken.setScope(null);
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(BaseOAuth2AccessTokenJacksonTest.ACCESS_TOKEN_NOSCOPE, encodedAccessToken);
}
@Test
public void writeValueAsStringWithEmptyScope() throws JsonGenerationException, JsonMappingException, IOException {
accessToken.getScope().clear();
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(BaseOAuth2AccessTokenJacksonTest.ACCESS_TOKEN_NOSCOPE, encodedAccessToken);
}
@Test
public void writeValueAsStringWithSingleScopes() throws JsonGenerationException, JsonMappingException, IOException {
accessToken.getScope().remove(accessToken.getScope().iterator().next());
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(BaseOAuth2AccessTokenJacksonTest.ACCESS_TOKEN_SINGLESCOPE, encodedAccessToken);
}
@Test
public void writeValueAsStringWithNullScope() throws JsonGenerationException, JsonMappingException, IOException {
thrown.expect(JsonMappingException.class);
thrown.expectMessage("Scopes cannot be null or empty. Got [null]");
accessToken.getScope().clear();
try {
accessToken.getScope().add(null);
}
catch (NullPointerException e) {
// short circuit NPE from Java 7 (which is correct but only relevant for this test)
throw new JsonMappingException("Scopes cannot be null or empty. Got [null]");
}
mapper.writeValueAsString(accessToken);
}
@Test
public void writeValueAsStringWithEmptyStringScope() throws JsonGenerationException, JsonMappingException,
IOException {
thrown.expect(JsonMappingException.class);
thrown.expectMessage("Scopes cannot be null or empty. Got []");
accessToken.getScope().clear();
accessToken.getScope().add("");
mapper.writeValueAsString(accessToken);
}
@Test
public void writeValueAsStringWithQuoteInScope() throws JsonGenerationException, JsonMappingException, IOException {
accessToken.getScope().add("\"");
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(
"{\"access_token\":\"token-value\",\"token_type\":\"bearer\",\"refresh_token\":\"refresh-value\",\"expires_in\":10,\"scope\":\"\\\" read write\"}",
encodedAccessToken);
}
@Test
public void writeValueAsStringWithMultiScopes() throws JsonGenerationException, JsonMappingException, IOException {
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(ACCESS_TOKEN_MULTISCOPE, encodedAccessToken);
}
@Test
public void writeValueAsStringWithMac() throws Exception {
accessToken.setTokenType("mac");
String expectedEncodedAccessToken = ACCESS_TOKEN_MULTISCOPE.replace("bearer", accessToken.getTokenType());
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(expectedEncodedAccessToken, encodedAccessToken);
}
@Test
public void writeValueWithAdditionalInformation() throws JsonGenerationException, JsonMappingException, IOException {
accessToken.setRefreshToken(null);
accessToken.setScope(null);
accessToken.setExpiration(null);
accessToken.setAdditionalInformation(additionalInformation);
String encodedAccessToken = mapper.writeValueAsString(accessToken);
assertEquals(BaseOAuth2AccessTokenJacksonTest.ACCESS_TOKEN_ADDITIONAL_INFO, encodedAccessToken);
}
}