package com.w11k.lsql.tests.pojo; import com.google.common.base.Optional; import com.w11k.lsql.LinkedRow; import com.w11k.lsql.PojoTable; import com.w11k.lsql.Row; import com.w11k.lsql.Table; import com.w11k.lsql.converter.predefined.AtomicIntegerConverter; import com.w11k.lsql.tests.AbstractLSqlTest; import com.w11k.lsql.tests.testdata.*; import org.testng.annotations.Test; import java.util.concurrent.atomic.AtomicInteger; import static org.testng.Assert.*; public class PojoTableTest extends AbstractLSqlTest { @Test public void insert() { PersonTestData.init(this.lSql, false); PojoTable<Person> personTable = this.lSql.table("person", Person.class); Person p1 = new Person(1, "Max", 30); personTable.insert(p1); Table personRowTable = this.lSql.table("person"); LinkedRow linkedRow = personRowTable.load(1).get(); assertEquals(linkedRow.getInt("id"), Integer.valueOf(1)); assertEquals(linkedRow.getString("firstName"), "Max"); } @Test public void update() { PersonTestData.init(this.lSql, false); PojoTable<Person> personTable = this.lSql.table("person", Person.class); Person p1 = new Person(1, "Max", 30); personTable.insert(p1); p1.setFirstName("Walter"); personTable.update(p1); Table personRowTable = this.lSql.table("person"); LinkedRow linkedRow = personRowTable.load(1).get(); assertEquals(linkedRow.getInt("id"), Integer.valueOf(1)); assertEquals(linkedRow.getString("firstName"), "Walter"); } @Test public void delete() { PersonTestData.init(this.lSql, false); PojoTable<Person> personTable = this.lSql.table("person", Person.class); Person p1 = new Person(1, "Max", 30); personTable.insert(p1); personTable.delete(p1); Table personRowTable = this.lSql.table("person"); Optional<LinkedRow> load = personRowTable.load(1); assertFalse(load.isPresent()); } @Test public void insertAssignsDefaultValue() { PersonTestData.init(this.lSql, false); PojoTable<Person> personTable = this.lSql.table("person", Person.class); Person p1 = new Person(); p1.setId(1); personTable.insert(p1); assertEquals(p1.getTitle(), "n/a"); } @Test public void insertIgnoresDefaultValueOnPureInsert() { PersonTestData.init(this.lSql, false); PojoTable<Person> personTable = this.lSql.table("person", Person.class); Person p1 = new Person(); p1.setId(1); personTable.insert(p1, true); assertNull(p1.getTitle()); } @Test public void loadById() { PersonTestData.init(this.lSql, true); PojoTable<Person> personTable = this.lSql.table("person", Person.class); Person person = personTable.load(1).get(); assertEquals(person.getId(), 1); assertEquals(person.getFirstName(), "Adam"); } @Test public void insertIgnoresFieldsFromSubclass() { PersonTestData.init(this.lSql, false); PojoTable<Person> personTable = this.lSql.table("person", Person.class); PersonSubclass p = new PersonSubclass(1, "Adam", 30); personTable.insert(p); } @Test public void fieldsUsesColumnConverter() { PersonTestData.init(this.lSql, false); PojoTable<PersonWithAtomicIntegerAge> personTable = this.lSql.table("person") .setColumnConverter("age", new AtomicIntegerConverter()) .withPojo(PersonWithAtomicIntegerAge.class); PersonWithAtomicIntegerAge adam1 = new PersonWithAtomicIntegerAge(1, "Adam", new AtomicInteger(30)); personTable.insert(adam1); PersonWithAtomicIntegerAge adam2 = personTable.load(1).get(); assertEquals(adam1, adam2); Object ai = this.lSql.table("person").load(1).get().get("age"); assertTrue(ai instanceof AtomicInteger); assertEquals(((AtomicInteger) ai).get(), 30); } @Test( expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*missing field.*title.*String.*" ) public void errorMessageOnMissingField() { PersonTestData.init(this.lSql, false); this.lSql.table("person", PersonMissingTitle.class); } @Test( expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*title.*wrong type.*Boolean.*String.*" ) public void errorMessageOnWrongFieldType() { PersonTestData.init(this.lSql, false); this.lSql.table("person", PersonWrongTitleType.class); } @Test( expectedExceptions = IllegalArgumentException.class, expectedExceptionsMessageRegExp = ".*superfluous field.*oops.*" ) public void errorMessageOnSuperfluousType() { PersonTestData.init(this.lSql, false); this.lSql.table("person", PersonWithSuperfluousField.class); } @Test public void nullInColumnForStringFieldInPojo() { PersonTestData.init(this.lSql, false); Table personTable = this.lSql.table("person"); personTable.insert(Row.fromKeyVals( "id", 1, "firstName", null, "age", 10, "title", "Title" )); PojoTable<Person> personPojoTable = personTable.withPojo(Person.class); Person person = personPojoTable.load(1).get(); assertNull(person.getFirstName()); } }