Initial API view tests

This commit is contained in:
Sonny Bakker 2020-10-17 17:08:23 +02:00
parent 8a6421b4c1
commit b016230500
2 changed files with 156 additions and 82 deletions

View file

@ -1,4 +1,4 @@
from rest_framework import status from rest_framework import filters, status
from rest_framework.generics import ( from rest_framework.generics import (
GenericAPIView, GenericAPIView,
ListAPIView, ListAPIView,
@ -19,10 +19,12 @@ class ListRuleView(ListAPIView):
queryset = CollectionRule.objects.all() queryset = CollectionRule.objects.all()
serializer_class = RuleSerializer serializer_class = RuleSerializer
pagination_class = ResultSetPagination pagination_class = ResultSetPagination
filter_backends = [filters.SearchFilter]
search_fields = ["name", "screen_name", "url"]
def get_queryset(self): def get_queryset(self):
user = self.request.user user = self.request.user
return self.queryset.filter(user=user).order_by("-created") return self.queryset.filter(user=user).order_by("name", "screen_name")
class DetailRuleView(RetrieveUpdateDestroyAPIView): class DetailRuleView(RetrieveUpdateDestroyAPIView):

View file

@ -1,6 +1,8 @@
import json import json
from datetime import date, datetime, time from datetime import date, datetime, time
from unittest import skip
from urllib.parse import urlencode
from django.test import TestCase from django.test import TestCase
from django.urls import reverse from django.urls import reverse
@ -8,7 +10,11 @@ from django.urls import reverse
import pytz import pytz
from newsreader.accounts.tests.factories import UserFactory from newsreader.accounts.tests.factories import UserFactory
from newsreader.news.collection.tests.factories import FeedFactory from newsreader.news.collection.tests.factories import (
FeedFactory,
SubredditFactory,
TwitterTimelineFactory,
)
from newsreader.news.core.tests.factories import CategoryFactory, FeedPostFactory from newsreader.news.core.tests.factories import CategoryFactory, FeedPostFactory
@ -23,44 +29,29 @@ class RuleListViewTestCase(TestCase):
response = self.client.get(reverse("api:news:collection:rules-list")) response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data) self.assertTrue("results" in data)
self.assertTrue("count" in data) self.assertTrue("count" in data)
self.assertEquals(data["count"], 3) self.assertEqual(data["count"], 3)
def test_ordering(self): def test_ordering(self):
rules = [ rules = {
FeedFactory( "foo": FeedFactory(name="foo", user=self.user),
created=datetime.combine( "bar": FeedFactory(name="bar", user=self.user),
date(2019, 5, 20), time(hour=16, minute=7, second=37), pytz.utc "dar": FeedFactory(name="dar", user=self.user),
), }
user=self.user,
),
FeedFactory(
created=datetime.combine(
date(2019, 7, 20), time(hour=18, minute=7, second=37), pytz.utc
),
user=self.user,
),
FeedFactory(
created=datetime.combine(
date(2019, 7, 20), time(hour=16, minute=7, second=37), pytz.utc
),
user=self.user,
),
]
response = self.client.get(reverse("api:news:collection:rules-list")) response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data) self.assertTrue("results" in data)
self.assertTrue("count" in data) self.assertTrue("count" in data)
self.assertEquals(data["count"], 3) self.assertEqual(data["count"], 3)
self.assertEquals(data["results"][0]["id"], rules[1].pk) self.assertEqual(data["results"][0]["id"], rules["bar"].pk)
self.assertEquals(data["results"][1]["id"], rules[2].pk) self.assertEqual(data["results"][1]["id"], rules["dar"].pk)
self.assertEquals(data["results"][2]["id"], rules[0].pk) self.assertEqual(data["results"][2]["id"], rules["foo"].pk)
def test_pagination_count(self): def test_pagination_count(self):
FeedFactory.create_batch(size=80, user=self.user) FeedFactory.create_batch(size=80, user=self.user)
@ -70,20 +61,20 @@ class RuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 80) self.assertEqual(data["count"], 80)
self.assertEquals(len(data["results"]), 30) self.assertEqual(len(data["results"]), 30)
def test_empty(self): def test_empty(self):
response = self.client.get(reverse("api:news:collection:rules-list")) response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data) self.assertTrue("results" in data)
self.assertTrue("count" in data) self.assertTrue("count" in data)
self.assertEquals(data["count"], 0) self.assertEqual(data["count"], 0)
self.assertEquals(len(data["results"]), 0) self.assertEqual(len(data["results"]), 0)
def test_post(self): def test_post(self):
category = CategoryFactory(user=self.user) category = CategoryFactory(user=self.user)
@ -97,29 +88,29 @@ class RuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "POST" not allowed.') self.assertEqual(data["detail"], 'Method "POST" not allowed.')
def test_patch(self): def test_patch(self):
response = self.client.patch(reverse("api:news:collection:rules-list")) response = self.client.patch(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PATCH" not allowed.') self.assertEqual(data["detail"], 'Method "PATCH" not allowed.')
def test_put(self): def test_put(self):
response = self.client.put(reverse("api:news:collection:rules-list")) response = self.client.put(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PUT" not allowed.') self.assertEqual(data["detail"], 'Method "PUT" not allowed.')
def test_delete(self): def test_delete(self):
response = self.client.delete(reverse("api:news:collection:rules-list")) response = self.client.delete(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "DELETE" not allowed.') self.assertEqual(data["detail"], 'Method "DELETE" not allowed.')
def test_rules_with_unauthenticated_user(self): def test_rules_with_unauthenticated_user(self):
self.client.logout() self.client.logout()
@ -128,7 +119,7 @@ class RuleListViewTestCase(TestCase):
response = self.client.get(reverse("api:news:collection:rules-list")) response = self.client.get(reverse("api:news:collection:rules-list"))
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_rules_with_unauthorized_user(self): def test_rules_with_unauthorized_user(self):
other_user = UserFactory() other_user = UserFactory()
@ -137,10 +128,91 @@ class RuleListViewTestCase(TestCase):
response = self.client.get(reverse("api:news:collection:rules-list")) response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 0) self.assertEqual(data["count"], 0)
self.assertEquals(len(data["results"]), 0) self.assertEqual(len(data["results"]), 0)
class RuleListViewSearchTestCase(TestCase):
def setUp(self):
self.user = UserFactory(password="test")
self.client.force_login(self.user)
def test_feed_rules(self):
rules = {
"foo": FeedFactory(name="foo", user=self.user),
"BarFoo": FeedFactory(name="BarFoo", user=self.user),
"FooBar": FeedFactory(name="FooBar", user=self.user),
"boo": FeedFactory(name="boo", user=self.user),
"Boobar": FeedFactory(name="Boobar", user=self.user),
}
params = urlencode({"search": "foo"})
url = reverse("api:news:collection:rules-list")
response = self.client.get(f"{url}?{params}")
response_data = response.json()
self.assertEqual(response_data["count"], 3)
self.assertEqual(response_data["results"][0]["id"], rules["BarFoo"].pk)
self.assertEqual(response_data["results"][1]["id"], rules["foo"].pk)
self.assertEqual(response_data["results"][2]["id"], rules["FooBar"].pk)
def test_twitter_profiles(self):
rules = {
"foo": TwitterTimelineFactory(
name="foo", screen_name="foo", user=self.user
),
"BarFoo": TwitterTimelineFactory(
name="BarFoo", screen_name="foodiddy", user=self.user
),
"BarFoo dup": TwitterTimelineFactory(
name="BarFoo", screen_name="foodadda", user=self.user
),
"something else": TwitterTimelineFactory(
name="something else", screen_name="foo", user=self.user
),
"not found": TwitterTimelineFactory(
name="no result", screen_name="boo", user=self.user
),
}
params = urlencode({"search": "foo"})
url = reverse("api:news:collection:rules-list")
response = self.client.get(f"{url}?{params}")
response_data = response.json()
self.assertEqual(response_data["count"], 4)
self.assertEqual(response_data["results"][0]["id"], rules["BarFoo dup"].pk)
self.assertEqual(response_data["results"][1]["id"], rules["BarFoo"].pk)
self.assertEqual(response_data["results"][2]["id"], rules["foo"].pk)
self.assertEqual(response_data["results"][3]["id"], rules["something else"].pk)
def test_subreddits(self):
rules = {
"foo": SubredditFactory(name="foo", user=self.user),
"BarFoo": SubredditFactory(name="BarFoo", user=self.user),
"FooBar": SubredditFactory(name="FooBar", user=self.user),
"boo": SubredditFactory(name="boo", user=self.user),
"Boobar": SubredditFactory(name="Boobar", user=self.user),
}
params = urlencode({"search": "foo"})
url = reverse("api:news:collection:rules-list")
response = self.client.get(f"{url}?{params}")
response_data = response.json()
self.assertEqual(response_data["count"], 3)
self.assertEqual(response_data["results"][0]["id"], rules["BarFoo"].pk)
self.assertEqual(response_data["results"][1]["id"], rules["foo"].pk)
self.assertEqual(response_data["results"][2]["id"], rules["FooBar"].pk)
@skip("TODO")
def test_ratelimitting(self):
pass
class NestedRuleListViewTestCase(TestCase): class NestedRuleListViewTestCase(TestCase):
@ -157,11 +229,11 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data) self.assertTrue("results" in data)
self.assertTrue("count" in data) self.assertTrue("count" in data)
self.assertEquals(data["count"], 5) self.assertEqual(data["count"], 5)
def test_pagination(self): def test_pagination(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -178,11 +250,11 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 80) self.assertEqual(data["count"], 80)
self.assertEquals(len(data["results"]), 30) self.assertEqual(len(data["results"]), 30)
self.assertEquals( self.assertEqual(
[post["id"] for post in data["results"]], [post.id for post in posts[:30]] [post["id"] for post in data["results"]], [post.id for post in posts[:30]]
) )
@ -194,16 +266,16 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 0) self.assertEqual(data["count"], 0)
self.assertEquals(len(data["results"]), 0) self.assertEqual(len(data["results"]), 0)
def test_not_known(self): def test_not_known(self):
response = self.client.get( response = self.client.get(
reverse("api:news:collection:rules-nested-posts", kwargs={"pk": 0}) reverse("api:news:collection:rules-nested-posts", kwargs={"pk": 0})
) )
self.assertEquals(response.status_code, 404) self.assertEqual(response.status_code, 404)
def test_post(self): def test_post(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -215,8 +287,8 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "POST" not allowed.') self.assertEqual(data["detail"], 'Method "POST" not allowed.')
def test_patch(self): def test_patch(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -228,8 +300,8 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PATCH" not allowed.') self.assertEqual(data["detail"], 'Method "PATCH" not allowed.')
def test_put(self): def test_put(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -241,8 +313,8 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PUT" not allowed.') self.assertEqual(data["detail"], 'Method "PUT" not allowed.')
def test_delete(self): def test_delete(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -254,8 +326,8 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 405) self.assertEqual(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "DELETE" not allowed.') self.assertEqual(data["detail"], 'Method "DELETE" not allowed.')
def test_rule_with_unauthenticated_user(self): def test_rule_with_unauthenticated_user(self):
self.client.logout() self.client.logout()
@ -266,7 +338,7 @@ class NestedRuleListViewTestCase(TestCase):
reverse("api:news:collection:rules-nested-posts", kwargs={"pk": rule.pk}) reverse("api:news:collection:rules-nested-posts", kwargs={"pk": rule.pk})
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_rule_with_unauthorized_user(self): def test_rule_with_unauthorized_user(self):
other_user = UserFactory() other_user = UserFactory()
@ -276,7 +348,7 @@ class NestedRuleListViewTestCase(TestCase):
reverse("api:news:collection:rules-nested-posts", kwargs={"pk": rule.pk}) reverse("api:news:collection:rules-nested-posts", kwargs={"pk": rule.pk})
) )
self.assertEquals(response.status_code, 403) self.assertEqual(response.status_code, 403)
def test_posts_ordering(self): def test_posts_ordering(self):
rule = FeedFactory(user=self.user, category=CategoryFactory(user=self.user)) rule = FeedFactory(user=self.user, category=CategoryFactory(user=self.user))
@ -310,14 +382,14 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data) self.assertTrue("results" in data)
self.assertTrue("count" in data) self.assertTrue("count" in data)
self.assertEquals(data["count"], 3) self.assertEqual(data["count"], 3)
self.assertEquals(data["results"][0]["id"], posts[1].pk) self.assertEqual(data["results"][0]["id"], posts[1].pk)
self.assertEquals(data["results"][1]["id"], posts[2].pk) self.assertEqual(data["results"][1]["id"], posts[2].pk)
self.assertEquals(data["results"][2]["id"], posts[0].pk) self.assertEqual(data["results"][2]["id"], posts[0].pk)
def test_only_posts_from_rule_are_returned(self): def test_only_posts_from_rule_are_returned(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -331,14 +403,14 @@ class NestedRuleListViewTestCase(TestCase):
) )
data = response.json() data = response.json()
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data) self.assertTrue("results" in data)
self.assertTrue("count" in data) self.assertTrue("count" in data)
self.assertEquals(data["count"], 5) self.assertEqual(data["count"], 5)
for post in data["results"]: for post in data["results"]:
self.assertEquals(post["rule"], rule.pk) self.assertEqual(post["rule"], rule.pk)
def test_unread_posts(self): def test_unread_posts(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -354,11 +426,11 @@ class NestedRuleListViewTestCase(TestCase):
data = response.json() data = response.json()
posts = data["results"] posts = data["results"]
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 10) self.assertEqual(data["count"], 10)
for post in posts: for post in posts:
self.assertEquals(post["read"], False) self.assertEqual(post["read"], False)
def test_read_posts(self): def test_read_posts(self):
rule = FeedFactory.create(user=self.user) rule = FeedFactory.create(user=self.user)
@ -374,8 +446,8 @@ class NestedRuleListViewTestCase(TestCase):
data = response.json() data = response.json()
posts = data["results"] posts = data["results"]
self.assertEquals(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 10) self.assertEqual(data["count"], 10)
for post in posts: for post in posts:
self.assertEquals(post["read"], True) self.assertEqual(post["read"], True)