/*******************************************************************************
* Gisgraphy Project
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
*
* Copyright 2008 Gisgraphy project
*
* David Masclet <davidmasclet@gisgraphy.com>
******************************************************************************/
package com.gisgraphy.importer;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.junit.Assert;
import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import com.gisgraphy.domain.repository.IAdmDao;
import com.gisgraphy.domain.repository.ICountryDao;
import com.gisgraphy.helper.FileHelper;
import com.gisgraphy.test.GisgraphyTestHelper;
public class GeonamesAlternateNamesExtracterTest {
public boolean initFilesIsCalled = false;
ImporterConfig importerConfig;
@Before
public void setup() {
importerConfig = new ImporterConfig();
importerConfig.setAlternateNameAdm1FileName("alternateNames-adm1.txt");
importerConfig.setAlternateNameAdm2FileName("alternateNames-adm2.txt");
importerConfig.setAlternateNameCountryFileName("alternateNames-country.txt");
importerConfig.setAlternateNameFeaturesFileName("alternateNames-features.txt");
}
@Test
public void testShouldBeSkipShouldReturnCorrectValue() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.setImporterConfig(importerConfig);
importerConfig.setGeonamesImporterEnabled(false);
importerConfig.setImportGisFeatureEmbededAlternateNames(false);
Assert.assertTrue(extracter.shouldBeSkipped());
importerConfig.setGeonamesImporterEnabled(false);
importerConfig.setImportGisFeatureEmbededAlternateNames(true);
Assert.assertTrue(extracter.shouldBeSkipped());
importerConfig.setGeonamesImporterEnabled(true);
importerConfig.setImportGisFeatureEmbededAlternateNames(false);
Assert.assertFalse(extracter.shouldBeSkipped());
importerConfig.setGeonamesImporterEnabled(true);
importerConfig.setImportGisFeatureEmbededAlternateNames(true);
Assert.assertTrue(extracter.shouldBeSkipped());
}
@Test
public void testLineIsAnAlternatNameForAdm2() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.setImporterConfig(importerConfig);
HashMap<Long, String> hashMap = new HashMap<Long, String>();
long existingFeatureId = 3L;
hashMap.put(existingFeatureId, "");
extracter.adm2Map = hashMap;
Assert.assertTrue("the method should return true when the adm2 featureid exists", extracter.lineIsAnAlternatNameForAdm2(existingFeatureId));
Assert.assertFalse("the method should return false when the adm2 featureid doesn't exists", extracter.lineIsAnAlternatNameForAdm2(4L));
}
@Test
public void testLineIsAnAlternatNameForAdm1() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.setImporterConfig(importerConfig);
HashMap<Long, String> hashMap = new HashMap<Long, String>();
long existingFeatureId = 3L;
hashMap.put(existingFeatureId, "");
extracter.adm1Map = hashMap;
Assert.assertTrue("the method should return true when the adm2 featureid exists", extracter.lineIsAnAlternateNameForAdm1(existingFeatureId));
Assert.assertFalse("the method should return false when the adm2 featureid doesn't exists", extracter.lineIsAnAlternateNameForAdm1(4L));
}
@Test
public void testLineIsAnAlternatNameForCountry() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.setImporterConfig(importerConfig);
HashMap<Long, String> hashMap = new HashMap<Long, String>();
long existingFeatureId = 3L;
hashMap.put(existingFeatureId, "");
extracter.countryMap = hashMap;
Assert.assertTrue("the method should return true when the adm2 featureid exists", extracter.lineIsAnAlternateNameForCountry(existingFeatureId));
Assert.assertFalse("the method should return false when the adm2 featureid doesn't exists", extracter.lineIsAnAlternateNameForCountry(4L));
}
@Test
public void testInitFilesShouldCreateTheFilesAndWriter() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.setImporterConfig(importerConfig);
// create a temporary directory to download files
File tempDir = FileHelper.createTempDir(this.getClass().getSimpleName());
importerConfig.setGeonamesDir(tempDir.getAbsolutePath());
extracter.initFiles();
Assert.assertTrue("the adm1 file should have been created", extracter.adm1file.exists());
Assert.assertNotNull("the adm1 writer should not be null", extracter.adm1fileOutputStreamWriter != null);
Assert.assertTrue("the adm2 file should have been created", extracter.adm2file.exists());
Assert.assertNotNull("the adm2 writer should not be null", extracter.adm2fileOutputStreamWriter != null);
Assert.assertTrue("the country file should have been created", extracter.countryFile.exists());
Assert.assertNotNull("the country writer should not be null", extracter.countryfileOutputStreamWriter != null);
Assert.assertTrue("the featuresFile should have been created", extracter.featuresFile.exists());
Assert.assertNotNull("the featuresfileOutputStreamWriter writer should not be null", extracter.featuresfileOutputStreamWriter != null);
GisgraphyTestHelper.DeleteNonEmptyDirectory(tempDir);
}
@Test
public void testSetup() {
ICountryDao countryDao = createMockCountryDao();
IAdmDao admDao = createMockAdmDao();
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter() {
@Override
protected void initFiles() {
initFilesIsCalled = true;
}
};
extracter.setImporterConfig(importerConfig);
extracter.setAdmDao(admDao);
extracter.setCountryDao(countryDao);
extracter.setup();
assertTrue("initfiles should be called in setup", initFilesIsCalled);
assertEquals("the adm1 map has not the expected number of element ", 2, extracter.adm1Map.size());
assertTrue("the adm1 map is missing a value", extracter.adm1Map.containsKey(3L));
assertTrue("the adm1 map is missing a value", extracter.adm1Map.containsKey(4L));
assertEquals("the adm2 map has not the expected number of element ", 2, extracter.adm2Map.size());
assertTrue("the adm2 map is missing a value", extracter.adm2Map.containsKey(5L));
assertTrue("the adm2 map is missing a value", extracter.adm2Map.containsKey(6L));
assertEquals("the countries map has not the expected number of element ", 2, extracter.countryMap.size());
assertTrue("the countries map is missing a value", extracter.countryMap.containsKey(1L));
assertTrue("the countries map is missing a value", extracter.countryMap.containsKey(2L));
verify(countryDao);
verify(admDao);
}
@Test
public void testProcessDataWithNonNumericFeatureIdShouldIgnoreTheLine() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.processData("1 nonnumeric FR alterantony 1 1");
}
@Test
public void testProcessDataWithMissingAlternateNameIDShouldIgnoreTheLine() {
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter();
extracter.processData(" nonnumeric FR alterantony 1 1");
}
@Test
public void testProcessDataWithCountryFeatureID() throws IOException {
String line = "1 1 FR alterantony 1 1";
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter() {
@Override
protected boolean lineIsAnAlternateNameForCountry(Long featureId) {
return true;
}
};
OutputStreamWriter mockWriter = createMockWriter(line);
extracter.countryfileOutputStreamWriter = mockWriter;
extracter.setCountryDao(createMockCountryDao());
extracter.processData(line);
verify(mockWriter);
}
@Test
public void testProcessDataWithAdm1FeatureID() throws IOException {
String line = "1 1 FR alterantony 1 1";
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter() {
@Override
protected boolean lineIsAnAlternateNameForCountry(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternateNameForAdm1(Long featureId) {
return true;
}
};
OutputStreamWriter mockWriter = createMockWriter(line);
extracter.adm1fileOutputStreamWriter = mockWriter;
extracter.setCountryDao(createMockCountryDao());
extracter.processData(line);
verify(mockWriter);
}
@Test
public void testProcessDataWithAdm2FeatureID() throws IOException {
String line = "1 1 FR alterantony 1 1";
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter() {
@Override
protected boolean lineIsAnAlternateNameForCountry(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternateNameForAdm1(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternatNameForAdm2(Long featureId) {
return true;
}
};
OutputStreamWriter mockWriter = createMockWriter(line);
extracter.adm2fileOutputStreamWriter = mockWriter;
extracter.setCountryDao(createMockCountryDao());
extracter.processData(line);
verify(mockWriter);
}
@Test
public void testProcessDataWithGenericFeatureID() throws IOException {
String line = "1 1 FR alterantony 1 1";
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter() {
@Override
protected boolean lineIsAnAlternateNameForCountry(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternateNameForAdm1(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternatNameForAdm2(Long featureId) {
return false;
}
};
OutputStreamWriter mockWriter = createMockWriter(line);
extracter.featuresfileOutputStreamWriter = mockWriter;
extracter.setCountryDao(createMockCountryDao());
extracter.processData(line);
verify(mockWriter);
}
@Test
public void testProcessDataWithMissingField() throws IOException {
String line = "1 FR alterantony 1 1";
GeonamesAlternateNamesExtracter extracter = new GeonamesAlternateNamesExtracter() {
@Override
protected boolean lineIsAnAlternateNameForCountry(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternateNameForAdm1(Long featureId) {
return false;
}
@Override
protected boolean lineIsAnAlternatNameForAdm2(Long featureId) {
return false;
}
};
extracter.processData(line);
}
private OutputStreamWriter createMockWriter(String line) throws IOException {
OutputStreamWriter mockWriter = EasyMock.createMock(OutputStreamWriter.class);
mockWriter.write(line);
mockWriter.write("\r\n");
mockWriter.flush();
replay(mockWriter);
return mockWriter;
}
private IAdmDao createMockAdmDao() {
IAdmDao admDao = EasyMock.createMock(IAdmDao.class);
List<Long> adm1Ids = new ArrayList<Long>();
adm1Ids.add(3L);
adm1Ids.add(4L);
List<Long> adm2Ids = new ArrayList<Long>();
adm2Ids.add(5L);
adm2Ids.add(6L);
expect(admDao.listFeatureIdByLevel(1)).andReturn(adm1Ids);
expect(admDao.listFeatureIdByLevel(2)).andReturn(adm2Ids);
replay(admDao);
return admDao;
}
private ICountryDao createMockCountryDao() {
ICountryDao countryDao = EasyMock.createMock(ICountryDao.class);
List<Long> countriesIds = new ArrayList<Long>();
countriesIds.add(1L);
countriesIds.add(2L);
expect(countryDao.listFeatureIds()).andStubReturn(countriesIds);
replay(countryDao);
return countryDao;
}
}