Skip to content

Commit 9687aa2

Browse files
authored
Merge pull request #7 from erik-sn/master
StrategySerializer tests, package versions
2 parents f86d820 + 5f03bab commit 9687aa2

File tree

6 files changed

+124
-7
lines changed

6 files changed

+124
-7
lines changed

.gitignore

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,7 @@ target/
5757
.venv
5858
.vagrant/
5959

60-
# Sublime Text Settings
60+
# Code editors
6161
*.sublime-*
62-
63-
# pycharm settings
6462
.idea
63+
.vscode

README.rst

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ If successful, you should see the following messages at the end of the installat
3636

3737
.. code::
3838
39-
web_1 | Django version 1.10.6, using settings 'api.config.settings'
39+
web_1 | Django version 1.11, using settings 'api.config.settings'
4040
web_1 | Starting development server at http://0.0.0.0:8000/
4141
web_1 | Quit the server with CONTROL-C.
4242
@@ -61,3 +61,10 @@ Make sure you have created a .env file as above. To run all tests:
6161
6262
python manage.py test --settings=api.config.test_settings
6363
64+
With coverage:
65+
66+
.. code:
67+
68+
coverage run --source='api' manage.py test --settings=api.config.test_settings
69+
coverage html --omit="*/test*"
70+

api/core/tests/test_serializers.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from unittest import TestCase
2+
from rest_framework.test import APIRequestFactory
3+
4+
from api.core.serializers import StrategySerializer
5+
6+
7+
class TestStrategy(object):
8+
name = 'Test Strategy'
9+
description = 'test object for serializer testing'
10+
classifier = {
11+
"memory_depth": 1,
12+
"stochastic": False,
13+
"makes_use_of": [],
14+
"long_run_time": False,
15+
"inspects_source": False,
16+
"manipulates_source": False,
17+
"manipulates_state": False,
18+
}
19+
params = {'rate': 0.5}
20+
21+
def __init__(self):
22+
pass
23+
24+
def init_params(self):
25+
return self.params
26+
27+
28+
class TestSerializers(TestCase):
29+
30+
@classmethod
31+
def setUpClass(cls):
32+
cls.factory = APIRequestFactory()
33+
cls.request = cls.factory.get('/articles/')
34+
35+
def setUp(self):
36+
self.strategy = TestStrategy()
37+
38+
def test_has_correct_fields(self):
39+
serializer = StrategySerializer(self.strategy, context={'request': self.request})
40+
for key in ['url', 'id', 'name', 'description', 'classifier', 'params']:
41+
self.assertIn(key, serializer.data)
42+
43+
def test_generates_correct_url(self):
44+
serializer = StrategySerializer(self.strategy, context={'request': self.request})
45+
self.assertEqual('http://testserver/strategies/teststrategy/', serializer.data['url'])
46+
47+
def test_generates_correct_params(self):
48+
serializer = StrategySerializer(self.strategy, context={'request': self.request})
49+
self.assertEqual({'rate': 0.5}, serializer.data['params'])
50+
51+
def test_handles_infinite_memory_depth(self):
52+
self.strategy.classifier['memory_depth'] = float('inf')
53+
serializer = StrategySerializer(self.strategy, context={'request': self.request})
54+
self.assertEqual(-1, serializer.data['classifier']['memory_depth'])
55+

api/core/tests/test_views.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from unittest import TestCase, mock
2+
from rest_framework.test import APIClient
3+
4+
from api.core.serializers import strategy_id
5+
6+
class TestStrategy(object):
7+
8+
def __init__(self, name, classifier):
9+
self.name = name
10+
self.classifier = classifier
11+
def init_params(self):
12+
return {}
13+
14+
15+
class TestStrategyView(TestCase):
16+
strategies = [
17+
TestStrategy('Test One', {'stochastic': True, 'memory_depth': 1}),
18+
TestStrategy('Test Two', {'stochastic': True, 'memory_depth': 1}),
19+
TestStrategy('Test Three', {'stochastic': True, 'memory_depth': 2}),
20+
TestStrategy('Test Four', {'stochastic': False, 'memory_depth': 2}),
21+
TestStrategy('Test Five', {'stochastic': False, 'memory_depth': 1}),
22+
]
23+
strategies_index = {strategy_id(s): s for s in strategies}
24+
25+
def setUp(self):
26+
self.client = APIClient()
27+
28+
@mock.patch('api.core.views.axl.filtered_strategies')
29+
def test_lists_all_strategies(self, filtered_strategies):
30+
filtered_strategies.return_value = self.strategies
31+
response = self.client.get('/strategies/')
32+
self.assertEqual(200, response.status_code)
33+
self.assertEqual(5, len(response.data))
34+
35+
@mock.patch('api.core.views.StrategyViewSet.strategies_index', strategies_index)
36+
def test_retrieves_one_strategy(self):
37+
response = self.client.get('/strategies/testone/')
38+
self.assertEqual(200, response.status_code)
39+
self.assertEqual('Test One', response.data['name'])
40+
41+
@mock.patch('api.core.views.StrategyViewSet.strategies_index', strategies_index)
42+
def test_strategy_does_not_exist(self):
43+
response = self.client.get('/strategies/notfound/')
44+
self.assertEqual(404, response.status_code)
45+
46+
47+

api/core/views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from distutils.util import strtobool
2+
from django.http import Http404
23
from rest_framework import viewsets
34
from rest_framework.response import Response
45
import axelrod as axl
@@ -51,6 +52,9 @@ def list(self, request):
5152
return Response(serializer.data)
5253

5354
def retrieve(self, request, pk=None):
54-
strategy = self.strategies_index[pk]
55+
try:
56+
strategy = self.strategies_index[pk]
57+
except KeyError:
58+
raise Http404
5559
serializer = StrategySerializer(strategy, context={'request': request})
5660
return Response(serializer.data)

requirements.txt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
appdirs==1.4.3
2-
Axelrod==2.8.0
2+
astroid==1.5.2
3+
Axelrod==2.10.0
34
cycler==0.10.0
45
dj-database-url==0.4.1
5-
Django==1.10.6
6+
Django==1.11
67
django-cors-headers==2.0.2
78
django-debug-toolbar==1.7
89
djangorestframework==3.6.2
910
hypothesis==3.7.0
11+
isort==4.2.5
12+
lazy-object-proxy==1.2.2
1013
matplotlib==2.0.0
14+
mccabe==0.6.1
1115
numpy==1.12.1
1216
packaging==16.8
1317
prompt-toolkit==1.0.14
@@ -20,3 +24,4 @@ sqlparse==0.2.3
2024
tqdm==3.4.0
2125
wcwidth==0.1.7
2226
whitenoise==3.3.0
27+
wrapt==1.10.10

0 commit comments

Comments
 (0)