PageRenderTime 93ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/tests/test_module_validate.py

https://gitlab.com/exarh-team/skaro-server
Python | 432 lines | 343 code | 44 blank | 45 comment | 0 complexity | 03a7d18028c9196a50f9ab6b576cef4c MD5 | raw file
  1. #!/usr/bin/env python
  2. # Skaro is the open standard for instant messaging
  3. # Copyright © 2017 Exarh Team
  4. #
  5. # This file is part of skaro-server.
  6. #
  7. # Skaro-server is free software: you can redistribute it and/or modify
  8. # it under the terms of the GNU General Public License as published by
  9. # the Free Software Foundation, either version 3 of the License, or
  10. # (at your option) any later version.
  11. #
  12. # This program is distributed in the hope that it will be useful,
  13. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. # GNU General Public License for more details.
  16. #
  17. # You should have received a copy of the GNU General Public License
  18. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. import unittest
  20. from modules import validate
  21. from datetime import datetime
  22. class ValidateTestCase(unittest.TestCase):
  23. def test_is_valid(self):
  24. self.assertTrue(
  25. validate.is_valid("login", validate.P_LOGIN)
  26. )
  27. self.assertTrue(
  28. validate.is_valid("мой-логин", validate.P_LOGIN)
  29. )
  30. self.assertFalse(
  31. validate.is_valid("login'", validate.P_LOGIN)
  32. )
  33. self.assertTrue(
  34. validate.is_valid("simplewithsymbol@example.com", validate.P_MAIL)
  35. )
  36. self.assertTrue(
  37. validate.is_valid("less.common@example.com", validate.P_MAIL)
  38. )
  39. self.assertTrue(
  40. validate.is_valid("a.little.more.unusual@dept.example.com", validate.P_MAIL)
  41. )
  42. self.assertTrue(
  43. validate.is_valid("!#$%&'*+-/=?^_`{}|~@example.org", validate.P_MAIL)
  44. )
  45. self.assertFalse(
  46. validate.is_valid("mail", validate.P_MAIL)
  47. )
  48. self.assertTrue(
  49. validate.is_valid("linux-4.9", validate.P_DEVICE_ID)
  50. )
  51. self.assertFalse(
  52. validate.is_valid("windows@localhost", validate.P_DEVICE_ID)
  53. )
  54. self.assertTrue(
  55. validate.is_valid("200 OK", validate.P_STATUS)
  56. )
  57. self.assertTrue(
  58. validate.is_valid("200", validate.P_STATUS)
  59. )
  60. self.assertFalse(
  61. validate.is_valid("Not found", validate.P_STATUS)
  62. )
  63. def test_arguments(self):
  64. #
  65. # test 1
  66. #
  67. def test_exception_1(a, info=False):
  68. self.assertEqual(
  69. info,
  70. " Значение должно быть указано"
  71. )
  72. @validate.arguments(error_handler=test_exception_1)
  73. def test_errors_1(parent, data: validate.DictSchema(
  74. type=validate.StringValue()
  75. )):
  76. self.fail(data)
  77. test_errors_1(self, None)
  78. #
  79. # test 2
  80. #
  81. def test_exception_2(a, info=False):
  82. self.assertEqual(
  83. info,
  84. " Значение должно быть ассоциативным массивом"
  85. )
  86. @validate.arguments(error_handler=test_exception_2)
  87. def test_errors_2(parent, data: validate.DictSchema(
  88. type=validate.StringValue()
  89. )):
  90. self.fail(data)
  91. test_errors_2(self, [])
  92. #
  93. # test 3
  94. #
  95. def test_exception_3(a, info=False):
  96. self.assertEqual(
  97. info,
  98. ["['chain_uuid'] Лишний ключ"]
  99. )
  100. @validate.arguments(error_handler=test_exception_3)
  101. def test_errors_3(parent, data: validate.DictSchema(
  102. type=validate.StringValue()
  103. )):
  104. self.fail(data)
  105. test_errors_3(self, {
  106. 'type': 'register_type',
  107. 'chain_uuid': "9"
  108. })
  109. #
  110. # test 4
  111. #
  112. def test_exception_4(a, info=False):
  113. self.assertCountEqual(
  114. info,
  115. ["['wrong_string'] Значение должно быть строкой",
  116. "['wrong_list'] Значение должно быть списком(массивом)",
  117. "['wrong_int'] Значение должно быть целым числом",
  118. "['wrong_numeric'] Значение должно быть числом",
  119. "['wrong_bool'] Значение должно быть либо True либо False",
  120. "['wrong_date'] Значение должно быть валидной временной меткой",
  121. "['wrong_dict'] Значение должно быть списком(массивом)"]
  122. )
  123. @validate.arguments(error_handler=test_exception_4)
  124. def test_errors_4(parent, data: validate.DictSchema(
  125. wrong_int=validate.IntValue(),
  126. wrong_numeric=validate.NumericValue(),
  127. wrong_bool=validate.BoolValue(),
  128. wrong_string=validate.StringValue(),
  129. wrong_list=validate.ListValue(),
  130. wrong_dict=validate.DictValue(),
  131. wrong_date=validate.DatetimeValue()
  132. )):
  133. self.fail(data)
  134. test_errors_4(self, {
  135. 'wrong_int': 1.1,
  136. 'wrong_numeric': 'num',
  137. 'wrong_bool': 11,
  138. 'wrong_string': 11,
  139. 'wrong_list': 11,
  140. 'wrong_dict': 11,
  141. 'wrong_date': 11
  142. })
  143. #
  144. # test 5
  145. #
  146. def test_exception_5(a, info=False):
  147. self.assertCountEqual(
  148. info,
  149. ["['wrong_date'] Значение должно быть заполнено",
  150. "['wrong_numeric'] Значение должно быть заполнено",
  151. "['wrong_dict'] Значение должно быть заполнено",
  152. "['wrong_int'] Значение должно быть заполнено",
  153. "['wrong_bool'] Значение должно быть заполнено",
  154. "['wrong_string'] Значение должно быть заполнено",
  155. "['wrong_list'] Значение должно быть заполнено"]
  156. )
  157. @validate.arguments(error_handler=test_exception_5)
  158. def test_errors_5(parent, data: validate.DictSchema(
  159. wrong_int=validate.IntValue(required=True),
  160. wrong_numeric=validate.NumericValue(required=True),
  161. wrong_bool=validate.BoolValue(required=True),
  162. wrong_string=validate.StringValue(required=True),
  163. wrong_list=validate.ListValue(required=True),
  164. wrong_dict=validate.DictValue(required=True),
  165. wrong_date=validate.DatetimeValue(required=True)
  166. )):
  167. self.fail(data)
  168. test_errors_5(self, {})
  169. #
  170. # test 6
  171. #
  172. def test_exception_6(a, info=False):
  173. self.fail(info)
  174. @validate.arguments(error_handler=test_exception_6)
  175. def test_errors_6(parent, data: validate.DictSchema(
  176. type=validate.StringValue(),
  177. chain_uuid=validate.StringValue(),
  178. login=validate.StringValue(
  179. required=True,
  180. max=255,
  181. pattern=validate.P_LOGIN
  182. ),
  183. number=validate.NumericValue(),
  184. is_true=validate.BoolValue(),
  185. hex_alphabet=validate.ListValue(),
  186. list_of_lists=validate.ListValue(
  187. item=validate.ListValue()
  188. ),
  189. val_dict=validate.DictValue(),
  190. date_now=validate.DatetimeValue()
  191. )):
  192. self.assertEqual(
  193. data,
  194. {
  195. 'type': 'register_type',
  196. 'chain_uuid': "9",
  197. 'login': 'user',
  198. 'number': 4815,
  199. 'is_true': True,
  200. 'hex_alphabet': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
  201. 'list_of_lists': [['a'], ['b'], ['c']],
  202. 'val_dict': {'key1': 1, 'key2': 2},
  203. 'date_now': datetime(2004, 9, 22, 13, 0, 38, 119173)
  204. }
  205. )
  206. test_errors_6(self, {
  207. 'type': 'register_type',
  208. 'chain_uuid': "9",
  209. 'login': "user",
  210. 'number': 4815,
  211. 'is_true': True,
  212. 'hex_alphabet': ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'],
  213. 'list_of_lists': [['a'], ['b'], ['c']],
  214. 'val_dict': {'key1': 1, 'key2': 2},
  215. 'date_now': datetime(2004, 9, 22, 13, 0, 38, 119173)
  216. })
  217. #
  218. # test int
  219. #
  220. def test_exception_int(a, info=False):
  221. self.assertCountEqual(
  222. info,
  223. ["['int_small'] Значение не должно быть меньше числа 10",
  224. "['int_big'] Значение не должно быть больше числа 100"]
  225. )
  226. @validate.arguments(error_handler=test_exception_int)
  227. def test_errors_int(parent, data: validate.DictSchema(
  228. int_big=validate.IntValue(
  229. max=100
  230. ),
  231. int_small=validate.IntValue(
  232. min=10
  233. )
  234. )):
  235. self.fail(data)
  236. test_errors_int(self, {
  237. 'int_big': 999,
  238. 'int_small': 0
  239. })
  240. #
  241. # test numeric
  242. #
  243. def test_exception_numeric(a, info=False):
  244. self.assertCountEqual(
  245. info,
  246. ["['numeric_small'] Значение не должно быть меньше длины 10",
  247. "['numeric_big'] Значение не должно быть больше длины 100"]
  248. )
  249. @validate.arguments(error_handler=test_exception_numeric)
  250. def test_errors_numeric(parent, data: validate.DictSchema(
  251. numeric_big=validate.NumericValue(
  252. max=100
  253. ),
  254. numeric_small=validate.NumericValue(
  255. min=10
  256. )
  257. )):
  258. self.fail(data)
  259. test_errors_numeric(self, {
  260. 'numeric_big': 999,
  261. 'numeric_small': 0.6
  262. })
  263. #
  264. # test string
  265. #
  266. def test_exception_string(a, info=False):
  267. self.assertCountEqual(
  268. info,
  269. ["['string_small'] Значение не должно быть меньше длины 10",
  270. "['string_big'] Значение не должно быть больше длины 10", "['string_pattern'] Значение не корректно"]
  271. )
  272. @validate.arguments(error_handler=test_exception_string)
  273. def test_errors_string(parent, data: validate.DictSchema(
  274. string_big=validate.StringValue(
  275. max=10
  276. ),
  277. string_small=validate.StringValue(
  278. min=10
  279. ),
  280. string_pattern=validate.StringValue(
  281. pattern=validate.P_LOGIN
  282. )
  283. )):
  284. self.fail(data)
  285. test_errors_string(self, {
  286. 'string_big': "long long string",
  287. 'string_small': "",
  288. 'string_pattern': "is not a login"
  289. })
  290. #
  291. # test list
  292. #
  293. def test_exception_list(a, info=False):
  294. self.assertCountEqual(
  295. info,
  296. ["['list_of_lists'][0] Значение должно быть строкой",
  297. "['list_big'] Количество элементов не должно быть больше длины 2",
  298. "['list_small'] Количество элементов не должно быть меньше длины 1"]
  299. )
  300. @validate.arguments(error_handler=test_exception_list)
  301. def test_errors_list(parent, data: validate.DictSchema(
  302. list_big=validate.ListValue(
  303. max=2
  304. ),
  305. list_small=validate.ListValue(
  306. min=1
  307. ),
  308. list_of_lists=validate.ListValue(
  309. item=validate.StringValue()
  310. ),
  311. )):
  312. self.fail(data)
  313. test_errors_list(self, {
  314. 'list_big': [1, 2, 3, 4],
  315. 'list_small': [],
  316. 'list_of_lists': [[1], [2]]
  317. })
  318. #
  319. # test dict
  320. #
  321. def test_exception_dict(a, info=False):
  322. self.assertCountEqual(
  323. info,
  324. ["['dict_values'][key1] Значение должно быть строкой",
  325. "['dict_small'] Количество элементов не должно быть меньше длины 1",
  326. "['dict_keys'][key1] Значение должно быть целым числом",
  327. "['dict_big'] Количество элементов не должно быть больше длины 2"]
  328. )
  329. @validate.arguments(error_handler=test_exception_dict)
  330. def test_errors_dict(parent, data: validate.DictSchema(
  331. dict_big=validate.DictValue(
  332. max=2
  333. ),
  334. dict_small=validate.DictValue(
  335. min=1
  336. ),
  337. dict_keys=validate.DictValue(
  338. keys=validate.IntValue()
  339. ),
  340. dict_values=validate.DictValue(
  341. values=validate.StringValue()
  342. )
  343. )):
  344. self.fail(data)
  345. test_errors_dict(self, {
  346. 'dict_big': {'key1': True, 'key2': False, 'key3': True},
  347. 'dict_small': {},
  348. 'dict_keys': {'key1': True},
  349. 'dict_values': {'key1': True}
  350. })
  351. #
  352. # test date
  353. #
  354. def test_exception_date(a, info=False):
  355. self.assertCountEqual(
  356. info,
  357. ["['date_small'] Значение не должно быть меньше даты 2014-09-22 13:00:38.119173",
  358. "['date_big'] Значение не должно быть больше даты 2014-09-22 13:00:38.119173"]
  359. )
  360. @validate.arguments(error_handler=test_exception_date)
  361. def test_errors_date(parent, data: validate.DictSchema(
  362. date_big=validate.DatetimeValue(
  363. max=datetime(2014, 9, 22, 13, 0, 38, 119173)
  364. ),
  365. date_small=validate.DatetimeValue(
  366. min=datetime(2014, 9, 22, 13, 0, 38, 119173)
  367. )
  368. )):
  369. self.fail(data)
  370. test_errors_date(self, {
  371. 'date_big': datetime(2024, 9, 22, 13, 0, 38, 119173),
  372. 'date_small': datetime(2000, 9, 22, 13, 0, 38, 119173)
  373. })
  374. if __name__ == '__main__':
  375. unittest.main()