Advertisement
Korotkodul

person_test_mistake2

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