Skip to content

Commit

Permalink
refs #107 Test mechanism about data validation through UrlProxy
Browse files Browse the repository at this point in the history
  • Loading branch information
moumoutte committed Oct 15, 2018
1 parent c233e09 commit a4b8e0d
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 2 deletions.
10 changes: 9 additions & 1 deletion demo/autocomplete.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@
from django.utils.encoding import force_text as text
from django.conf import settings

from agnocomplete.exceptions import SkipItem
from agnocomplete.register import register
from agnocomplete.core import (
AgnocompleteChoices,
AgnocompleteModel,
AgnocompleteUrlProxy,
)
from agnocomplete.exceptions import SkipItem

from .models import Person, Tag, ContextTag
from .common import COLORS
Expand Down Expand Up @@ -261,11 +261,19 @@ def items(self, query=None, **kwargs):

class AutocompleteUrlSkipItem(AutocompleteUrlSimple):

data_key = 'data'

def item(self, obj):
if obj['label'] == 'first person':
raise SkipItem
return super(AutocompleteUrlSkipItem, self).item(obj)

def get_item_url(self, pk):
return '{}{}'.format(
getattr(settings, 'HTTP_HOST', ''),
reverse_lazy('url-proxy:atomic-item', args=[pk])
)


# Registration
register(AutocompleteColor)
Expand Down
7 changes: 7 additions & 0 deletions demo/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,10 @@ def create_item(self, **kwargs):
Return the created model instance.
"""
return self.queryset.model.objects.create(**kwargs)


class AgnocompleteUrlProxyField(fields.AgnocompleteUrlProxyMixin,
fields.AgnocompleteField):
"""
Demo Field to use AutocompleteUrlProxy
"""
30 changes: 29 additions & 1 deletion demo/tests/test_fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

from django import forms, get_version
from django.urls import reverse
from django.test import TestCase
from django.test import LiveServerTestCase, TestCase, override_settings
from django.core.exceptions import ValidationError
import six

import mock

from agnocomplete import fields
from agnocomplete.exceptions import UnregisteredAgnocompleteException
from agnocomplete.fields import (
Expand All @@ -19,7 +22,9 @@
HiddenAutocompleteURLReverse,
AutocompleteTag,
AutocompletePersonDomain,
AutocompleteUrlSkipItem,
)
from demo.fields import AgnocompleteUrlProxyField
from demo.models import Tag, Person
from demo.tests import LoaddataTestCase

Expand Down Expand Up @@ -241,3 +246,26 @@ def test_render_no_selection(self):
)
html_form = "{}".format(form)
self.assertNotIn('<option', html_form)


@override_settings(HTTP_HOST='')
class FieldUrlProxyTest(LiveServerTestCase):

def test_clean_method(self):
person = AgnocompleteUrlProxyField(AutocompleteUrlSkipItem)
search_url = person.agnocomplete.get_item_url('2')
with mock.patch('demo.autocomplete.AutocompleteUrlSkipItem'
'.get_item_url') as mock_auto:
mock_auto.return_value = self.live_server_url + search_url
item = person.clean('2')

self.assertEqual(item, '2')

def test_clean_method_value_not_found(self):
# Value is filter through the `item` method
person = AgnocompleteUrlProxyField(AutocompleteUrlSkipItem)
search_url = person.agnocomplete.get_item_url('1')
with mock.patch('demo.autocomplete.AutocompleteUrlSkipItem'
'.get_item_url') as mock_auto:
mock_auto.return_value = self.live_server_url + search_url
self.assertRaises(ValidationError, person.clean, '1')
2 changes: 2 additions & 0 deletions demo/urls_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

urlpatterns = [
url(r'^item/(?P<pk>[0-9]+)$', views_proxy.item, name='item'),
url(r'^atomicitem/(?P<pk>[0-9]+)$', views_proxy.atomic_item,
name='atomic-item'),
url(r'^simple/$', views_proxy.simple, name='simple'),
url(r'^simple-post/$', views_proxy.simple_post, name='simple-post'),
url(r'^convert/$', views_proxy.convert, name='convert'),
Expand Down
19 changes: 19 additions & 0 deletions demo/views_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,3 +180,22 @@ def item(request, pk):
response = json.dumps(result)
logger.debug('response: `%s`', response)
return HttpResponse(response)


@require_GET
def atomic_item(request, pk):
"""
Similar to `item` but does not return a list
"""
data = None
for item in DATABASE:
if text(item['pk']) == text(pk):
data = convert_data(item)
break
if not data:
raise Http404("Unknown item `{}`".format(pk))
logger.debug('3rd item search: `%s`', pk)
result = {'data': data}
response = json.dumps(result)
logger.debug('response: `%s`', response)
return HttpResponse(response)

0 comments on commit a4b8e0d

Please sign in to comment.