2013-07-30 01:19:04 +08:00
|
|
|
from __future__ import unicode_literals
|
2011-10-18 02:45:22 +08:00
|
|
|
|
2013-07-01 20:22:27 +08:00
|
|
|
from unittest import skipUnless
|
2008-08-17 04:40:47 +08:00
|
|
|
from xml.dom import minidom
|
2011-10-18 02:45:22 +08:00
|
|
|
|
2013-12-22 18:35:17 +08:00
|
|
|
from django.apps import app_cache
|
2011-03-17 02:22:52 +08:00
|
|
|
from django.conf import settings
|
|
|
|
from django.contrib.sites.models import Site
|
2013-05-11 11:08:45 +08:00
|
|
|
from django.contrib.gis.geos import HAS_GEOS
|
|
|
|
from django.contrib.gis.tests.utils import HAS_SPATIAL_DB
|
2010-12-02 13:58:21 +08:00
|
|
|
from django.test import TestCase
|
2010-10-11 20:55:17 +08:00
|
|
|
|
2013-05-11 11:08:45 +08:00
|
|
|
if HAS_GEOS:
|
|
|
|
from .models import City
|
2008-08-17 04:40:47 +08:00
|
|
|
|
2010-10-11 20:55:17 +08:00
|
|
|
|
2013-05-11 11:08:45 +08:00
|
|
|
@skipUnless(HAS_GEOS and HAS_SPATIAL_DB, "Geos and spatial db are required.")
|
2010-12-02 13:58:21 +08:00
|
|
|
class GeoFeedTest(TestCase):
|
|
|
|
|
|
|
|
urls = 'django.contrib.gis.tests.geoapp.urls'
|
2008-08-17 04:40:47 +08:00
|
|
|
|
2011-03-17 02:22:52 +08:00
|
|
|
def setUp(self):
|
|
|
|
Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
|
2013-12-18 20:16:33 +08:00
|
|
|
self._with_sites = app_cache._begin_with_app('django.contrib.sites')
|
2011-03-17 02:22:52 +08:00
|
|
|
|
|
|
|
def tearDown(self):
|
2013-12-18 20:16:33 +08:00
|
|
|
app_cache._end_with_app(self._with_sites)
|
2011-03-17 02:22:52 +08:00
|
|
|
|
2008-08-17 04:40:47 +08:00
|
|
|
def assertChildNodes(self, elem, expected):
|
2013-03-04 04:03:11 +08:00
|
|
|
"Taken from syndication/tests.py."
|
2013-08-30 07:20:00 +08:00
|
|
|
actual = set(n.nodeName for n in elem.childNodes)
|
2008-08-17 04:40:47 +08:00
|
|
|
expected = set(expected)
|
|
|
|
self.assertEqual(actual, expected)
|
|
|
|
|
|
|
|
def test_geofeed_rss(self):
|
|
|
|
"Tests geographic feeds using GeoRSS over RSSv2."
|
|
|
|
# Uses `GEOSGeometry` in `item_geometry`
|
2010-12-02 13:58:21 +08:00
|
|
|
doc1 = minidom.parseString(self.client.get('/feeds/rss1/').content)
|
2008-08-17 04:40:47 +08:00
|
|
|
# Uses a 2-tuple in `item_geometry`
|
2010-12-02 13:58:21 +08:00
|
|
|
doc2 = minidom.parseString(self.client.get('/feeds/rss2/').content)
|
2008-08-17 04:40:47 +08:00
|
|
|
feed1, feed2 = doc1.firstChild, doc2.firstChild
|
|
|
|
|
|
|
|
# Making sure the box got added to the second GeoRSS feed.
|
2010-01-30 02:07:49 +08:00
|
|
|
self.assertChildNodes(feed2.getElementsByTagName('channel')[0],
|
|
|
|
['title', 'link', 'description', 'language',
|
|
|
|
'lastBuildDate', 'item', 'georss:box', 'atom:link']
|
2008-08-17 04:40:47 +08:00
|
|
|
)
|
2010-01-30 02:07:49 +08:00
|
|
|
|
2008-08-17 04:40:47 +08:00
|
|
|
# Incrementing through the feeds.
|
|
|
|
for feed in [feed1, feed2]:
|
|
|
|
# Ensuring the georss namespace was added to the <rss> element.
|
2013-11-03 03:37:48 +08:00
|
|
|
self.assertEqual(feed.getAttribute('xmlns:georss'), 'http://www.georss.org/georss')
|
2008-08-17 04:40:47 +08:00
|
|
|
chan = feed.getElementsByTagName('channel')[0]
|
|
|
|
items = chan.getElementsByTagName('item')
|
|
|
|
self.assertEqual(len(items), City.objects.count())
|
2010-01-30 02:07:49 +08:00
|
|
|
|
2008-08-17 04:40:47 +08:00
|
|
|
# Ensuring the georss element was added to each item in the feed.
|
|
|
|
for item in items:
|
|
|
|
self.assertChildNodes(item, ['title', 'link', 'description', 'guid', 'georss:point'])
|
|
|
|
|
|
|
|
def test_geofeed_atom(self):
|
|
|
|
"Testing geographic feeds using GeoRSS over Atom."
|
2010-12-02 13:58:21 +08:00
|
|
|
doc1 = minidom.parseString(self.client.get('/feeds/atom1/').content)
|
|
|
|
doc2 = minidom.parseString(self.client.get('/feeds/atom2/').content)
|
2008-08-17 04:40:47 +08:00
|
|
|
feed1, feed2 = doc1.firstChild, doc2.firstChild
|
|
|
|
|
|
|
|
# Making sure the box got added to the second GeoRSS feed.
|
2010-01-30 02:07:49 +08:00
|
|
|
self.assertChildNodes(feed2, ['title', 'link', 'id', 'updated', 'entry', 'georss:box'])
|
2008-08-17 04:40:47 +08:00
|
|
|
|
|
|
|
for feed in [feed1, feed2]:
|
|
|
|
# Ensuring the georsss namespace was added to the <feed> element.
|
2013-11-03 03:37:48 +08:00
|
|
|
self.assertEqual(feed.getAttribute('xmlns:georss'), 'http://www.georss.org/georss')
|
2008-08-17 04:40:47 +08:00
|
|
|
entries = feed.getElementsByTagName('entry')
|
|
|
|
self.assertEqual(len(entries), City.objects.count())
|
2010-01-30 02:07:49 +08:00
|
|
|
|
2008-08-17 04:40:47 +08:00
|
|
|
# Ensuring the georss element was added to each entry in the feed.
|
|
|
|
for entry in entries:
|
|
|
|
self.assertChildNodes(entry, ['title', 'link', 'id', 'summary', 'georss:point'])
|
|
|
|
|
|
|
|
def test_geofeed_w3c(self):
|
|
|
|
"Testing geographic feeds using W3C Geo."
|
2010-12-02 13:58:21 +08:00
|
|
|
doc = minidom.parseString(self.client.get('/feeds/w3cgeo1/').content)
|
2008-08-17 04:40:47 +08:00
|
|
|
feed = doc.firstChild
|
|
|
|
# Ensuring the geo namespace was added to the <feed> element.
|
2012-06-08 00:08:47 +08:00
|
|
|
self.assertEqual(feed.getAttribute('xmlns:geo'), 'http://www.w3.org/2003/01/geo/wgs84_pos#')
|
2008-08-17 04:40:47 +08:00
|
|
|
chan = feed.getElementsByTagName('channel')[0]
|
|
|
|
items = chan.getElementsByTagName('item')
|
|
|
|
self.assertEqual(len(items), City.objects.count())
|
|
|
|
|
|
|
|
# Ensuring the geo:lat and geo:lon element was added to each item in the feed.
|
|
|
|
for item in items:
|
|
|
|
self.assertChildNodes(item, ['title', 'link', 'description', 'guid', 'geo:lat', 'geo:lon'])
|
|
|
|
|
|
|
|
# Boxes and Polygons aren't allowed in W3C Geo feeds.
|
2013-11-03 05:02:56 +08:00
|
|
|
self.assertRaises(ValueError, self.client.get, '/feeds/w3cgeo2/') # Box in <channel>
|
|
|
|
self.assertRaises(ValueError, self.client.get, '/feeds/w3cgeo3/') # Polygons in <entry>
|