Skip to content
This repository has been archived by the owner on Mar 19, 2024. It is now read-only.

HW1 #52

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open

HW1 #52

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
267 changes: 178 additions & 89 deletions poetry.lock

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ pytest-randomly = "^3.15"
pytest-timeout = "^2.1"
hypothesis = "^6.84"
django-test-migrations = "^1.3"
mimesis = "*"
httpretty = "*"
django-fakery = "*"

django-stubs = { version = "^4.2", extras = ["compatible-mypy"] }
types-requests = "^2.31"
Expand Down
3 changes: 3 additions & 0 deletions setup.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,9 @@ filterwarnings =
ignore::DeprecationWarning:password_reset.*:
ignore::DeprecationWarning:pytest_freezegun:

markers =
picture_fetch_limit_data


[coverage:run]
# Coverage configuration:
Expand Down
3 changes: 3 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,9 @@
pytest_plugins = [
# Should be the first custom one:
'plugins.django_settings',
'plugins.mocks.identity',
'plugins.mocks.pictures',
'plugins.mocks.user',

# TODO: add your own plugins here!
]
52 changes: 52 additions & 0 deletions tests/plugins/mocks/identity.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import json
import re
from http import HTTPStatus
from typing import TYPE_CHECKING
from urllib.parse import urljoin

import httpretty
import pytest
from mimesis import Field, Locale

if TYPE_CHECKING:
from server.common.django.types import Settings


DEFAULT_SEED = 0xFF


@pytest.fixture()
def lead_create_response():
"""Mock LeadResponse on creation."""
mf = Field(locale=Locale.RU, seed=DEFAULT_SEED)
return str(mf('numeric.increment'))


@pytest.fixture()
def mock_lead_create(settings: 'Settings', lead_create_response):
"""Mock Lead creation."""
with httpretty.enabled(allow_net_connect=False):
httpretty.register_uri(
httpretty.POST,
urljoin(
settings.PLACEHOLDER_API_URL,
'users',
),
status=HTTPStatus.CREATED,
body=json.dumps({'id': lead_create_response}),
)
yield lead_create_response
assert httpretty.has_request()


@pytest.fixture()
def mock_lead_update(settings: 'Settings'):
"""Mock Lead update."""
with httpretty.enabled(allow_net_connect=False):
httpretty.register_uri(
httpretty.PATCH,
re.compile(urljoin(settings.PLACEHOLDER_API_URL, r'users/\d+')),
status=HTTPStatus.OK,
)
yield httpretty
assert httpretty.has_request()
79 changes: 79 additions & 0 deletions tests/plugins/mocks/pictures.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import json
from http import HTTPStatus
from typing import TYPE_CHECKING
from urllib.parse import urljoin

import httpretty
import pytest
from django_fakery.faker_factory import Factory
from mimesis import Field, Locale

from server.apps.pictures.models import FavouritePicture

if TYPE_CHECKING:
from server.common.django.types import Settings
DEFAULT_SEED = 0xFF


@pytest.fixture()
def user_fav_factory(
fakery: Factory[FavouritePicture],
user_factory,
):
"""Mock user fav."""
def decorator(**fields) -> FavouritePicture:
fields.setdefault('user', user_factory())
return fakery.m(
FavouritePicture,
)(
**fields,
)

return decorator


@pytest.fixture()
def user_favs_factory(
user_fav_factory,
):
"""Mock user favs."""
def decorator(nfavs: int = 1, **fields) -> FavouritePicture:
return [user_fav_factory(**fields) for _ in range(nfavs)]

return decorator


@pytest.fixture()
def picture_response():
"""Mock PictureFetch response."""
def factory(limit=1):
mf = Field(locale=Locale.RU, seed=DEFAULT_SEED)
return [
{
'id': str(mf('numeric.increment')),
'url': mf('internet.uri'),
} for _ in range(limit)
]
return factory


@pytest.fixture()
def mock_picture_fetch(request, settings: 'Settings', picture_response):
"""Mock PictureFetch call."""
limit = 1
marker = request.node.get_closest_marker('picture_fetch_limit_data')
if marker:
limit = marker.args[0]
resp = picture_response(limit=limit)
with httpretty.enabled(allow_net_connect=False):
httpretty.register_uri(
httpretty.GET,
urljoin(
settings.PLACEHOLDER_API_URL,
'photos',
),
status=HTTPStatus.OK,
body=json.dumps(resp),
)
yield resp
assert httpretty.has_request()
26 changes: 26 additions & 0 deletions tests/plugins/mocks/user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import pytest
from django_fakery.faker_factory import Factory
from faker import Faker

from server.apps.identity.models import User


@pytest.fixture()
def user_factory(fakery: Factory[User], faker: Faker):
"""Fixture to create your own custom users. Everything is customizable."""

def factory(user: User, password: str) -> User:
# We store the original password for test purposes only:
user._password = password # noqa: WPS437
return user

def decorator(**fields) -> User:
password = fields.setdefault('password', faker.password())
return fakery.m(
User,
post_save=[lambda user: factory(user, password)],
)(
**{'is_active': True, **fields},
)

return decorator
Empty file added tests/test_apps/__init__.py
Empty file.
Empty file.
20 changes: 20 additions & 0 deletions tests/test_apps/test_identity/test_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from http import HTTPStatus

import pytest
from django.test import Client


@pytest.mark.django_db()
@pytest.mark.parametrize(('url_to_check', 'expected_status'), [
('/identity/login', HTTPStatus.OK),
('/identity/logout', HTTPStatus.FOUND),
('/identity/registration', HTTPStatus.OK),
('/identity/update', HTTPStatus.FOUND),
])
def test_urls(
client: Client, url_to_check: str, expected_status: HTTPStatus,
) -> None:
"""Test ensures that app urls are accessible."""
response = client.get(url_to_check)

assert response.status_code == expected_status
37 changes: 37 additions & 0 deletions tests/test_apps/test_identity/test_usecases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
import pytest

from server.apps.identity.container import container
from server.apps.identity.logic.usecases.user_create_new import UserCreateNew
from server.apps.identity.logic.usecases.user_update import UserUpdate
from server.apps.identity.models import User


@pytest.mark.django_db()
def test_create_user(user_factory):
"""Test user creation."""
user = user_factory()

assert user.is_active


@pytest.mark.django_db()
def test_create_new_user(user_factory, mock_lead_create):
"""Test create new user with lead."""
user_create_new = container.instantiate(UserCreateNew)
user = user_factory()

user_create_new(user)

user = User.objects.get(email=user.email)
assert user.lead_id == int(mock_lead_create)


@pytest.mark.django_db()
def test_update_user_lead(user_factory, mock_lead_update):
"""Test update user lead."""
lead_id = '2'
user_update = container.instantiate(UserUpdate)
user = user_factory(lead_id=int(lead_id))

user_update(user)
assert mock_lead_update.last_request().url.endswith(lead_id)
Empty file.
18 changes: 18 additions & 0 deletions tests/test_apps/test_pictures/test_urls.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from http import HTTPStatus

import pytest
from django.test import Client


@pytest.mark.django_db()
@pytest.mark.parametrize(('url_to_check', 'expected_status'), [
('/pictures/dashboard', HTTPStatus.FOUND),
('/pictures/favourites', HTTPStatus.FOUND),
])
def test_urls(
client: Client, url_to_check: str, expected_status: HTTPStatus,
) -> None:
"""Test ensures that app urls are accessible."""
response = client.get(url_to_check)

assert response.status_code == expected_status
30 changes: 30 additions & 0 deletions tests/test_apps/test_pictures/test_usecases.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import pytest

from server.apps.pictures.container import container
from server.apps.pictures.logic.usecases.favourites_list import FavouritesList
from server.apps.pictures.logic.usecases.pictures_fetch import PicturesFetch


@pytest.mark.django_db()
def test_list_favs(user_favs_factory, user_factory):
"""Test favs list."""
user = user_factory()
user_favs_factory(user=user)
list_favourites = container.instantiate(FavouritesList)

user_favs = list_favourites(user.id)

assert len(user_favs) == 1


@pytest.mark.django_db()
@pytest.mark.picture_fetch_limit_data(2)
def test_create_new_user(mock_picture_fetch):
"""Test fetch picture."""
fetch = container.instantiate(PicturesFetch)

fetched = fetch(limit=2)

assert len(fetched) == 2
pics = mock_picture_fetch
assert len(fetched) == len(pics)
Loading