def test_04_correct_currencies_in_page(self): """ Коректність відораження валют на головній сторінці. Намагаємося відкрити головну сторінку "/" . Очікуємо, що статус відповіді буде "200 OK". Очікуємо, що кількість валют на сторінці дорівнює кількості валют в базі. Очікуємо, що коди валют співпадають з кодами валют в базі. Очікуємо, що назви валют співпадають з назвами валют в базі. """ request = b"GET / HTTP/1.0\n" out, err = run_amock(self.exchange_rate, request) response = str(out, encoding="utf-8") # Перевіряємо чи відкрилась сторінка self.assertEqual("200 OK", get_status(response)) # Отримуємо з фіктивної бази список кодів і назв валют expected_currencies = self.exchange_rate.get_currencies() # Множимо на 2, бо на сторінці вони дублюються expected_currencies_codes = [cur for cur, name in expected_currencies] * 2 expected_currencies_names = [name for cur, name in expected_currencies] * 2 # Шукаємо на сторінці коди і назви валют match_iter = re.finditer( r"<option value=\"(?P<code>.+?)\">(?P<name>.+?)</option>", response ) currencies_codes = [] currencies_names = [] for match in match_iter: currencies_codes.append(match.group("code")) currencies_names.append(match.group("name")) # Перевіряємо чи дорівнює кількість валют на сторінці кількості валют в базі self.assertCountEqual(expected_currencies_codes, currencies_codes) # Порівнюємо коди і назви валют на сторінці з відповідними в базі self.assertListEqual(expected_currencies_codes, currencies_codes) self.assertListEqual(expected_currencies_names, currencies_names)
def test_02_incorrect_path_status(self): """ Коректність статусу відповіді при неправильному шляху. Намагаємося відкрити сторінку "/incorrect/path". Очікуємо, що статус відповіді буде "404 NOT FOUND". """ request = b"GET /incorrect/path HTTP/1.0\n" out, err = run_amock(self.exchange_rate, request) response = str(out, encoding="utf-8") status = get_status(response) self.assertEqual("404 NOT FOUND", status)
def test_05_correct_path_without_data(self): request = (b"POST /operation_status HTTP/1.0\n" b"Content-Type: application/x-www-form-urlencoded\n\n" b"from=&to=&balls_1=3&balls_2=2") out, err = run_amock(self.match_results, request) response = str(out, encoding="utf-8") self.assertEqual("303 SEE OTHER", get_status(response)) match = re.search("Location: (?P<LOCATION>.+?)\n", response) self.assertFalse(match is None) location = match.group("LOCATION").rstrip() self.assertEqual(location, "/")
def test_01_correct_path_status(self): """ Коректність статусу відповіді при правильному шляху. Намагаємося відкрити головну сторінку "/" . Очікуємо, що статус відповіді буде "200 OK". """ # метод шлях версія протоколу # | | | # v v v request = b"GET / HTTP/1.0\n" # Запит на відкриття головної сторінки # Намагаємося отримати відповідь out, err = run_amock(self.exchange_rate, request) response = str(out, encoding="utf-8") # Розкодовуємо відповідь # print(response) # <-- Так виглядає відповідь status = get_status(response) # Шукаємо статус у відповіді # Перевіряємо чи справді статус відповіді є коректним self.assertEqual("200 OK", status)
def test_05_correct_exchange_rate_in_page(self): """ Коректність відображення курсу валют на сторінці валют. Робимо тест 3 рази. Вибираємо кількість одинись валюти. Вибираємо дві довільні валюти з фіктивної бази. Намагаємося відкрити сторінку валют "/currencies" за допомоою методу POST з даними про кількість і валюти. Очікуємо, що статус відповіді буде "200 OK". Очікуємо, що на сторінці буде присутній результат. Очікуємо, що значення отриманого курсу буде коректним. """ # Беремо з бази список валют currencies = [ cur for cur, name in self.exchange_rate.get_currencies() ] for _ in range(3): # Вибираємо значення і дві довільні валюти amount = random.randint(1, 100) cur1 = random.choice(currencies) cur2 = random.choice(currencies) # Створюємо рядок байті запиту для метода POST form_args = bytes( "amount={}&from={}&to={}".format(amount, cur1, cur2), encoding="utf-8" ) request = ( b"POST /exchange_rate HTTP/1.0\n" b"Content-Type: application/x-www-form-urlencoded\n\n" + form_args ) out, err = run_amock(self.exchange_rate, request) response = str(out, encoding="utf-8") # Перевіряємо чи відкрилась сторінка self.assertEqual("200 OK", get_status(response)) # Намагаємося знайти на сторінці результат match = re.search(r"<p>.+? = (?P<RESULT>\d+\.?\d*) .+?</p>", response) self.assertFalse(match is None) # Перевіряємо чи знайшли результат rate = float(match.group("RESULT")) # Знаходимо коректний курс валют expected_rate = round(self.exchange_rate.obtain_rate(cur1, cur2, amount), 2) # Перевіряємо рівність курсу валюти на сторінці з коректним курсом self.assertAlmostEqual(expected_rate, rate)
def test_03_correct_path_without_data(self): """ Коректність відповіді, якщо надіслати форму з неповними даними. Намагаємося відкрити сторінку "/currencies" за допомогою метода POST. Очікуємо, що відбудеться перенаправдлення, при цьому статус відповіді повинен бути "303 SEE OTHER", а до заголовків додано направлення "Location: /" """ request = ( b"POST /exchange_rate HTTP/1.0\n" # Наступний рядок потрібен для методу POST: # Тип даних, які насилаються b"Content-Type: application/x-www-form-urlencoded\n\n" # Дані, які надсилаються b"amount=&from=&to=" ) out, err = run_amock(self.exchange_rate, request) response = str(out, encoding="utf-8") self.assertEqual("303 SEE OTHER", get_status(response)) # Шукаємо в заголовок з ім'ям "Location" і отримуємо його вміст match = re.search("Location: (?P<LOCATION>.+?)\n", response) self.assertFalse(match is None) location = match.group("LOCATION").rstrip() # Перевіряємо чи здійснюється перенаправлення на головну сторінку self.assertEqual(location, "/")
def test_04_incorrect_path_status(self): request = b"GET /lalala_path HTTP/1.1" out, err = run_amock(self.match_results, request) response = str(out, encoding="utf-8") status = get_status(response) self.assertEqual("404 NOT FOUND", status)
def test_03_correct_path_status(self): request = b"GET / HTTP/1.1" out, err = run_amock(self.match_results, request) response = str(out, encoding="utf-8") status = get_status(response) self.assertEqual("200 OK", status)