package org.fenixedu.bennu.core.rest;
import static org.junit.Assert.assertEquals;
import java.util.Locale;
import javax.ws.rs.GET;
import javax.ws.rs.NotFoundException;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Application;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.domain.UserProfile;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import pt.ist.fenixframework.FenixFramework;
import pt.ist.fenixframework.test.core.FenixFrameworkRunner;
/***
* Tests for DomainObjectParamConverter
*
* @author Sérgio Silva (sergio.silva@tecnico.ulisboa.pt)
*
* @see DomainObjectParamConverter
* @see JerseyTest
*
*/
@RunWith(FenixFrameworkRunner.class)
public class DomainObjectParamConverterTest extends JerseyTest {
@Path("resource")
public static class TestResource {
@Path("/username")
@GET
public String username(@QueryParam("id") User user) {
return user.getUsername();
}
@Path("/username/{id}/email")
@POST
public String postUserAsMessageBody(@PathParam("id") User user, @QueryParam("email") String email) {
setUserEmail(user, email);
return user.getEmail();
}
private void setUserEmail(User user, String email) {
user.getProfile().setEmail(email);
}
}
@Override
protected Application configure() {
return new ResourceConfig(TestResource.class, DomainObjectParamConverter.class);
}
private static User user1;
@BeforeClass
public static void setupUsers() {
final String username = "user1";
FenixFramework.atomic(() -> {
user1 = User.findByUsername(username);
if (user1 == null) {
user1 =
new User(username,
new UserProfile(username, username, username, username + "@gmail.com", Locale.getDefault()));
}
});
}
@Test
public void testDomainObjectAsQueryParam() {
final String username =
target("resource").path("username").queryParam("id", user1.getExternalId()).request().get(String.class);
assertEquals("user1", username);
}
@Test
public void testDomainObjecAsPathParam() {
final String expectedEmail = "user1@fanfans.com";
final String newEmail =
target("resource").path("username").path(user1.getExternalId()).path("email").queryParam("email", expectedEmail)
.request().post(null, String.class);
assertEquals(expectedEmail, newEmail);
assertEquals(expectedEmail, user1.getEmail());
}
@Test(expected = NotFoundException.class)
public void testNotFoundDomainObjectAsQueryParam() {
target("resource").path("username").queryParam("id", "THIS_IS_NOT_A_DOMAIN_OBJECT").request().get(String.class);
}
}