mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-07 22:04:48 +03:00
Added tests for RouteTree, improved error messages, small bug fix
This commit is contained in:
parent
8f9f8b31d3
commit
5cbd737af3
|
@ -68,16 +68,18 @@ class RouteTree:
|
||||||
been set or if the path doesn't exist.
|
been set or if the path doesn't exist.
|
||||||
"""
|
"""
|
||||||
routes = self.routes
|
routes = self.routes
|
||||||
|
parent_path = []
|
||||||
|
|
||||||
for part in path:
|
for part in path:
|
||||||
if part not in routes:
|
if part not in routes:
|
||||||
# TODO: invalid path error message
|
on_path = (' on path %s' % parent_path) if len(parent_path) > 0 else ''
|
||||||
raise KeyError('')
|
raise KeyError('Parent route "%s"%s was not registred' % (part, on_path))
|
||||||
routes = routes[path].routes
|
parent_path.append(part)
|
||||||
|
routes = routes[part].routes
|
||||||
|
|
||||||
if name in routes:
|
if name in routes:
|
||||||
# TODO: route name already exists error message
|
on_path = (' on path %s' % path) if len(path) > 0 else ''
|
||||||
raise KeyError('')
|
raise KeyError('Route "%s" already set%s' % (name, on_path))
|
||||||
|
|
||||||
routes[name] = self.Node({}, value)
|
routes[name] = self.Node({}, value)
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,7 @@ from django.test import TestCase, override_settings
|
||||||
from rest_framework import permissions, serializers, viewsets
|
from rest_framework import permissions, serializers, viewsets
|
||||||
from rest_framework.decorators import detail_route, list_route
|
from rest_framework.decorators import detail_route, list_route
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.routers import DefaultRouter, SimpleRouter
|
from rest_framework.routers import DefaultRouter, RouteTree, SimpleRouter
|
||||||
from rest_framework.test import APIRequestFactory
|
from rest_framework.test import APIRequestFactory
|
||||||
|
|
||||||
factory = APIRequestFactory()
|
factory = APIRequestFactory()
|
||||||
|
@ -89,6 +89,53 @@ class BasicViewSet(viewsets.ViewSet):
|
||||||
return Response({'method': 'link2'})
|
return Response({'method': 'link2'})
|
||||||
|
|
||||||
|
|
||||||
|
class TestRouteTree(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.tree = RouteTree()
|
||||||
|
|
||||||
|
def test_set(self):
|
||||||
|
"""
|
||||||
|
Should set the value for the given name and path.
|
||||||
|
"""
|
||||||
|
self.tree.set(1, [], 'A')
|
||||||
|
self.tree.set(2, ['A'], 'B')
|
||||||
|
self.tree.set(3, ['A', 'B'], 'C')
|
||||||
|
|
||||||
|
root = self.tree.routes
|
||||||
|
self.assertEqual(list(root.keys()), ['A'])
|
||||||
|
self.assertEqual(root['A'].value, 1)
|
||||||
|
self.assertEqual(list(root['A'].routes.keys()), ['B'])
|
||||||
|
self.assertEqual(root['A'].routes['B'].value, 2)
|
||||||
|
self.assertEqual(list(root['A'].routes['B'].routes.keys()), ['C'])
|
||||||
|
self.assertEqual(root['A'].routes['B'].routes['C'].value, 3)
|
||||||
|
|
||||||
|
def test_set_invalid(self):
|
||||||
|
"""
|
||||||
|
A KeyError should be raised for an invalid name or path.
|
||||||
|
"""
|
||||||
|
self.tree.set(1, [], 'A')
|
||||||
|
self.tree.set(2, ['A'], 'B')
|
||||||
|
|
||||||
|
with self.assertRaises(KeyError):
|
||||||
|
self.tree.set(5, ['A', 'B', 'C', 'C'], 'E')
|
||||||
|
|
||||||
|
with self.assertRaises(KeyError):
|
||||||
|
self.tree.set(20, ['A'], 'B')
|
||||||
|
|
||||||
|
def test_get(self):
|
||||||
|
"""
|
||||||
|
Should return a list of (name, value) for each node on
|
||||||
|
the path.
|
||||||
|
"""
|
||||||
|
self.tree.set(1, [], 'A')
|
||||||
|
self.tree.set(2, ['A'], 'B')
|
||||||
|
self.tree.set(3, ['A', 'B'], 'C')
|
||||||
|
|
||||||
|
self.assertEqual(self.tree.get(['A', 'B'], 'C'), [
|
||||||
|
('A', 1), ('B', 2), ('C', 3)
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
class TestSimpleRouter(TestCase):
|
class TestSimpleRouter(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.router = SimpleRouter()
|
self.router = SimpleRouter()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user