Reputation: 8451
Here is the model that I am testing:
class Entity(TimestampModerated):
name = models.CharField(max_length=255)
slug = models.SlugField(unique=True)
description = models.TextField(verbose_name='description of entity', blank=True)
media = models.URLField(verbose_name='media representing entity (image, mp3, mpg, etc)',
blank=True, null=True)
uuid = models.UUIDField(db_index=True,
default=uuid_lib.uuid4(),
editable=False,
)
owner = models.ForeignKey('auth.User', related_name='entities', on_delete=models.CASCADE)
tags = TaggableManager(blank=True)
def get_absolute_url(self):
return reverse('entities:detail', kwargs={'slug': self.slug})
def __str__(self):
return self.name
class Meta:
verbose_name_plural = "entities"
Here is the ViewSet
:
class EntityViewSet(viewsets.ModelViewSet):
"""
This viewsetomatically provides `list`, `create`, `retrieve`,
`update` and `destroy` actions.
Additionally we also provide an extra `highlight` action.
"""
queryset = Entity.objects.all()
serializer_class = EntitySerializer
permission_classes = (permissions.IsAuthenticatedOrReadOnly,
IsOwnerOrReadOnly,)
lookup_field = 'slug'
def perform_create(self, serializer):
serializer.save(owner=self.request.user)
Here are my urls:
router = DefaultRouter()
router.register(r'entities', views.EntityViewSet)
router.register(r'users', views.UserViewSet)
urlpatterns = [
url(r'^', include(router.urls)),
]
Here is my test:
class EntitiesAPITests(test.APITestCase):
def setUp(self):
test_user = models.User.objects.create(username='testuser', password='password')
def test_login_post(self):
client = APIClient()
client.login(username='testuser', password='password')
response = client.post('/api/entities/', data={
'name': 'Sean Penn',
'slug': 'sean-penn'
})
self.assertContains(response, 200)
client.logout()
When I run the tests I get the following error, which I haven't been able to figure out:
======================================================================
FAIL: test_login_post (entities.tests.test_api.EntitiesAPITests)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/xxx/xxx/entities/tests/test_api.py", line 63, in test_login_post
self.assertContains(response, 200)
File "/Users/xxx/xxx/.virtualenv/lib/python3.6/site-packages/django/test/testcases.py", line 385, in assertContains
response, text, status_code, msg_prefix, html)
File "/Users/xxx/xxx/.virtualenv/lib/python3.6/site-packages/django/test/testcases.py", line 357, in _assert_contains
" (expected %d)" % (response.status_code, status_code)
AssertionError: 400 != 200 : Couldn't retrieve content: Response code was 400 (expected 200)
----------------------------------------------------------------------
Ran 10 tests in 0.280s
FAILED (failures=1)
Destroying test database for alias 'default'...
Here is the Serializer:
from django.contrib.auth.models import User
from rest_framework import serializers
from taggit_serializer.serializers import TagListSerializerField
from entities.models import Entity
class EntitySerializer(serializers.ModelSerializer):
owner = serializers.CharField(source='owner.username', read_only=True)
tags = TagListSerializerField()
class Meta:
model = Entity
fields = ('id', 'created', 'name', 'description', 'media', 'moderation_code', 'owner', 'updated', 'tags',
'slug', 'uuid')
Upvotes: 4
Views: 3088
Reputation: 9235
Try changing like this,
class EntitiesAPITests(test.APITestCase):
def setUp(self):
self.user = models.User.objects.create(username='testuser', password='password')
def test_login_post(self):
client = APIClient()
client.force_authenticate(self.user)
response = client.post('/api/entities/', data={
'name': 'Sean Penn',
'slug': 'sean-penn'
})
self.assertContains(response, 200)
client.logout()
Upvotes: 3