PageRenderTime 1253ms CodeModel.GetById 19ms RepoModel.GetById 2ms app.codeStats 0ms

/tests/cases/resources/tests/concept.py

https://github.com/cbmi/serrano
Python | 276 lines | 246 code | 22 blank | 8 comment | 0 complexity | 09f0e1f571d3a3a33a3960ef709e3dff MD5 | raw file
  1. import json
  2. from django.test.utils import override_settings
  3. from restlib2.http import codes
  4. from avocado.models import DataConcept, DataConceptField, DataField, \
  5. DataCategory
  6. from avocado.events.models import Log
  7. from .base import BaseTestCase
  8. class ConceptResourceTestCase(BaseTestCase):
  9. def setUp(self):
  10. super(ConceptResourceTestCase, self).setUp()
  11. self.name_field = DataField.objects.get_by_natural_key(
  12. 'tests', 'title', 'name')
  13. self.salary_field = DataField.objects.get_by_natural_key(
  14. 'tests', 'title', 'salary')
  15. self.boss_field = DataField.objects.get_by_natural_key(
  16. 'tests', 'title', 'boss')
  17. cat = DataCategory(name='Test', published=True, order=1.0)
  18. cat.save()
  19. c1 = DataConcept(name='Title', published=True, category=cat)
  20. c1.save()
  21. DataConceptField(concept=c1, field=self.name_field, order=1).save()
  22. DataConceptField(concept=c1, field=self.salary_field, order=2).save()
  23. DataConceptField(concept=c1, field=self.boss_field, order=3).save()
  24. # Not published
  25. c2 = DataConcept(name='Salary', category=cat)
  26. c2.save()
  27. DataConceptField(concept=c2, field=self.salary_field, order=1).save()
  28. DataConceptField(concept=c2, field=self.boss_field, order=2).save()
  29. c3 = DataConcept(name='Name', published=True, category=cat)
  30. c3.save()
  31. DataConceptField(concept=c3, field=self.name_field, order=1).save()
  32. self.c1 = c1
  33. self.c2 = c2
  34. self.c3 = c3
  35. def test_get_all(self):
  36. response = self.client.get('/api/concepts/',
  37. HTTP_ACCEPT='application/json')
  38. self.assertEqual(response.status_code, codes.ok)
  39. self.assertEqual(len(json.loads(response.content)), 2)
  40. self.assertEqual(response['Link-Template'], (
  41. '<http://testserver/api/concepts/{id}/>; rel="self"'
  42. ))
  43. def test_get_all_unrelated(self):
  44. # Publish unrelated field and concept
  45. f = DataField.objects.get(model_name='unrelated')
  46. f.published = True
  47. f.save()
  48. c = DataConcept(name='Unrelated', published=True)
  49. c.save()
  50. DataConceptField(concept=c, field=f, order=1).save()
  51. # Concept from two unrelated fields.. this will never show.
  52. # TODO don't allow this
  53. c = DataConcept(name='Unrelated', published=True)
  54. c.save()
  55. DataConceptField(concept=c, field=f, order=1).save()
  56. DataConceptField(concept=c, field=self.boss_field, order=2).save()
  57. # Still 2 concepts visible by default tree
  58. response = self.client.get('/api/concepts/',
  59. HTTP_ACCEPT='application/json')
  60. self.assertEqual(response.status_code, codes.ok)
  61. self.assertEqual(len(json.loads(response.content)), 2)
  62. # 1 concept visible for unrelated tree
  63. response = self.client.get('/api/concepts/?tree=unrelated',
  64. HTTP_ACCEPT='application/json')
  65. self.assertEqual(response.status_code, codes.ok)
  66. self.assertEqual(len(json.loads(response.content)), 1)
  67. def test_get_all_category_sort(self):
  68. # Create some temporary concepts and categories.
  69. cat1 = DataCategory(name='Category1', order=2.0, published=True)
  70. cat1.save()
  71. c1 = DataConcept(name='B', published=True, category=cat1, order=1)
  72. c1.save()
  73. field1 = DataConceptField(concept=c1, field=self.name_field, order=1)
  74. field1.save()
  75. c2 = DataConcept(name='C', published=True, category=cat1, order=2)
  76. c2.save()
  77. field2 = DataConceptField(concept=c2, field=self.name_field, order=1)
  78. field2.save()
  79. c3 = DataConcept(name='A', published=True, category=cat1, order=3)
  80. c3.save()
  81. field3 = DataConceptField(concept=c3, field=self.name_field, order=1)
  82. field3.save()
  83. # Check that category ordering is happening by default.
  84. response = self.client.get('/api/concepts/',
  85. HTTP_ACCEPT='application/json')
  86. self.assertEqual(response.status_code, codes.ok)
  87. self.assertEqual(len(json.loads(response.content)), 5)
  88. names = [concept.get('name', '') for concept in
  89. json.loads(response.content)]
  90. self.assertEqual(names, ['Title', 'Name', 'B', 'C', 'A'])
  91. # Reverse the ordering of the categories.
  92. response = self.client.get('/api/concepts/',
  93. {'order': 'desc'},
  94. HTTP_ACCEPT='application/json')
  95. self.assertEqual(response.status_code, codes.ok)
  96. self.assertEqual(len(json.loads(response.content)), 5)
  97. names = [concept.get('name', '') for concept in
  98. json.loads(response.content)]
  99. self.assertEqual(names, ['B', 'C', 'A', 'Title', 'Name'])
  100. # Order by concept name in addition to category.
  101. response = self.client.get('/api/concepts/',
  102. {'sort': 'name'},
  103. HTTP_ACCEPT='application/json')
  104. self.assertEqual(response.status_code, codes.ok)
  105. self.assertEqual(len(json.loads(response.content)), 5)
  106. names = [concept.get('name', '') for concept in
  107. json.loads(response.content)]
  108. self.assertEqual(names, ['Name', 'Title', 'A', 'B', 'C'])
  109. # Reverse the name and category sorting.
  110. response = self.client.get('/api/concepts/',
  111. {'sort': 'name', 'order': 'desc'},
  112. HTTP_ACCEPT='application/json')
  113. self.assertEqual(response.status_code, codes.ok)
  114. self.assertEqual(len(json.loads(response.content)), 5)
  115. names = [concept.get('name', '') for concept in
  116. json.loads(response.content)]
  117. self.assertEqual(names, ['C', 'B', 'A', 'Title', 'Name'])
  118. c1.delete()
  119. c2.delete()
  120. c3.delete()
  121. field1.delete()
  122. field2.delete()
  123. field3.delete()
  124. cat1.delete()
  125. def test_get_all_name_sort(self):
  126. response = self.client.get('/api/concepts/',
  127. {'sort': 'name'},
  128. HTTP_ACCEPT='application/json')
  129. self.assertEqual(response.status_code, codes.ok)
  130. self.assertEqual(len(json.loads(response.content)), 2)
  131. names = [concept.get('name', '') for concept in
  132. json.loads(response.content)]
  133. self.assertEqual(names, ['Name', 'Title'])
  134. response = self.client.get('/api/concepts/',
  135. {'sort': 'name', 'order': 'desc'},
  136. HTTP_ACCEPT='application/json')
  137. self.assertEqual(response.status_code, codes.ok)
  138. self.assertEqual(len(json.loads(response.content)), 2)
  139. names = [concept.get('name', '') for concept in
  140. json.loads(response.content)]
  141. self.assertEqual(names, ['Title', 'Name'])
  142. def test_get_all_limit(self):
  143. # Name and title are both published but with the limit param set below
  144. # we should only get one back.
  145. response = self.client.get('/api/concepts/',
  146. {'limit': 1},
  147. HTTP_ACCEPT='application/json')
  148. self.assertEqual(response.status_code, codes.ok)
  149. self.assertEqual(len(json.loads(response.content)), 1)
  150. @override_settings(SERRANO_CHECK_ORPHANED_FIELDS=True)
  151. def test_get_all_orphan(self):
  152. # Orphan one of the fields of the concepts we are about to retrieve.
  153. DataField.objects.filter(pk=self.salary_field.pk) \
  154. .update(field_name='XXX')
  155. with self.settings(SERRANO_CHECK_ORPHANED_FIELDS=True):
  156. response = self.client.get('/api/concepts/',
  157. HTTP_ACCEPT='application/json')
  158. self.assertEqual(response.status_code, codes.ok)
  159. self.assertEqual(len(json.loads(response.content)), 1)
  160. with self.settings(SERRANO_CHECK_ORPHANED_FIELDS=False):
  161. response = self.client.get('/api/concepts/',
  162. HTTP_ACCEPT='application/json')
  163. self.assertEqual(response.status_code, codes.ok)
  164. self.assertEqual(len(json.loads(response.content)), 2)
  165. def test_get_one(self):
  166. response = self.client.get('/api/concepts/999/',
  167. HTTP_ACCEPT='application/json')
  168. self.assertEqual(response.status_code, codes.not_found)
  169. response = self.client.get('/api/concepts/{0}/'.format(self.c3.pk),
  170. HTTP_ACCEPT='application/json')
  171. self.assertEqual(response.status_code, codes.ok)
  172. self.assertTrue(json.loads(response.content))
  173. event = Log.objects.filter(event='read', object_id=self.c3.pk)
  174. self.assertTrue(event.exists())
  175. @override_settings(SERRANO_CHECK_ORPHANED_FIELDS=True)
  176. def test_get_one_orphan(self):
  177. # Orphan one of the fields on the concept before we retrieve it.
  178. DataField.objects.filter(pk=self.salary_field.pk) \
  179. .update(field_name='XXX')
  180. with self.settings(SERRANO_CHECK_ORPHANED_FIELDS=True):
  181. response = self.client.get('/api/concepts/{0}/'.format(self.c1.pk),
  182. HTTP_ACCEPT='application/json')
  183. self.assertEqual(response.status_code, codes.internal_server_error)
  184. with self.settings(SERRANO_CHECK_ORPHANED_FIELDS=False):
  185. response = self.client.get('/api/concepts/{0}/'.format(self.c1.pk),
  186. HTTP_ACCEPT='application/json')
  187. self.assertEqual(response.status_code, codes.ok)
  188. def test_search(self):
  189. response = self.client.get('/api/concepts/?query=XYZ',
  190. HTTP_ACCEPT='application/json')
  191. self.assertEqual(response.status_code, codes.ok)
  192. self.assertEqual(len(json.loads(response.content)), 0)
  193. response = self.client.get('/api/concepts/?query=itle',
  194. HTTP_ACCEPT='application/json')
  195. self.assertEqual(response.status_code, codes.ok)
  196. self.assertEqual(len(json.loads(response.content)), 1)
  197. # Orphan one of the fields on the concept we are searching for.
  198. DataField.objects.filter(pk=self.name_field.pk) \
  199. .update(field_name='XXX')
  200. with self.settings(SERRANO_CHECK_ORPHANED_FIELDS=True):
  201. response = self.client.get('/api/concepts/?query=itle',
  202. HTTP_ACCEPT='application/json')
  203. self.assertEqual(response.status_code, codes.ok)
  204. self.assertEqual(len(json.loads(response.content)), 0)
  205. with self.settings(SERRANO_CHECK_ORPHANED_FIELDS=False):
  206. response = self.client.get('/api/concepts/?query=itle',
  207. HTTP_ACCEPT='application/json')
  208. self.assertEqual(response.status_code, codes.ok)
  209. self.assertEqual(len(json.loads(response.content)), 1)
  210. def test_get_privileged(self):
  211. # Superuser sees everything
  212. self.client.login(username='root', password='password')
  213. response = self.client.get('/api/concepts/?unpublished=1',
  214. HTTP_ACCEPT='application/json')
  215. self.assertEqual(len(json.loads(response.content)), 3)
  216. response = self.client.get('/api/concepts/{0}/?unpublished=1'
  217. .format(self.c2.pk),
  218. HTTP_ACCEPT='application/json')
  219. self.assertEqual(response.status_code, codes.ok)
  220. self.assertTrue(json.loads(response.content))
  221. # Make sure the unpublished concepts are only exposed when explicitly
  222. # asked for even when a superuser makes the request.
  223. response = self.client.get('/api/concepts/',
  224. HTTP_ACCEPT='application/json')
  225. self.assertEqual(len(json.loads(response.content)), 2)
  226. response = self.client.get('/api/concepts/{0}/'.format(self.c2.pk),
  227. HTTP_ACCEPT='application/json')
  228. self.assertEqual(response.status_code, codes.not_found)