package org.fenixedu.bennu.core.json;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
@RunWith(JUnit4.class)
public class TestJsonSerialization {
private static User user;
private static JsonBuilder jsonRegistry;
private static JsonParser parser;
private static JsonObject parse(String jsonData) {
return (JsonObject) parser.parse(jsonData);
}
@BeforeClass
public static void cenas() {
user = new User("test", "testpwd", "1");
jsonRegistry = new JsonBuilder();
jsonRegistry.setDefault(User.class, UserAdapter.class);
parser = new JsonParser();
}
@Test
public void testSerialization() {
String expected = "{\"name\":\"test\",\"password\":\"testpwd\",\"number\":\"1\"}";
Assert.assertEquals(expected, jsonRegistry.view(user).toString());
}
@Test
public void testCreation() {
String jsonString = "{\"name\":\"test_creation\",\"password\":\"pass_creation\",\"number\":\"2\"}";
final User userCreated = jsonRegistry.create(parse(jsonString), User.class);
Assert.assertEquals("test_creation", userCreated.getName());
Assert.assertEquals("pass_creation", userCreated.getPassword());
Assert.assertEquals("2", userCreated.getNumber());
}
@Test
public void testUpdate() {
String jsonString = "{\"name\":\"test_update\",\"password\":\"pass_update\",\"number\":\"3\"}";
jsonRegistry.update(parse(jsonString), user);
Assert.assertEquals("test_update", user.getName());
Assert.assertEquals("pass_update", user.getPassword());
Assert.assertEquals("3", user.getNumber());
}
@Test
public void testCustomSerialization() {
String expected = "{\"name\":\"test\",\"cenas\":\"isto sao cenas\"}";
Assert.assertEquals(expected, jsonRegistry.view(user, UserSpecificViewer.class).toString());
}
@Test
public void testCustomCreation() {
String jsonData = "{\"name\":\"test_custom_creation\",\"password\":\"pass_custom_creation\",\"number\":\"4\"}";
final User createdUser = jsonRegistry.create(parse(jsonData), User.class, UserSpecificCreator.class);
Assert.assertEquals("test_custom_creation", createdUser.getName());
Assert.assertEquals("cGFzc19jdXN0b21fY3JlYXRpb24=", createdUser.getPassword());
Assert.assertEquals("4", createdUser.getNumber());
}
@Test
public void testSetDefaultViewer() {
String expected = "{\"name\":\"test\",\"cenas\":\"isto sao cenas\"}";
jsonRegistry.setDefault(User.class, UserSpecificViewer.class);
Assert.assertEquals(expected, jsonRegistry.view(user).toString());
}
@Test
public void testPersonViewerOnUser() {
JsonBuilder reg = new JsonBuilder();
reg.setDefault(Person.class, PersonViewer.class);
//reg.setDefault(User.class, UserAdapter.class);
User thisUser = new User("test", "testpwd", "1");
String expected = "{\"name\":\"test\"}";
Assert.assertEquals(expected, reg.view(thisUser).toString());
}
@Test
public void testParse() {
String expected =
"{\"name\":\"john\",\"contacts\":[{\"type\":\"EMAIL\",\"value\":\"bla@gmail.com\"},{\"type\":\"MOBILE_PHONE\",\"value\":\"555241541\"}]}";
String result =
"{\"name\":\"john\",\"contacts\":[{\"value\":\"555241541\",\"type\":\"MOBILE_PHONE\"},{\"value\":\"bla@gmail.com\",\"type\":\"EMAIL\"}]}";
JsonParser p = new JsonParser();
final JsonElement eJson = p.parse(expected);
final JsonElement pJson = p.parse(result);
Assert.assertNotEquals(eJson, pJson);
}
@Test
public void testPersonViewerWithContacts() {
JsonBuilder reg = new JsonBuilder();
reg.setDefault(Person.class, PersonViewer.class);
reg.setDefault(Contact.class, ContactViewer.class);
//reg.setDefault(User.class, UserAdapter.class);
Person person = new Person("sergio");
person.addContact(ContactType.EMAIL, "bla@gmail.com");
person.addContact(ContactType.MOBILE_PHONE, "845");
JsonObject expected = new JsonObject();
expected.addProperty("name", "sergio");
JsonArray contacts = new JsonArray();
JsonObject contact = new JsonObject();
contact.addProperty("type", "EMAIL");
contact.addProperty("value", "bla@gmail.com");
contacts.add(contact);
JsonObject contact2 = new JsonObject();
contact2.addProperty("type", "MOBILE_PHONE");
contact2.addProperty("value", "845");
contacts.add(contact2);
expected.add("contacts", contacts);
final JsonElement result = reg.view(person);
Assert.assertEquals(expected, result);
}
}