Skip to content
Snippets Groups Projects
Commit 809d68d4 authored by martinburchell's avatar martinburchell
Browse files

Merge pull request #10 from aptivate/data-layer-techdebt

Data layer techdebt
parents f1e17f0c 9cf33b6e
No related branches found
No related tags found
No related merge requests found
import pytest
from .factories import ItemFactory
from taxonomies.tests.factories import TermFactory, TaxonomyFactory
@pytest.mark.django_db
def test_apply_term_replaces_term_for_categories():
item = ItemFactory()
taxonomy = TaxonomyFactory() # Ensure multiplicity = optional
term1 = TermFactory(taxonomy=taxonomy)
term2 = TermFactory(taxonomy=taxonomy)
assert taxonomy.is_optional
item.apply_term(term1)
assert list(item.terms.all()) == [term1]
item.apply_term(term2)
assert list(item.terms.all()) == [term2]
@pytest.mark.xfail
# I'm putting this here to explain some of my thinking.
@pytest.mark.django_db
def test_apply_term_adds_term_for_tags():
item = ItemFactory()
taxonomy = TaxonomyFactory() # Ensure multiplicity == multiple
term1 = TermFactory(taxonomy=taxonomy)
term2 = TermFactory(taxonomy=taxonomy)
assert taxonomy.is_multiple
item.apply_term(term1)
assert list(item.terms.all()) == [term1]
item.apply_term(term2)
assert set(item.terms.all()) == set([term1, term2])
......@@ -13,6 +13,13 @@ from ..views import add_items_categories
ReqFactory = RequestFactory()
@pytest.fixture
def term():
# TODO rewrite using transport.terms, etc.
taxonomy = TaxonomyFactory(name="Test Ebola Questions")
return TermFactory(taxonomy=taxonomy, name="Vaccine")
@pytest.fixture
def terms():
# TODO rewrite using transport.terms, etc.
......@@ -31,6 +38,26 @@ def items():
]
@pytest.fixture
def item():
return transport.items.create({'body': 'test message one'})
@pytest.mark.django_db
def test_add_categories_adds_term_to_item(term, item):
category_list = [(item['id'], term.taxonomy.slug, term.name), ]
url = reverse('data-view-process')
request = ReqFactory.post(url, {'a': 'b'})
request = fix_messages(request)
add_items_categories(request, category_list)
[item_data] = transport.items.list()
[term_data] = item_data['terms']
assert term_data['name'] == term.name
assert term_data['taxonomy'] == term.taxonomy.slug
@pytest.mark.django_db
def test_add_items_categories_adds_term_to_items(terms, items):
url = reverse('data-view-process')
......
......@@ -70,6 +70,15 @@ def test_item_can_haz_category(term, item):
# TODO test for terms with the same name in different taxonomies
@pytest.mark.django_db
def test_categorize_item_returns_the_categorized_item(term, item):
result = categorize_item(item, term).data
assert result['id'] == item['id']
terms = result['terms']
assert term in terms
@pytest.mark.django_db
def test_categorize_item_fails_gracefully_if_term_not_found(item):
response = categorize_item(
......@@ -81,6 +90,15 @@ def test_categorize_item_fails_gracefully_if_term_not_found(item):
assert response.data['detail'] == "Term matching query does not exist."
@pytest.mark.django_db
def test_categorize_item_fails_gracefully_if_item_not_found(term, item):
unknown_item_id = 6 # I am not a prisoner
response = categorize_item({'id': unknown_item_id}, term)
assert response.status_code == status.HTTP_404_NOT_FOUND
assert response.data['detail'] == "Message matching query does not exist."
@pytest.mark.django_db
def test_only_one_category_per_item_per_taxonomy(item, term, second_term):
"""
......
......@@ -37,7 +37,12 @@ class ItemViewSet(viewsets.ModelViewSet, BulkDestroyModelMixin):
@detail_route(methods=['post'])
def add_term(self, request, item_pk):
item = Item.objects.get(pk=item_pk)
try:
item = Item.objects.get(pk=item_pk)
except Item.DoesNotExist as e:
data = {'detail': e.message}
return Response(data, status=status.HTTP_404_NOT_FOUND)
term_data = request.data
try:
term = Term.objects.by_taxonomy(
......@@ -49,8 +54,9 @@ class ItemViewSet(viewsets.ModelViewSet, BulkDestroyModelMixin):
return Response(data, status=status.HTTP_400_BAD_REQUEST)
item.apply_term(term)
data = {} # TODO should be the item containing the new term
return Response(data, status=status.HTTP_200_OK)
serializer = ItemSerializer(item)
return Response(serializer.data, status=status.HTTP_200_OK)
class TaxonomyViewSet(viewsets.ModelViewSet):
......
......@@ -82,7 +82,10 @@ class TermManager(models.Manager):
raise ValueError(
"taxonomy must be a Taxonomy instance "
"or a valid taxonomy slug")
return self.get(taxonomy__slug=taxonomy_slug, name=name)
return self.select_related('taxonomy').get(
taxonomy__slug=taxonomy_slug,
name=name
)
class Term(models.Model):
......
......@@ -113,4 +113,6 @@ def add_term(item_id, taxonomy_slug, name):
return response.data
else:
response.data['status_code'] = response.status_code
response.data['term'] = term
response.data['item_id'] = item_id
raise TransportException(response.data)
......@@ -3,9 +3,7 @@ import pytest
from data_layer.models import Item
from taxonomies.tests.factories import (
TaxonomyFactory,
TermFactory)
from taxonomies.tests.factories import TermFactory
from transport import items
from ..exceptions import TransportException
......@@ -42,3 +40,19 @@ def test_add_term_fails_if_term_does_not_exist(item_data):
assert error['status_code'] == 400
assert error['detail'] == "Term matching query does not exist."
assert error['term']['name'] == "unknown term name"
@pytest.mark.django_db
def test_add_term_fails_if_item_does_not_exist():
with pytest.raises(TransportException) as excinfo:
term = TermFactory()
unknown_item_id = 6 # I am a Free Man
items.add_term(unknown_item_id, term.taxonomy.slug, term.name)
error = excinfo.value.message
assert error['status_code'] == 404
assert error['detail'] == "Message matching query does not exist."
# TODO: assert error['detail'] == "Item matching query does not exist."
assert error['item_id'] == unknown_item_id
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment