test_sitemaps.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. from __future__ import absolute_import
  2. from io import BytesIO
  3. from xml.dom import minidom
  4. import zipfile
  5. from django.conf import settings
  6. from django.contrib.sites.models import Site
  7. from django.test import TestCase
  8. from .models import City, Country
  9. class GeoSitemapTest(TestCase):
  10. urls = 'django.contrib.gis.tests.geoapp.urls'
  11. def setUp(self):
  12. Site(id=settings.SITE_ID, domain="example.com", name="example.com").save()
  13. self.old_Site_meta_installed = Site._meta.installed
  14. Site._meta.installed = True
  15. def tearDown(self):
  16. Site._meta.installed = self.old_Site_meta_installed
  17. def assertChildNodes(self, elem, expected):
  18. "Taken from regressiontests/syndication/tests.py."
  19. actual = set([n.nodeName for n in elem.childNodes])
  20. expected = set(expected)
  21. self.assertEqual(actual, expected)
  22. def test_geositemap_index(self):
  23. "Tests geographic sitemap index."
  24. # Getting the geo index.
  25. doc = minidom.parseString(self.client.get('/sitemap.xml').content)
  26. index = doc.firstChild
  27. self.assertEqual(index.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9')
  28. self.assertEqual(3, len(index.getElementsByTagName('sitemap')))
  29. def test_geositemap_kml(self):
  30. "Tests KML/KMZ geographic sitemaps."
  31. for kml_type in ('kml', 'kmz'):
  32. doc = minidom.parseString(self.client.get('/sitemaps/%s.xml' % kml_type).content)
  33. # Ensuring the right sitemaps namespaces are present.
  34. urlset = doc.firstChild
  35. self.assertEqual(urlset.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9')
  36. self.assertEqual(urlset.getAttribute(u'xmlns:geo'), u'http://www.google.com/geo/schemas/sitemap/1.0')
  37. urls = urlset.getElementsByTagName('url')
  38. self.assertEqual(2, len(urls)) # Should only be 2 sitemaps.
  39. for url in urls:
  40. self.assertChildNodes(url, ['loc', 'geo:geo'])
  41. # Making sure the 'geo:format' element was properly set.
  42. geo_elem = url.getElementsByTagName('geo:geo')[0]
  43. geo_format = geo_elem.getElementsByTagName('geo:format')[0]
  44. self.assertEqual(kml_type, geo_format.childNodes[0].data)
  45. # Getting the relative URL since we don't have a real site.
  46. kml_url = url.getElementsByTagName('loc')[0].childNodes[0].data.split('http://example.com')[1]
  47. if kml_type == 'kml':
  48. kml_doc = minidom.parseString(self.client.get(kml_url).content)
  49. elif kml_type == 'kmz':
  50. # Have to decompress KMZ before parsing.
  51. buf = BytesIO(self.client.get(kml_url).content)
  52. zf = zipfile.ZipFile(buf)
  53. self.assertEqual(1, len(zf.filelist))
  54. self.assertEqual('doc.kml', zf.filelist[0].filename)
  55. kml_doc = minidom.parseString(zf.read('doc.kml'))
  56. # Ensuring the correct number of placemarks are in the KML doc.
  57. if 'city' in kml_url:
  58. model = City
  59. elif 'country' in kml_url:
  60. model = Country
  61. self.assertEqual(model.objects.count(), len(kml_doc.getElementsByTagName('Placemark')))
  62. def test_geositemap_georss(self):
  63. "Tests GeoRSS geographic sitemaps."
  64. from .feeds import feed_dict
  65. doc = minidom.parseString(self.client.get('/sitemaps/georss.xml').content)
  66. # Ensuring the right sitemaps namespaces are present.
  67. urlset = doc.firstChild
  68. self.assertEqual(urlset.getAttribute(u'xmlns'), u'http://www.sitemaps.org/schemas/sitemap/0.9')
  69. self.assertEqual(urlset.getAttribute(u'xmlns:geo'), u'http://www.google.com/geo/schemas/sitemap/1.0')
  70. # Making sure the correct number of feed URLs were included.
  71. urls = urlset.getElementsByTagName('url')
  72. self.assertEqual(len(feed_dict), len(urls))
  73. for url in urls:
  74. self.assertChildNodes(url, ['loc', 'geo:geo'])
  75. # Making sure the 'geo:format' element was properly set to 'georss'.
  76. geo_elem = url.getElementsByTagName('geo:geo')[0]
  77. geo_format = geo_elem.getElementsByTagName('geo:format')[0]
  78. self.assertEqual('georss', geo_format.childNodes[0].data)