package jwt4j; import com.google.gson.Gson; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatcher; import org.mockito.Matchers; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; import java.util.HashMap; import java.util.Map; import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @RunWith(MockitoJUnitRunner.class) public class JWTHandlerTest { private static final String DATA = "Data"; private static final String SUBJECT = "Subject"; private static final String TOKEN = "token"; private static final String ISSUER = "Issuer"; private static final String AUDIENCE = "Audience"; private JWTHandler<String> jwtHandler; @Mock private JWTEncoder jwtEncoder; @Mock private JWTDecoder jwtDecoder; @Before public void setUp() { jwtHandler = new JWTHandler<>( jwtEncoder, jwtDecoder, String.class, new Gson(), Optional.of(ISSUER), Optional.of(SUBJECT), Optional.of(AUDIENCE), 180, 30, true, Optional.of(JWTIdGenerator.UUID_JWT_ID) ); } @Test public void shouldEncodeData() { //given given(jwtEncoder.encode(Matchers.anyMap())).willReturn(TOKEN); //when final String token = jwtHandler.encode(DATA); //then assertThat(token).isEqualTo(TOKEN); verify(jwtEncoder, times(1)).encode(Matchers.argThat(new ArgumentMatcher<Map<String, String>>() { @Override public boolean matches(Object input) { final Map<String, String> inputArgument = (Map<String, String>) input; return inputArgument.containsKey(JWTConstants.ISSUER) && inputArgument.get(JWTConstants.ISSUER).equals(ISSUER) && inputArgument.containsKey(JWTConstants.SUBJECT) && inputArgument.get(JWTConstants.SUBJECT).equals(SUBJECT) && inputArgument.containsKey(JWTConstants.AUDIENCE) && inputArgument.get(JWTConstants.AUDIENCE).equals(AUDIENCE) && inputArgument.containsKey(JWTConstants.EXPIRATION) && Long.valueOf(inputArgument.get(JWTConstants.EXPIRATION)) > 0 && inputArgument.containsKey(JWTConstants.NOT_BEFORE) && Long.valueOf(inputArgument.get(JWTConstants.NOT_BEFORE)) > 0 && inputArgument.containsKey(JWTConstants.JWT_ID) && inputArgument.containsKey(JWTConstants.DATA); } })); } @Test public void shouldDecodeTokenToPayload() { //given given(jwtDecoder.decode(TOKEN)).willReturn(new HashMap<String, String>() { { put(JWTConstants.SUBJECT, SUBJECT); put(JWTConstants.DATA, "\"" + DATA + "\""); } }); //when final Payload<String> payload = jwtHandler.decodeToPayload(TOKEN); //then assertThat(payload).isEqualTo(new Payload<>(DATA, new Claims(new HashMap<String, String>() { { put(JWTConstants.SUBJECT, SUBJECT); } }))); } @Test public void shouldDecodeTokenToData() { //given given(jwtDecoder.decode(TOKEN)).willReturn(new HashMap<String, String>() { { put(JWTConstants.SUBJECT, SUBJECT); put(JWTConstants.DATA, "\"" + DATA + "\""); } }); //when final String data = jwtHandler.decode(TOKEN); //then assertThat(data).isEqualTo(DATA); } }