From 96c3a6fababa9b1ae588c9fe005c2689a1df9def Mon Sep 17 00:00:00 2001 From: Robert Kolner Date: Wed, 11 Sep 2013 19:51:30 +0200 Subject: [PATCH] Not working version of tests. I fail english. --- dusken/api/member.py | 42 ++++++++++++++++++++++++++------ dusken/models.py | 6 +++++ dusken/tests/member.py | 55 ++++++++++++++++++++++++++++-------------- 3 files changed, 77 insertions(+), 26 deletions(-) diff --git a/dusken/api/member.py b/dusken/api/member.py index 51da0dc..7100912 100644 --- a/dusken/api/member.py +++ b/dusken/api/member.py @@ -3,9 +3,10 @@ from django.contrib.auth.models import User from django.conf.urls import url from django.shortcuts import get_object_or_404 from tastypie import fields -from tastypie.authorization import Authorization +from tastypie.authentication import ApiKeyAuthentication +from tastypie.authorization import DjangoAuthorization from tastypie.exceptions import ImmediateHttpResponse -from tastypie.http import HttpForbidden, HttpNoContent, HttpResponse +from tastypie.http import HttpForbidden, HttpNoContent, HttpResponse, HttpAccepted from tastypie.resources import ModelResource, ALL from dusken.models import * from dusken.api.groupsbymember import GroupsByMemberResource @@ -22,10 +23,10 @@ class MemberResource(ModelResource): resource_name = 'member' list_allowed_methods = [ 'get', 'post' ] detail_allowed_methods = [ 'get', 'patch', 'delete' ] - authorization = Authorization() # TODO: for dev (VERY INSECURE) + authentication = ApiKeyAuthentication() + authorization = DjangoAuthorization() excludes = [ 'date_joined', 'password', 'is_active', 'is_staff', 'is_superuser', 'last_login' ] filtering = { - 'username' : [ 'exact' ], 'email' : [ 'exact' ], 'first_name' : [ 'exact' ], 'last_name' : [ 'exact' ], @@ -133,12 +134,37 @@ class MemberResource(ModelResource): return bundle - def post(self, request, **kwargs): - pass #TODO Activate user or... - return super(MemberResource, self).post(request, **kwargs) + + def get_list(self, request, **kwargs): + return super(MemberResource, self).get_list(request, **kwargs) + + def get_detail(self, request, **kwargs): + return super(MemberResource, self).get_detail(request, **kwargs) + + def post_list(self, request, **kwargs): + return super(MemberResource, self).post_list(request, **kwargs) + + def post_detail(self, request, **kwargs): + try: + member = MemberResource.objects.get(kwargs['pk']) + member.is_active = True + member.save() + return HttpAccepted() + except MemberResource.DoesNotExist: + pass + return super(MemberResource, self).post_detail(request, **kwargs) + + def patch_list(self, request, **kwargs): + return super(MemberResource, self).patch_list(request, **kwargs) + + def patch_detail(self, request, **kwargs): + return super(MemberResource, self).patch_detail(request, **kwargs) + + def delete_list(self, request, **kwargs): + return super(MemberResource, self).delete_list(request, **kwargs) def delete_detail(self, request, **kwargs): - member = Member.objects.get(kwargs['pk']) + member = MemberResource.objects.get(kwargs['pk']) member.is_active = False member.save() return HttpNoContent() diff --git a/dusken/models.py b/dusken/models.py index fe70a44..f001975 100644 --- a/dusken/models.py +++ b/dusken/models.py @@ -1,5 +1,6 @@ import django from django.db import models +from tastypie.models import create_api_key class Country(models.Model): class Meta: @@ -152,3 +153,8 @@ class Group(django.contrib.auth.models.Group): created = models.DateTimeField(auto_now_add=True) updated = models.DateTimeField(auto_now=True) +########### +# SIGNALS # +########### +models.signals.post_save.connect(create_api_key, sender=Member) + diff --git a/dusken/tests/member.py b/dusken/tests/member.py index 6988e07..b8b4049 100644 --- a/dusken/tests/member.py +++ b/dusken/tests/member.py @@ -1,8 +1,8 @@ import logging -from support.test import ResourceTestCase from dusken.models import Address, Country, Member - +from support.test import ResourceTestCase +from tastypie.models import ApiKey from utils.tests import test_fixtures class MemberTestBase(ResourceTestCase): @@ -13,17 +13,22 @@ class MemberTestBase(ResourceTestCase): # TODO use fixtures for this # Get the preloaded member, which will be used for # comparison with fetched object. - self.member = Member(username='robert', email='robert.kolner@gmail.com', phone_number=90567268) + self.member = Member(username='robert', password='pass', email='robert.kolner@gmail.com', phone_number=90567268) + self.member.is_staff = True + self.member.is_admin = True self.member.save() - self.member2 = Member(username='test', email='test@test.com') + self.member2 = Member(username='test', password='pass', email='test@test.com') self.member2.save() + # create credentials for both members: + self.creds = self.create_apikey(username=self.member.username, api_key=ApiKey.objects.get(user=self.member).key) + self.creds2 = self.create_apikey(username=self.member2.username, api_key=ApiKey.objects.get(user=self.member2).key) + # URIs to the member api self.all_members_url = '/api/v1/member/' self.member_url = self.all_members_url + '{}/' - class MemberTest(MemberTestBase): def assertValidMemberData(self, member): self.assertEquals(type(member), dict) @@ -47,22 +52,28 @@ class MemberTest(MemberTestBase): self.assertNotEquals(None,member['updated']) self.assertNotEquals(None,member['resource_uri']) + def test_get_member_unauthorized(self): + self.assertHttpUnauthorized(self.api_client.get(self.member_url.format(self.member.pk), format='json')) + def test_get_member(self): """ Tests that we can get a premade user correctly. """ - resp = self.api_client.get(self.member_url.format(self.member.pk), format='json') + resp = self.api_client.get(self.member_url.format(self.member.pk), format='json', authentication=self.creds) self.assertValidJSONResponse(resp) # Check if the returned data is correct: member = self.deserialize(resp) self.assertValidMemberData(member) + def test_get_member_unauthorized(self): + self.assertHttpUnauthorized(self.api_client.get(self.all_members_url, format='json')) + def test_get_all_members(self): """ Tests that we can get all users from the api. """ - resp = self.api_client.get(self.all_members_url, format='json') + resp = self.api_client.get(self.all_members_url, format='json', authentication=self.creds) self.assertValidJSONResponse(resp) # Check if the returned data is correct: @@ -83,7 +94,7 @@ class MemberTest(MemberTestBase): } for key, value in data.items(): - resp = self.api_client.get(self.all_members_url, format='json', data={ key : value }) + resp = self.api_client.get(self.all_members_url, format='json', data={ key : value }, authentication=self.creds) self.assertValidJSONResponse(resp) # Check if the returned data is correct: @@ -106,7 +117,8 @@ class MemberTest(MemberTestBase): resp = self.api_client.post(self.all_members_url, format='json', - data=data) + data=data, + authentication=str(self.creds)) self.assertHttpCreated(resp) # Check if user was actually put into database: @@ -132,7 +144,8 @@ class MemberTest(MemberTestBase): resp = self.api_client.post(self.all_members_url, format = 'json', - data = data) + data = data, + authentication=self.creds) self.assertHttpForbidden(resp) def test_patch_change_member(self): @@ -147,7 +160,8 @@ class MemberTest(MemberTestBase): resp = self.api_client.patch(self.member_url.format(self.member.pk), format='json', - data=data) + data=data, + authentication=self.creds) self.assertHttpAccepted(resp) # Check if user was actually updated: @@ -164,7 +178,7 @@ class MemberTest(MemberTestBase): newusername = oldusername + 'lolzorz' data = { 'username' : newusername } - resp = self.api_client.patch(self.member_url.format(self.member.pk), format='json', data=data) + resp = self.api_client.patch(self.member_url.format(self.member.pk), format='json', data=data, authentication=self.creds) self.assertHttpForbidden(resp) try: @@ -202,7 +216,8 @@ class MemberAddressTest(MemberTestBase): response = self.api_client.patch( self.member_url.format(self.user_id), format='json', - data=data) + data=data, + authentication=self.creds) self.assertHttpAccepted(response) self.assertEquals('somestreet 2', Member.objects.get(id=self.user_id).address.street_address) @@ -217,8 +232,9 @@ class MemberAddressTest(MemberTestBase): response = self.api_client.patch( self.member_url.format(self.user_id), format='json', - data=data) - + data=data, + authentication=self.creds) + self.assertHttpAccepted(response) self.assertEquals('Amsterdam', Member.objects.get(id=self.user_id).address.city) @@ -232,7 +248,8 @@ class MemberAddressTest(MemberTestBase): response = self.api_client.patch( self.member_url.format(self.user_id), format='json', - data=data) + data=data, + authentication=self.creds) self.assertHttpAccepted(response) self.assertEquals('0977RT', Member.objects.get(id=self.user_id).address.postal_code) @@ -247,7 +264,8 @@ class MemberAddressTest(MemberTestBase): response = self.api_client.patch( self.member_url.format(self.user_id), format='json', - data=data) + data=data, + authentication=self.creds) self.assertHttpAccepted(response) self.assertEquals( @@ -264,7 +282,8 @@ class MemberAddressTest(MemberTestBase): response = self.api_client.patch( self.member_url.format(self.user_id), format='json', - data=data) + data=data, + authentication=self.creds) self.assertHttpForbidden(response) self.assertEquals('The country "unknown" does not exist.', response.content)