1 package fr.ifremer.dali.dao.data.photo;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import com.google.common.collect.Lists;
27 import fr.ifremer.dali.config.DaliConfiguration;
28 import fr.ifremer.dali.dao.DaliDatabaseResource;
29 import fr.ifremer.dali.dao.referential.DaliReferentialDao;
30 import fr.ifremer.dali.dao.technical.Daos;
31 import fr.ifremer.dali.dto.DaliBeanFactory;
32 import fr.ifremer.dali.dto.DaliBeans;
33 import fr.ifremer.dali.dto.data.photo.PhotoDTO;
34 import fr.ifremer.dali.dto.data.sampling.SamplingOperationDTO;
35 import fr.ifremer.dali.service.DaliServiceLocator;
36 import fr.ifremer.quadrige3.core.dao.technical.Files;
37 import fr.ifremer.quadrige3.core.test.AbstractDaoTest;
38 import org.apache.commons.io.FileUtils;
39 import org.junit.Before;
40 import org.junit.ClassRule;
41 import org.junit.Test;
42
43 import java.io.IOException;
44 import java.net.URISyntaxException;
45 import java.nio.file.Path;
46 import java.nio.file.Paths;
47 import java.util.Date;
48 import java.util.List;
49 import java.util.Map;
50
51 import static org.junit.Assert.*;
52
53 public class PhotoDaoWriteTest extends AbstractDaoTest {
54
55 @ClassRule
56 public static final DaliDatabaseResource dbResource = DaliDatabaseResource.writeDb();
57
58 private DaliConfiguration config;
59 private DaliPhotoDao photoDao;
60 private DaliReferentialDao referentialDao;
61 private static final int SURVEY_ID = 103;
62 private static final int SAMPLING_OPERATION_1_ID = 101;
63 private static final int SAMPLING_OPERATION_2_ID = 102;
64
65 @Before
66 @Override
67 public void setUp() throws Exception {
68 super.setUp();
69 config = DaliConfiguration.getInstance();
70 photoDao = DaliServiceLocator.instance().getService("daliPhotoDao", DaliPhotoDao.class);
71 referentialDao = DaliServiceLocator.instance().getService("daliReferentialDao", DaliReferentialDao.class);
72 setCommitOnTearDown(true);
73 }
74
75 @Test
76 public void createPhoto() throws URISyntaxException, IOException {
77
78 Path sourcePhoto1 = getPhoto("/photo/poisson1.jpg");
79 Path sourcePhoto2 = getPhoto("/photo/poisson2.jpg");
80 Path sourcePhoto3 = getPhoto("/photo/poisson3.jpg");
81
82 Path testPhoto1 = createTestPhoto(sourcePhoto1);
83 Path testPhoto2 = createTestPhoto(sourcePhoto2);
84 Path testPhoto3 = createTestPhoto(sourcePhoto3);
85 assertNotNull(testPhoto1);
86 assertNotNull(testPhoto2);
87 assertNotNull(testPhoto3);
88
89 PhotoDTO photo1 = DaliBeanFactory.newPhotoDTO();
90 photo1.setDirty(true);
91 photo1.setDate(new Date());
92 photo1.setDirection("NW");
93 photo1.setCaption("legende 1");
94 photo1.setName("photo 1");
95 photo1.setPhotoType(referentialDao.getPhotoTypeByCode("PAN"));
96 photo1.setSamplingOperation(null);
97 photo1.setFullPath(testPhoto1.toString());
98 PhotoDTO photo2 = DaliBeanFactory.newPhotoDTO();
99 photo2.setDirty(true);
100 photo2.setDate(new Date());
101 photo2.setDirection("NE");
102 photo2.setCaption("legende 2");
103 photo2.setName("photo 2");
104 photo2.setPhotoType(referentialDao.getPhotoTypeByCode("SOL"));
105 SamplingOperationDTO prel1 = DaliBeanFactory.newSamplingOperationDTO();
106 prel1.setId(SAMPLING_OPERATION_1_ID);
107 photo2.setSamplingOperation(prel1);
108 photo2.setFullPath(testPhoto2.toString());
109 PhotoDTO photo3 = DaliBeanFactory.newPhotoDTO();
110 photo3.setDirty(true);
111 photo3.setDate(new Date());
112 photo3.setDirection("SE");
113 photo3.setCaption("legende 3");
114 photo3.setName("photo 3");
115 photo3.setPhotoType(referentialDao.getPhotoTypeByCode("MACRO"));
116 SamplingOperationDTO prel2 = DaliBeanFactory.newSamplingOperationDTO();
117 prel2.setId(SAMPLING_OPERATION_2_ID);
118 photo3.setSamplingOperation(prel2);
119 photo3.setFullPath(testPhoto3.toString());
120
121 List<PhotoDTO> photos = Lists.newArrayList(photo1,photo2,photo3);
122
123
124 photoDao.savePhotosBySurveyId(SURVEY_ID, photos);
125 assertNotNull(photo1.getId());
126 assertNotNull(photo2.getId());
127 assertNotNull(photo3.getId());
128
129
130 String filePath1 = Daos.computePhotoFilePath(Daos.SURVEY_OBJECT_TYPE, SURVEY_ID, photo1.getId(), "jpg");
131 String filePath2 = Daos.computePhotoFilePath(Daos.SAMPLING_OPERATION_OBJECT_TYPE, SAMPLING_OPERATION_1_ID, photo2.getId(), "jpg");
132 String filePath3 = Daos.computePhotoFilePath(Daos.SAMPLING_OPERATION_OBJECT_TYPE, SAMPLING_OPERATION_2_ID, photo3.getId(), "jpg");
133 assertNotNull(filePath1);
134 assertNotNull(filePath2);
135 assertNotNull(filePath3);
136 assertEquals(filePath1, photo1.getPath());
137 assertEquals(filePath2, photo2.getPath());
138 assertEquals(filePath3, photo3.getPath());
139
140
141 photos = photoDao.getPhotosBySurveyId(SURVEY_ID);
142 assertNotNull(photos);
143 assertEquals(3, photos.size());
144
145
146 Map<Integer, PhotoDTO> map = DaliBeans.mapById(photos);
147 assertPhotoEquals(photo1, map.get(photo1.getId()));
148 assertPhotoEquals(photo2, map.get(photo2.getId()));
149 assertPhotoEquals(photo3, map.get(photo3.getId()));
150
151
152 Path persistedPhotoFile1 = config.getDbPhotoDirectory().toPath().resolve(filePath1);
153 Path persistedPhotoFile2 = config.getDbPhotoDirectory().toPath().resolve(filePath2);
154 Path persistedPhotoFile3 = config.getDbPhotoDirectory().toPath().resolve(filePath3);
155 assertFileEquals(sourcePhoto1, persistedPhotoFile1);
156 assertFileEquals(sourcePhoto2, persistedPhotoFile2);
157 assertFileEquals(sourcePhoto3, persistedPhotoFile3);
158
159
160 photoDao.removeBySamplingOperationId(SAMPLING_OPERATION_1_ID);
161
162
163 photos = photoDao.getPhotosBySurveyId(SURVEY_ID);
164 assertNotNull(photos);
165 assertEquals(2, photos.size());
166
167 assertFalse(java.nio.file.Files.exists(persistedPhotoFile2));
168
169 assertTrue(java.nio.file.Files.exists(persistedPhotoFile1));
170 assertTrue(java.nio.file.Files.exists(persistedPhotoFile3));
171 }
172
173 private Path getPhoto(String source) throws URISyntaxException {
174 return Paths.get(getClass().getResource(source).toURI());
175 }
176
177 private Path createTestPhoto(Path photo) throws IOException {
178 Path testFile = config.getTempDirectory().toPath().resolve(photo.getFileName().toString());
179 Files.copyFile(photo, testFile);
180 return testFile;
181 }
182
183 private void assertPhotoEquals(PhotoDTO expectedPhoto, PhotoDTO photoToTest) {
184
185 assertNotSame(expectedPhoto, photoToTest);
186
187 assertEquals(expectedPhoto.getId(), photoToTest.getId());
188 assertEquals(expectedPhoto.getName(), photoToTest.getName());
189 assertEquals(expectedPhoto.getPhotoType(), photoToTest.getPhotoType());
190 assertEquals(expectedPhoto.getCaption(), photoToTest.getCaption());
191 assertEquals(expectedPhoto.getDate(), photoToTest.getDate());
192 assertEquals(expectedPhoto.getDirection(), photoToTest.getDirection());
193 assertEquals(expectedPhoto.getPath(), photoToTest.getPath());
194 assertEquals(expectedPhoto.getSamplingOperation(), photoToTest.getSamplingOperation());
195
196 }
197
198 private void assertFileEquals(Path expectedFile, Path fileToTest) {
199
200 try {
201 assertTrue(FileUtils.contentEquals(expectedFile.toFile(), fileToTest.toFile()));
202 } catch (IOException ex) {
203 fail(ex.getLocalizedMessage());
204 }
205
206 }
207
208 @Test
209 public void deleteAllPhotos() {
210 photoDao.removeBySurveyId(SURVEY_ID);
211 }
212 }