Andrey-Volkovitskiy/python-project-83

View on GitHub
tests/test_url_id_page.py

Summary

Maintainability
A
0 mins
Test Coverage
from page_analyzer.app import app
from psycopg2.extras import NamedTupleCursor
from datetime import datetime
from flask import url_for
import os
import requests_mock
from tests import conftest


with app.test_request_context():
    CORRECT_URL = "http://gmail.com"
    INCORRECT_URL = "http://wrong.com"
    GET_PAGE = url_for('show_url', id=1)
    POST_PAGE = url_for('check', url_id=1)


def add_url_to_db(connection, url_name):
    '''Adds the url to test database'''
    with connection as conn:
        with conn.cursor(cursor_factory=NamedTupleCursor) as curs:
            created_at = datetime.utcnow()
            curs.execute("""INSERT INTO urls(name, created_at)
                            VALUES (%s, %s)""",
                         (url_name, created_at))


def test_basic_content(get_test_db):
    connection = get_test_db
    add_url_to_db(connection, CORRECT_URL)
    client = app.test_client()
    response = client.get(GET_PAGE)

    assert response.status_code == 200
    assert CORRECT_URL in response.text
    assert "Запустить проверку" in response.text


def test_missing_db_connection():
    conftest.missing_db_connection(GET_PAGE)


def test_check_correct_url(get_test_db):

    H1 = "Sign in"
    TITLE = "Gmail"
    DESCRIPTION = (
        "My Gmail is email that’s intuitive, efficient, and useful."
        " 15 GB of storage, less spam, and mobile access.")

    connection = get_test_db
    add_url_to_db(connection, CORRECT_URL)
    client = app.test_client()

    fixture_path = os.path.abspath(
        os.path.join(
            os.path.dirname(__file__), 'fixtures/gmail.html'))
    with open(fixture_path, 'r') as f:
        HTML = f.read()

    with requests_mock.Mocker() as m:
        m.get(CORRECT_URL, text=HTML)
        m.status_code = 200

        # 1st check
        pre_1st_time = datetime.utcnow()
        response1 = client.post(POST_PAGE, follow_redirects=True)
        assert response1.status_code == 200
        assert response1.request.path == GET_PAGE
        assert "Страница успешно проверена" in response1.text
        assert H1 in response1.text
        assert TITLE in response1.text
        assert DESCRIPTION in response1.text

        # 2nd check
        pre_2nd_time = datetime.utcnow()
        response2 = client.post(POST_PAGE, follow_redirects=True)
        assert response2.status_code == 200
        assert response2.request.path == GET_PAGE
        assert "Страница успешно проверена" in response2.text

        # database asserts
        db_records = get_all_db_records(connection)
        assert len(db_records) == 2
        assert db_records[0].url_id == db_records[1].url_id == 1
        assert db_records[0].status_code == db_records[1].status_code == 200
        assert db_records[0].h1 == db_records[1].h1 == H1
        assert db_records[0].title == db_records[1].title == TITLE
        assert db_records[0].description == DESCRIPTION
        assert db_records[1].description == DESCRIPTION
        assert pre_1st_time <= db_records[0].created_at <= pre_2nd_time
        assert pre_2nd_time <= db_records[1].created_at


def get_all_db_records(connection):
    '''Gets all rows from test database'''
    with connection as conn:
        with conn.cursor(cursor_factory=NamedTupleCursor) as curs:
            curs.execute("SELECT * FROM checks")
            return curs.fetchall()


def test_check_incorrect_url(get_test_db):

    connection = get_test_db
    add_url_to_db(connection, INCORRECT_URL)
    client = app.test_client()

    response = client.post(POST_PAGE, follow_redirects=True)
    assert response.status_code == 422
    assert response.request.path == GET_PAGE
    assert "Произошла ошибка при проверке" in response.text

    db_records = get_all_db_records(connection)
    assert len(db_records) == 0