package io.ebean.text.json;
import io.ebean.Ebean;
import io.ebean.EbeanServer;
import io.ebean.text.PathProperties;
import org.tests.model.basic.Contact;
import org.tests.model.basic.Customer;
import org.tests.model.basic.Order;
import org.tests.model.basic.ResetBasicData;
import com.fasterxml.jackson.core.JsonGenerator;
import org.junit.Test;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import java.util.Map;
import static org.assertj.core.api.StrictAssertions.assertThat;
import static org.junit.Assert.*;
public class JsonContextTest {
@Test
public void testIsSupportedType() throws Exception {
EbeanServer server = Ebean.getDefaultServer();
JsonContext json = server.json();
assertTrue(json.isSupportedType(Customer.class));
assertFalse(json.isSupportedType(System.class));
}
@Test
public void test_jsonWithPersistenceContext() {
ResetBasicData.reset();
List<Order> orders = Ebean.find(Order.class)
.fetch("customer", "id, name")
.where().eq("customer.id", 1)
.findList();
String json = Ebean.json().toJson(orders);
List<Order> orders1 = Ebean.json().toList(Order.class, json);
Customer customer = null;
for (Order order : orders1) {
Customer tempCustomer = order.getCustomer();
if (customer == null) {
customer = tempCustomer;
} else {
assertThat(tempCustomer).isSameAs(customer);
}
}
}
@Test
public void test_json_loadContext() {
ResetBasicData.reset();
List<Order> orders = Ebean.find(Order.class)
.select("status")
.fetch("customer", "id, name")
.findList();
String json = Ebean.json().toJson(orders);
JsonReadOptions options = new JsonReadOptions().setEnableLazyLoading(true);
List<Order> orders1 = Ebean.json().toList(Order.class, json, options);
for (Order order : orders1) {
Customer customer = order.getCustomer();
customer.getName();
customer.getSmallnote();
List<Contact> contacts = customer.getContacts();
contacts.size();
}
}
@Test
public void test_toObject() throws Exception {
EbeanServer server = Ebean.getDefaultServer();
JsonContext json = server.json();
Customer customer = new Customer();
customer.setId(1);
customer.setName("Jim");
String asJson = json.toJson(customer);
Object bean = json.toObject(Customer.class, asJson);
assertTrue(bean instanceof Customer);
assertEquals(Integer.valueOf(1), ((Customer) bean).getId());
assertEquals("Jim", ((Customer) bean).getName());
StringReader reader = new StringReader(asJson);
bean = json.toObject(Customer.class, reader);
assertTrue(bean instanceof Customer);
assertEquals(Integer.valueOf(1), ((Customer) bean).getId());
assertEquals("Jim", ((Customer) bean).getName());
}
@Test
public void test_unknownProperty() {
String jsonWithUnknown = "{\"id\":42,\"unknownProp\":\"foo\",\"name\":\"rob\",\"version\":1}";
Customer customer = Ebean.json().toBean(Customer.class, jsonWithUnknown);
assertEquals(Integer.valueOf(42), customer.getId());
assertEquals("rob", customer.getName());
}
class CustReadVisitor implements JsonReadBeanVisitor<Customer> {
Customer bean;
Map<String, Object> unmapped;
@Override
public void visit(Customer bean, Map<String, Object> unmapped) {
this.bean = bean;
this.unmapped = unmapped;
}
}
@SuppressWarnings("unchecked")
@Test
public void test_unknownProperty_withVisitor() {
String jsonWithUnknown = "{\"id\":42,\"unknownProp\":\"foo\",\"name\":\"rob\",\"version\":1,\"extraProp\":{\"name\":\"foobie\",\"sim\":\"bo\"}}";
CustReadVisitor custReadVisitor = new CustReadVisitor();
JsonReadOptions options = new JsonReadOptions();
options.addRootVisitor(custReadVisitor);
Customer customer = Ebean.json().toBean(Customer.class, jsonWithUnknown, options);
assertEquals(Integer.valueOf(42), customer.getId());
assertEquals("rob", customer.getName());
assertSame(customer, custReadVisitor.bean);
assertEquals("foo", custReadVisitor.unmapped.get("unknownProp"));
assertEquals(2, custReadVisitor.unmapped.size());
assertEquals("foobie", ((Map<String, Object>) custReadVisitor.unmapped.get("extraProp")).get("name"));
assertEquals("bo", ((Map<String, Object>) custReadVisitor.unmapped.get("extraProp")).get("sim"));
}
@Test
public void test_withVisitor_noUnmapped() {
String someJsonAllKnown = "{\"id\":42,\"name\":\"rob\",\"version\":1}";
CustReadVisitor custReadVisitor = new CustReadVisitor();
JsonReadOptions options = new JsonReadOptions();
options.addRootVisitor(custReadVisitor);
Customer customer = Ebean.json().toBean(Customer.class, someJsonAllKnown, options);
assertEquals(Integer.valueOf(42), customer.getId());
assertEquals("rob", customer.getName());
assertSame(customer, custReadVisitor.bean);
assertNull(custReadVisitor.unmapped);
}
@Test
public void testCreateGenerator() throws Exception {
EbeanServer server = Ebean.getDefaultServer();
StringWriter writer = new StringWriter();
JsonContext json = server.json();
JsonGenerator generator = json.createGenerator(writer);
Customer customer = new Customer();
customer.setId(1);
customer.setName("Jim");
// we can use the generator before and after our json.toJson() call
// ... confirming we are not closing the generator
generator.writeStartArray();
json.toJson(customer, generator, PathProperties.parse("id,name"));
generator.writeEndArray();
generator.close();
String jsonString = writer.toString();
assertTrue(jsonString, jsonString.startsWith("["));
assertTrue(jsonString, jsonString.endsWith("]"));
assertTrue(jsonString, jsonString.contains("{\"id\":1,\"name\":\"Jim\"}"));
}
@Test
public void testCreateGenerator_writeRaw() throws Exception {
EbeanServer server = Ebean.getDefaultServer();
StringWriter writer = new StringWriter();
JsonContext json = server.json();
JsonGenerator generator = json.createGenerator(writer);
// test that we can write anything via writeRaw()
generator.writeRaw("START");
generator.writeStartArray();
generator.writeStartObject();
generator.writeNumberField("count", 12);
generator.writeEndObject();
generator.writeEndArray();
generator.writeRaw("END");
generator.close();
assertEquals("START[{\"count\":12}]END", writer.toString());
}
}