Skip to content

Commit

Permalink
Merge branch 'refactor-tests' into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
asfaltboy committed Apr 26, 2020
2 parents ba51e69 + 422a1b8 commit 41271b7
Show file tree
Hide file tree
Showing 17 changed files with 410 additions and 328 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ tests/db.sqlite*
.DS_Store
.pytest_cache
/tests/local.db
/.venv
2 changes: 1 addition & 1 deletion advanced_filters/form_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

logger = logging.getLogger('advanced_filters.form_helpers')

extra_spaces_pattern = re.compile('\s+')
extra_spaces_pattern = re.compile(r'\s+')


class VaryingTypeCharField(forms.CharField):
Expand Down
23 changes: 12 additions & 11 deletions advanced_filters/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -253,17 +253,18 @@ def get_fields_from_model(self, model, fields):
"""
model_fields = {}
for field in fields:
if isinstance(field, tuple) and len(field) == 2:
field, verbose_name = field[0], field[1]
else:
try:
model_field = get_fields_from_path(model, field)[-1]
verbose_name = model_field.verbose_name
except (FieldDoesNotExist, IndexError, TypeError) as e:
logger.warn("AdvancedFilterForm: skip invalid field "
"- %s", e)
continue
model_fields[field] = verbose_name
if isinstance(field, tuple) and len(field) == 2:
field, verbose_name = field[0], field[1]
else:
try:
model_field = get_fields_from_path(model, field)[-1]
verbose_name = model_field.verbose_name
except (FieldDoesNotExist, IndexError, TypeError) as e:
logger.warning(
"AdvancedFilterForm: skip invalid field - %s", e
)
continue
model_fields[field] = verbose_name
return model_fields

def __init__(self, *args, **kwargs):
Expand Down
3 changes: 0 additions & 3 deletions advanced_filters/tests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
from .test_models import *
from .test_q_serializer import *
from .test_views import *
13 changes: 13 additions & 0 deletions advanced_filters/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import pytest
from tests.factories import SalesRepFactory


@pytest.fixture
def user(db):
return SalesRepFactory()


@pytest.fixture()
def client(client, user):
client.force_login(user)
return client
10 changes: 10 additions & 0 deletions advanced_filters/tests/factories.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import factory

from tests.factories import SalesRepFactory


class AdvancedFilterFactory(factory.django.DjangoModelFactory):
model = 'customers.Client'

class Meta:
model = 'advanced_filters.AdvancedFilter'
176 changes: 0 additions & 176 deletions advanced_filters/tests/test_admin.py

This file was deleted.

57 changes: 57 additions & 0 deletions advanced_filters/tests/test_admin_change_form.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import pytest
from django.contrib.auth.models import Permission
from django.db.models import Q

from ..models import AdvancedFilter
from .factories import AdvancedFilterFactory

try:
from django.urls import reverse
except ImportError: # Django < 2.0
from django.core.urlresolvers import reverse

URL_NAME_CHANGE = "admin:advanced_filters_advancedfilter_change"
URL_NAME_ADD = "admin:advanced_filters_advancedfilter_add"
URL_NAME_CLIENT_CHANGELIST = "admin:customers_client_changelist"


@pytest.fixture
def advanced_filter(user):
af = AdvancedFilterFactory.build(created_by=user)
af.query = Q(email__iexact="a@a.com")
af.save()
return af


def test_change_page_requires_perms(client, advanced_filter):
url = reverse(URL_NAME_CHANGE, args=(advanced_filter.pk,))
res = client.get(url)
assert res.status_code == 403


def test_change_page_renders(client, user, settings, advanced_filter):
user.user_permissions.add(Permission.objects.get(codename="change_advancedfilter"))
url = reverse(URL_NAME_CHANGE, args=(advanced_filter.pk,))

settings.ADVANCED_FILTER_EDIT_BY_USER = False
res = client.get(url)
assert res.status_code == 200


def test_change_and_goto(client, user, settings, advanced_filter):
user.user_permissions.add(Permission.objects.get(codename="change_advancedfilter"))
url = reverse(URL_NAME_CHANGE, args=(advanced_filter.pk,))
form_data = {"form-TOTAL_FORMS": 1, "form-INITIAL_FORMS": 0, "_save_goto": 1}
settings.ADVANCED_FILTER_EDIT_BY_USER = False
res = client.post(url, data=form_data)
assert res.status_code == 302
url = res["location"]
assert url.endswith("%s?_afilter=1" % reverse(URL_NAME_CLIENT_CHANGELIST))


def test_create_page_disabled(client, user):
user.user_permissions.add(Permission.objects.get(codename="add_advancedfilter"))
url = reverse(URL_NAME_ADD)
res = client.get(url)
assert res.status_code == 403
assert AdvancedFilter.objects.count() == 0
88 changes: 88 additions & 0 deletions advanced_filters/tests/test_creation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import pytest
from django.contrib.auth.models import Permission

from ..models import AdvancedFilter

try:
from django.urls import reverse_lazy
except ImportError: # Django < 2.0
from django.core.urlresolvers import reverse_lazy

URL_CLIENT_CHANGELIST = reverse_lazy("admin:customers_client_changelist")


def test_changelist_includes_form(user, settings, client):
user.user_permissions.add(Permission.objects.get(codename="change_client"))
settings.ADVANCED_FILTER_EDIT_BY_USER = False
res = client.get(URL_CLIENT_CHANGELIST)
assert res.status_code == 200
title = ["Create advanced filter"]
fields = ["First name", "Language", "Sales Rep"]
response_content = res.content.decode("utf-8")
for part in title + fields:
assert part in response_content


@pytest.fixture
def form_data():
return {
"form-TOTAL_FORMS": 1,
"form-INITIAL_FORMS": 0,
"action": "advanced_filters",
}


def test_create_form_validation(user, client, form_data):
user.user_permissions.add(Permission.objects.get(codename="change_client"))
res = client.post(URL_CLIENT_CHANGELIST, data=form_data)
assert res.status_code == 200
form = res.context_data["advanced_filters"]
assert "title" in form.errors
assert "__all__" in form.errors
assert form.errors["title"] == ["This field is required."]
assert form.errors["__all__"] == ["Error validating filter forms"]


@pytest.fixture()
def good_data(form_data):
form_data.update(
{
"title": "Test title",
"form-0-field": "language",
"form-0-operator": "iexact",
"form-0-value": "ru",
}
)
return form_data


@pytest.fixture()
def query():
return ["language__iexact", "ru"]


def test_create_form_valid(user, client, good_data, query):
assert AdvancedFilter.objects.count() == 0
user.user_permissions.add(Permission.objects.get(codename="change_client"))
res = client.post(URL_CLIENT_CHANGELIST, data=good_data)
assert res.status_code == 200
form = res.context_data["advanced_filters"]
assert form.is_valid()
assert AdvancedFilter.objects.count() == 1

created_filter = AdvancedFilter.objects.order_by("pk").last()

assert created_filter.title == good_data["title"]
assert list(created_filter.query.children[0]) == query

# save with redirect to filter
good_data["_save_goto"] = 1
res = client.post(URL_CLIENT_CHANGELIST, data=good_data)
assert res.status_code == 302
assert AdvancedFilter.objects.count() == 2

created_filter = AdvancedFilter.objects.order_by("pk").last()
url = res["location"]
assert url.endswith("%s?_afilter=%s" % (URL_CLIENT_CHANGELIST, created_filter.pk))

assert list(created_filter.query.children[0]) == query
Loading

0 comments on commit 41271b7

Please sign in to comment.