ibt2_tests.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #!/usr/bin/env python3
  2. """I'll Be There, 2 (ibt2) - tests
  3. Copyright 2016-2017 Davide Alberani <da@erlug.linux.it>
  4. RaspiBO <info@raspibo.org>
  5. Licensed under the Apache License, Version 2.0 (the "License");
  6. you may not use this file except in compliance with the License.
  7. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
  8. Unless required by applicable law or agreed to in writing, software
  9. distributed under the License is distributed on an "AS IS" BASIS,
  10. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. See the License for the specific language governing permissions and
  12. limitations under the License.
  13. """
  14. import unittest
  15. import requests
  16. import monco
  17. BASE_URL = 'http://localhost:3000/v1.1/'
  18. DB_NAME = 'ibt2_test'
  19. def dictInDict(d, dContainer):
  20. for k, v in d.items():
  21. if k not in dContainer:
  22. return False
  23. if v != dContainer[k]:
  24. return False
  25. return True
  26. class Ibt2Tests(unittest.TestCase):
  27. def setUp(self):
  28. self.monco_conn = monco.Monco(dbName=DB_NAME)
  29. self.connection = self.monco_conn.connection
  30. self.db = self.monco_conn.db
  31. self.db['attendees'].drop()
  32. self.db['days'].drop()
  33. self.db['groups'].drop()
  34. self.db['settings'].drop()
  35. self.db['users'].delete_one({'username': 'newuser'})
  36. self.db['users'].delete_one({'username': 'newuser2'})
  37. def tearDown(self):
  38. self.db['attendees'].drop()
  39. self.db['days'].drop()
  40. self.db['groups'].drop()
  41. self.db['settings'].drop()
  42. self.db['users'].delete_one({'username': 'newuser'})
  43. self.db['users'].delete_one({'username': 'newuser2'})
  44. def add_attendee(self, attendee):
  45. r = requests.post('%sattendees' % BASE_URL, json=attendee)
  46. r.raise_for_status()
  47. return r
  48. def test_add_attendee(self):
  49. attendee = {'name': 'A Name', 'day': '2017-01-15', 'group': 'A group'}
  50. r = self.add_attendee(attendee)
  51. rj = r.json()
  52. id_ = rj.get('_id')
  53. self.assertTrue(dictInDict(attendee, rj))
  54. r = requests.get(BASE_URL + 'attendees/' + id_)
  55. r.raise_for_status()
  56. rj = r.json()
  57. self.assertTrue(dictInDict(attendee, rj))
  58. def test_put_attendee(self):
  59. attendee = {'name': 'A Name', 'day': '2017-01-15', 'group': 'A group'}
  60. r = self.add_attendee(attendee)
  61. update = {'notes': 'A note'}
  62. r = requests.post(BASE_URL + 'attendees', json=attendee)
  63. r.raise_for_status()
  64. id_ = r.json().get('_id')
  65. r = requests.put(BASE_URL + 'attendees/' + id_, json=update)
  66. r.raise_for_status()
  67. r = requests.get('%s%s/%s' % (BASE_URL, 'attendees', id_))
  68. r.raise_for_status()
  69. rj = r.json()
  70. final = attendee.copy()
  71. final.update(update)
  72. self.assertTrue(dictInDict(final, rj))
  73. def test_delete_attendee(self):
  74. attendee = {'name': 'A Name', 'day': '2017-01-15', 'group': 'A group'}
  75. r = self.add_attendee(attendee)
  76. id_ = r.json().get('_id')
  77. r.connection.close()
  78. r = requests.delete(BASE_URL + 'attendees/' + id_)
  79. r.raise_for_status()
  80. self.assertTrue(r.json().get('success'))
  81. r.connection.close()
  82. def test_get_days(self):
  83. self.add_attendee({'day': '2017-01-15', 'name': 'A name', 'group': 'group A'})
  84. self.add_attendee({'day': '2017-01-16', 'name': 'A new name', 'group': 'group C'})
  85. self.add_attendee({'day': '2017-01-15', 'name': 'Another name', 'group': 'group A'})
  86. self.add_attendee({'day': '2017-01-15', 'name': 'Yet another name', 'group': 'group B'})
  87. r = requests.get(BASE_URL + 'days')
  88. r.raise_for_status()
  89. rj = r.json()
  90. self.assertEqual([x.get('day') for x in rj['days']], ['2017-01-15', '2017-01-16'])
  91. self.assertEqual([x.get('group') for x in rj['days'][0]['groups']], ['group A', 'group B'])
  92. self.assertTrue(len(rj['days'][0]['groups'][0]['attendees']) == 2)
  93. self.assertTrue(len(rj['days'][0]['groups'][1]['attendees']) == 1)
  94. self.assertEqual([x.get('group') for x in rj['days'][1]['groups']], ['group C'])
  95. self.assertTrue(len(rj['days'][1]['groups'][0]['attendees']) == 1)
  96. def test_get_days_summary(self):
  97. self.add_attendee({'day': '2017-01-15', 'name': 'A name', 'group': 'group A'})
  98. self.add_attendee({'day': '2017-01-16', 'name': 'A new name', 'group': 'group C'})
  99. self.add_attendee({'day': '2017-01-15', 'name': 'Another name', 'group': 'group A'})
  100. self.add_attendee({'day': '2017-01-15', 'name': 'Yet another name', 'group': 'group B'})
  101. r = requests.get(BASE_URL + 'days?summary=1')
  102. r.raise_for_status()
  103. rj = r.json()
  104. self.assertEqual(rj,
  105. {"days": [{"groups_count": 2, "day": "2017-01-15"}, {"groups_count": 1, "day": "2017-01-16"}]})
  106. def test_create_user(self):
  107. r = requests.post(BASE_URL + 'users', json={'username': 'newuser', 'password': 'ibt2'})
  108. r.raise_for_status()
  109. r.connection.close()
  110. s = self.login('newuser', 'ibt2')
  111. r = s.get(BASE_URL + 'users/current')
  112. r.raise_for_status()
  113. r.connection.close()
  114. def test_update_user(self):
  115. r = requests.post(BASE_URL + 'users', json={'username': 'newuser', 'password': 'ibt2'})
  116. r.raise_for_status()
  117. id_ = r.json()['_id']
  118. r = requests.post(BASE_URL + 'users', json={'username': 'newuser2', 'password': 'ibt2'})
  119. r.raise_for_status()
  120. id2_ = r.json()['_id']
  121. r = requests.put(BASE_URL + 'users/' + id_, json={'email': 't@example.com'})
  122. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  123. s = self.login('newuser', 'ibt2')
  124. r = s.put(BASE_URL + 'users/' + id_, json={'email': 'test@example.com'})
  125. r.raise_for_status()
  126. self.assertEqual(r.json().get('email'), 'test@example.com')
  127. r.connection.close()
  128. r = s.put(BASE_URL + 'users/' + id2_, json={'email': 'test@example.com'})
  129. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  130. r.connection.close()
  131. s = self.login('admin', 'ibt2')
  132. r = s.put(BASE_URL + 'users/' + id_, json={'email': 'test2@example.com'})
  133. r.raise_for_status()
  134. self.assertEqual(r.json().get('email'), 'test2@example.com')
  135. r.connection.close()
  136. def test_delete_user(self):
  137. r = requests.post(BASE_URL + 'users', json={'username': 'newuser', 'password': 'ibt2'})
  138. r.raise_for_status()
  139. id_ = r.json()['_id']
  140. r = requests.post(BASE_URL + 'users', json={'username': 'newuser2', 'password': 'ibt2'})
  141. r.raise_for_status()
  142. id2_ = r.json()['_id']
  143. r = requests.delete(BASE_URL + 'users/' + id_)
  144. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  145. r.connection.close()
  146. s = self.login('newuser', 'ibt2')
  147. r = s.delete(BASE_URL + 'users/' + id_)
  148. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  149. r.connection.close()
  150. r = s.delete(BASE_URL + 'users/' + id2_)
  151. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  152. r.connection.close()
  153. s = self.login('admin', 'ibt2')
  154. r = s.delete(BASE_URL + 'users/' + id2_)
  155. r.raise_for_status()
  156. r.connection.close()
  157. def test_duplicate_user(self):
  158. r = requests.post(BASE_URL + 'users', json={'username': 'newuser', 'password': 'ibt2'})
  159. r.raise_for_status()
  160. r = requests.post(BASE_URL + 'users', json={'username': 'newuser', 'password': 'ibt3'})
  161. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  162. def login(self, username, password):
  163. s = requests.Session()
  164. r = s.post(BASE_URL + 'login', json={'username': username, 'password': password})
  165. r.raise_for_status()
  166. r.connection.close()
  167. return s
  168. def test_created_by(self):
  169. s = self.login('admin', 'ibt2')
  170. r = s.get(BASE_URL + 'users/current')
  171. r.raise_for_status()
  172. user_id = r.json()['_id']
  173. r.connection.close()
  174. attendee = {'day': '2017-01-15', 'name': 'A name', 'group': 'group A'}
  175. r = s.post('%sattendees' % BASE_URL, json=attendee)
  176. r.raise_for_status()
  177. rj = r.json()
  178. self.assertEqual(user_id, rj['created_by'])
  179. self.assertEqual(user_id, rj['updated_by'])
  180. r.connection.close()
  181. def test_put_day(self):
  182. day = {'day': '2017-01-16', 'notes': 'A day note'}
  183. self.add_attendee({'day': '2017-01-16', 'name': 'A new name', 'group': 'group C'})
  184. r = requests.put(BASE_URL + 'days/2017-01-16/info', json=day)
  185. r.raise_for_status()
  186. rj = r.json()
  187. self.assertTrue(dictInDict(day, rj))
  188. r = requests.get(BASE_URL + 'days/2017-01-16')
  189. r.raise_for_status()
  190. rj = r.json()
  191. self.assertTrue(dictInDict(day, rj))
  192. def test_put_group(self):
  193. self.add_attendee({'day': '2017-01-16', 'name': 'A new name', 'group': 'A group'})
  194. group = {'group': 'A group', 'day': '2017-01-16', 'notes': 'A group note'}
  195. r = requests.put(BASE_URL + 'days/2017-01-16/groups/A group/info', json=group)
  196. r.raise_for_status()
  197. rj = r.json()
  198. self.assertTrue(dictInDict(group, rj))
  199. r = requests.get(BASE_URL + 'days/2017-01-16')
  200. r.raise_for_status()
  201. rj = r.json()
  202. self.assertTrue(dictInDict(group, rj['groups'][0]))
  203. def test_delete_group(self):
  204. self.add_attendee({'day': '2017-01-16', 'name': 'A new name', 'group': 'A group'})
  205. s = self.login('admin', 'ibt2')
  206. r = s.delete(BASE_URL + 'days/2017-01-16/groups/A group', params={'day': '2017-01-16', 'group': 'A group'})
  207. r.raise_for_status()
  208. rj = r.json()
  209. r.connection.close()
  210. r = requests.get(BASE_URL + 'days/2017-01-16')
  211. r.raise_for_status()
  212. rj = r.json()
  213. self.assertTrue(rj == {})
  214. r.connection.close()
  215. def test_settings(self):
  216. r = requests.get(BASE_URL + 'settings/non-existant')
  217. r.raise_for_status()
  218. rj = r.json()
  219. r.connection.close()
  220. self.assertEqual({'non-existant': None}, rj)
  221. settings = {'key1': 'value1', 'key2': 'value2'}
  222. r = requests.post(BASE_URL + 'settings', json=settings)
  223. self.assertRaises(requests.exceptions.HTTPError, r.raise_for_status)
  224. s = self.login('admin', 'ibt2')
  225. r = s.post(BASE_URL + 'settings', json=settings)
  226. r.raise_for_status()
  227. rj = r.json()
  228. r.connection.close()
  229. self.assertTrue('error' not in rj)
  230. r = requests.get(BASE_URL + 'settings')
  231. r.raise_for_status()
  232. rj = r.json()
  233. r.connection.close()
  234. self.assertEqual(rj, settings)
  235. r = requests.get(BASE_URL + 'settings/key1')
  236. r.raise_for_status()
  237. rj = r.json()
  238. r.connection.close()
  239. self.assertEqual(rj, {'key1': 'value1'})
  240. r = requests.get(BASE_URL + 'settings/key2')
  241. r.raise_for_status()
  242. rj = r.json()
  243. r.connection.close()
  244. self.assertEqual(rj, {'key2': 'value2'})
  245. r = s.put(BASE_URL + 'settings/key2', json={'key2': 'value3'})
  246. r.raise_for_status()
  247. rj = r.json()
  248. r.connection.close()
  249. self.assertTrue('error' not in rj)
  250. r = requests.get(BASE_URL + 'settings/key2')
  251. r.raise_for_status()
  252. rj = r.json()
  253. r.connection.close()
  254. self.assertEqual(rj, {'key2': 'value3'})
  255. if __name__ == '__main__':
  256. unittest.main(verbosity=2)