newsreader/src/newsreader/news/collection/tests/reddit/builder/tests.py
Sonny Bakker d4a41a62da 0.3.0
- Add Twitter integration
- Refactor alot of existing code in collection app
- Update webpack font configuration
2020-09-27 16:19:32 +02:00

424 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime
from unittest.mock import Mock
from django.test import TestCase
import pytz
from newsreader.news.collection.reddit import RedditBuilder
from newsreader.news.collection.tests.factories import SubredditFactory
from newsreader.news.collection.tests.reddit.builder.mocks import *
from newsreader.news.core.models import Post
from newsreader.news.core.tests.factories import RedditPostFactory
class RedditBuilderTestCase(TestCase):
def setUp(self):
self.maxDiff = None
def test_simple_mock(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(simple_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(
("hm0qct", "hna75r", "hngs71", "hngsj8", "hnd7cy"), posts.keys()
)
post = posts["hm0qct"]
self.assertEquals(post.rule, subreddit)
self.assertEquals(
post.title,
"Linux Experiences/Rants or Education/Certifications thread - July 06, 2020",
)
self.assertIn(
" This megathread is also to hear opinions from anyone just starting out"
" with Linux or those that have used Linux (GNU or otherwise) for a long",
post.body,
)
self.assertIn(
"<p>For those looking for certifications please use this megathread to ask about how"
" to get certified whether it&#39;s for the business world or for your own satisfaction."
' Be sure to check out <a href="/r/linuxadmin">r/linuxadmin</a> for more discussion in the'
" SysAdmin world!</p>",
post.body,
)
self.assertEquals(post.author, "AutoModerator")
self.assertEquals(
post.url,
"https://www.reddit.com/r/linux/comments/hm0qct/linux_experiencesrants_or_educationcertifications/",
)
self.assertEquals(
post.publication_date, pytz.utc.localize(datetime(2020, 7, 6, 6, 11, 22))
)
def test_empty_data(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(empty_mock, mock_stream) as builder:
builder.build()
builder.save()
self.assertEquals(Post.objects.count(), 0)
def test_unknown_mock(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(unknown_mock, mock_stream) as builder:
builder.build()
builder.save()
self.assertEquals(Post.objects.count(), 0)
def test_update_posts(self):
subreddit = SubredditFactory()
existing_post = RedditPostFactory(
remote_identifier="hm0qct",
author="Old author",
title="Old title",
body="Old body",
url="https://bbc.com/",
rule=subreddit,
)
builder = RedditBuilder
mock_stream = Mock(rule=subreddit)
with builder(simple_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(
("hm0qct", "hna75r", "hngs71", "hngsj8", "hnd7cy"), posts.keys()
)
existing_post.refresh_from_db()
self.assertEquals(existing_post.remote_identifier, "hm0qct")
self.assertEquals(existing_post.author, "AutoModerator")
self.assertEquals(
existing_post.title,
"Linux Experiences/Rants or Education/Certifications thread - July 06, 2020",
)
self.assertIn(
"This megathread is also to hear opinions from anyone just starting out "
"with Linux or those that have used Linux (GNU or otherwise) for a long time.",
existing_post.body,
)
self.assertEquals(
existing_post.publication_date,
pytz.utc.localize(datetime(2020, 7, 6, 6, 11, 22)),
)
self.assertEquals(
existing_post.url,
"https://www.reddit.com/r/linux/comments/hm0qct/linux_experiencesrants_or_educationcertifications/",
)
def test_html_sanitizing(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(unsanitized_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(("hnd7cy",), posts.keys())
post = posts["hnd7cy"]
self.assertEquals(post.body, "<article></article>")
def test_long_author_text_is_truncated(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(author_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(("hnd7cy",), posts.keys())
post = posts["hnd7cy"]
self.assertEquals(post.author, "TheQuantumZeroTheQuantumZeroTheQuantumZ…")
def test_long_title_text_is_truncated(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(title_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(("hnd7cy",), posts.keys())
post = posts["hnd7cy"]
self.assertEquals(
post.title,
'Board statement on the LibreOffice 7.0 RC "Personal EditionBoard statement on the LibreOffice 7.0 RC "Personal Edition" label" labelBoard statement on the LibreOffice 7.0 RC "PersBoard statement on t…',
)
def test_duplicate_in_response(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(duplicate_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertEquals(Post.objects.count(), 2)
self.assertCountEqual(("hm0qct", "hna75r"), posts.keys())
def test_duplicate_in_database(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
duplicate_post = RedditPostFactory(
remote_identifier="hm0qct", rule=subreddit, title="foo"
)
with builder(simple_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertEquals(Post.objects.count(), 5)
self.assertCountEqual(
("hm0qct", "hna75r", "hngs71", "hngsj8", "hnd7cy"), posts.keys()
)
duplicate_post.refresh_from_db()
self.assertEquals(
duplicate_post.publication_date,
pytz.utc.localize(datetime(2020, 7, 6, 6, 11, 22)),
)
self.assertEquals(
duplicate_post.title,
"Linux Experiences/Rants or Education/Certifications thread - July 06, 2020",
)
def test_image_post(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(image_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(("hr64xh", "hr4bxo", "hr14y5", "hr2fv0"), posts.keys())
post = posts["hr64xh"]
title = (
"Yall, I just cant... this is my "
"son, Judah. My wife and I have no "
"idea how we created such a "
"beautiful child."
)
url = "https://i.redd.it/cm2qybia1va51.jpg"
self.assertEquals(
"https://www.reddit.com/r/aww/comments/hr64xh/yall_i_just_cant_this_is_my_son_judah_my_wife_and/",
post.url,
)
self.assertEquals(
f"<div><img alt='{title}' src='{url}' loading='lazy' /></div>", post.body
)
def test_external_image_post(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(external_image_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(("hr41am", "huoldn"), posts.keys())
post = posts["hr41am"]
url = "http://gfycat.com/thatalivedogwoodclubgall"
title = "Excited cows have a new brush!"
self.assertEquals(
f"<div><a target='_blank' rel='noopener noreferrer' alt='{title}' href='{url}' class='link'>Direct url</a></div>",
post.body,
)
self.assertEquals(
"https://www.reddit.com/r/aww/comments/hr41am/excited_cows_have_a_new_brush/",
post.url,
)
post = posts["huoldn"]
url = "https://i.imgur.com/usfMVUJ.jpg"
title = "Novosibirsk Zoo welcomes 16 cobalt-eyed Pallass cat kittens"
self.assertEquals(
f"<div><img alt='{title}' src='{url}' loading='lazy' /></div>", post.body
)
self.assertEquals(
"https://www.reddit.com/r/aww/comments/huoldn/novosibirsk_zoo_welcomes_16_cobalteyed_pallass/",
post.url,
)
def test_video_post(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(video_mock, mock_stream) as builder:
builder.build()
builder.save()
posts = {post.remote_identifier: post for post in Post.objects.all()}
self.assertCountEqual(("hr32jf", "hr1r00", "hqy0ny", "hr0uzh"), posts.keys())
post = posts["hr1r00"]
url = "https://v.redd.it/eyvbxaeqtta51/DASH_480.mp4?source=fallback"
self.assertEquals(
post.url,
"https://www.reddit.com/r/aww/comments/hr1r00/cool_catt_and_his_clingy_girlfriend/",
)
self.assertEquals(
f"<div><video controls muted><source src='{url}' type='video/mp4' /></video></div>",
post.body,
)
def test_external_video_post(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(external_video_mock, mock_stream) as builder:
builder.build()
builder.save()
post = Post.objects.get()
self.assertEquals(post.remote_identifier, "hulh8k")
self.assertEquals(
post.url,
"https://www.reddit.com/r/aww/comments/hulh8k/dog_splashing_in_water/",
)
title = "Dog splashing in water"
url = "https://gfycat.com/excellentinfantileamericanwigeon"
self.assertEquals(
f"<div><a target='_blank' rel='noopener noreferrer' alt='{title}' href='{url}' class='link'>Direct url</a></div>",
post.body,
)
def test_external_gifv_video_post(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(external_gifv_mock, mock_stream) as builder:
builder.build()
builder.save()
post = Post.objects.get()
self.assertEquals(post.remote_identifier, "humdlf")
self.assertEquals(
post.url, "https://www.reddit.com/r/aww/comments/humdlf/if_i_fits_i_sits/"
)
self.assertEquals(
"<div><video controls muted><source src='https://i.imgur.com/grVh2AG.mp4' type='video/mp4' /></video></div>",
post.body,
)
def test_link_only_post(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(simple_mock, mock_stream) as builder:
builder.build()
builder.save()
post = Post.objects.get(remote_identifier="hngsj8")
title = "KeePassXC 2.6.0 released"
url = "https://keepassxc.org/blog/2020-07-07-2.6.0-released/"
self.assertIn(
f"<div><a target='_blank' rel='noopener noreferrer' alt='{title}' href='{url}' class='link'>Direct url</a></div>",
post.body,
)
self.assertEquals(
post.url,
"https://www.reddit.com/r/linux/comments/hngsj8/keepassxc_260_released/",
)
def test_skip_not_known_post_type(self):
builder = RedditBuilder
subreddit = SubredditFactory()
mock_stream = Mock(rule=subreddit)
with builder(unknown_mock, mock_stream) as builder:
builder.build()
builder.save()
self.assertEquals(Post.objects.count(), 0)