Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
Add tests
Adds a number of tests to get decent test coverage (87%). Updates tox.ini to install both requirements.txt and requirements_test.txt
- Loading branch information
1 parent
6f760e5
commit 8c06b06
Showing
14 changed files
with
224 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
from django.test import TestCase | ||
|
||
from ner_trainer.conf import settings, DEFAULTS | ||
|
||
|
||
class SettingsTests(TestCase): | ||
def test_default_settings(self): | ||
for setting_name, default_value in DEFAULTS.items(): | ||
self.assertEqual(getattr(settings, setting_name), default_value) | ||
|
||
def test_nonexistant_setting(self): | ||
with self.assertRaises(AttributeError): | ||
settings.BANANA |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
from django.test import TestCase | ||
from ner_trainer.forms import ModelTestForm | ||
|
||
|
||
class ModelTestFormTests(TestCase): | ||
def test_invalid_model_test_form(self): | ||
""" | ||
Ensure a ModelTestForm instance without text is invalid. | ||
""" | ||
form = ModelTestForm() | ||
self.assertFalse(form.is_valid()) | ||
|
||
def test_valid_model_test_form(self): | ||
""" | ||
Ensure a ModelTestForm instance with text is valid. | ||
""" | ||
form = ModelTestForm({'text': 'This is a sentence'}) | ||
self.assertTrue(form.is_valid()) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
#!/usr/bin/env python | ||
# -*- coding: utf-8 -*- | ||
|
||
""" | ||
test_django-ner-trainer | ||
------------ | ||
Tests for `django-ner-trainer` models module. | ||
""" | ||
|
||
from django.core.exceptions import ValidationError | ||
from django.test import TestCase | ||
|
||
from ner_trainer.validators import validate_all_caps | ||
|
||
|
||
class TestValidators(TestCase): | ||
def test_validate_all_caps(self): | ||
good_label = 'PROVINCE' | ||
self.assertEqual(validate_all_caps(good_label), None) | ||
|
||
bad_label = 'province' | ||
with self.assertRaises(ValidationError): | ||
validate_all_caps(bad_label) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,115 @@ | ||
import shutil | ||
from django.core.management import call_command | ||
from rest_framework import status | ||
from rest_framework.test import APITestCase | ||
|
||
from ner_trainer.models import ( | ||
Entity, | ||
Phrase, | ||
) | ||
|
||
|
||
class EntityTests(APITestCase): | ||
def test_entity_list(self): | ||
""" | ||
Ensure we can list Entity objects. | ||
""" | ||
for i in range(5): | ||
name = 'Entity {}'.format(i) | ||
label = 'ENTITY_{}'.format(i) | ||
Entity.objects.create(name=name, label=label) | ||
response = self.client.get('/entities/', format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(len(response.data), 5) | ||
|
||
def test_entity_detail(self): | ||
""" | ||
Ensure we can detail an Entity object. | ||
""" | ||
Entity.objects.create(name='Banana', label='BANANA') | ||
response = self.client.get('/entities/BANANA/') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(response.data['name'], 'Banana') | ||
self.assertEqual(response.data['label'], 'BANANA') | ||
|
||
|
||
class PhraseTests(APITestCase): | ||
@classmethod | ||
def setUpClass(cls): | ||
super(PhraseTests, cls).setUpClass() | ||
|
||
def test_phrase_list(self): | ||
""" | ||
Ensure we can list Phrase objects. | ||
""" | ||
Phrase.objects.create(text='Phrase 1') | ||
response = self.client.get('/phrases/', format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(len(response.data), 1) | ||
self.assertEqual(response.data[0]['text'], 'Phrase 1') | ||
|
||
def test_active_phrase_list(self): | ||
""" | ||
Ensure we can list active Phrase objects. | ||
""" | ||
phrases = [] | ||
for i in range(10): | ||
text = 'Phrase {}'.format(i) | ||
phrases.append(Phrase(text=text)) | ||
Phrase.objects.bulk_create(phrases) | ||
response = self.client.get('/phrases/active/', format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(len(response.data), 10) | ||
self.assertEqual(response.data[0]['text'], 'Phrase 0') | ||
self.assertEqual(response.data[-1]['text'], 'Phrase 9') | ||
|
||
def test_tagged_phrase_list(self): | ||
""" | ||
Ensure we can list tagged Phrase objects. | ||
""" | ||
phrase = Phrase.objects.create(text='I like London and Berlin.') | ||
entity = Entity.objects.create(label='LOC', name='Location') | ||
phrase.entities.create( | ||
entity=entity, | ||
start_index=7, | ||
end_index=13, | ||
) | ||
phrase.entities.create( | ||
entity=entity, | ||
start_index=18, | ||
end_index=24, | ||
) | ||
response = self.client.get('/phrases/tagged/', format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertEqual(len(response.data), 1) | ||
|
||
|
||
class NERModelTestViewTests(APITestCase): | ||
def test_get(self): | ||
response = self.client.get('/test-ner/') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
|
||
def test_post_with_text_without_model(self): | ||
data = {'text': 'This is a sentence.'} | ||
response = self.client.post('/test-ner/', data, format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertTrue('Could not find NER model' in response.data) | ||
|
||
def test_post_without_text(self): | ||
data = {} | ||
response = self.client.post('/test-ner/', data, format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
self.assertTrue('Missing required field' in response.data) | ||
|
||
def test_post_with_model(self): | ||
call_command('train_ner_model') | ||
text = 'This is a sentence.' | ||
data = {'text': text} | ||
response = self.client.post('/test-ner/', data, format='json') | ||
self.assertEqual(response.status_code, status.HTTP_200_OK) | ||
expected_response_data = { | ||
'text': 'This is a sentence.', | ||
'entities': [] | ||
} | ||
self.assertEqual(response.data, expected_response_data) | ||
shutil.rmtree('spacy_model', ignore_errors=True) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters