package org.nutz.dao.test.normal;
import static org.junit.Assert.*;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.nutz.Nutz;
import org.nutz.castor.Castors;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Condition;
import org.nutz.dao.DaoException;
import org.nutz.dao.Sqls;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.entity.Record;
import org.nutz.dao.pager.Pager;
import org.nutz.dao.sql.Criteria;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.test.DaoCase;
import org.nutz.dao.test.meta.Abc;
import org.nutz.dao.test.meta.Master;
import org.nutz.dao.test.meta.Pet;
import org.nutz.dao.test.meta.PetObj;
import org.nutz.dao.test.meta.SimplePOJO;
import org.nutz.dao.test.meta.issue396.Issue396Master;
import org.nutz.lang.Lang;
public class SimpleDaoTest extends DaoCase {
public void before() {
dao.create(Pet.class, true);
}
private void insertRecords(int len) {
for (int i = 0; i < len; i++) {
Pet pet = Pet.create("pet" + i);
pet.setNickName("alias_" + i);
dao.insert(pet);
}
}
// for issue #515 写给 mysql 一个特殊的例子
@Test
public void test_escape_char() {
if (dao.meta().isMySql()) {
dao.insert(Pet.create("A").setNickName("AAA"));
dao.insert(Pet.create("B").setNickName("B%B"));
Criteria cri = Cnd.cri();
cri.where().andLike("alias", "\\%");
List<Pet> pets = dao.query(Pet.class, cri);
assertEquals(1, pets.size());
assertEquals("B", pets.get(0).getName());
}
}
@Test
public void test_simple_fetch_record() {
Pet pet = Pet.create("abc");
long now = System.currentTimeMillis();
pet.setBirthday(Castors.me().castTo(now, Timestamp.class));
dao.insert(pet);
List<Record> pets = dao.query("t_pet", null, null);
assertEquals(1, pets.size());
assertEquals("abc", pets.get(0).getString("name"));
assertEquals(now / 1000,
pets.get(0).getTimestamp("birthday").getTime() / 1000);
}
@Test
public void test_delete_list() {
insertRecords(8);
List<Pet> list = dao.query(Pet.class, null, null);
List<Pet> pets = new ArrayList<Pet>(list.size());
pets.addAll(list);
assertEquals(8, pets.size());
pets.addAll(list);
dao.delete(pets);
assertEquals(0, dao.count(Pet.class));
}
@Test
public void test_simple_update() {
dao.fastInsert(Lang.array(Pet.create("A"), Pet.create("B")));
Pet a = dao.fetch(Pet.class, "A");
a.setName("C");
a.setAge(5);
dao.update(a);
Pet c = dao.fetch(Pet.class, "C");
assertEquals("C", c.getName());
assertEquals(5, c.getAge());
Pet b = dao.fetch(Pet.class, "B");
assertEquals("B", b.getName());
}
@Test
public void test_fetch_by_condition_in_special_char() {
dao.insert(Pet.create("a@b").setNickName("ABC"));
Pet pet = dao.fetch(Pet.class, Cnd.where("name", "=", "a@b"));
assertEquals("a@b", pet.getName());
assertEquals("ABC", pet.getNickName());
}
@Test
public void test_count_with_entity() {
insertRecords(8);
int re = dao.count(Pet.class, new Condition() {
public String toSql(Entity<?> entity) {
return entity.getField("nickName").getColumnName()
+ " IN ('alias_5','alias_6')";
}
});
assertEquals(2, re);
}
@Test
public void test_table_exists() {
assertTrue(dao.exists(Pet.class));
}
@Test
public void test_count_by_condition() {
insertRecords(4);
assertEquals(4, dao.count(Pet.class));
assertEquals(2,
dao.count(Pet.class,
Cnd.wrap("name IN ('pet2','pet3') ORDER BY name ASC")));
}
@Test
public void run_2_sqls_with_error() {
assertEquals(0, dao.count(Pet.class));
Sql sql1 = Sqls.create("INSERT INTO t_pet (name) VALUES ('A')");
Sql sql2 = Sqls.create("INSERT INTO t_pet (nocol) VALUES ('B')");
try {
dao.execute(sql1, sql2);
fail();
}
catch (DaoException e) {}
assertEquals(0, dao.count(Pet.class));
}
@Test
public void test_clear_two_records() {
dao.insert(Pet.create("A"));
dao.insert(Pet.create("B"));
assertEquals(2, dao.clear(Pet.class, Cnd.where("id", ">", 0)));
assertEquals(0, dao.clear(Pet.class, Cnd.where("id", ">", 0)));
}
@Test
public void test_delete_records() {
dao.insert(Pet.create("A"));
dao.insert(Pet.create("B"));
assertEquals(1, dao.delete(Pet.class, "A"));
assertEquals(1, dao.delete(Pet.class, "B"));
assertEquals(0, dao.delete(Pet.class, "A"));
}
@Test
public void test_integer_object_column() {
dao.insert(PetObj.create("X"));
PetObj pet = dao.fetch(PetObj.class, "X");
assertEquals("X", pet.getName());
assertNull(pet.getAge());
dao.update(pet.setAge(20));
pet = dao.fetch(PetObj.class, "X");
assertEquals(20, pet.getAge().intValue());
dao.update(pet.setAge(null));
pet = dao.fetch(PetObj.class, "X");
assertNull(pet.getAge());
}
@Test
public void test_insert_readonly() {
dao.create(SimplePOJO.class, true);
SimplePOJO p = new SimplePOJO();
p.setSex("火星");
dao.insert(p);
p.setSex("东方不败");
dao.update(p);
}
@Test
public void test_order_by() {
dao.create(Abc.class, true);
Abc a = new Abc();
a.setName("ccc");
dao.insert(a);
a.setName("abc");
dao.insert(a);
dao.query(Abc.class, Cnd.where("id", ">", "-1").asc("name"), null);
}
@Test
public void test_clear() {
dao.create(Pet.class, true);
dao.insert(Pet.create("Wendal"));
dao.insert(Pet.create("Wendal2"));
dao.insert(Pet.create("Wendal3"));
dao.insert(Pet.create("Wendal4"));
dao.insert(Pet.create("Wendal5"));
assertEquals(5, dao.count(Pet.class));
assertEquals(5, dao.clear(Pet.class));
}
@Test
public void test_chain_insert() {
dao.insert(Pet.class,
Chain.make("name", "wendal").add("nickName", "asfads"));
}
@Test
public void test_sql_pager() {
dao.create(Pet.class, true);
for (int i = 0; i < 100; i++) {
dao.insert(Pet.class,
Chain.make("name", "record" + i)
.add("nickName",
"Time=" + System.currentTimeMillis()));
}
Pager pager = dao.createPager(5, 5);
pager.setRecordCount(dao.count(Pet.class));
Sql sql = Sqls.queryEntity("select * from t_pet");
sql.setEntity(dao.getEntity(Pet.class));
sql.setPager(pager);
dao.execute(sql);
List<Pet> pets = sql.getList(Pet.class);
assertNotNull(pets);
assertEquals(5, pets.size());
assertEquals("record20", pets.get(0).getName());
assertEquals("record21", pets.get(1).getName());
assertEquals("record22", pets.get(2).getName());
assertEquals("record23", pets.get(3).getName());
assertEquals("record24", pets.get(4).getName());
}
@Test(expected = IllegalArgumentException.class)
public void test_fetch_null_name() {
dao.fetch(Pet.class, (String) null);
}
@Test(expected = IllegalArgumentException.class)
public void test_create_error_class() {
dao.create(Nutz.class, true);
}
// issue 395 删除一个不存在的管理对象
@Test
public void test_delete_null_many() {
dao.create(Master.class, true);
Master master = new Master();
master.setName("ACB");
dao.insert(master);
master = dao.fetch(Master.class);
dao.fetchLinks(master, null);
dao.deleteWith(master, null);
}
// issue 396
@Test
public void test_insert_with() {
if (!dao.meta().isOracle())
return;
dao.create(Issue396Master.class, true);
}
@Test
public void test_insert_special_chain() {
if (dao.meta().isMySql())
dao.insert(Pet.class, Chain.makeSpecial("birthday", "now()").add("name", "wendal"));
}
}