├── README.md ├── test-api-views.py ├── test_forms.py ├── test_models.py ├── test_views.py └── test_views_advanced_user.py /README.md: -------------------------------------------------------------------------------- 1 | ![Django Tests Unleashed Logo](https://cfe-static.s3.amazonaws.com/media/django-tests-unleashed/images/unleasing_django_tests.png) 2 | 3 | # Django Tests Unleashed 4 | A guide for Simple & Straightforward Tests in Django. Learn this [here](http://kirr.co/5i9l9n/). 5 | 6 | ==== 7 | 8 | ### Lecture Code 9 | [4 - Model Tests](./test_models.py) 10 | 11 | [5 - Form Tests](./test_forms.py) 12 | 13 | [6 - View Tests](./test_views.py) 14 | 15 | [7 - Authenticating User Tests](./test_views_advanced_user.py) 16 | 17 | [8 - CRUD Test in Django Rest Framework](./test-api-views.py) 18 | -------------------------------------------------------------------------------- /test-api-views.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.contrib.auth import get_user_model 3 | from django.core.urlresolvers import reverse 4 | from django.utils import timezone 5 | 6 | from rest_framework.test import APIRequestFactory, force_authenticate 7 | 8 | """ 9 | Below app is coming form: 10 | http://kirr.co/9u0caa/ 11 | in the posts app and post api app. 12 | """ 13 | from posts.api.views import ( 14 | PostCreateAPIView, 15 | PostDeleteAPIView, 16 | PostDetailAPIView, 17 | PostListAPIView, 18 | PostUpdateAPIView, 19 | ) 20 | 21 | from posts.models import Post 22 | 23 | User = get_user_model() 24 | 25 | 26 | class PostAPITest(TestCase): 27 | def setUp(self): 28 | self.data = {"title": "Some title", "content": "New content", "publish": timezone.now().date()} 29 | self.factory = APIRequestFactory() 30 | self.user = User.objects.create( 31 | username='abc123test123', 32 | email = 'abc123test123@gmail.com', 33 | password = 'pwtest123#$$$', 34 | is_staff=True, 35 | is_superuser=True, 36 | ) 37 | 38 | def create_post(self, title='This title'): 39 | return Post.objects.create(title=title) 40 | 41 | def test_get_data(self): 42 | # GET METHOD 43 | list_url = reverse("posts-api:list") 44 | obj = self.create_post() 45 | detail_url = reverse("posts-api:detail", kwargs={"slug": obj.slug}) 46 | 47 | request = self.factory.get(list_url) 48 | response = PostListAPIView.as_view()(request) 49 | self.assertEqual(response.status_code, 200) 50 | 51 | request = self.factory.get(detail_url) 52 | response = PostDetailAPIView.as_view()(request, slug=obj.slug) 53 | self.assertEqual(response.status_code, 200) 54 | 55 | def test_post_data(self): 56 | create_url = reverse("posts-api:create") 57 | request = self.factory.post(create_url, data=self.data) 58 | response1 = PostCreateAPIView.as_view()(request) 59 | self.assertEqual(response1.status_code, 401) 60 | 61 | force_authenticate(request, user=self.user) 62 | response2 = PostCreateAPIView.as_view()(request) 63 | self.assertEqual(response2.status_code, 201) 64 | 65 | def test_update_data(self): 66 | obj = self.create_post() 67 | update_url = reverse("posts-api:update", kwargs={"slug": obj.slug}) 68 | request = self.factory.put(update_url, data=self.data) 69 | response1 = PostUpdateAPIView.as_view()(request, slug=obj.slug) 70 | self.assertEqual(response1.status_code, 401) 71 | 72 | force_authenticate(request, user=self.user) 73 | response2 = PostUpdateAPIView.as_view()(request, slug=obj.slug) 74 | self.assertEqual(response2.status_code, 200) 75 | 76 | 77 | def test_delete_data(self): 78 | obj = self.create_post(title='another new title') 79 | delete_url = reverse("posts-api:delete", kwargs={"slug": obj.slug}) 80 | request = self.factory.delete(delete_url) 81 | response1 = PostDeleteAPIView.as_view()(request, slug=obj.slug) 82 | self.assertEqual(response1.status_code, 401) 83 | 84 | force_authenticate(request, user=self.user) 85 | response2 = PostDeleteAPIView.as_view()(request, slug=obj.slug) 86 | self.assertEqual(response2.status_code, 204) 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /test_forms.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.utils.text import slugify 3 | from django.utils import timezone 4 | 5 | """ 6 | Below app is coming form: 7 | http://kirr.co/9u0caa/ 8 | in the posts app. 9 | """ 10 | from posts.forms import PostForm 11 | from posts.models import Post 12 | 13 | # Create your tests here. 14 | 15 | 16 | class PostFormTestCase(TestCase): 17 | def test_valid_form(self): 18 | title = 'A new title' 19 | slug = 'some-prob-unique-slug-by-this-test-abc-123' 20 | content = 'some content' 21 | obj = Post.objects.create(title=title, slug=slug, publish=timezone.now(), content=content) 22 | data = {'title': obj.title, "slug": obj.slug, "publish": obj.publish, "content": content} 23 | form = PostForm(data=data) # PostForm(request.POST) 24 | self.assertTrue(form.is_valid()) 25 | self.assertEqual(form.cleaned_data.get('title'), obj.title) 26 | self.assertNotEqual(form.cleaned_data.get("content"), "Another item") 27 | 28 | def test_invalid_form(self): 29 | title = 'A new title' 30 | slug = 'some-prob-unique-slug-by-this-test-abc-123' 31 | content = 'some content' 32 | obj = Post.objects.create(title=title, slug=slug, publish=timezone.now(), content=content) 33 | data = {'title': obj.title, "slug": obj.slug, "publish": obj.publish, "content": ""} 34 | form = PostForm(data=data) # PostForm(request.POST) 35 | self.assertFalse(form.is_valid()) 36 | self.assertTrue(form.errors) 37 | -------------------------------------------------------------------------------- /test_models.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | from django.utils.text import slugify 3 | 4 | 5 | from .models import Post # from http://kirr.co/9u0caa/ the posts app. 6 | 7 | 8 | class PostModelTestCase(TestCase): 9 | def setUp(self): 10 | Post.objects.create(title='A new title', slug='some-prob-unique-slug-by-this-test-abc-123') 11 | 12 | def create_post(self, title='This title'): 13 | return Post.objects.create(title=title) 14 | 15 | def test_post_title(self): 16 | obj = Post.objects.get(slug='some-prob-unique-slug-by-this-test-abc-123') 17 | self.assertEqual(obj.title, 'A new title') 18 | self.assertTrue(obj.content == "") # maybe i want to change 19 | #self.assertTrue(100 == 40+2000) 20 | 21 | def test_post_slug(self): 22 | # generate slug 23 | title1 = 'another title abc' 24 | title2 = 'another title abc' 25 | title3 = 'another title abc' 26 | slug1 = slugify(title1) 27 | slug2 = slugify(title2) 28 | slug3 = slugify(title3) 29 | obj1 = self.create_post(title=title1) 30 | obj2 = self.create_post(title=title2) 31 | obj3 = self.create_post(title=title2) 32 | self.assertEqual(obj1.slug, slug1) 33 | self.assertNotEqual(obj2.slug, slug2) 34 | self.assertNotEqual(obj3.slug, slug3) 35 | 36 | def test_post_qs(self): 37 | title1 = 'another title abc' 38 | obj1 = self.create_post(title=title1) 39 | obj2 = self.create_post(title=title1) 40 | obj3 = self.create_post(title=title1) 41 | qs = Post.objects.filter(title=title1) 42 | self.assertEqual(qs.count(), 3) 43 | qs2 = Post.objects.filter(slug=obj1.slug) 44 | self.assertEqual(qs2.count(), 1) 45 | 46 | 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /test_views.py: -------------------------------------------------------------------------------- 1 | from django.core.urlresolvers import reverse 2 | from django.test import TestCase 3 | from django.utils.text import slugify 4 | 5 | 6 | """ 7 | Below app is coming form: 8 | http://kirr.co/9u0caa/ 9 | in the posts app. 10 | """ 11 | from posts.models import Post 12 | # Create your tests here. 13 | 14 | 15 | class PostViewTestCase(TestCase): 16 | def create_post(self, title='This title'): 17 | return Post.objects.create(title=title) 18 | 19 | def test_list_view(self): 20 | list_url = reverse("posts:list") 21 | response = self.client.get(list_url) 22 | self.assertEqual(response.status_code, 200) 23 | 24 | 25 | def test_detail_view(self): 26 | obj = self.create_post(title='Another New Title Test') 27 | response = self.client.get(obj.get_absolute_url()) 28 | self.assertEqual(response.status_code, 200) 29 | 30 | 31 | def test_update_view(self): 32 | obj = self.create_post(title='Another New Title Test') 33 | edit_url = reverse("posts:update", kwargs={"slug": obj.slug}) 34 | print(edit_url) 35 | response = self.client.get(edit_url) 36 | self.assertEqual(response.status_code, 404) 37 | 38 | def test_delete_view(self): 39 | obj = self.create_post(title='Another New Title Test') 40 | #delete_url = reverse("posts:delete", kwargs={"slug": obj.slug}) 41 | delete_url = obj.get_absolute_url() + "delete/" 42 | response = self.client.get(delete_url) 43 | self.assertEqual(response.status_code, 404) 44 | 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /test_views_advanced_user.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import AnonymousUser 2 | from django.contrib.auth import get_user_model 3 | from django.core.urlresolvers import reverse 4 | from django.test import TestCase, RequestFactory 5 | from django.utils.text import slugify 6 | 7 | 8 | """ 9 | Below app is coming form: 10 | http://kirr.co/9u0caa/ 11 | in the posts app. 12 | """ 13 | from posts.models import Post 14 | from posts.views import post_update, post_create 15 | # Create your tests here. 16 | 17 | User = get_user_model() 18 | 19 | class PostViewAdvanceTestCase(TestCase): 20 | def setUp(self): 21 | self.factory = RequestFactory() 22 | self.user = User.objects.create( 23 | username='abc123test123', 24 | email = 'abc123test123@gmail.com', 25 | password = 'pwtest123#$$$', 26 | is_staff=True, 27 | is_superuser=True, 28 | ) 29 | 30 | def create_post(self, title='This title'): 31 | return Post.objects.create(title=title) 32 | 33 | def test_user_auth(self): 34 | obj = self.create_post(title='Another New Title Test') 35 | edit_url = reverse("posts:update", kwargs={"slug": obj.slug}) 36 | request = self.factory.get(edit_url) 37 | request.user = self.user 38 | response = post_update(request, slug=obj.slug) 39 | self.assertEqual(response.status_code, 200) 40 | #print(request.user.is_authenticated()) 41 | 42 | def test_user_post(self): 43 | obj = self.create_post(title='Another New Title Test') 44 | request = self.factory.post("/posts/create/") 45 | request.user = self.user 46 | response = post_create(request) 47 | self.assertEqual(response.status_code, 200) 48 | #print(request.user.is_authenticated()) 49 | 50 | def test_empty_page(self): 51 | page = '/asdfads/asdfasd/fasdfasdfasd/' 52 | request = self.factory.get(page) 53 | request.user = self.user 54 | response = post_create(request) 55 | self.assertEqual(response.status_code, 200) 56 | 57 | def test_unauth_user(self): 58 | obj = self.create_post(title='Another New Title Test') 59 | edit_url = reverse("posts:update", kwargs={"slug": obj.slug}) 60 | request = self.factory.get(edit_url) 61 | request.user = AnonymousUser() 62 | response = post_update(request, slug=obj.slug) 63 | ''' 64 | Using Class Based views instead of FBVs 65 | response = PostUpdateView.as_view()(request) 66 | ''' 67 | self.assertEqual(response.status_code, 404) 68 | 69 | 70 | 71 | 72 | 73 | --------------------------------------------------------------------------------