package org.nutz.mvc.adaptor.injector; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.lang.reflect.Type; import java.text.SimpleDateFormat; import java.util.List; import java.util.Map; import org.junit.Test; import org.nutz.lang.Lang; import org.nutz.lang.util.NutType; import org.nutz.mock.Mock; import org.nutz.mock.servlet.MockHttpServletRequest; /** * * @author juqkai(juqkai@gmail.com) * */ public class ObjectNavlPairInjectorTest { public static ObjectNavlPairInjector inj() { return new ObjectNavlPairInjector("pojo", MvcTestPojo.class); } public static ObjectNavlPairInjector inj(String prefix, Type type){ return new ObjectNavlPairInjector(prefix, type); } /** * 根据 Issue 272,如果为空串,原生类型的外覆类应该返回 null */ @Test public void test_balnk_param_to_number() { // 准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("pojo.longValue", " "); req.setParameter("pojo.num", " "); // 执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); // 检测 assertNull(pojo.longValue); assertEquals(0, pojo.num); } /** * 这个测试将检验在 HTTP 请求中,如果存在多个参数同名的情况,本注入器能否正确处理 */ @Test public void test_duplicated_name_params() { // 准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("pojo.num", 23); req.setParameterValues("pojo.names", Lang.array("A", "B", "C")); // 执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); // 检测 assertNull(pojo.longValue); assertEquals(23, pojo.num); assertEquals(3, pojo.names.length); assertEquals("A", pojo.names[0]); assertEquals("B", pojo.names[1]); assertEquals("C", pojo.names[2]); } @Test public void test_array_to_string() { // 准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameterValues("pojo.str", Lang.array("A", "B", "C")); // 执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); // 检测 assertEquals("A,B,C", pojo.str); } @Test public void test_string_to_string() { // 准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameterValues("pojo.str", Lang.array("A")); // 执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); // 检测 assertEquals("A", pojo.str); } @Test public void test_date(){ // 准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("pojo.date", "2010-01-01"); // 执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); System.out.println(sdf.format(pojo.date)); assertEquals("2010-01-01", sdf.format(pojo.date)); req.setParameter("pojo.date", ""); // 执行 MvcTestPojo pojoNull = (MvcTestPojo) inj().get(null, req, null, null); assertEquals(null, pojoNull.date); } @Test public void testList(){ //准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("pojo.books[1]", "a"); req.setParameter("pojo.books[ads]", "b"); req.setParameter("pojo.books[3]", "c"); //执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); assertTrue(pojo.books.contains("a")); assertTrue(pojo.books.contains("b")); assertTrue(pojo.books.contains("c")); } @SuppressWarnings("unchecked") @Test public void testListParam() throws NoSuchFieldException{ //准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("lists[1].str", "a"); ObjectNavlPairInjector onpi = inj("lists", NutType.list(MvcTestPojo.class)); //执行 List<MvcTestPojo> pojo = (List<MvcTestPojo>) onpi.get(null, req, null, null); assertTrue(pojo.get(0).str.contains("a")); } @Test public void testMap(){ //准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("pojo.maps(abc).str", "a"); req.setParameter("pojo.maps(1).str", "b"); req.setParameter("pojo.maps(jk).str", "c"); req.setParameter("pojo.maps(jk).maps.nutz.str", "k"); //执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); assertEquals(pojo.maps.get("abc").str, "a"); assertEquals(pojo.maps.get("1").str, "b"); assertEquals(pojo.maps.get("jk").str, "c"); assertEquals(pojo.maps.get("jk").maps.get("nutz").str, "k"); } @SuppressWarnings("unchecked") @Test public void testMapParam() throws NoSuchFieldException{ //准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("maps(abc).str", "a"); req.setParameter("maps(1).str", "b"); req.setParameter("maps(jk).str", "c"); req.setParameter("maps.jk.maps.nutz.str", "k"); //执行 ObjectNavlPairInjector onpi = inj("maps", NutType.map(String.class, MvcTestPojo.class)); Map<String, MvcTestPojo> pojo = (Map<String, MvcTestPojo>) onpi.get(null, req, null, null); assertEquals(pojo.get("abc").str, "a"); assertEquals(pojo.get("1").str, "b"); assertEquals(pojo.get("jk").str, "c"); assertEquals(pojo.get("jk").maps.get("nutz").str, "k"); } @Test public void testSet(){ //准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("pojo.sets[jk].str", "c"); req.setParameter("pojo.sets[jk].maps(nutz).str", "k"); //执行 MvcTestPojo pojo = (MvcTestPojo) inj().get(null, req, null, null); for(MvcTestPojo m : pojo.sets){ assertEquals(m.str, "c"); assertEquals(m.maps.get("nutz").str, "k"); } } @Test public void testArray() throws NoSuchFieldException{ //准备数据 MockHttpServletRequest req = Mock.servlet.request(); req.setParameter("arrays[1].str", "a"); ObjectNavlPairInjector onpi = inj("arrays", NutType.array(MvcTestPojo.class)); //执行 MvcTestPojo[] pojo = (MvcTestPojo[]) onpi.get(null, req, null, null); assertTrue(pojo[0].str.contains("a")); } }