package com.auth0.jwt.impl; import com.auth0.jwt.UserPojo; import com.fasterxml.jackson.core.JsonFactory; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import org.junit.Before; import org.junit.Test; import java.io.StringWriter; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Map; import static org.hamcrest.Matchers.*; import static org.junit.Assert.assertThat; public class PayloadSerializerTest { private StringWriter writer; private PayloadSerializer serializer; private JsonGenerator jsonGenerator; private SerializerProvider serializerProvider; @Before public void setUp() throws Exception { writer = new StringWriter(); serializer = new PayloadSerializer(); jsonGenerator = new JsonFactory().createGenerator(writer); ObjectMapper mapper = new ObjectMapper(); jsonGenerator.setCodec(mapper); serializerProvider = mapper.getSerializerProvider(); } @SuppressWarnings("Convert2Diamond") @Test public void shouldSerializeEmptyMap() throws Exception { ClaimsHolder holder = new ClaimsHolder(new HashMap<String, Object>()); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{}"))); } @Test public void shouldSerializeStringAudienceAsString() throws Exception { ClaimsHolder holder = holderFor("aud", "auth0"); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"aud\":\"auth0\"}"))); } @Test public void shouldSerializeSingleItemAudienceAsArray() throws Exception { ClaimsHolder holder = holderFor("aud", new String[]{"auth0"}); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"aud\":\"auth0\"}"))); } @Test public void shouldSerializeMultipleItemsAudienceAsArray() throws Exception { ClaimsHolder holder = holderFor("aud", new String[]{"auth0", "auth10"}); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"aud\":[\"auth0\",\"auth10\"]}"))); } @Test public void shouldSkipSerializationOnEmptyAudience() throws Exception { ClaimsHolder holder = holderFor("aud", new String[0]); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{}"))); } @Test public void shouldSerializeNotBeforeDateInSeconds() throws Exception { ClaimsHolder holder = holderFor("nbf", new Date(1478874000)); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"nbf\":1478874}"))); } @Test public void shouldSerializeIssuedAtDateInSeconds() throws Exception { ClaimsHolder holder = holderFor("iat", new Date(1478874000)); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"iat\":1478874}"))); } @Test public void shouldSerializeExpiresAtDateInSeconds() throws Exception { ClaimsHolder holder = holderFor("exp", new Date(1478874000)); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"exp\":1478874}"))); } @Test public void shouldSerializeCustomDateInSeconds() throws Exception { ClaimsHolder holder = holderFor("birthdate", new Date(1478874000)); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"birthdate\":1478874}"))); } @Test public void shouldSerializeDatesUsingLong() throws Exception { long secs = Integer.MAX_VALUE + 10000L; Date date = new Date(secs * 1000L); Map<String, Object> claims = new HashMap<String, Object>(); claims.put("iat", date); claims.put("nbf", date); claims.put("exp", date); claims.put("ctm", date); ClaimsHolder holder = new ClaimsHolder(claims); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); String json = writer.toString(); assertThat(json, containsString("\"iat\":2147493647")); assertThat(json, containsString("\"nbf\":2147493647")); assertThat(json, containsString("\"exp\":2147493647")); assertThat(json, containsString("\"ctm\":2147493647")); } @Test public void shouldSerializeStrings() throws Exception { ClaimsHolder holder = holderFor("name", "Auth0 Inc"); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"name\":\"Auth0 Inc\"}"))); } @Test public void shouldSerializeIntegers() throws Exception { ClaimsHolder holder = holderFor("number", 12345); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"number\":12345}"))); } @Test public void shouldSerializeDoubles() throws Exception { ClaimsHolder holder = holderFor("fraction", 23.45); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"fraction\":23.45}"))); } @Test public void shouldSerializeBooleans() throws Exception { ClaimsHolder holder = holderFor("pro", true); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"pro\":true}"))); } @Test public void shouldSerializeNulls() throws Exception { ClaimsHolder holder = holderFor("id", null); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"id\":null}"))); } @Test public void shouldSerializeCustomArrayOfObject() throws Exception { UserPojo user1 = new UserPojo("Michael", 1); UserPojo user2 = new UserPojo("Lucas", 2); ClaimsHolder holder = holderFor("users", new UserPojo[]{user1, user2}); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"users\":[{\"name\":\"Michael\",\"id\":1},{\"name\":\"Lucas\",\"id\":2}]}"))); } @Test public void shouldSerializeCustomListOfObject() throws Exception { UserPojo user1 = new UserPojo("Michael", 1); UserPojo user2 = new UserPojo("Lucas", 2); ClaimsHolder holder = holderFor("users", Arrays.asList(user1, user2)); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"users\":[{\"name\":\"Michael\",\"id\":1},{\"name\":\"Lucas\",\"id\":2}]}"))); } @Test public void shouldSerializeCustomObject() throws Exception { UserPojo user = new UserPojo("Michael", 1); ClaimsHolder holder = holderFor("users", user); serializer.serialize(holder, jsonGenerator, serializerProvider); jsonGenerator.flush(); assertThat(writer.toString(), is(equalTo("{\"users\":{\"name\":\"Michael\",\"id\":1}}"))); } @SuppressWarnings("Convert2Diamond") private ClaimsHolder holderFor(String key, Object value) { Map<String, Object> map = new HashMap<String, Object>(); map.put(key, value); return new ClaimsHolder(map); } }