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 (
GenericAPIView,
ListAPIView,
@ -19,10 +19,12 @@ class ListRuleView(ListAPIView):
queryset = CollectionRule.objects.all()
serializer_class = RuleSerializer
pagination_class = ResultSetPagination
filter_backends = [filters.SearchFilter]
search_fields = ["name", "screen_name", "url"]
def get_queryset(self):
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):

View file

@ -1,6 +1,8 @@
import json
from datetime import date, datetime, time
from unittest import skip
from urllib.parse import urlencode
from django.test import TestCase
from django.urls import reverse
@ -8,7 +10,11 @@ from django.urls import reverse
import pytz
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
@ -23,44 +29,29 @@ class RuleListViewTestCase(TestCase):
response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data)
self.assertTrue("count" in data)
self.assertEquals(data["count"], 3)
self.assertEqual(data["count"], 3)
def test_ordering(self):
rules = [
FeedFactory(
created=datetime.combine(
date(2019, 5, 20), time(hour=16, minute=7, second=37), pytz.utc
),
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,
),
]
rules = {
"foo": FeedFactory(name="foo", user=self.user),
"bar": FeedFactory(name="bar", user=self.user),
"dar": FeedFactory(name="dar", user=self.user),
}
response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertTrue("results" 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.assertEquals(data["results"][1]["id"], rules[2].pk)
self.assertEquals(data["results"][2]["id"], rules[0].pk)
self.assertEqual(data["results"][0]["id"], rules["bar"].pk)
self.assertEqual(data["results"][1]["id"], rules["dar"].pk)
self.assertEqual(data["results"][2]["id"], rules["foo"].pk)
def test_pagination_count(self):
FeedFactory.create_batch(size=80, user=self.user)
@ -70,20 +61,20 @@ class RuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEquals(data["count"], 80)
self.assertEquals(len(data["results"]), 30)
self.assertEqual(response.status_code, 200)
self.assertEqual(data["count"], 80)
self.assertEqual(len(data["results"]), 30)
def test_empty(self):
response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data)
self.assertTrue("count" in data)
self.assertEquals(data["count"], 0)
self.assertEquals(len(data["results"]), 0)
self.assertEqual(data["count"], 0)
self.assertEqual(len(data["results"]), 0)
def test_post(self):
category = CategoryFactory(user=self.user)
@ -97,29 +88,29 @@ class RuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "POST" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "POST" not allowed.')
def test_patch(self):
response = self.client.patch(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PATCH" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "PATCH" not allowed.')
def test_put(self):
response = self.client.put(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PUT" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "PUT" not allowed.')
def test_delete(self):
response = self.client.delete(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "DELETE" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "DELETE" not allowed.')
def test_rules_with_unauthenticated_user(self):
self.client.logout()
@ -128,7 +119,7 @@ class RuleListViewTestCase(TestCase):
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):
other_user = UserFactory()
@ -137,10 +128,91 @@ class RuleListViewTestCase(TestCase):
response = self.client.get(reverse("api:news:collection:rules-list"))
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertEquals(data["count"], 0)
self.assertEquals(len(data["results"]), 0)
self.assertEqual(data["count"], 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):
@ -157,11 +229,11 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data)
self.assertTrue("count" in data)
self.assertEquals(data["count"], 5)
self.assertEqual(data["count"], 5)
def test_pagination(self):
rule = FeedFactory.create(user=self.user)
@ -178,11 +250,11 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEquals(data["count"], 80)
self.assertEquals(len(data["results"]), 30)
self.assertEqual(response.status_code, 200)
self.assertEqual(data["count"], 80)
self.assertEqual(len(data["results"]), 30)
self.assertEquals(
self.assertEqual(
[post["id"] for post in data["results"]], [post.id for post in posts[:30]]
)
@ -194,16 +266,16 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEquals(data["count"], 0)
self.assertEquals(len(data["results"]), 0)
self.assertEqual(response.status_code, 200)
self.assertEqual(data["count"], 0)
self.assertEqual(len(data["results"]), 0)
def test_not_known(self):
response = self.client.get(
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):
rule = FeedFactory.create(user=self.user)
@ -215,8 +287,8 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "POST" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "POST" not allowed.')
def test_patch(self):
rule = FeedFactory.create(user=self.user)
@ -228,8 +300,8 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PATCH" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "PATCH" not allowed.')
def test_put(self):
rule = FeedFactory.create(user=self.user)
@ -241,8 +313,8 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "PUT" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "PUT" not allowed.')
def test_delete(self):
rule = FeedFactory.create(user=self.user)
@ -254,8 +326,8 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 405)
self.assertEquals(data["detail"], 'Method "DELETE" not allowed.')
self.assertEqual(response.status_code, 405)
self.assertEqual(data["detail"], 'Method "DELETE" not allowed.')
def test_rule_with_unauthenticated_user(self):
self.client.logout()
@ -266,7 +338,7 @@ class NestedRuleListViewTestCase(TestCase):
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):
other_user = UserFactory()
@ -276,7 +348,7 @@ class NestedRuleListViewTestCase(TestCase):
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):
rule = FeedFactory(user=self.user, category=CategoryFactory(user=self.user))
@ -310,14 +382,14 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertTrue("results" 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.assertEquals(data["results"][1]["id"], posts[2].pk)
self.assertEquals(data["results"][2]["id"], posts[0].pk)
self.assertEqual(data["results"][0]["id"], posts[1].pk)
self.assertEqual(data["results"][1]["id"], posts[2].pk)
self.assertEqual(data["results"][2]["id"], posts[0].pk)
def test_only_posts_from_rule_are_returned(self):
rule = FeedFactory.create(user=self.user)
@ -331,14 +403,14 @@ class NestedRuleListViewTestCase(TestCase):
)
data = response.json()
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)
self.assertTrue("results" in data)
self.assertTrue("count" in data)
self.assertEquals(data["count"], 5)
self.assertEqual(data["count"], 5)
for post in data["results"]:
self.assertEquals(post["rule"], rule.pk)
self.assertEqual(post["rule"], rule.pk)
def test_unread_posts(self):
rule = FeedFactory.create(user=self.user)
@ -354,11 +426,11 @@ class NestedRuleListViewTestCase(TestCase):
data = response.json()
posts = data["results"]
self.assertEquals(response.status_code, 200)
self.assertEquals(data["count"], 10)
self.assertEqual(response.status_code, 200)
self.assertEqual(data["count"], 10)
for post in posts:
self.assertEquals(post["read"], False)
self.assertEqual(post["read"], False)
def test_read_posts(self):
rule = FeedFactory.create(user=self.user)
@ -374,8 +446,8 @@ class NestedRuleListViewTestCase(TestCase):
data = response.json()
posts = data["results"]
self.assertEquals(response.status_code, 200)
self.assertEquals(data["count"], 10)
self.assertEqual(response.status_code, 200)
self.assertEqual(data["count"], 10)
for post in posts:
self.assertEquals(post["read"], True)
self.assertEqual(post["read"], True)