Advertisement
Korotkodul

person_test_mistake

Sep 27th, 2024 (edited)
7
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.42 KB | None | 0 0
  1. from dataclasses import dataclass, asdict
  2. from uuid import (
  3. UUID,
  4. uuid4,
  5. )
  6.  
  7.  
  8.  
  9. @dataclass
  10. class Person:
  11. """
  12. Информация о пользователе.
  13.  
  14. Attrs:
  15. login: логин пользователя.
  16. password: пароль пользователя.
  17. username: имя пользователя.
  18. metadata: дополнительные сведения о пользователе.
  19. """
  20. login: str = ""
  21. password: str = ""
  22. username: str = ""
  23. metadata: str = ""
  24.  
  25.  
  26.  
  27. class PersonDB:
  28. _database: dict[UUID, Person]
  29. _login_registry: set[str]
  30. _min_password_len = 10
  31.  
  32. def __init__(self) -> None:
  33. """Инициализирует базу данных."""
  34. self._database = {}
  35. self._login_registry = set()
  36.  
  37. def _check_password(self, password):
  38. """
  39. Пароль считается надежным, если
  40. пароль содержит хотя бы одну букву английского алфавита в верхнем регистре;
  41. пароль содержит хотя бы одну букву английского алфавита в нижнем регистре;
  42. пароль содержит хотя бы одну цифру от 0 до 9;
  43. пароль состоит не менее чем из 10 символов;
  44. пароль не содержит никаких символов, кроме разрешенных.
  45. """
  46. alph_lower = 'abcdefghijklmnopqrstuvwxyz'
  47. alph_upper = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  48. num = '0123456789'
  49. if len(password) < self._min_password_len:
  50. return False
  51. contains_alph_lower = False
  52. contains_alph_upper = False
  53. contains_num = False
  54. for l in password:
  55. if l in alph_lower:
  56. contains_alph_lower = True
  57. elif l in alph_upper:
  58. contains_alph_upper = True
  59. elif l in num:
  60. contains_num = True
  61. else:
  62. return False
  63. return contains_alph_lower and contains_alph_upper and contains_num
  64.  
  65. def _check_login(self, login):
  66. """
  67. Логин должен быть уникальным и содержать только английские буквы в верхнем и нижнем регистре, а также цифры от 0 до 9. Логин не может быть пустой строкой.
  68. """
  69. return login != '' and login.isalnum()
  70.  
  71. def _check_login_and_password(self, login, password):
  72. login_is_ok = self._check_login(login)
  73. if not login_is_ok:
  74. raise ValueError("incorrect login")
  75. if login in self._login_registry:
  76. raise ValueError("such login already exists")
  77. password_is_ok = self._check_password(password)
  78. if not password_is_ok:
  79. raise ValueError("incorrect password")
  80.  
  81. def create_person(self, person: Person) -> UUID:
  82. """
  83. Создает новую запись о пользователе в базе данных.
  84.  
  85. Args:
  86. person: данные о пользователе, которые будут помещены в БД.
  87.  
  88. Returns:
  89. UUID - идентификатор, который будет связан с созданной записью.
  90.  
  91. Raises:
  92. ValueError, если логин или пароль не удовлетворяют требованиям.
  93. """
  94. self._check_login_and_password(person.login, person.password)
  95. id = uuid4()
  96. if id in self._database:
  97. raise Exception("such id already exists")
  98. self._login_registry.add(person.login)
  99. self._database[id] = person
  100. return id
  101.  
  102. def read_person_info(self, person_id: UUID) -> Person:
  103. """
  104. Читает актуальные данные пользователя из базы данных.
  105.  
  106. Args:
  107. person_id: идентификатор пользователя в формате UUID.
  108.  
  109. Returns:
  110. Данные о пользователе, упакованные в структуру Person.
  111.  
  112. Raises:
  113. KeyError, если в базе данных нет пользователя с person_id.
  114. """
  115. if person_id not in self._database:
  116. raise KeyError("no person with such id")
  117. return self._database[person_id]
  118.  
  119. def update_person_info(self, person_id: UUID, person_info_new: Person) -> None:
  120. """
  121. Обновляет данные о пользователе.
  122.  
  123. Args:
  124. person_id: идентификатор пользователя в формате UUID.
  125. person_info_new: модель со значениями на обновление. Будут обновлены
  126. только те поля, чье значение отличается от пустой строки '',
  127. остальные поля будут оставлены без изменений.
  128.  
  129. Raises:
  130. ValueError, если при обновлении логина или пароля логин или пароль
  131. не прошли этап валидации.
  132. KeyError, если в базе данных нет пользователя с person_id.
  133. """
  134. if person_id not in self._database:
  135. raise KeyError("no person with such id")
  136. self._check_login_and_password(person_info_new.login, person_info_new.password)
  137. old_login = self._database[person_id].login
  138. new_person = Person()
  139. dict_helper = asdict(self._database[person_id])
  140. print("dict_helper")
  141. print(dict_helper)
  142. #сли копироавть каждое поле отдельно - то там будет ссылка или значение копироваться?
  143. #как надо было без dict_helper?
  144. new_person.login = dict_helper['login']
  145. new_person.password = dict_helper['password']
  146. new_person.username = dict_helper['username']
  147. new_person.metadata = dict_helper['metadata']
  148. if person_info_new.login != '':
  149. self._login_registry.remove(old_login)
  150. new_person.login = person_info_new.login
  151. self._login_registry.add(new_person.login)
  152. if person_info_new.password != '':
  153. new_person.password = person_info_new.password
  154. if person_info_new.username != '':
  155. new_person.username = person_info_new.username
  156. if person_info_new.metadata != '':
  157. new_person.metadata = person_info_new.metadata
  158. self._database[person_id] = new_person
  159.  
  160. def delete_person(self, person_id: UUID) -> None:
  161. """
  162. Удаляет запись о пользователе.
  163.  
  164. Args:
  165. person_id: идентификатор пользователя в формате UUID.
  166.  
  167. Raises:
  168. KeyError, если в базе данных нет пользователя с person_id.
  169. """
  170. if person_id not in self._database:
  171. raise KeyError("no person with such id")
  172. self._database.pop(person_id)
  173.  
  174. person1 = Person(
  175. password="Aa1Bb2Cc3Dd4",
  176. login="login1",
  177. username="user#1",
  178. )
  179.  
  180. database = PersonDB()
  181. person1_id = database.create_person(person1)
  182.  
  183. assert len(database._database) == 1
  184. assert len(database._login_registry) == 1
  185. assert person1_id in database._database
  186. assert person1.login in database._login_registry
  187. assert database._database[person1_id] == person1
  188.  
  189. persons_wrong = {
  190. "no-login": Person(
  191. password="Aa1Bb2Cc3Dd4",
  192. login="",
  193. username="user#2",
  194. ),
  195. "existed-login": Person(
  196. password="Aa1Bb2Cc3Dd4",
  197. login="login1",
  198. username="user#2",
  199. ),
  200. "too-short-password": Person(
  201. password="12345",
  202. login="login2",
  203. username="user#2",
  204. ),
  205. "no-lower": Person(
  206. password="A1B2C3D4E5F",
  207. login="login2",
  208. username="user#2",
  209. ),
  210. "no-upper": Person(
  211. password="a1b2c3d4e5f",
  212. login="login2",
  213. username="user#2",
  214. ),
  215. "no-digits": Person(
  216. password="aAbBcCdDeEf",
  217. login="login2",
  218. username="user#2",
  219. ),
  220. }
  221.  
  222. for test_name, wrong_person in persons_wrong.items():
  223. try:
  224. database.create_person(wrong_person)
  225. assert False, test_name
  226.  
  227. except ValueError:
  228. assert True
  229. assert len(database._database) == 1
  230. assert len(database._login_registry) == 1
  231.  
  232. person = database.read_person_info(person1_id)
  233. assert person1 == person
  234. assert len(database._database) == 1
  235. assert len(database._login_registry) == 1
  236.  
  237. try:
  238. fake_id = uuid4()
  239. person = database.read_person_info(fake_id)
  240. assert False
  241.  
  242. except KeyError:
  243. assert True
  244. assert len(database._database) == 1
  245. assert len(database._login_registry) == 1
  246.  
  247. person2 = Person(
  248. password="AaBbcC1234Dd",
  249. login="login2",
  250. username="user#2"
  251. )
  252. person2_id = database.create_person(person2)
  253. assert len(database._database) == 2
  254. assert len(database._login_registry) == 2
  255. assert person2_id in database._database
  256. assert person2.login in database._login_registry
  257. assert database._database[person2_id] == person2
  258.  
  259. person2_updated = Person(
  260. password="abcDEF123456",
  261. login="LOGIN2",
  262. username="user#2",
  263. )
  264. person2_update = Person(
  265. password="abcDEF123456",
  266. login="LOGIN2",
  267. username="",
  268. )
  269.  
  270. database.update_person_info(person2_id, person2_update)
  271. assert len(database._database) == 2
  272. assert len(database._login_registry) == 2
  273. assert person2_id in database._database
  274. assert person2.login not in database._login_registry
  275. assert person2_updated.login in database._login_registry
  276. assert database._database[person2_id] == person2_updated
  277.  
  278. try:
  279. fake_id = uuid4()
  280. database.delete_person(fake_id)
  281. assert False
  282.  
  283. except KeyError:
  284. assert True
  285. assert len(database._database) == 2
  286. assert len(database._login_registry) == 2
  287.  
  288. database.delete_person(person2_id)
  289. assert len(database._database) == 1
  290. assert len(database._login_registry) == 1
  291. assert person2_id not in database._database
  292. assert person2_updated.login not in database._login_registry
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement