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
Exemple #2
0
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