import com.feth.play.module.pa.service.AbstractUserService;
import org.junit.Test;
import play.Application;
import play.Logger;
import play.mvc.Call;
import play.mvc.Http;
import play.mvc.Http.RequestBuilder;
import play.mvc.Result;
import providers.TestUsernamePasswordAuthProvider;
import service.TestUserService;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import static org.fest.assertions.Assertions.assertThat;
import static play.mvc.Http.Status.OK;
import static play.mvc.Http.Status.SEE_OTHER;
import static play.test.Helpers.*;
public class JavaControllerTest {
@Test
public void redirectsWhenNotLoggedIn() {
Application app = fakeApplication();
running(app, () -> {
assertThat(userService(app)).isNotNull();
Result result = route(controllers.routes.JavaController
.index());
assertThat(result.status()).isEqualTo(SEE_OTHER);
});
}
@Test
public void okWhenLoggedIn() {
Application app = fakeApplication();
running(app, () -> {
assertThat(userService(app)).isNotNull();
Http.Session session = signupAndLogin(app);
Result result = route(new RequestBuilder().uri(controllers.routes.JavaController.index().url()).session(session));
assertThat(result.status()).isEqualTo(OK);
});
}
private Http.Session signupAndLogin(Application app) {
String email = "user@example.com";
String password = "PaSSW0rd";
{
// Signup with a username/password
Map<String, String> data = new HashMap<>();
data.put("email", email);
data.put("password", password);
final Call doSignup = controllers.routes.ApplicationController.doSignup();
Result result = route(new RequestBuilder().method(doSignup.method()).uri(doSignup.url()).bodyForm(data));
assertThat(result.status()).isEqualTo(SEE_OTHER);
}
{
// Validate the token
String token = upAuthProvider(app).getVerificationToken(email);
assertThat(token).isNotNull();
Logger.info("Verifying token: " + token);
Result result = route(controllers.routes.ApplicationController
.verify(token));
assertThat(result.status()).isEqualTo(SEE_OTHER);
assertThat(upAuthProvider(app).getVerificationToken(email)).isNull();
// We should actually be logged in here, but let's ignore that
// as we want to test login too.
assertThat(result.redirectLocation()).isEqualTo(Optional.of("/"));
}
{
// Log the user in
Map<String, String> data = new HashMap<>();
data.put("email", email);
data.put("password", password);
final Call doLogin = controllers.routes.ApplicationController.doLogin();
Result result = route(new RequestBuilder().method(doLogin.method()).uri(doLogin.url()).bodyForm(data));
assertThat(result.status()).isEqualTo(SEE_OTHER);
assertThat(result.redirectLocation()).isEqualTo(Optional.of("/"));
// Create a Java session from the Scala session
return result.session();
}
}
private TestUsernamePasswordAuthProvider upAuthProvider(Application app) {
return app.injector().instanceOf(TestUsernamePasswordAuthProvider.class);
}
private AbstractUserService userService(Application app) {
return app.injector().instanceOf(TestUserService.class);
}
}