class TestsMain: config = read_yaml(os.path.join(const.PROJECT, 'config.yaml')) url = config['site_url'] api_url = config['api_url'] driver: webdriver driver = None def setup_class(self): self.api = API(self.api_url) self.driver = config_and_run_browser(self.config) # для запуска локального браузера #self.driver = webdriver.Chrome(executable_path="/Users/arkuz/Repos/subscribe_tests/chromedriver") #self.driver.maximize_window() self.driver.get(self.url) self.main_page = MainPage(self.driver) def setup_method(self): # чистим БД перед каждым тестом self.api.delete_subscribers() self.driver.refresh() def teardown_class(self): self.driver.close() # тест проверяет успешную подписку с заполнением всех полей @pytest.mark.positive def test_add_subscriber_success(self): expected_res = { 'name': 'Ivanov Ivan', 'email': '*****@*****.**', 'time': True } time = '7d' self.main_page.subscribe_user( email=expected_res['email'], name=expected_res['name'], time=time, ) actual_res = self.main_page.get_row_data(1) assert actual_res == expected_res # тест проверяет успешную подписку с заполнением всех полей с невалидной датой подписки @pytest.mark.positive def test_add_subscriber_invalid_time(self): expected_res = { 'name': 'Ivanov Ivan', 'email': '*****@*****.**', 'time': False } time = 'unknown' self.main_page.subscribe_user( email=expected_res['email'], name=expected_res['name'], time=time, ) actual_res = self.main_page.get_row_data(1) assert actual_res == expected_res # тест проверяет, что подписка НЕ оформилась с незаполненным полем email @pytest.mark.negative def test_add_subscriber_invalid_email(self): data = {'name': 'Ivanov Ivan', 'email': '', 'time': '7d'} self.main_page.subscribe_user( email=data['email'], name=data['name'], time=data['time'], ) assert self.main_page.get_rows() is None # тест проверяет кнопку рефреша @pytest.mark.positive def test_refresh_button(self, add_subscriber_fixture): row_count = 3 add_subscriber_fixture(row_count) self.main_page.refresh_btn_click() assert len(self.main_page.get_rows()) == row_count # тест поверяет кнопку удаления @pytest.mark.positive def test_delete_button(self, add_subscriber_fixture): add_subscriber_fixture(7) self.main_page.refresh_btn_click() self.main_page.delete_btn_click() assert self.main_page.get_rows() is None # тест проверяет, что таблица отображает 5 последних добавленнх зписей @pytest.mark.positive def test_last_5_subscribers(self, add_subscriber_fixture): api_subscribers_list = add_subscriber_fixture(9) self.main_page.refresh_btn_click() ui_subscribers_list = self.main_page.get_rows_data() assert len(ui_subscribers_list) == 5 api_subscribers_list.reverse() expected_res = [] actual_res = [] for i in range(0, len(ui_subscribers_list)): expected_res.append({ 'email': api_subscribers_list[i]['email'], 'name': api_subscribers_list[i]['name'], }) actual_res.append({ 'email': ui_subscribers_list[i]['email'], 'name': ui_subscribers_list[i]['name'], }) assert actual_res == expected_res
class TestsSubscribe: config = read_yaml(os.path.join(const.PROJECT, 'config.yaml')) api_url = config['api_url'] def setup_class(self): self.api = API(self.api_url) def setup_method(self): # чистим БД перед каждым тестом self.api.delete_subscribers() # тест проверяет невозможность добавления подписчика без указния параметров @pytest.mark.negative def test_add_subscriber_empty_params(self): data = {} data = json.dumps(data) resp = self.api.add_subscriber(data) assert resp.status_code == STATUS_BAD assert resp.json()['message'] == 'Internal Server Error' # тест проверяет невозможность добавления подписчика с некорректным email @pytest.mark.negative def test_add_subscriber_email_invalid(self): email = tools.generate_random_string() data = {'email': email, 'name': 'Ivan', 'time': '7d'} data = json.dumps(data) resp = self.api.add_subscriber(data) assert resp.status_code == STATUS_OK assert resp.json( )['error'] == f"ValidationError (SubscriptionModel:None) (Invalid email address: {email}: ['email'])" # тест проверяет добавление подписчика при валидном email и остальных параметрах (пустых или заполненных, в том числе с длиной строки = 1000) @pytest.mark.positive @pytest.mark.parametrize("email,name,time,comment", [ (tools.generate_email(), '', '', ''), (tools.generate_email(), tools.generate_random_string(), '7d', tools.generate_random_string()), (tools.generate_email(), tools.generate_random_string(1000), tools.generate_random_string(1000), tools.generate_random_string(1000)), ]) def test_add_subscriber_with_email_and_any_params(self, email, name, time, comment): data = { 'email': email, 'name': name, 'time': time, 'comment': comment, } data = json.dumps(data) resp = self.api.add_subscriber(data) assert resp.status_code == STATUS_OK resp = resp.json() assert resp['id'] == self.api.get_subscribers().json()[0]['id'] # тест проверяет удаление подписчиков @pytest.mark.positive def test_delete_subscribers(self, add_subscriber_fixture): count = 5 add_subscriber_fixture(count) resp = self.api.delete_subscribers() assert resp.status_code == STATUS_OK resp = resp.json() assert resp['removed'] == count assert not self.api.get_subscribers().json() # тест проверяет получение списка подписчиков @pytest.mark.positive def test_get_subscribers(self, add_subscriber_fixture): expected_subs = add_subscriber_fixture(5) expected_keys = expected_subs[0] resp = self.api.get_subscribers() assert resp.status_code == STATUS_OK actual_subs = resp.json() assert len(actual_subs) == len(expected_subs) # проверяем, что ключи и значения добавленных подписчиков есть в актуальном ответе сервера for item in actual_subs: for k, v in item.items(): if k in expected_keys: assert tools.is_items_exist_in_list_of_dict( expected_subs, k, v) # тест проверяет корректность сроков подписки # невалидные параметры устанавливают expired_at == created_at @pytest.mark.positive @pytest.mark.parametrize("time,delta_sec", [ ('unknown', 0.0), ('6y', 0.0), ('23', 0.0), ('1D', 0.0), ('22H', 0.0), ('105M', 0.0), ('50S', 0.0), ('1d', 86400.0), ('22h', 79200.0), ('105m', 6300.0), ('50s', 50.0), ]) def test_check_subscribe_time(self, time, delta_sec): data = { 'email': tools.generate_email(), 'name': tools.generate_random_string(), 'time': time, } data = json.dumps(data) self.api.add_subscriber(data) resp = self.api.get_subscribers().json()[0] created_at = isoparser.parse(resp['created_at']) expired_at = isoparser.parse(resp['expired_at']) # вычисляем срок подписки в секундах и допускаем разницу между датами в 0.5 секунды delta = expired_at - created_at acceptable_delta = abs(delta.total_seconds() - delta_sec) assert 0 <= acceptable_delta <= 0.5