1   package org.itracker.persistence.dao;
2   
3   import org.hibernate.SessionFactory;
4   import org.itracker.AbstractDependencyInjectionTest;
5   import org.itracker.model.Language;
6   import org.junit.Test;
7   import org.springframework.dao.DataAccessException;
8   
9   /**
10   * Unit test for BaseHibernateDaoImpl
11   * 
12   * @author rdjurin
13   * 
14   */
15  public class BaseHibernateDaoImplTest extends AbstractDependencyInjectionTest {
16  
17  	BaseHibernateDAOImpl<Language> dao;
18  	LanguageDAO languageDAO;
19  
20  	@Test
21  	public void testSave() {
22  
23  		try {
24  			dao.save(null);
25  			fail("save of null entity must throw DataAccessException");
26  		} catch (DataAccessException dae) {
27  			// OK
28  		} catch (Throwable t) {
29  			fail("save of null entity must throw DataAccessException, not " + t);
30  		}
31  
32  		Language entity = new Language();
33  		entity.setLocale("en_US");
34  		entity.setResourceKey("org.itracker.test.BaseHibernateDAOImpl");
35  
36  		try {
37  			dao.save(null);
38  			fail("save of null not-null property must throw DataAccessException");
39  		} catch (DataAccessException dae) {
40  			// OK
41  		} catch (Throwable t) {
42  			fail("save of null not-null property must throw DataAccessException, not "
43  					+ t);
44  		}
45  
46  		entity.setResourceValue("BaseHibernateDAOImpl");
47  		assertTrue("entity.new", entity.isNew());
48  		dao.save(entity);
49  		assertTrue("entity.!new", !entity.isNew());
50  		try {
51  			Language l = languageDAO.findByKeyAndLocale(
52  					entity.getResourceKey(), entity.getLocale());
53  
54  			assertEquals("entity", entity, l);
55  			// TODO: fails currently
56  			// try {
57  			// dao.save(l);
58  			// fail("entity is already persisted, save must throw DataAccessException");
59  			// } catch (DataAccessException dae) {
60  			// // OK
61  			// }
62  
63  		} catch (DataAccessException dae) {
64  			fail("failed to load entity from languageDAO");
65  		}
66  
67  	}
68  
69  	@Test
70  	public void testSaveOrUpdate() {
71  
72  		try {
73  			dao.saveOrUpdate(null);
74  			fail("saveOrUpdate of null entity must throw DataAccessException");
75  		} catch (DataAccessException dae) {
76  			// OK
77  		} catch (Throwable t) {
78  			fail("saveOrUpdate of null entity must throw DataAccessException, not "
79  					+ t);
80  		}
81  
82  		Language entity = new Language();
83  		entity.setLocale("en_US");
84  		entity.setResourceKey("org.itracker.test.BaseHibernateDAOImpl");
85  
86  		try {
87  			dao.saveOrUpdate(null);
88  			fail("saveOrUpdate of null not-null property must throw DataAccessException");
89  		} catch (DataAccessException dae) {
90  			// OK
91  		} catch (Throwable t) {
92  			fail("saveOrUpdate of null not-null property must throw DataAccessException, not "
93  					+ t);
94  		}
95  
96  		entity.setResourceValue("BaseHibernateDAOImpl");
97  		dao.saveOrUpdate(entity);
98  
99  		try {
100 			Language l = languageDAO.findByKeyAndLocale(
101 					entity.getResourceKey(), entity.getLocale());
102 
103 			assertEquals("entity", entity, l);
104 			try {
105 				dao.saveOrUpdate(entity);
106 			} catch (Throwable t) {
107 				fail("saveOrUpdate of persisted entity must not throw " + t);
108 			}
109 		} catch (DataAccessException dae) {
110 			fail("failed to load entity from languageDAO");
111 		}
112 	}
113 
114 	@Test
115 	public void testDelete() throws Exception {
116 
117 		try {
118 			dao.delete(null);
119 			fail("delete of null entity must throw DataAccessException");
120 		} catch (DataAccessException dae) {
121 			// OK
122 		}
123 
124 		Language entity = new Language();
125 		entity.setLocale("en_US");
126 		entity.setResourceKey("org.itracker.test.BaseHibernateDAOImpl");
127 		entity.setResourceValue("BaseHibernateDAOImpl");
128 
129 		dao.save(entity);
130 
131 		entity = languageDAO.findByKeyAndLocale(entity.getResourceKey(), entity
132 				.getLocale());
133 		dao.delete(entity);
134 
135 		try {
136 			entity = languageDAO.findByKeyAndLocale(entity.getResourceKey(),
137 					entity.getLocale());
138 			fail("expecting to catch NoSuchEntityException");
139 		} catch (NoSuchEntityException dae) {
140 			// OK
141 		}
142 	}
143 
144 	@Test
145 	public void testDetach() throws Exception {
146 		try {
147 			dao.detach(null);
148 			fail("detach of null entity must throw DataAccessException");
149 		} catch (DataAccessException dae) {
150 			// OK
151 		}
152 
153 		Language entity = new Language();
154 		entity.setLocale("en_US");
155 		entity.setResourceKey("org.itracker.test.BaseHibernateDAOImpl");
156 		entity.setResourceValue("BaseHibernateDAOImpl");
157 
158 		dao.save(entity);
159 
160 		entity = languageDAO.findByKeyAndLocale(entity.getResourceKey(), entity
161 				.getLocale());
162 		dao.detach(entity);
163 
164 		Language l = languageDAO.findByKeyAndLocale(entity.getResourceKey(),
165 				entity.getLocale());
166 		assertNotSame("detached object", l, entity);
167 
168 	}
169 
170 	@Test
171 	public void testRefresh() throws Exception {
172 
173 		try {
174 			dao.refresh(null);
175 			fail("Should throw DataAccessException");
176 		} catch (DataAccessException e) {
177 			// OK
178 		} catch (Exception e) {
179 			fail("Should throw DataAccessException not " + e);
180 		}
181 
182 		Language entity = new Language();
183 		entity.setLocale("en_US");
184 		entity.setResourceKey("org.itracker.test.BaseHibernateDAOImpl");
185 		entity.setResourceValue("BaseHibernateDAOImpl");
186 
187 		dao.save(entity);
188 		dao.detach(entity);
189 
190 		Language l = languageDAO.findByKeyAndLocale(entity.getResourceKey(),
191 				entity.getLocale());
192 		dao.detach(l);
193 
194 		entity.setResourceValue("org.itracker.test.BaseHibernateDAO2");
195 		dao.merge(entity);
196 		assertNotSame("detached and managed entity are same", l, entity);
197 
198 		assertTrue("entity.resourceValue not equals l.resourceValue", !entity
199 				.getResourceValue().equals(l.getResourceValue()));
200 
201 		l = languageDAO.findByKeyAndLocale(entity.getResourceKey(), entity
202 				.getLocale());
203 		assertEquals("entity.resourceValue", l.getResourceValue(), entity
204 				.getResourceValue());
205 
206 	}
207 
208 	@Test
209 	public void testMerge() throws Exception {
210 		try {
211 			dao.merge(null);
212 			fail("Should throw DataAccessException");
213 		} catch (DataAccessException e) {
214 			// OK
215 		} catch (Exception e) {
216 			fail("Should throw DataAccessException not " + e);
217 		}
218 
219 		Language entity = new Language();
220 		entity.setLocale("en_US");
221 		entity.setResourceKey("org.itracker.test.BaseHibernateDAOImpl");
222 		entity.setResourceValue("BaseHibernateDAOImpl");
223 
224 		dao.save(entity);
225 		dao.detach(entity);
226 
227 		Language l = languageDAO.findByKeyAndLocale(entity.getResourceKey(),
228 				entity.getLocale());
229 		l.setResourceValue("test");
230 		dao.saveOrUpdate(l);
231 
232 		entity.setResourceValue("org.itracker.test.BaseHibernateDAOImpl2");
233 
234 		assertTrue("entity.resourceValue not equals l.resourceValue", !l
235 				.getResourceValue().equals(entity.getResourceValue()));
236 
237 		dao.detach(l);
238 		dao.merge(entity);
239 
240 		assertTrue("entity.resourceValue not equals l.resourceValue", !l
241 				.getResourceValue().equals(entity.getResourceValue()));
242 
243 		l = languageDAO.findByKeyAndLocale(entity.getResourceKey(), entity
244 				.getLocale());
245 
246 		assertEquals("entity.resourceKey", l.getResourceKey(), entity
247 				.getResourceKey());
248 		assertEquals("entity.resourceValue", l.getResourceValue(), entity
249 				.getResourceValue());
250 	}
251 
252 	@Override
253 	public void onSetUp() throws Exception {
254 		// TODO Auto-generated method stub
255 		super.onSetUp();
256 
257 		languageDAO = (LanguageDAO) applicationContext.getBean("languageDAO");
258 		dao = new BaseHibernateDAOImpl<Language>() {
259 		};
260 		dao.setSessionFactory((SessionFactory) applicationContext
261 				.getBean("sessionFactory"));
262 	}
263 
264 	@Override
265 	protected String[] getDataSetFiles() {
266 		return new String[] { "dataset/languagebean_dataset.xml" };
267 	}
268 
269 	@Override
270 	protected String[] getConfigLocations() {
271 		return new String[] { "application-context.xml" };
272 	}
273 }