package de.knurt.fam.test.unit.couchdb; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import de.knurt.fam.connector.FamConnector; import de.knurt.fam.core.model.persist.User; import de.knurt.fam.core.model.persist.booking.TimeBooking; import de.knurt.fam.core.model.persist.document.Job; import de.knurt.fam.core.model.persist.document.JobDataProcessing; import de.knurt.fam.core.persistence.dao.couchdb.CouchDBDao4Jobs; import de.knurt.fam.core.persistence.dao.couchdb.FamCouchDBDao; import de.knurt.fam.test.utils.FamIBatisTezt; import de.knurt.fam.test.utils.TeztBeanSimpleFactory; import de.knurt.heinzelmann.util.nebc.bu.File2ByteArray; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath:/test-dependencies.xml" }) public class StoreJobSurveyTest extends FamIBatisTezt { @Test public synchronized void storeAndGetAllJobs() { int i = 20; while (i-- > 0) { this.clearDatabase(); TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking(); booking.setBooked(); booking.insert(); Job document = new Job(); document.setJobId(booking.getId()); document.setUsername("foo"); document.setStep(0); document.setIdJobDataProcessing("foo"); document.setJobSurvey(new JSONObject()); long docSizesBefore = FamCouchDBDao.getInstance().documentCount(); assertTrue(FamCouchDBDao.getInstance().createDocument(document)); assertEquals(docSizesBefore + 1, FamCouchDBDao.getInstance().documentCount()); } } @Test public void storeAndGetJobAttachment() throws IOException { this.clearDatabase(); User admin = TeztBeanSimpleFactory.getAdmin(); File testFileOriginal = new File(System.getProperty("user.dir") + File.separator + ".." + File.separator + "fam-web" + File.separator + "src" + File.separator + "main" + File.separator + "webapp" + File.separator + "demo" + File.separator + "invoice_demo_nursery_school.pdf"); assertTrue(testFileOriginal.canRead()); String usersDirectoryName = FamConnector.fileExchangeDir() + File.separator + "users"; File usersDirectory = new File(usersDirectoryName); if (!usersDirectory.exists()) { usersDirectory.mkdir(); usersDirectory.setWritable(true); } assertTrue(usersDirectory.canWrite()); File usernameDirectory = new File(usersDirectoryName + File.separator + admin.getUsername()); if (!usernameDirectory.exists()) { usernameDirectory.mkdir(); usernameDirectory.setWritable(true); } assertTrue(usernameDirectory.canWrite()); File testFile = new File(usernameDirectory.getAbsolutePath() + File.separator + "test.pdf"); if (testFile.exists() == false || testFile.canRead() == false || testFile.length() != testFileOriginal.length()) { InputStream in = new FileInputStream(testFileOriginal); OutputStream out = new FileOutputStream(testFile); byte[] buf = new byte[1024]; int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.close(); } assertEquals(testFileOriginal.length(), testFile.length()); TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking(); booking.setBooked(); booking.insert(); Job document = new Job(); document.setJobId(booking.getId()); document.setUsername(admin.getUsername()); document.setStep(0); document.setIdJobDataProcessing("foo"); document.setJobSurvey(new JSONObject()); List<File> attachments = new ArrayList<File>(1); attachments.add(testFile); document.addAttachments(attachments); assertTrue(document.insertOrUpdate()); // get it back byte[] got_back = FamCouchDBDao.getInstance().getAttachment(document.getId(), testFile.getName()); assertEquals(got_back.length, testFile.length()); assertEquals(got_back.length, testFileOriginal.length()); Byte[] testBs = new File2ByteArray().process(testFile); Byte[] testBs2 = new File2ByteArray().process(testFileOriginal); for (int i = 0; i < testBs.length; i++) { assertEquals(testBs[i].byteValue(), got_back[i]); assertEquals(testBs2[i].byteValue(), got_back[i]); } } @Test public synchronized void storeAndUpdateJob() { this.clearDatabase(); long docSizesBefore = FamCouchDBDao.getInstance().documentCount(); int step = 1; TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking(); booking.setBooked(); booking.insert(); Job document = new Job(); document.setJobId(booking.getId()); document.setUsername("foo"); document.setStep(step); document.setIdJobDataProcessing("foo"); document.setJobSurvey(new JSONObject()); assertTrue(FamCouchDBDao.getInstance().createDocument(document)); Job back = CouchDBDao4Jobs.me().getJob(booking.getId(), step); assertNotNull(back); long createdBefore = back.getCreated(); assertEquals(back.getIdJobDataProcessing(), "foo"); assertEquals(docSizesBefore + 1, FamCouchDBDao.getInstance().documentCount()); document.setIdJobDataProcessing("bar"); document.insertOrUpdate(); back = CouchDBDao4Jobs.me().getJob(booking.getId(), step); assertNotNull(back); assertTrue(createdBefore != back.getCreated()); assertEquals(back.getIdJobDataProcessing(), "bar"); assertEquals(docSizesBefore + 1, FamCouchDBDao.getInstance().documentCount()); } @Test public void storeAndGetJobSimpleJobSurvey() { this.clearDatabase(); try { int step = 0; TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking(); booking.setBooked(); booking.insert(); Job job = new Job(); job.setUsername(TeztBeanSimpleFactory.getAdmin().getUsername()); job.setStep(step); job.setJobSurvey(new JSONObject()); job.setJobId(booking.getId()); JobDataProcessing jdp = TeztBeanSimpleFactory.getNewValidJobDataProcessing(); jdp.insertOrUpdate(); job.setIdJobDataProcessing(jdp.getId()); assertTrue(job.insertOrUpdate()); Job back = CouchDBDao4Jobs.me().getJob(booking.getId(), step); assertNotNull(back); } catch (Exception e) { fail("should not throw exception " + e); } } @SuppressWarnings("rawtypes") @Test public void storeAndGetJob() { this.clearDatabase(); try { int step = 0; Job job = new Job(); job.setStep(step); JSONObject jobsurvey = new JSONObject(); JSONObject jobsurvey2 = new JSONObject(); jobsurvey2.put("input 2", "value 2"); jobsurvey2.put("input 3", "value 3"); JSONObject jobsurvey3 = new JSONObject(); jobsurvey3.put("input 4", "value 4"); jobsurvey3.put("input 5", "value 5"); JSONArray innerarray = new JSONArray(); innerarray.put("hallo 1"); innerarray.put("hallo 2"); JSONArray innerarray2 = new JSONArray(); innerarray2.put("hallo 3"); innerarray2.put("hallo 4"); innerarray.put(innerarray2); innerarray.put(jobsurvey3); jobsurvey.put("input 0", "value 0"); jobsurvey.put("input 1", "value 1"); jobsurvey.put("innerobj", jobsurvey2); jobsurvey.put("innerarray", innerarray); job.setJobSurvey(jobsurvey); assertEquals(job.getJobSurvey().get("input 0").toString(), "value 0"); assertEquals(job.getJobSurvey().get("input 1").toString(), "value 1"); Map inner = (Map) job.getJobSurvey().get("innerobj"); assertEquals(inner.get("input 2"), "value 2"); job.setUsername(TeztBeanSimpleFactory.getAdmin().getUsername()); TimeBooking booking = TeztBeanSimpleFactory.getNewValidBooking(); booking.setBooked(); booking.insert(); job.setJobId(booking.getId()); JobDataProcessing jdp = TeztBeanSimpleFactory.getNewValidJobDataProcessing(); jdp.insertOrUpdate(); job.setIdJobDataProcessing(jdp.getId()); job.insertOrUpdate(); Job back = CouchDBDao4Jobs.me().getJob(booking.getId(), step); assertNotNull(back); assertNotNull(back.getJobSurvey()); assertEquals(back.getJobSurvey().get("input 0").toString(), "value 0"); assertEquals(back.getJobSurvey().get("input 1").toString(), "value 1"); Map innerback = (Map) back.getJobSurvey().get("innerobj"); assertEquals(innerback.get("input 2"), "value 2"); } catch (JSONException e) { fail("should not throw exception " + e); } catch (Exception e) { fail("should not throw exception " + e); } } }