def test_city_with_topo(self): """ +-----------------+ | S | | +---x---+ | | | | | City | |p | | | O O | | | +-----------------+ """ c = City(code='005178', name='Trifouillis-les-marmottes', geom=MultiPolygon( Polygon(((0, 0), (2, 0), (2, 2), (0, 2), (0, 0)), srid=settings.SRID))) c.save() if settings.TREKKING_TOPOLOGY_ENABLED: p = PathFactory( geom=LineString((0.5, 0.5), (0.5, 1.5), (1.5, 1.5), (1.5, 0.5))) p.save() signage = SignageFactory.create(paths=[(p, 0.5, 0.5)]) else: signage = SignageFactory.create( geom=Point(1, 1.5, srid=settings.SRID)) self.assertEqual(len(signage.cities), 1)
def test_couches_sig_link(self): """ +-----------------+ - | |ra2 | | +-------+ | | | _ _| _ _ _|_ _ | - C | |p | | | | O O | | | |ra1 | +-----------------+ - """ # Fake restricted areas RestrictedAreaFactory.create( geom=MultiPolygon(Polygon(((0, 0), (2, 0), (2, 1), (0, 1), (0, 0))))) RestrictedAreaFactory.create( geom=MultiPolygon(Polygon(((0, 1), (2, 1), (2, 2), (0, 2), (0, 1))))) # Fake city c = City(code='005178', name='Trifouillis-les-marmottes', geom=MultiPolygon( Polygon(((0, 0), (2, 0), (2, 2), (0, 2), (0, 0)), srid=settings.SRID))) c.save() # Fake paths in these areas p = PathFactory( geom=LineString((0.5, 0.5), (0.5, 1.5), (1.5, 1.5), (1.5, 0.5))) p.save() self.assertEqual(len(p.areas), 2) self.assertEqual(len(p.cities), 1)
def test_city_with_path_ends_on_border(self): """ | | |p1 |p2 | | +--------+----+---+ | | | | City | | +-----------------+ """ # Create a path before city to test one trigger p1 = PathFactory(geom=LineString((1, 1), (1, 2))) p1.save() c = City(code='005178', name='Trifouillis-les-marmottes', geom=MultiPolygon( Polygon(((0, 0), (2, 0), (2, 1), (0, 1), (0, 0)), srid=settings.SRID))) c.save() # Create a path after city to the the another trigger p2 = PathFactory(geom=LineString((1.5, 2), (1.5, 1))) p2.save() self.assertEqual(len(p1.cities), 1) self.assertEqual(len(p2.cities), 1)
def test_dates(self): t1 = dbnow() p = PathFactory() t2 = dbnow() self.assertTrue(t1 < p.date_insert < t2, msg='Date interval failed: %s < %s < %s' % (t1, p.date_insert, t2)) p.name = "Foo" p.save() t3 = dbnow() self.assertTrue(t2 < p.date_update < t3, msg='Date interval failed: %s < %s < %s' % (t2, p.date_update, t3))
def test_dates(self): t1 = dbnow() p = PathFactory() t2 = dbnow() self.assertTrue(t1 < p.date_insert < t2, msg='Date interval failed: %s < %s < %s' % ( t1, p.date_insert, t2 )) p.name = "Foo" p.save() t3 = dbnow() self.assertTrue(t2 < p.date_update < t3, msg='Date interval failed: %s < %s < %s' % (t2, p.date_update, t3))
def test_structure_restricted(self): p = PathFactory() # Login user = PathManagerFactory(password="******") success = self.client.login(username=user.username, password="******") self.assertTrue(success) # Try to edit path from same structure response = self.client.get(p.get_update_url()) self.assertEqual(response.status_code, 200) # Try to edit path from other structure p.structure = StructureFactory(name="Other") p.save() self.assertNotEqual(p.structure, user.profile.structure) response = self.client.get(p.get_update_url()) self.assertEqual(response.status_code, 302)
def test_structure_restricted(self): p = PathFactory() # Login user = PathManagerFactory(password="******") success = self.client.login(username=user.username, password="******") self.assertTrue(success) # Try to edit path from same structure response = self.client.get(p.get_update_url()) self.assertEqual(response.status_code, 200) # Try to edit path from other structure p.structure = StructureFactory(name="Other") p.save() self.assertNotEqual(p.structure, user.profile.structure) response = self.client.get(p.get_update_url()) self.assertEqual(response.status_code, 302)
def test_city_with_topo_3(self): """ +-------+ _ _ | _ _ _ | _ _ | |p | | | O X S | City | | +-----------------+ """ c = City(code='005178', name='Trifouillis-les-marmottes', geom=MultiPolygon(Polygon(((0, 0), (2, 0), (2, 1), (0, 1), (0, 0)), srid=settings.SRID))) c.save() p = PathFactory(geom=LineString((0.5, 0.5), (0.5, 1.5), (1.5, 1.5), (1.5, 0.5))) p.save() signage = SignageFactory.create(paths=[(p, 1, 1)]) self.assertEqual(signage.city_edges.count(), 1)
def test_couches_sig_link(self): # Fake restricted areas ra1 = RestrictedAreaFactory.create( geom=MultiPolygon(Polygon(((0, 0), (2, 0), (2, 1), (0, 1), (0, 0))))) ra2 = RestrictedAreaFactory.create( geom=MultiPolygon(Polygon(((0, 1), (2, 1), (2, 2), (0, 2), (0, 1))))) # Fake city c = City(code='005178', name='Trifouillis-les-marmottes', geom=MultiPolygon( Polygon(((0, 0), (2, 0), (2, 2), (0, 2), (0, 0)), srid=settings.SRID))) c.save() # Fake paths in these areas p = PathFactory( geom=LineString((0.5, 0.5), (0.5, 1.5), (1.5, 1.5), (1.5, 0.5))) p.save() # This should results in 3 PathAggregation (2 for RA1, 1 for RA2, 1 for City) self.assertEquals(p.aggregations.count(), 4) self.assertEquals(p.topology_set.count(), 4) # PathAgg is plain for City t_c = c.cityedge_set.get().topo_object pa = c.cityedge_set.get().aggregations.get() self.assertEquals(pa.start_position, 0.0) self.assertEquals(pa.end_position, 1.0) # PathAgg is splitted for RA self.assertEquals(ra1.restrictedareaedge_set.count(), 2) self.assertEquals(ra2.restrictedareaedge_set.count(), 1) rae1a = ra1.restrictedareaedge_set.filter( aggregations__start_position=0).get() rae1b = ra1.restrictedareaedge_set.filter( aggregations__end_position=1).get() pa1a = rae1a.aggregations.get() pa1b = rae1b.aggregations.get() t_ra1a = rae1a.topo_object t_ra1b = rae1b.topo_object pa2 = ra2.restrictedareaedge_set.get().aggregations.get() t_ra2 = ra2.restrictedareaedge_set.get().topo_object self.assertAlmostEqual(pa1a.start_position, 0.0) self.assertAlmostEqual(pa1a.end_position, 0.5 / 3) self.assertAlmostEqual(pa1b.start_position, 2.5 / 3) self.assertAlmostEqual(pa1b.end_position, 1.0) self.assertAlmostEqual(pa2.start_position, 0.5 / 3) self.assertAlmostEqual(pa2.end_position, 2.5 / 3) # Ensure everything is in order after update p.geom = LineString((0.5, 0.5), (1.5, 0.5)) p.save() self.assertEquals(p.aggregations.count(), 2) self.assertEquals(p.topology_set.count(), 2) # Topology are re-created at DB-level after any update self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_c.pk) self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_ra1a.pk) self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_ra1b.pk) self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_ra2.pk) self.assertEquals(ra1.restrictedareaedge_set.count(), 1) # a new association exists for C t_c = c.cityedge_set.get().topo_object self.assertEquals(Topology.objects.filter(pk=t_c.pk).count(), 1) # a new association exists for RA1 t_ra1 = ra1.restrictedareaedge_set.get().topo_object self.assertEquals(Topology.objects.filter(pk=t_ra1.pk).count(), 1) pa1 = ra1.restrictedareaedge_set.get().aggregations.get() self.assertEquals(pa1.start_position, 0.0) self.assertEquals(pa1.end_position, 1.0) # RA2 is not connected anymore self.assertEquals(ra2.restrictedareaedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_ra2.pk).count(), 0) # All intermediary objects should be cleaned on delete p.delete() self.assertEquals(c.cityedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_c.pk).count(), 0) self.assertEquals(ra1.restrictedareaedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_ra1.pk).count(), 0) self.assertEquals(ra2.restrictedareaedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_ra2.pk).count(), 0)
def test_couches_sig_link(self): # Fake restricted areas ra1 = RestrictedAreaFactory.create(geom=MultiPolygon( Polygon(((0, 0), (2, 0), (2, 1), (0, 1), (0, 0))))) ra2 = RestrictedAreaFactory.create(geom=MultiPolygon( Polygon(((0, 1), (2, 1), (2, 2), (0, 2), (0, 1))))) # Fake city c = City(code='005178', name='Trifouillis-les-marmottes', geom=MultiPolygon(Polygon(((0, 0), (2, 0), (2, 2), (0, 2), (0, 0)), srid=settings.SRID))) c.save() # Fake paths in these areas p = PathFactory(geom=LineString((0.5, 0.5), (0.5, 1.5), (1.5, 1.5), (1.5, 0.5))) p.save() # This should results in 3 PathAggregation (2 for RA1, 1 for RA2, 1 for City) self.assertEquals(p.aggregations.count(), 4) self.assertEquals(p.topology_set.count(), 4) # PathAgg is plain for City t_c = c.cityedge_set.get().topo_object pa = c.cityedge_set.get().aggregations.get() self.assertEquals(pa.start_position, 0.0) self.assertEquals(pa.end_position, 1.0) # PathAgg is splitted for RA self.assertEquals(ra1.restrictedareaedge_set.count(), 2) self.assertEquals(ra2.restrictedareaedge_set.count(), 1) rae1a = ra1.restrictedareaedge_set.filter(aggregations__start_position=0).get() rae1b = ra1.restrictedareaedge_set.filter(aggregations__end_position=1).get() pa1a = rae1a.aggregations.get() pa1b = rae1b.aggregations.get() t_ra1a = rae1a.topo_object t_ra1b = rae1b.topo_object pa2 = ra2.restrictedareaedge_set.get().aggregations.get() t_ra2 = ra2.restrictedareaedge_set.get().topo_object self.assertAlmostEqual(pa1a.start_position, 0.0) self.assertAlmostEqual(pa1a.end_position, 0.5 / 3) self.assertAlmostEqual(pa1b.start_position, 2.5 / 3) self.assertAlmostEqual(pa1b.end_position, 1.0) self.assertAlmostEqual(pa2.start_position, 0.5 / 3) self.assertAlmostEqual(pa2.end_position, 2.5 / 3) # Ensure everything is in order after update p.geom = LineString((0.5, 0.5), (1.5, 0.5)) p.save() self.assertEquals(p.aggregations.count(), 2) self.assertEquals(p.topology_set.count(), 2) # Topology are re-created at DB-level after any update self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_c.pk) self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_ra1a.pk) self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_ra1b.pk) self.assertRaises(Topology.DoesNotExist, Topology.objects.get, pk=t_ra2.pk) self.assertEquals(ra1.restrictedareaedge_set.count(), 1) # a new association exists for C t_c = c.cityedge_set.get().topo_object self.assertEquals(Topology.objects.filter(pk=t_c.pk).count(), 1) # a new association exists for RA1 t_ra1 = ra1.restrictedareaedge_set.get().topo_object self.assertEquals(Topology.objects.filter(pk=t_ra1.pk).count(), 1) pa1 = ra1.restrictedareaedge_set.get().aggregations.get() self.assertEquals(pa1.start_position, 0.0) self.assertEquals(pa1.end_position, 1.0) # RA2 is not connected anymore self.assertEquals(ra2.restrictedareaedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_ra2.pk).count(), 0) # All intermediary objects should be cleaned on delete p.delete() self.assertEquals(c.cityedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_c.pk).count(), 0) self.assertEquals(ra1.restrictedareaedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_ra1.pk).count(), 0) self.assertEquals(ra2.restrictedareaedge_set.count(), 0) self.assertEquals(Topology.objects.filter(pk=t_ra2.pk).count(), 0)