PageRenderTime 74ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/cases/resources/tests/view.py

https://github.com/cbmi/serrano
Python | 323 lines | 233 code | 68 blank | 22 comment | 0 complexity | 486e449dcfd1f07923e78f18c769a615 MD5 | raw file
  1. import json
  2. from django.contrib.auth.models import User
  3. from django.contrib.contenttypes.models import ContentType
  4. from django.test import Client
  5. from restlib2.http import codes
  6. from avocado.history.models import Revision
  7. from avocado.models import DataView
  8. from .base import AuthenticatedBaseTestCase
  9. class ViewResourceTestCase(AuthenticatedBaseTestCase):
  10. def test_get_all(self):
  11. response = self.client.get('/api/views/',
  12. HTTP_ACCEPT='application/json')
  13. self.assertFalse(json.loads(response.content))
  14. self.assertEqual(
  15. response['Link-Template'],
  16. '<http://testserver/api/views/{id}/>; rel="self"'
  17. )
  18. def test_get_all_default(self):
  19. view = DataView(template=True, default=True, json=[])
  20. view.save()
  21. response = self.client.get('/api/views/',
  22. HTTP_ACCEPT='application/json')
  23. self.assertEqual(len(json.loads(response.content)), 1)
  24. def test_get(self):
  25. view = DataView(user=self.user)
  26. view.save()
  27. response = self.client.get('/api/views/{0}/'.format(view.pk),
  28. HTTP_ACCEPT='application/json')
  29. self.assertEqual(response.status_code, codes.ok)
  30. self.assertTrue(response.content)
  31. self.assertLess(view.accessed,
  32. DataView.objects.get(pk=view.pk).accessed)
  33. # Make sure that accessing a non-existent view returns a 404 error
  34. # indicating that it wasn't found.
  35. response = self.client.get('/api/views/999/',
  36. HTTP_ACCEPT='application/json')
  37. self.assertEqual(response.status_code, codes.not_found)
  38. def test_get_session(self):
  39. view = DataView(user=self.user, name='Session View', session=True)
  40. view.save()
  41. response = self.client.get('/api/views/session/',
  42. HTTP_ACCEPT='application/json')
  43. self.assertEqual(response.status_code, codes.ok)
  44. self.assertTrue(response.content)
  45. view.session = False
  46. view.save()
  47. response = self.client.get('/api/views/session/',
  48. HTTP_ACCEPT='application/json')
  49. self.assertEqual(response.status_code, codes.not_found)
  50. def test_post(self):
  51. # Attempt to create a new view using a POST request
  52. response = self.client.post('/api/views/',
  53. data=u'{"name":"POST View"}',
  54. content_type='application/json')
  55. self.assertEqual(response.status_code, codes.created)
  56. data = json.loads(response.content)
  57. # Make sure the changes from the POST request are persisted
  58. response = self.client.get('/api/views/{0}/'.format(data['id']),
  59. HTTP_ACCEPT='application/json')
  60. self.assertEqual(response.status_code, codes.ok)
  61. self.assertTrue(response.content)
  62. self.assertEqual(json.loads(response.content)['name'], 'POST View')
  63. # Make a POST request with invalid JSON and make sure we get an
  64. # unprocessable status code back.
  65. response = self.client.post('/api/views/',
  66. data=u'{"json":"[~][~]"}',
  67. content_type='application/json')
  68. self.assertEqual(response.status_code, codes.unprocessable_entity)
  69. def test_put(self):
  70. # Add a view so we can try to update it later
  71. view = DataView(user=self.user, name='Initial Name')
  72. view.save()
  73. response = self.client.get('/api/views/{0}/'.format(view.pk),
  74. HTTP_ACCEPT='application/json')
  75. self.assertEqual(response.status_code, codes.ok)
  76. self.assertTrue(response.content)
  77. # Attempt to update the name via a PUT request
  78. response = self.client.put('/api/views/{0}/'.format(view.pk),
  79. data=u'{"name":"New Name"}',
  80. content_type='application/json')
  81. self.assertEqual(response.status_code, codes.ok)
  82. # Make sure our changes from the PUT request are persisted
  83. response = self.client.get('/api/views/{0}/'.format(view.pk),
  84. HTTP_ACCEPT='application/json')
  85. self.assertEqual(response.status_code, codes.ok)
  86. self.assertTrue(response.content)
  87. self.assertEqual(json.loads(response.content)['name'], 'New Name')
  88. # Make a PUT request with invalid JSON and make sure we get an
  89. # unprocessable status code back.
  90. response = self.client.put('/api/views/{0}/'.format(view.pk),
  91. data=u'{"json":"]]]"}',
  92. content_type='application/json')
  93. self.assertEqual(response.status_code, codes.unprocessable_entity)
  94. def test_delete(self):
  95. view1 = DataView(user=self.user, name='View 1')
  96. view1.save()
  97. view2 = DataView(user=self.user, name='View 2')
  98. view2.save()
  99. view3 = DataView(user=self.user, name='View 3', session=True)
  100. view3.save()
  101. response = self.client.get('/api/views/',
  102. HTTP_ACCEPT='application/json')
  103. self.assertEqual(response.status_code, codes.ok)
  104. self.assertEqual(len(json.loads(response.content)), 3)
  105. response = self.client.delete('/api/views/{0}/'.format(view1.pk))
  106. self.assertEqual(response.status_code, codes.no_content)
  107. response = self.client.get('/api/views/',
  108. HTTP_ACCEPT='application/json')
  109. self.assertEqual(response.status_code, codes.ok)
  110. self.assertEqual(len(json.loads(response.content)), 2)
  111. response = self.client.delete('/api/views/{0}/'.format(view3.pk))
  112. self.assertEqual(response.status_code, codes.bad_request)
  113. response = self.client.get('/api/views/',
  114. HTTP_ACCEPT='application/json')
  115. self.assertEqual(response.status_code, codes.ok)
  116. self.assertEqual(len(json.loads(response.content)), 2)
  117. class ViewsRevisionsResourceTestCase(AuthenticatedBaseTestCase):
  118. def test_get(self):
  119. view = DataView(user=self.user)
  120. view.save()
  121. response = self.client.get('/api/views/revisions/',
  122. HTTP_ACCEPT='application/json')
  123. self.assertEqual(response.status_code, codes.ok)
  124. self.assertEqual(len(json.loads(response.content)), 1)
  125. response = self.client.get('/api/viewss/999/',
  126. HTTP_ACCEPT='application/json')
  127. self.assertEqual(response.status_code, codes.not_found)
  128. def test_user(self):
  129. view = DataView(user=self.user)
  130. view.save()
  131. user2 = User.objects.create_user(username='FAKE', password='ALSO_FAKE')
  132. view2 = DataView(user=user2)
  133. view2.save()
  134. self.assertEqual(Revision.objects.filter(
  135. content_type=ContentType.objects.get_for_model(DataView)).count(),
  136. 2)
  137. response = self.client.get('/api/views/revisions/',
  138. HTTP_ACCEPT='application/json')
  139. self.assertEqual(response.status_code, codes.ok)
  140. self.assertEqual(len(json.loads(response.content)), 1)
  141. def test_session(self):
  142. # This session mumbo-jumbo is from:
  143. # https://code.djangoproject.com/ticket/10899
  144. self.client = Client()
  145. from django.conf import settings
  146. from django.utils.importlib import import_module
  147. engine = import_module(settings.SESSION_ENGINE)
  148. store = engine.SessionStore()
  149. store.save() # we need to make load() work, or the cookie is worthless
  150. session_key = store.session_key
  151. self.client.cookies[settings.SESSION_COOKIE_NAME] = session_key
  152. view = DataView(session_key=self.client.session.session_key)
  153. view.save()
  154. view2 = DataView(session_key='XYZ')
  155. view2.save()
  156. self.assertEqual(Revision.objects.filter(
  157. content_type=ContentType.objects.get_for_model(DataView)).count(),
  158. 2)
  159. response = self.client.get('/api/views/revisions/',
  160. HTTP_ACCEPT='application/json')
  161. self.assertEqual(response.status_code, codes.ok)
  162. self.assertEqual(len(json.loads(response.content)), 1)
  163. def test_no_identifier(self):
  164. view = DataView()
  165. view.save()
  166. # Make sure the revision was created but has nothing useful in
  167. # either of the "owner" properties.
  168. self.assertEqual(Revision.objects.filter(
  169. content_type=ContentType.objects.get_for_model(DataView),
  170. user=None, session_key=None).count(), 1)
  171. # We want this request to come from an anonymous user
  172. self.client.logout()
  173. response = self.client.get('/api/views/revisions/',
  174. HTTP_ACCEPT='application/json')
  175. self.assertEqual(response.status_code, codes.ok)
  176. self.assertEqual(len(json.loads(response.content)), 0)
  177. def test_embedded(self):
  178. view = DataView(user=self.user, name='My View',
  179. description='This is not a descriptive description')
  180. view.save()
  181. # Retrieve the revisions the normal way and make sure the object
  182. # itself is not included.
  183. response = self.client.get('/api/views/revisions/',
  184. HTTP_ACCEPT='application/json')
  185. self.assertEqual(response.status_code, codes.ok)
  186. self.assertEqual(len(json.loads(response.content)), 1)
  187. no_embed_revision = json.loads(response.content)[0]
  188. self.assertFalse('object' in no_embed_revision)
  189. # Now retrieve the revisiosn with the embed flag enabled and verify
  190. # that the object is now included with the revision.
  191. response = self.client.get('/api/views/revisions/', {'embed': True},
  192. HTTP_ACCEPT='application/json')
  193. self.assertEqual(response.status_code, codes.ok)
  194. self.assertEqual(len(json.loads(response.content)), 1)
  195. embed_revision = json.loads(response.content)[0]
  196. self.assertTrue('object' in embed_revision)
  197. # Make sure the included object matches the copy of the object directly
  198. # from the object resource itself.
  199. response = self.client.get('/api/views/{0}/'.format(view.pk),
  200. HTTP_ACCEPT='application/json')
  201. self.assertEqual(response.status_code, codes.ok)
  202. revision_view = json.loads(response.content)
  203. self.assertEqual(revision_view, embed_revision['object'])
  204. class ViewRevisionsResourceTestCase(AuthenticatedBaseTestCase):
  205. def test_get(self):
  206. view = DataView(user=self.user)
  207. view.save()
  208. view.name = "Fake name"
  209. view.save()
  210. view.description = "Terribly vague description"
  211. view.save()
  212. url = '/api/views/{0}/revisions/'.format(view.id)
  213. response = self.client.get(url, HTTP_ACCEPT='application/json')
  214. self.assertEqual(response.status_code, codes.ok)
  215. self.assertEqual(len(json.loads(response.content)), 3)
  216. class ViewRevisionResourceTestCase(AuthenticatedBaseTestCase):
  217. def test_get(self):
  218. view = DataView(user=self.user)
  219. view.save()
  220. view.name = "Fake name"
  221. view.save()
  222. target_revision_id = Revision.objects.latest().pk
  223. view.description = "Terribly vague description"
  224. view.save()
  225. url = '/api/views/{0}/revisions/{1}/'.format(
  226. view.id, target_revision_id)
  227. response = self.client.get(url, HTTP_ACCEPT='application/json')
  228. self.assertEqual(response.status_code, codes.ok)
  229. self.assertTrue(response.content)
  230. revision = json.loads(response.content)
  231. self.assertEqual(revision['changes'], {
  232. 'name': {
  233. 'old_value': None,
  234. 'new_value': 'Fake name'
  235. }
  236. })
  237. self.assertFalse("description" in revision['changes'])
  238. def test_non_existent_object(self):
  239. view = DataView(user=self.user)
  240. view.save()
  241. view.name = "Fake name"
  242. view.save()
  243. target_revision_id = Revision.objects.latest().pk
  244. url = '/api/views/{0}/revisions/{1}/'.format(
  245. 123456789, target_revision_id)
  246. response = self.client.get(url, HTTP_ACCEPT='application/json')
  247. self.assertEqual(response.status_code, codes.not_found)
  248. def test_non_existent_revision(self):
  249. view = DataView(user=self.user)
  250. view.save()
  251. view.name = "Fake name"
  252. view.save()
  253. url = '/api/views/{0}/revisions/{1}/'.format(view.id, 123456789)
  254. response = self.client.get(url, HTTP_ACCEPT='application/json')
  255. self.assertEqual(response.status_code, codes.not_found)