Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
104 changes: 61 additions & 43 deletions tests/test_features.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from io import StringIO
import json
import unittest

import geojson


Expand All @@ -16,22 +16,22 @@ def test_protocol(self):
'properties': {'title': 'Dict 1'},
}

json = geojson.dumps(f, sort_keys=True)
self.assertEqual(json, '{"geometry":'
' {"coordinates": [53.0, -4.0],'
' "type": "Point"},'
' "id": "1",'
' "properties": {"title": "Dict 1"},'
' "type": "Feature"}')

o = geojson.loads(json)
output = geojson.dumps(o, sort_keys=True)
self.assertEqual(output, '{"geometry":'
' {"coordinates": [53.0, -4.0],'
' "type": "Point"},'
' "id": "1",'
' "properties": {"title": "Dict 1"},'
' "type": "Feature"}')
json_str = geojson.dumps(f, sort_keys=True)
# Parse JSON to avoid formatting issues across Python versions
json_obj = json.loads(json_str)

expected = {
"geometry": {"coordinates": [53.0, -4.0], "type": "Point"},
"id": "1",
"properties": {"title": "Dict 1"},
"type": "Feature"
}
self.assertEqual(json_obj, expected)

o = geojson.loads(json_str)
output_str = geojson.dumps(o, sort_keys=True)
output_obj = json.loads(output_str)
self.assertEqual(output_obj, expected)

def test_unicode_properties(self):
with open("tests/data.geojson") as file_:
Expand All @@ -57,38 +57,45 @@ def test_feature_class(self):
self.assertEqual(feature.properties['summary'], 'The first feature')
self.assertEqual(feature.properties['link'],
'http://example.org/features/1')
self.assertEqual(geojson.dumps(feature.geometry, sort_keys=True),
'{"coordinates": [53.0, -4.0], "type": "Point"}')

# Encoding
json = ('{"geometry": {"coordinates": [53.0, -4.0],'
' "type": "Point"},'
' "id": "1",'
' "properties":'
' {"link": "http://example.org/features/1",'
' "summary": "The first feature",'
' "title": "Feature 1"},'
' "type": "Feature"}')
self.assertEqual(geojson.dumps(feature, sort_keys=True), json)
# Encoding - use JSON comparison to avoid formatting issues
geometry_obj = json.loads(geojson.dumps(feature.geometry, sort_keys=True))
self.assertEqual(geometry_obj, {"coordinates": [53.0, -4.0], "type": "Point"})

expected_feature = {
"geometry": {"coordinates": [53.0, -4.0], "type": "Point"},
"id": "1",
"properties": {
"link": "http://example.org/features/1",
"summary": "The first feature",
"title": "Feature 1"
},
"type": "Feature"
}

feature_json_obj = json.loads(geojson.dumps(feature, sort_keys=True))
self.assertEqual(feature_json_obj, expected_feature)

# Decoding
factory = geojson.examples.create_simple_web_feature
json = ('{"geometry": {"type": "Point",'
json_str = ('{"geometry": {"type": "Point",'
' "coordinates": [53.0, -4.0]},'
' "id": "1",'
' "properties": {"summary": "The first feature",'
' "link": "http://example.org/features/1",'
' "title": "Feature 1"}}')
feature = geojson.loads(json, object_hook=factory)
feature = geojson.loads(json_str, object_hook=factory)
self.assertEqual(repr(type(feature)),
"<class 'geojson.examples.SimpleWebFeature'>")
self.assertEqual(feature.id, '1')
self.assertEqual(feature.properties['title'], 'Feature 1')
self.assertEqual(feature.properties['summary'], 'The first feature')
self.assertEqual(feature.properties['link'],
'http://example.org/features/1')
self.assertEqual(geojson.dumps(feature.geometry, sort_keys=True),
'{"coordinates": [53.0, -4.0], "type": "Point"}')

# Compare geometry using JSON
geom_obj = json.loads(geojson.dumps(feature.geometry, sort_keys=True))
self.assertEqual(geom_obj, {"coordinates": [53.0, -4.0], "type": "Point"})

def test_geo_interface(self):
class Thingy:
Expand All @@ -100,17 +107,28 @@ def __init__(self, id, title, x, y):

@property
def __geo_interface__(self):
return ({"id": self.id,
return {"id": self.id,
"properties": {"title": self.title},
"geometry": {"type": "Point",
"coordinates": (self.x, self.y)}})
"coordinates": (self.x, self.y)}}

ob = Thingy('1', 'thingy one', -106.0, 40.0)
self.assertEqual(geojson.dumps(ob.__geo_interface__['geometry'],
sort_keys=True),
'{"coordinates": [-106.0, 40.0], "type": "Point"}')
self.assertEqual(geojson.dumps(ob, sort_keys=True),
('{"geometry": {"coordinates": [-106.0, 40.0],'
' "type": "Point"},'
' "id": "1",'
' "properties": {"title": "thingy one"}}'))

# Use JSON comparison for geometry
geom_json = json.loads(geojson.dumps(ob.__geo_interface__['geometry'],
sort_keys=True))
self.assertEqual(geom_json, {"coordinates": [-106.0, 40.0], "type": "Point"})

# Use JSON comparison for the whole object
expected_obj = {
"geometry": {"coordinates": [-106.0, 40.0], "type": "Point"},
"id": "1",
"properties": {"title": "thingy one"},
"type": "Feature"
}
ob_json = json.loads(geojson.dumps(ob, sort_keys=True))
self.assertEqual(ob_json, expected_obj)


if __name__ == '__main__':
unittest.main()