package com.jdriven.stateless.security;
import static javax.xml.bind.DatatypeConverter.printBase64Binary;
import static org.junit.Assert.*;
import java.security.SecureRandom;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TokenHandlerTest {
private TokenHandler tokenHandler;
@Before
public void init() {
byte[] secret = new byte[70];
new SecureRandom().nextBytes(secret);
tokenHandler = new TokenHandler(secret);
}
@Test
public void testRoundTrip_ProperData() {
final User user = new User("Robbert", new Date(new Date().getTime() + 10000));
user.grantRole(UserRole.ADMIN);
final User parsedUser = tokenHandler.parseUserFromToken(tokenHandler.createTokenForUser(user));
assertEquals(user.getUsername(), parsedUser.getUsername());
assertTrue(parsedUser.hasRole(UserRole.ADMIN));
}
@Test
public void testCreateToken_SeparatorCharInUsername() {
final User user = new User("R.bbert", new Date(new Date().getTime() + 10000));
final User parsedUser = tokenHandler.parseUserFromToken(tokenHandler.createTokenForUser(user));
assertEquals(user.getUsername(), parsedUser.getUsername());
}
@Test
public void testCreateToken_ExcludePasswords() {
final User user = new User("Robbert", new Date(new Date().getTime() + 10000));
user.setPassword("abc");
user.setNewPassword("def");
final User parsedUser = tokenHandler.parseUserFromToken(tokenHandler.createTokenForUser(user));
assertEquals(user.getUsername(), parsedUser.getUsername());
assertNull(parsedUser.getPassword());
assertNull(parsedUser.getNewPassword());
}
@Test
public void testParseInvalidTokens_NoParseExceptions() throws JsonProcessingException {
final String unsignedToken = printBase64Binary(new ObjectMapper().writeValueAsBytes(new User("test")));
testForNullResult("");
testForNullResult(unsignedToken);
testForNullResult(unsignedToken + ".");
testForNullResult(unsignedToken + "." + unsignedToken);
}
private void testForNullResult(final String token) {
final User result = tokenHandler.parseUserFromToken(token);
assertNull(result);
}
}