Advertisement
Korotkodul

person_test

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