tests.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from decimal import Decimal, InvalidOperation
  4. from django.core.exceptions import ImproperlyConfigured, ValidationError
  5. from django.forms.renderers import get_default_renderer
  6. from django.test import TestCase
  7. from django.test.utils import override_settings
  8. from treasuremap.backends.base import BaseMapBackend
  9. from treasuremap.backends.google import GoogleMapBackend
  10. from treasuremap.backends.yandex import YandexMapBackend
  11. from treasuremap.fields import LatLong, LatLongField
  12. from treasuremap.forms import LatLongField as FormLatLongField
  13. from treasuremap.utils import get_backend, import_class
  14. from treasuremap.widgets import AdminMapWidget, MapWidget
  15. from .models import MyModel
  16. class LatLongObjectTestCase(TestCase):
  17. def test_create_empty_latlong(self):
  18. latlong = LatLong()
  19. self.assertEqual(latlong.latitude, 0.0)
  20. self.assertEqual(latlong.longitude, 0.0)
  21. def test_create_latlog_with_float(self):
  22. latlong = LatLong(latitude=33.300, longitude=44.440)
  23. self.assertEqual(latlong.latitude, Decimal(33.300))
  24. self.assertEqual(latlong.longitude, Decimal(44.440))
  25. def test_create_latlog_with_string(self):
  26. latlong = LatLong(latitude="33.300", longitude="44.440")
  27. self.assertEqual(latlong.latitude, Decimal("33.300"))
  28. self.assertEqual(latlong.longitude, Decimal("44.440"))
  29. def test_create_latlog_with_invalid_value(self):
  30. self.assertRaises(InvalidOperation, LatLong, "not int", 44.440)
  31. def test_latlog_object_str(self):
  32. latlong = LatLong(latitude=33.300, longitude=44.440)
  33. self.assertEqual(str(latlong), "33.300000;44.440000")
  34. def test_latlog_object_repr(self):
  35. latlong = LatLong(latitude=33.300, longitude=44.440)
  36. self.assertEqual(repr(latlong), "LatLong(33.300000, 44.440000)")
  37. def test_latlog_object_eq(self):
  38. self.assertEqual(
  39. LatLong(latitude=33.300, longitude=44.440), LatLong(latitude=33.300, longitude=44.440)
  40. )
  41. def test_latlog_object_ne(self):
  42. self.assertNotEqual(
  43. LatLong(latitude=33.300, longitude=44.441), LatLong(latitude=22.300, longitude=44.441)
  44. )
  45. class LatLongFieldTestCase(TestCase):
  46. def test_latlog_field_create(self):
  47. m = MyModel.objects.create()
  48. new_m = MyModel.objects.get(pk=m.pk)
  49. self.assertEqual(new_m.empty_point, LatLong())
  50. self.assertEqual(new_m.null_point, None)
  51. self.assertEqual(new_m.default_point, LatLong(33, 44))
  52. def test_latlog_field_change_with_latlog_obj(self):
  53. m = MyModel.objects.create(empty_point=LatLong(22.123456, 33.654321))
  54. new_m = MyModel.objects.get(pk=m.pk)
  55. self.assertEqual(new_m.empty_point, LatLong(22.123456, 33.654321))
  56. def test_latlog_field_change_with_string(self):
  57. m = MyModel.objects.create(empty_point="22.123456;33.654321")
  58. new_m = MyModel.objects.get(pk=m.pk)
  59. self.assertEqual(new_m.empty_point, LatLong(22.123456, 33.654321))
  60. def test_latlog_field_change_invalid_value(self):
  61. self.assertRaises(ValidationError, MyModel.objects.create, empty_point="22.12345633.654321")
  62. def test_get_prep_value_convert(self):
  63. field = LatLongField()
  64. self.assertEqual(field.get_prep_value(""), "")
  65. self.assertEqual(
  66. field.get_prep_value(LatLong(22.123456, 33.654321)), LatLong(22.123456, 33.654321)
  67. )
  68. self.assertIsNone(field.get_prep_value(None))
  69. def test_get_formfield(self):
  70. field = LatLongField()
  71. form_field = field.formfield()
  72. self.assertIsInstance(form_field, FormLatLongField)
  73. def test_deconstruct(self):
  74. field = LatLongField()
  75. _, _, args, kwargs = field.deconstruct()
  76. new_instance = LatLongField(*args, **kwargs)
  77. self.assertEqual(field.max_length, new_instance.max_length)
  78. class LoadBackendTestCase(TestCase):
  79. def test_load_google(self):
  80. backend = get_backend({"BACKEND": "treasuremap.backends.google.GoogleMapBackend"})
  81. self.assertEqual(backend.__class__.__name__, "GoogleMapBackend")
  82. def test_load_yandex(self):
  83. backend = get_backend({"BACKEND": "treasuremap.backends.yandex.YandexMapBackend"})
  84. self.assertEqual(backend.__class__.__name__, "YandexMapBackend")
  85. def test_load_failed(self):
  86. self.assertRaises(
  87. ImportError, get_backend, {"BACKEND": "treasuremap.backends.unknown.UnknownMapBackend"}
  88. )
  89. def test_load_without_backend(self):
  90. backend = get_backend({})
  91. self.assertEqual(backend.__class__.__name__, "GoogleMapBackend")
  92. def test_load_not_subclass_mapbackend(self):
  93. self.assertRaises(ImproperlyConfigured, get_backend, {"BACKEND": "django.test.TestCase"})
  94. class ImportClassTestCase(TestCase):
  95. def test_import_from_string(self):
  96. c = import_class("django.test.TestCase")
  97. self.assertEqual(c, TestCase)
  98. def test_import_from_string_none(self):
  99. with self.assertRaises(ImportError):
  100. import_class("django.test.NonModel")
  101. class BaseMapBackendTestCase(TestCase):
  102. def test_base_init(self):
  103. backend = BaseMapBackend()
  104. self.assertEqual(backend.NAME, None)
  105. self.assertEqual(backend.API_URL, None)
  106. def test_base_get_js(self):
  107. backend = BaseMapBackend()
  108. self.assertRaises(ImproperlyConfigured, backend.get_js)
  109. def test_base_get_js_with_name(self):
  110. backend = BaseMapBackend()
  111. backend.NAME = "test"
  112. self.assertEqual(backend.get_js(), "treasuremap/default/js/jquery.treasuremap-test.js")
  113. def test_base_get_api_js(self):
  114. backend = BaseMapBackend()
  115. self.assertRaises(NotImplementedError, backend.get_api_js)
  116. def test_base_widget_template_default(self):
  117. backend = BaseMapBackend()
  118. self.assertEqual(backend.get_widget_template(), "treasuremap/widgets/map.html")
  119. @override_settings(TREASURE_MAP={"WIDGET_TEMPLATE": "template/custom.html"})
  120. def test_base_widget_template_custom(self):
  121. backend = BaseMapBackend()
  122. self.assertEqual(backend.get_widget_template(), "template/custom.html")
  123. def test_base_api_key_default(self):
  124. backend = BaseMapBackend()
  125. self.assertEqual(backend.API_KEY, None)
  126. @override_settings(TREASURE_MAP={"API_KEY": "random_string"})
  127. def test_base_api_key_settings(self):
  128. backend = BaseMapBackend()
  129. self.assertEqual(backend.API_KEY, "random_string")
  130. def test_base_only_map_default(self):
  131. backend = BaseMapBackend()
  132. self.assertEqual(backend.only_map, True)
  133. @override_settings(TREASURE_MAP={"ONLY_MAP": False})
  134. def test_base_only_map_settings(self):
  135. backend = BaseMapBackend()
  136. self.assertEqual(backend.only_map, False)
  137. def test_base_size_default(self):
  138. backend = BaseMapBackend()
  139. self.assertEqual(backend.width, 400)
  140. self.assertEqual(backend.height, 400)
  141. @override_settings(TREASURE_MAP={"SIZE": (500, 500)})
  142. def test_base_size_settings(self):
  143. backend = BaseMapBackend()
  144. self.assertEqual(backend.width, 500)
  145. self.assertEqual(backend.height, 500)
  146. @override_settings(TREASURE_MAP={"SIZE": ("Invalid",)})
  147. def test_base_size_invalid_settings(self):
  148. self.assertRaises(ImproperlyConfigured, BaseMapBackend)
  149. @override_settings(TREASURE_MAP={"ADMIN_SIZE": (500, 500)})
  150. def test_base_admin_size_settings(self):
  151. backend = BaseMapBackend()
  152. self.assertEqual(backend.admin_width, 500)
  153. self.assertEqual(backend.admin_height, 500)
  154. @override_settings(TREASURE_MAP={"ADMIN_SIZE": ("Invalid",)})
  155. def test_base_admin_size_invalid_settings(self):
  156. self.assertRaises(ImproperlyConfigured, BaseMapBackend)
  157. def test_base_map_options_default(self):
  158. backend = BaseMapBackend()
  159. self.assertDictEqual(
  160. backend.get_map_options(), {"latitude": 51.562519, "longitude": -1.603156, "zoom": 5}
  161. )
  162. @override_settings(
  163. TREASURE_MAP={"MAP_OPTIONS": {"latitude": 44.1, "longitude": -55.1, "zoom": 1}}
  164. )
  165. def test_base_map_options_settings(self):
  166. backend = BaseMapBackend()
  167. self.assertDictEqual(
  168. backend.get_map_options(), {"latitude": 44.1, "longitude": -55.1, "zoom": 1}
  169. )
  170. class GoogleMapBackendTestCase(TestCase):
  171. def test_get_api_js_default(self):
  172. backend = GoogleMapBackend()
  173. self.assertEqual(backend.get_api_js(), "//maps.googleapis.com/maps/api/js?v=3.exp")
  174. @override_settings(TREASURE_MAP={"API_KEY": "random_string"})
  175. def test_get_api_js_with_api_key(self):
  176. backend = GoogleMapBackend()
  177. self.assertEqual(
  178. backend.get_api_js(), "//maps.googleapis.com/maps/api/js?v=3.exp&key=random_string"
  179. )
  180. class YandexMapBackendTestCase(TestCase):
  181. def test_get_api_js(self):
  182. backend = YandexMapBackend()
  183. self.assertEqual(backend.get_api_js(), "//api-maps.yandex.ru/2.1/?lang=en-us")
  184. @override_settings(TREASURE_MAP={"API_KEY": "random_string"})
  185. def test_get_api_js_with_api_key(self):
  186. backend = YandexMapBackend()
  187. self.assertEqual(
  188. backend.get_api_js(), "//api-maps.yandex.ru/2.1/?lang=en-us&apikey=random_string"
  189. )
  190. class FormTestCase(TestCase):
  191. def test_witget_render(self):
  192. witget = MapWidget()
  193. done_html = """
  194. {"latitude": 51.562519, "longitude": -1.603156, "zoom": 5}
  195. """
  196. out_html = witget.render(
  197. "name", LatLong(22.123456, 33.654321), renderer=get_default_renderer()
  198. )
  199. self.assertTrue(out_html, done_html)
  200. def test_witget_render_js(self):
  201. witget = MapWidget()
  202. out_html = str(witget.media)
  203. self.assertIn("//maps.googleapis.com/maps/api/js?v=3.exp", out_html)
  204. self.assertIn("/static/treasuremap/default/js/jquery.treasuremap-google.js", out_html)
  205. def test_admin_witget_render(self):
  206. witget = AdminMapWidget()
  207. done_html = """
  208. {"latitude": 51.562519, "longitude": -1.603156, "zoom": 5}
  209. """
  210. out_html = witget.render(
  211. "name", LatLong(22.123456, 33.654321), renderer=get_default_renderer()
  212. )
  213. self.assertTrue(out_html, done_html)
  214. def test_admin_witget_render_js(self):
  215. witget = AdminMapWidget()
  216. out_html = str(witget.media)
  217. self.assertIn("//maps.googleapis.com/maps/api/js?v=3.exp", out_html)
  218. self.assertIn("/static/treasuremap/default/js/jquery.treasuremap-google.js", out_html)