package org.activityinfo.server.report; import org.activityinfo.fixtures.InjectionSupport; import org.activityinfo.fixtures.Modules; import org.activityinfo.legacy.shared.command.GenerateElement; import org.activityinfo.legacy.shared.reports.content.MapContent; import org.activityinfo.legacy.shared.reports.content.MapMarker; import org.activityinfo.legacy.shared.reports.model.MapReportElement; import org.activityinfo.legacy.shared.reports.model.clustering.AdministrativeLevelClustering; import org.activityinfo.legacy.shared.reports.model.clustering.AutomaticClustering; import org.activityinfo.legacy.shared.reports.model.layers.BubbleMapLayer; import org.activityinfo.legacy.shared.reports.model.layers.IconMapLayer; import org.activityinfo.legacy.shared.reports.model.layers.MapLayer; import org.activityinfo.server.command.CommandTestCase2; import org.activityinfo.server.database.OnDataSet; import org.activityinfo.server.database.TestDatabaseModule; import org.activityinfo.server.report.renderer.image.ImageMapRenderer; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.io.File; import java.io.IOException; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @RunWith(InjectionSupport.class) @Modules({TestDatabaseModule.class, ReportModule.class}) @OnDataSet("/dbunit/mg-mapping.db.xml") public class MgMapIntegrationTest extends CommandTestCase2 { public static final int NUMBER_OF_BENE_INDICATOR_ID = 12445; public static final int MG_OWNER_ID = 1070; public static final int FOKOTANY_LEVEL_ID = 1512; private File outFolder; private MapContent content; private MapReportElement map; @Before public final void setup() { outFolder = new File("target/report-tests"); outFolder.mkdirs(); setUser(MG_OWNER_ID); } @Test public void siteBoundsToAdminLevelsAreMappedAsBubbles() throws IOException { BubbleMapLayer layer = new BubbleMapLayer(); layer.addIndicator(NUMBER_OF_BENE_INDICATOR_ID); generateMap(layer, "mg-bubbles.png"); assertThat(content.getMarkers().size(), equalTo(10)); MapMarker marker = getMarkerForSite(1336279918); assertThat(marker.getX(), equalTo(262)); assertThat(marker.getY(), equalTo(113)); } @Test public void siteBoundsToAdminLevelsAreMappedAsIcons() throws IOException { IconMapLayer layer = new IconMapLayer(); layer.setIcon("educ"); layer.getIndicatorIds().add(NUMBER_OF_BENE_INDICATOR_ID); generateMap(layer, "mg-icons.png"); assertThat(content.getMarkers().size(), equalTo(10)); MapMarker marker = getMarkerForSite(1336279918); assertThat(marker.getX(), equalTo(262)); assertThat(marker.getY(), equalTo(113)); } @Test public void siteBoundsToAdminLevelsMappedAsIconsAutoClustered() throws IOException { IconMapLayer layer = new IconMapLayer(); layer.setIcon("educ"); layer.getIndicatorIds().add(NUMBER_OF_BENE_INDICATOR_ID); layer.setClustering(new AutomaticClustering()); generateMap(layer, "mg-icons-auto.png"); assertTrue(content.getMarkers().size() > 0); assertTrue(content.getUnmappedSites().isEmpty()); } @Test public void sitesBoundToAdminLevelsAreAutoClusteredProperly() throws IOException { BubbleMapLayer layer = new BubbleMapLayer(); layer.addIndicator(NUMBER_OF_BENE_INDICATOR_ID); layer.setClustering(new AutomaticClustering()); generateMap(layer, "mg-auto-cluster.png"); assertThat(content.getMarkers().size(), equalTo(4)); assertThat(content.getUnmappedSites().size(), equalTo(0)); } @Test public void sitesBoundToAdminLevelsAreClusteredByAdminLevelMissingBounds() throws IOException { BubbleMapLayer layer = new BubbleMapLayer(); layer.addIndicator(NUMBER_OF_BENE_INDICATOR_ID); layer.setClustering(clusterByFokotany()); generateMap(layer, "mg-cluster-fok.png"); assertThat(content.getMarkers().size(), equalTo(10)); assertThat(content.getUnmappedSites().size(), equalTo(0)); } private AdministrativeLevelClustering clusterByFokotany() { AdministrativeLevelClustering clustering = new AdministrativeLevelClustering(); clustering.getAdminLevels().add(FOKOTANY_LEVEL_ID); return clustering; } private void generateMap(MapLayer layer, String fileName) throws IOException { map = new MapReportElement(); map.addLayer(layer); content = (MapContent) execute(new GenerateElement(map)); renderToFile(map, fileName); } private MapMarker getMarkerForSite(int siteId) { for(MapMarker marker : this.content.getMarkers()) { if(marker.getSiteIds().contains(siteId)) { return marker; } } throw new AssertionError("No marker for " + siteId); } private void renderToFile(MapReportElement map, String fileName) throws IOException { ImageMapRenderer renderer = new ImageMapRenderer(null, "src/main/webapp/mapicons"); renderer.renderToFile(map, new File(outFolder, fileName)); } }