def test_upload_multi_action(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) node2 = create_node(self.user.id, self.user.username, node) way = create_way(self.user.id, self.user.username, [node.objId, node2.objId]) xml = """<osmChange version="0.6" generator="JOSM"> <create> <node id='-3912' changeset='{0}' lat='50.78673385857' lon='-1.04730886255'> <tag k='abc' v='def' /> </node> </create> <modify> <way id='{1}' changeset='{0}' version="{2}"> <nd ref='-3912' /> <nd ref='{3}' /> <nd ref='{4}' /> <tag k='ghi' v='jkl' /> </way> </modify> </osmChange>""".format(cs.objId, way.objId, way.metaData.version, node.objId, node2.objId) response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) xml = fromstring(response.content) diffDict = ParseOsmDiffToDict(xml)
def test_upload_delete_interdependent_objects(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) node2 = create_node(self.user.id, self.user.username, node) way = create_way(self.user.id, self.user.username, [node.objId, node2.objId]) xml = """<osmChange version="0.6" generator="JOSM"> <delete> <way id='{}' version='{}' changeset='{}'/> <node id='{}' version='{}' changeset='{}'/> <node id='{}' version='{}' changeset='{}'/> </delete> </osmChange>""".format(way.objId, way.metaData.version, cs.objId, node.objId, node.metaData.version, cs.objId, node2.objId, node2.metaData.version, cs.objId) response = self.client.post(reverse('changeset:upload', args=(cs.objId, )), xml, content_type='text/xml') #print (response.content) self.assertEqual(response.status_code, 200)
def test_upload_delete_single_node(self): cs = CreateTestChangeset(self.user, tags={"foo": "interstellar"}, is_open=True) node = create_node(self.user.id, self.user.username) xml = """<osmChange generator="JOSM" version="0.6"> <delete> <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"/> </delete> </osmChange>""".format(cs.objId, node.objId, node.metaData.version) response = self.client.post(reverse('changeset:upload', args=(cs.objId, )), xml, content_type='text/xml') if response.status_code != 200: print(response.content) self.assertEqual(response.status_code, 200) xml = fromstring(response.content) self.assertEqual(len(xml), 1) ndiff = xml[0] self.assertEqual(int(ndiff.attrib["old_id"]), node.objId) dbNode = GetObj(p, "node", node.objId) self.assertEqual(dbNode is None, True)
def test_upload_delete_relations_with_circular_reference(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) relation = create_relation(self.user.id, self.user.username, [("node", node.objId, "parrot")]) relation2 = create_relation(self.user.id, self.user.username, [("node", node.objId, "parrot"), ("relation", relation.objId, "dead")]) relation = modify_relation(self.user.id, self.user.username, relation, [("node", node.objId, "parrot"), ("relation", relation2.objId, "dead")], {}) xml = """<osmChange version="0.6" generator="JOSM"> <delete> <relation id='{}' version='{}' changeset='{}'/> <relation id='{}' version='{}' changeset='{}'/> </delete> </osmChange>""".format(relation.objId, relation.metaData.version, cs.objId, relation2.objId, relation2.metaData.version, cs.objId) response = self.client.post(reverse('changeset:upload', args=(cs.objId, )), xml, content_type='text/xml') #print (response.content) self.assertEqual(response.status_code, 200)
def test_delete_node_diff(self): ts = time.time() - 120 ts2 = time.time() - 60 node = qmt.create_node(self.user.id, self.user.username, timestamp = ts) ok = qmt.delete_object(node, self.user, timestamp = ts2) self.assertEqual(ok, True) cat = rv.TimestampToPath(int(ts2), "minute") anonClient = Client() response = anonClient.get(reverse('replicate:diffdata', args=['minute', str(cat[0]), str(cat[1]), str(cat[2])])) if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) osc = pgmap.OsmChange() pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc) oscIndex = CreateIndexOsmChange(osc) self.assertEqual(node.objId in oscIndex["node"], True) found = False for action, obj in oscIndex["node"][node.objId]: print (action, obj.objId, obj.metaData.version) if action == "delete": found = True break self.assertEqual(found, True)
def test_get_ways_for_node(self): anonClient = Client() node = create_node(self.user.id, self.user.username) node2 = create_node(self.user.id, self.user.username, node) way = create_way(self.user.id, self.user.username, [node.objId, node2.objId]) response = anonClient.get(reverse('elements:ways_for_node', args=['node', str(node.objId)])) if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) osmData = DecodeOsmdataResponse([response.content]) wayIdDict = GetOsmDataIndex(osmData)['way'] self.assertEqual(len(wayIdDict), 1) self.assertEqual(way.objId in wayIdDict, True)
def test_upload_delete_node_used_by_way(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) node2 = create_node(self.user.id, self.user.username, node) way = create_way(self.user.id, self.user.username, [node.objId, node2.objId]) xml = """<osmChange generator="JOSM" version="0.6"> <delete> <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"/> </delete> </osmChange>""".format(cs.objId, node.objId, node.metaData.version) response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') self.assertEqual(response.status_code, 412)
def test_upload_delete_relation_used_by_relation_if_unused(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) node2 = create_node(self.user.id, self.user.username, node) relation = create_relation(self.user.id, self.user.username, [("node", node.objId, "parrot"), ("node", node2.objId, "dead")]) relation2 = create_relation(self.user.id, self.user.username, [("node", node.objId, "parrot"), ("relation", relation.objId, "dead")]) xml = """<osmChange generator="JOSM" version="0.6"> <delete if-unused="true"> <relation changeset="{}" id="{}" version="{}"/> </delete> </osmChange>""".format(cs.objId, relation.objId, relation.metaData.version) response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') #print (response.content) self.assertEqual(response.status_code, 200)
def test_upload_delete_undelete_way(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) node2 = create_node(self.user.id, self.user.username, node) way = create_way(self.user.id, self.user.username, [node.objId, node2.objId]) xml = """<osmChange generator="JOSM" version="0.6"> <delete> <way changeset="{}" id="{}" version="{}"/> </delete> </osmChange>""".format(cs.objId, way.objId, node.metaData.version) response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') #print (response.content) self.assertEqual(response.status_code, 200) ok, way = modify_way(way, [node.objId, node2.objId], {}, self.user) self.assertEqual(ok, True)
def test_create_relation_diff(self): ts = time.time() - 60 node1 = qmt.create_node(self.user.id, self.user.username, timestamp = ts) node2 = qmt.create_node(self.user.id, self.user.username, timestamp = ts) refs = [("node", node1.objId, "foo"), ("node", node2.objId, "bar")] relation = qmt.create_relation(self.user.id, self.user.username, refs, timestamp = ts) cat = rv.TimestampToPath(relation.metaData.timestamp, "minute") anonClient = Client() response = anonClient.get(reverse('replicate:diffdata', args=['minute', str(cat[0]), str(cat[1]), str(cat[2])])) if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) osc = pgmap.OsmChange() pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc) oscIndex = CreateIndexOsmChange(osc) self.assertEqual(relation.objId in oscIndex["relation"], True) self.assertEqual(oscIndex["relation"][relation.objId][0][0], "create")
def test_upload_modify_single_node_wrong_user(self): cs = CreateTestChangeset(self.user, tags={"foo": "apollo"}, is_open=True) node = create_node(self.user.id, self.user.username) xml = """<osmChange generator="JOSM" version="0.6"> <modify> <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"> <tag k="note" v="Just a node"/> </node> </modify> </osmChange>""".format(cs.objId, node.objId, node.metaData.version) response = self.client2.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') self.assertEqual(response.status_code, 409)
def test_create_node_diff(self): ts = time.time() - 60 node = qmt.create_node(self.user.id, self.user.username, timestamp = ts) cat = rv.TimestampToPath(node.metaData.timestamp, "minute") #Check minutely diff anonClient = Client() response = anonClient.get(reverse('replicate:diffdata', args=['minute', str(cat[0]), str(cat[1]), str(cat[2])])) if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) osc = pgmap.OsmChange() pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc) oscIndex = CreateIndexOsmChange(osc) self.assertEqual(node.objId in oscIndex["node"], True) self.assertEqual(oscIndex["node"][node.objId][0][0], "create")
def test_create_node_diff_custom_range(self): ts = time.time() - 60 node = qmt.create_node(self.user.id, self.user.username, timestamp = ts) #Check custom time range diff anonClient = Client() startTs = datetime.datetime.utcfromtimestamp(ts-5).isoformat() endTs = datetime.datetime.utcfromtimestamp(ts+5).isoformat() response = anonClient.get(reverse('replicate:customdiff')+'?start={}&end={}'.format(startTs, endTs)) if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) osc = pgmap.OsmChange() pgmap.LoadFromOsmChangeXml(response.content.decode("utf-8"), osc) oscIndex = CreateIndexOsmChange(osc) self.assertEqual(node.objId in oscIndex["node"], True) self.assertEqual(oscIndex["node"][node.objId][0][0], "create")
def test_upload_modify_single_node(self): cs = CreateTestChangeset(self.user, tags={"foo": "interstellar"}, is_open=True) node = create_node(self.user.id, self.user.username) xml = """<osmChange generator="JOSM" version="0.6"> <modify> <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"> <tag k="note" v="Just a node"/> </node> </modify> </osmChange>""".format(cs.objId, node.objId, node.metaData.version) response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) xml = fromstring(response.content) self.assertEqual(len(xml), 1) ndiff = xml[0] self.assertEqual(int(ndiff.attrib["old_id"]), node.objId) self.assertEqual(int(ndiff.attrib["new_version"]), node.metaData.version+1) self.assertEqual(int(ndiff.attrib["new_id"]), node.objId) dbNode = GetObj(p, "node", node.objId) self.assertEqual(abs(dbNode.lat-50.80)<1e-6, True) self.assertEqual(abs(dbNode.lon+1.05)<1e-6, True) self.assertEqual(len(dbNode.tags), 1) # Check xml download is reasonable response2 = self.client.get(reverse('changeset:download', args=(cs.objId,))) xml2 = fromstring(response2.content) for ch in xml2: self.assertEqual(ch.tag, "modify") for ch2 in ch: self.assertEqual(ch2.tag, "node")
def test_upload_delete_undelete_single_node(self): cs = CreateTestChangeset(self.user, tags={"foo": "interstellar"}, is_open=True) node = create_node(self.user.id, self.user.username) xml = """<osmChange generator="JOSM" version="0.6"> <delete> <node changeset="{}" id="{}" lat="50.80" lon="-1.05" version="{}"/> </delete> </osmChange>""".format(cs.objId, node.objId, node.metaData.version) response = self.client.post(reverse('changeset:upload', args=(cs.objId,)), xml, content_type='text/xml') if response.status_code != 200: print (response.content) self.assertEqual(response.status_code, 200) xml = fromstring(response.content) self.assertEqual(len(xml), 1) ndiff = xml[0] self.assertEqual(int(ndiff.attrib["old_id"]), node.objId) dbNode = GetObj(p, "node", node.objId) self.assertEqual(dbNode is None, True) # Check xml download is reasonable response2 = self.client.get(reverse('changeset:download', args=(cs.objId,))) xml2 = fromstring(response2.content) for ch in xml2: self.assertEqual(ch.tag, "delete") for ch2 in ch: self.assertEqual(ch2.tag, "node") # Undelete node by uploading new version ok, node = modify_node(node, node.metaData.version+1, self.user) self.assertEqual(ok, True)
def test_upload_create_complex(self): cs = CreateTestChangeset(self.user, tags={"foo": "me"}, is_open=True) node = create_node(self.user.id, self.user.username) xml = """<osmChange version="0.6" generator="JOSM"> <create> <node id='-3912' changeset='{0}' lat='50.78673385857' lon='-1.04730886255'> <tag k='abc' v='def' /> </node> <node id='-3910' changeset='{0}' lat='50.7865119298' lon='-1.04843217891' /> <node id='-3909' changeset='{0}' lat='50.78724872927' lon='-1.04808114255' /> <way id='-3911' changeset='{0}'> <nd ref='-3909' /> <nd ref='-3910' /> <nd ref='-3912' /> <nd ref='{1}' /> <tag k='ghi' v='jkl' /> </way> <relation id='-3933' changeset='{0}'> <member type='way' ref='-3911' role='lmn' /> <member type='node' ref='-3909' role='opq' /> <tag k='rst' v='uvw' /> </relation> <relation id='-3934' changeset='{0}'> <member type='way' ref='-3911' role='lmn' /> <member type='relation' ref='-3933' role='opq' /> <tag k='rst' v='xyz' /> </relation> </create> </osmChange>""".format(cs.objId, node.objId) response = self.client.post(reverse('changeset:upload', args=(cs.objId, )), xml, content_type='text/xml') if response.status_code != 200: print(response.content) self.assertEqual(response.status_code, 200) xml = fromstring(response.content) diffDict = ParseOsmDiffToDict(xml) way = GetObj(p, "way", diffDict["way"][-3911][0]) wayRefs = list(way.refs) for diffId, diffVer in diffDict["node"].values(): self.assertEqual(diffId in wayRefs, True) self.assertEqual(node.objId in wayRefs, True) wayTags = dict(way.tags) self.assertEqual(wayTags, {'ghi': 'jkl'}) rel1 = GetObj(p, "relation", diffDict["relation"][-3933][0]) rel1Refs = zip(list(rel1.refTypeStrs), list(rel1.refIds), list(rel1.refRoles)) self.assertEqual(("way", diffDict["way"][-3911][0], "lmn") in rel1Refs, True) self.assertEqual(("node", diffDict["node"][-3909][0], "opq") in rel1Refs, True) rel1Tags = dict(rel1.tags) self.assertEqual(rel1Tags, {'rst': 'uvw'}) rel2 = GetObj(p, "relation", diffDict["relation"][-3934][0]) rel2Refs = zip(list(rel2.refTypeStrs), list(rel2.refIds), list(rel2.refRoles)) self.assertEqual(("way", diffDict["way"][-3911][0], "lmn") in rel2Refs, True) self.assertEqual(("relation", diffDict["relation"][-3933][0], "opq") in rel2Refs, True) rel2Tags = dict(rel2.tags) self.assertEqual(rel2Tags, {'rst': 'xyz'})