Django 4.2 upgrade
This commit is contained in:
parent
b78f03d3b0
commit
dfb049ae14
32 changed files with 345 additions and 414 deletions
|
|
@ -2,7 +2,7 @@ from django import forms
|
|||
from django.contrib import admin
|
||||
from django.contrib.auth.admin import UserAdmin as DjangoUserAdmin
|
||||
from django.contrib.auth.forms import UserChangeForm
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from newsreader.accounts.models import User
|
||||
|
||||
|
|
|
|||
|
|
@ -106,11 +106,11 @@ DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
|
|||
|
||||
CACHES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
|
||||
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
|
||||
"LOCATION": "memcached:11211",
|
||||
},
|
||||
"axes": {
|
||||
"BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
|
||||
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
|
||||
"LOCATION": "memcached:11211",
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,11 +22,11 @@ AXES_ENABLED = False
|
|||
|
||||
CACHES = {
|
||||
"default": {
|
||||
"BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
|
||||
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
|
||||
"LOCATION": "memcached:11211",
|
||||
},
|
||||
"axes": {
|
||||
"BACKEND": "django.core.cache.backends.memcached.MemcachedCache",
|
||||
"BACKEND": "django.core.cache.backends.memcached.PyMemcacheCache",
|
||||
"LOCATION": "memcached:11211",
|
||||
},
|
||||
}
|
||||
|
|
|
|||
|
|
@ -23,7 +23,6 @@ class App extends React.Component {
|
|||
<PostList
|
||||
feedUrl={this.props.feedUrl}
|
||||
subredditUrl={this.props.subredditUrl}
|
||||
timelineUrl={this.props.timelineUrl}
|
||||
timezone={this.props.timezone}
|
||||
/>
|
||||
|
||||
|
|
@ -35,7 +34,6 @@ class App extends React.Component {
|
|||
selectedType={this.props.selectedType}
|
||||
feedUrl={this.props.feedUrl}
|
||||
subredditUrl={this.props.subredditUrl}
|
||||
timelineUrl={this.props.timelineUrl}
|
||||
categoriesUrl={this.props.categoriesUrl}
|
||||
timezone={this.props.timezone}
|
||||
autoMarking={this.props.autoMarking}
|
||||
|
|
|
|||
|
|
@ -3,14 +3,7 @@ import { connect } from 'react-redux';
|
|||
import Cookies from 'js-cookie';
|
||||
|
||||
import { unSelectPost, markPostRead, toggleSaved } from '../actions/posts.js';
|
||||
import {
|
||||
CATEGORY_TYPE,
|
||||
RULE_TYPE,
|
||||
SAVED_TYPE,
|
||||
FEED,
|
||||
SUBREDDIT,
|
||||
TWITTER_TIMELINE,
|
||||
} from '../constants.js';
|
||||
import { SAVED_TYPE, SUBREDDIT } from '../constants.js';
|
||||
import { formatDatetime } from '../../../utils.js';
|
||||
|
||||
class PostModal extends React.Component {
|
||||
|
|
@ -62,9 +55,6 @@ class PostModal extends React.Component {
|
|||
case SUBREDDIT:
|
||||
ruleUrl = `${this.props.subredditUrl}/${this.props.rule.id}/`;
|
||||
break;
|
||||
case TWITTER_TIMELINE:
|
||||
ruleUrl = '#';
|
||||
break;
|
||||
default:
|
||||
ruleUrl = `${this.props.feedUrl}/${this.props.rule.id}/`;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -4,11 +4,8 @@ import Cookies from 'js-cookie';
|
|||
|
||||
import {
|
||||
CATEGORY_TYPE,
|
||||
RULE_TYPE,
|
||||
SAVED_TYPE,
|
||||
FEED,
|
||||
SUBREDDIT,
|
||||
TWITTER_TIMELINE,
|
||||
} from '../../constants.js';
|
||||
import { selectPost, toggleSaved } from '../../actions/posts.js';
|
||||
import { formatDatetime } from '../../../../utils.js';
|
||||
|
|
@ -28,8 +25,6 @@ class PostItem extends React.Component {
|
|||
let ruleUrl = '';
|
||||
if (rule.type === SUBREDDIT) {
|
||||
ruleUrl = `${this.props.subredditUrl}/${rule.id}/`;
|
||||
} else if (rule.type === TWITTER_TIMELINE) {
|
||||
ruleUrl = `${this.props.timelineUrl}/${rule.id}/`;
|
||||
} else {
|
||||
ruleUrl = `${this.props.feedUrl}/${rule.id}/`;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -65,7 +65,6 @@ class PostList extends React.Component {
|
|||
selected: this.props.selected,
|
||||
feedUrl: this.props.feedUrl,
|
||||
subredditUrl: this.props.subredditUrl,
|
||||
timelineUrl: this.props.timelineUrl,
|
||||
timezone: this.props.timezone,
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -4,4 +4,3 @@ export const SAVED_TYPE = 'SAVED';
|
|||
|
||||
export const SUBREDDIT = 'subreddit';
|
||||
export const FEED = 'feed';
|
||||
export const TWITTER_TIMELINE = 'twitter_timeline';
|
||||
|
|
|
|||
|
|
@ -12,14 +12,13 @@ if (page) {
|
|||
const store = configureStore();
|
||||
|
||||
const settings = JSON.parse(document.getElementById('homepageSettings').textContent);
|
||||
const { feedUrl, subredditUrl, timelineUrl, categoriesUrl } = settings;
|
||||
const { feedUrl, subredditUrl, categoriesUrl } = settings;
|
||||
|
||||
const app = (
|
||||
<Provider store={store}>
|
||||
<App
|
||||
feedUrl={feedUrl.substring(1, feedUrl.length - 3)}
|
||||
subredditUrl={subredditUrl.substring(1, subredditUrl.length - 3)}
|
||||
timelineUrl={timelineUrl.substring(1, timelineUrl.length - 3)}
|
||||
categoriesUrl={categoriesUrl.substring(1, categoriesUrl.length - 3)}
|
||||
timezone={settings.timezone}
|
||||
autoMarking={settings.autoMarking}
|
||||
|
|
|
|||
|
|
@ -6,8 +6,6 @@ from datetime import timedelta
|
|||
from django.core.exceptions import MultipleObjectsReturned, ObjectDoesNotExist
|
||||
from django.utils import timezone
|
||||
|
||||
import pytz
|
||||
|
||||
from feedparser import parse
|
||||
|
||||
from newsreader.news.collection.base import (
|
||||
|
|
@ -58,7 +56,6 @@ class FeedBuilder(PostBuilder):
|
|||
"published_parsed": "publication_date",
|
||||
"author": "author",
|
||||
}
|
||||
tz = pytz.timezone(self.stream.rule.timezone)
|
||||
data = {"rule_id": self.stream.rule.pk}
|
||||
|
||||
for field, model_field in field_mapping.items():
|
||||
|
|
@ -68,7 +65,7 @@ class FeedBuilder(PostBuilder):
|
|||
value = truncate_text(Post, model_field, entry[field])
|
||||
|
||||
if field == "published_parsed":
|
||||
data[model_field] = build_publication_date(value, tz)
|
||||
data[model_field] = build_publication_date(value)
|
||||
elif field == "summary":
|
||||
data[model_field] = self.sanitize_fragment(value)
|
||||
else:
|
||||
|
|
|
|||
|
|
@ -1,24 +1,15 @@
|
|||
from django import forms
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
import pytz
|
||||
|
||||
from newsreader.core.forms import CheckboxInput
|
||||
from newsreader.news.collection.forms.base import CollectionRuleForm
|
||||
from newsreader.news.collection.models import CollectionRule
|
||||
|
||||
|
||||
class FeedForm(CollectionRuleForm):
|
||||
timezone = forms.ChoiceField(
|
||||
widget=forms.Select(attrs={"size": len(pytz.all_timezones)}),
|
||||
choices=((timezone, timezone) for timezone in pytz.all_timezones),
|
||||
help_text=_("The timezone which the feed uses"),
|
||||
initial=pytz.utc,
|
||||
)
|
||||
|
||||
class Meta:
|
||||
model = CollectionRule
|
||||
fields = ("name", "url", "timezone", "favicon", "category")
|
||||
fields = ("name", "url", "favicon", "category")
|
||||
|
||||
|
||||
class OPMLImportForm(forms.Form):
|
||||
|
|
|
|||
|
|
@ -3,8 +3,6 @@ from django.core.exceptions import ValidationError
|
|||
from django.utils.safestring import mark_safe
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
import pytz
|
||||
|
||||
from newsreader.news.collection.choices import RuleTypeChoices
|
||||
from newsreader.news.collection.forms.base import CollectionRuleForm
|
||||
from newsreader.news.collection.models import CollectionRule
|
||||
|
|
@ -36,7 +34,6 @@ class SubRedditForm(CollectionRuleForm):
|
|||
instance = super().save(commit=False)
|
||||
|
||||
instance.type = RuleTypeChoices.subreddit
|
||||
instance.timezone = str(pytz.utc)
|
||||
|
||||
if commit:
|
||||
instance.save()
|
||||
|
|
|
|||
|
|
@ -0,0 +1,17 @@
|
|||
# Generated by Django 4.2.16 on 2024-09-07 17:07
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('collection', '0016_alter_collectionrule_timezone'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RemoveField(
|
||||
model_name='collectionrule',
|
||||
name='timezone',
|
||||
),
|
||||
]
|
||||
|
|
@ -3,8 +3,6 @@ from django.conf import settings
|
|||
from django.urls import reverse
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
import pytz
|
||||
|
||||
from newsreader.core.models import TimeStampedModel
|
||||
from newsreader.news.collection.choices import RuleTypeChoices
|
||||
|
||||
|
|
@ -26,12 +24,6 @@ class CollectionRule(TimeStampedModel):
|
|||
)
|
||||
favicon = models.URLField(blank=True, null=True)
|
||||
|
||||
timezone = models.CharField(
|
||||
choices=((timezone, timezone) for timezone in pytz.all_timezones),
|
||||
max_length=100,
|
||||
default=str(pytz.utc),
|
||||
)
|
||||
|
||||
category = models.ForeignKey(
|
||||
"core.Category",
|
||||
blank=True,
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import logging
|
||||
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
from datetime import datetime, timedelta
|
||||
from datetime import datetime, timedelta, timezone
|
||||
from html import unescape
|
||||
from json.decoder import JSONDecodeError
|
||||
from urllib.parse import urlencode
|
||||
|
|
@ -9,10 +9,8 @@ from uuid import uuid4
|
|||
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.utils import timezone
|
||||
from django.utils.html import format_html
|
||||
|
||||
import pytz
|
||||
import requests
|
||||
|
||||
from newsreader.news.collection.base import (
|
||||
|
|
@ -214,8 +212,8 @@ class RedditBuilder(PostBuilder):
|
|||
body = self.get_url_post(title, direct_url)
|
||||
|
||||
try:
|
||||
parsed_date = datetime.fromtimestamp(entry_data["created_utc"])
|
||||
created_date = pytz.utc.localize(parsed_date)
|
||||
_created_date = datetime.fromtimestamp(entry_data["created_utc"])
|
||||
created_date = _created_date.replace(tzinfo=timezone.utc)
|
||||
except (OverflowError, OSError) as e:
|
||||
raise BuilderParseException(payload=entry) from e
|
||||
except KeyError as e:
|
||||
|
|
@ -370,7 +368,7 @@ class RedditClient(PostClient):
|
|||
|
||||
continue
|
||||
finally:
|
||||
stream.rule.last_run = timezone.now()
|
||||
stream.rule.last_run = datetime.now(tz=timezone.utc)
|
||||
stream.rule.save()
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from django.conf import settings
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.core.mail import send_mail
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
import requests
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,10 @@
|
|||
import json
|
||||
|
||||
from datetime import date, datetime, time
|
||||
from datetime import date, datetime, time, timezone
|
||||
|
||||
from django.test import TestCase
|
||||
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.core.tests.factories import CategoryFactory, FeedPostFactory
|
||||
|
|
@ -153,22 +151,22 @@ class NestedRuleListViewTestCase(TestCase):
|
|||
FeedPostFactory(
|
||||
title="I'm the first post",
|
||||
rule=rule,
|
||||
publication_date=datetime.combine(
|
||||
date(2019, 5, 20), time(hour=16, minute=7, second=37), pytz.utc
|
||||
),
|
||||
publication_date=(
|
||||
datetime(2019, 5, 20, 16, 7, 37, tzinfo=timezone.utc)
|
||||
)
|
||||
),
|
||||
FeedPostFactory(
|
||||
title="I'm the second post",
|
||||
rule=rule,
|
||||
publication_date=datetime.combine(
|
||||
date(2019, 7, 20), time(hour=18, minute=7, second=37), pytz.utc
|
||||
publication_date=(
|
||||
datetime(2019, 7, 20, 18, 7, 37, tzinfo=timezone.utc)
|
||||
),
|
||||
),
|
||||
FeedPostFactory(
|
||||
title="I'm the third post",
|
||||
rule=rule,
|
||||
publication_date=datetime.combine(
|
||||
date(2019, 7, 20), time(hour=16, minute=7, second=37), pytz.utc
|
||||
publication_date=(
|
||||
datetime(2019, 7, 20, 16, 7, 37, tzinfo=timezone.utc)
|
||||
),
|
||||
),
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,10 +1,7 @@
|
|||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from unittest.mock import Mock
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils import timezone
|
||||
|
||||
import pytz
|
||||
|
||||
from freezegun import freeze_time
|
||||
|
||||
|
|
@ -51,7 +48,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
post = posts[0]
|
||||
|
||||
publication_date = datetime(
|
||||
2019, 5, 20, hour=16, minute=32, second=38, tzinfo=pytz.utc
|
||||
2019, 5, 20, hour=16, minute=32, second=38, tzinfo=timezone.utc
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
|
|
@ -75,7 +72,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
post = posts[1]
|
||||
|
||||
publication_date = datetime(
|
||||
2019, 5, 20, hour=16, minute=7, second=37, tzinfo=pytz.utc
|
||||
2019, 5, 20, hour=16, minute=7, second=37, tzinfo=timezone.utc
|
||||
)
|
||||
|
||||
self.assertEqual(
|
||||
|
|
@ -110,7 +107,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
post = posts[0]
|
||||
|
||||
publication_date = datetime(
|
||||
2019, 5, 20, hour=16, minute=7, second=37, tzinfo=pytz.utc
|
||||
2019, 5, 20, hour=16, minute=7, second=37, tzinfo=timezone.utc
|
||||
)
|
||||
|
||||
self.assertEqual(post.publication_date, publication_date)
|
||||
|
|
@ -125,7 +122,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
post = posts[1]
|
||||
|
||||
publication_date = datetime(
|
||||
2019, 5, 20, hour=12, minute=19, second=19, tzinfo=pytz.utc
|
||||
2019, 5, 20, hour=12, minute=19, second=19, tzinfo=timezone.utc
|
||||
)
|
||||
|
||||
self.assertEqual(post.publication_date, publication_date)
|
||||
|
|
@ -149,7 +146,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
self.assertEqual(
|
||||
post.publication_date.strftime("%Y-%m-%d %H:%M"), "2019-10-30 12:30"
|
||||
)
|
||||
self.assertEqual(post.created, timezone.now())
|
||||
self.assertEqual(post.created, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(
|
||||
post.remote_identifier,
|
||||
"https://www.bbc.co.uk/news/world-us-canada-48338168",
|
||||
|
|
@ -160,7 +157,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
self.assertEqual(
|
||||
post.publication_date.strftime("%Y-%m-%d %H:%M"), "2019-10-30 12:30"
|
||||
)
|
||||
self.assertEqual(post.created, timezone.now())
|
||||
self.assertEqual(post.created, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(
|
||||
post.remote_identifier, "https://www.bbc.co.uk/news/technology-48334739"
|
||||
)
|
||||
|
|
@ -178,7 +175,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
|
||||
post = posts[0]
|
||||
|
||||
self.assertEqual(post.created, timezone.now())
|
||||
self.assertEqual(post.created, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(
|
||||
post.remote_identifier,
|
||||
"https://www.bbc.co.uk/news/world-us-canada-48338168",
|
||||
|
|
@ -186,7 +183,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
|
||||
post = posts[1]
|
||||
|
||||
self.assertEqual(post.created, timezone.now())
|
||||
self.assertEqual(post.created, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(
|
||||
post.remote_identifier, "https://www.bbc.co.uk/news/technology-48334739"
|
||||
)
|
||||
|
|
@ -238,7 +235,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
|
||||
post = posts[0]
|
||||
|
||||
self.assertEqual(post.created, timezone.now())
|
||||
self.assertEqual(post.created, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(
|
||||
post.remote_identifier,
|
||||
"https://www.bbc.co.uk/news/world-us-canada-48338168",
|
||||
|
|
@ -247,7 +244,7 @@ class FeedBuilderTestCase(TestCase):
|
|||
|
||||
post = posts[1]
|
||||
|
||||
self.assertEqual(post.created, timezone.now())
|
||||
self.assertEqual(post.created, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(
|
||||
post.remote_identifier, "https://www.bbc.co.uk/news/technology-48334739"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
from datetime import date, datetime, time
|
||||
from datetime import datetime, timezone
|
||||
from time import struct_time
|
||||
from unittest.mock import Mock, patch
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils import timezone
|
||||
|
||||
import pytz
|
||||
|
||||
from freezegun import freeze_time
|
||||
|
||||
|
|
@ -47,10 +44,10 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 3)
|
||||
self.assertEquals(rule.succeeded, True)
|
||||
self.assertEquals(rule.last_run, timezone.now())
|
||||
self.assertEquals(rule.error, None)
|
||||
self.assertEqual(Post.objects.count(), 3)
|
||||
self.assertEqual(rule.succeeded, True)
|
||||
self.assertEqual(rule.last_run, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(rule.error, None)
|
||||
|
||||
def test_emtpy_batch(self):
|
||||
self.mocked_fetch.return_value = Mock()
|
||||
|
|
@ -63,10 +60,10 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, True)
|
||||
self.assertEquals(rule.error, None)
|
||||
self.assertEquals(rule.last_run, timezone.now())
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, True)
|
||||
self.assertEqual(rule.error, None)
|
||||
self.assertEqual(rule.last_run, datetime.now(tz=timezone.utc))
|
||||
|
||||
def test_not_found(self):
|
||||
self.mocked_fetch.side_effect = StreamNotFoundException
|
||||
|
|
@ -77,14 +74,14 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream not found")
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream not found")
|
||||
|
||||
def test_denied(self):
|
||||
self.mocked_fetch.side_effect = StreamDeniedException
|
||||
|
||||
old_run = timezone.make_aware(datetime(2019, 10, 30, 12, 30))
|
||||
old_run = datetime(2019, 10, 30, 12, 30, tzinfo=timezone.utc)
|
||||
rule = FeedFactory(last_run=old_run)
|
||||
|
||||
collector = FeedCollector()
|
||||
|
|
@ -92,15 +89,15 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream does not have sufficient permissions")
|
||||
self.assertEquals(rule.last_run, timezone.now())
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream does not have sufficient permissions")
|
||||
self.assertEqual(rule.last_run, datetime.now(tz=timezone.utc))
|
||||
|
||||
def test_forbidden(self):
|
||||
self.mocked_fetch.side_effect = StreamForbiddenException
|
||||
|
||||
old_run = pytz.utc.localize(datetime(2019, 10, 30, 12, 30))
|
||||
old_run = datetime(2019, 10, 30, 12, 30, tzinfo=timezone.utc)
|
||||
rule = FeedFactory(last_run=old_run)
|
||||
|
||||
collector = FeedCollector()
|
||||
|
|
@ -108,17 +105,15 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream forbidden")
|
||||
self.assertEquals(rule.last_run, timezone.now())
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream forbidden")
|
||||
self.assertEqual(rule.last_run, datetime.now(tz=timezone.utc))
|
||||
|
||||
def test_timed_out(self):
|
||||
self.mocked_fetch.side_effect = StreamTimeOutException
|
||||
|
||||
last_run = timezone.make_aware(
|
||||
datetime.combine(date=date(2019, 10, 30), time=time(12, 30))
|
||||
)
|
||||
last_run = datetime(2019, 10, 30, 12, 30, tzinfo=timezone.utc)
|
||||
rule = FeedFactory(last_run=last_run)
|
||||
|
||||
collector = FeedCollector()
|
||||
|
|
@ -126,11 +121,11 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream timed out")
|
||||
self.assertEquals(
|
||||
rule.last_run, pytz.utc.localize(datetime(2019, 10, 30, 12, 30))
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream timed out")
|
||||
self.assertEqual(
|
||||
rule.last_run, datetime(2019, 10, 30, 12, 30, tzinfo=timezone.utc)
|
||||
)
|
||||
|
||||
def test_duplicates(self):
|
||||
|
|
@ -139,7 +134,7 @@ class FeedCollectorTestCase(TestCase):
|
|||
rule = FeedFactory()
|
||||
|
||||
aware_datetime = build_publication_date(
|
||||
struct_time((2019, 5, 20, 16, 7, 37, 0, 140, 0)), pytz.utc
|
||||
struct_time((2019, 5, 20, 16, 7, 37, 0, 140, 0))
|
||||
)
|
||||
|
||||
FeedPostFactory(
|
||||
|
|
@ -152,7 +147,7 @@ class FeedCollectorTestCase(TestCase):
|
|||
)
|
||||
|
||||
aware_datetime = build_publication_date(
|
||||
struct_time((2019, 5, 20, 12, 19, 19, 0, 140, 0)), pytz.utc
|
||||
struct_time((2019, 5, 20, 12, 19, 19, 0, 140, 0))
|
||||
)
|
||||
|
||||
FeedPostFactory(
|
||||
|
|
@ -165,7 +160,7 @@ class FeedCollectorTestCase(TestCase):
|
|||
)
|
||||
|
||||
aware_datetime = build_publication_date(
|
||||
struct_time((2019, 5, 20, 16, 32, 38, 0, 140, 0)), pytz.utc
|
||||
struct_time((2019, 5, 20, 16, 32, 38, 0, 140, 0))
|
||||
)
|
||||
|
||||
FeedPostFactory(
|
||||
|
|
@ -183,10 +178,10 @@ class FeedCollectorTestCase(TestCase):
|
|||
|
||||
rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 3)
|
||||
self.assertEquals(rule.succeeded, True)
|
||||
self.assertEquals(rule.last_run, timezone.now())
|
||||
self.assertEquals(rule.error, None)
|
||||
self.assertEqual(Post.objects.count(), 3)
|
||||
self.assertEqual(rule.succeeded, True)
|
||||
self.assertEqual(rule.last_run, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(rule.error, None)
|
||||
|
||||
def test_items_with_identifiers_get_updated(self):
|
||||
self.mocked_parse.return_value = multiple_update_mock
|
||||
|
|
@ -197,7 +192,7 @@ class FeedCollectorTestCase(TestCase):
|
|||
url="https://www.bbc.co.uk/",
|
||||
title="Trump",
|
||||
body="Foreign Minister Mohammad Javad Zarif",
|
||||
publication_date=timezone.now(),
|
||||
publication_date=datetime.now(tz=timezone.utc),
|
||||
rule=rule,
|
||||
)
|
||||
|
||||
|
|
@ -206,7 +201,7 @@ class FeedCollectorTestCase(TestCase):
|
|||
url="https://www.bbc.co.uk/",
|
||||
title="Huawei's Android loss: How it affects you",
|
||||
body="Google's move to end business ties with Huawei will",
|
||||
publication_date=timezone.now(),
|
||||
publication_date=datetime.now(tz=timezone.utc),
|
||||
rule=rule,
|
||||
)
|
||||
|
||||
|
|
@ -215,7 +210,7 @@ class FeedCollectorTestCase(TestCase):
|
|||
url="https://www.bbc.co.uk/news/uk-england-birmingham-48339080",
|
||||
title="Birmingham head teacher threatened over LGBT lessons",
|
||||
body="Police are investigating the messages while an MP",
|
||||
publication_date=timezone.now(),
|
||||
publication_date=datetime.now(tz=timezone.utc),
|
||||
rule=rule,
|
||||
)
|
||||
|
||||
|
|
@ -227,19 +222,19 @@ class FeedCollectorTestCase(TestCase):
|
|||
second_post.refresh_from_db()
|
||||
third_post.refresh_from_db()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 3)
|
||||
self.assertEquals(rule.succeeded, True)
|
||||
self.assertEquals(rule.last_run, timezone.now())
|
||||
self.assertEquals(rule.error, None)
|
||||
self.assertEqual(Post.objects.count(), 3)
|
||||
self.assertEqual(rule.succeeded, True)
|
||||
self.assertEqual(rule.last_run, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(rule.error, None)
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
first_post.title, "Trump's 'genocidal taunts' will not end Iran - Zarif"
|
||||
)
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
second_post.title, "Huawei's Android loss: How it affects you"
|
||||
)
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
third_post.title, "Birmingham head teacher threatened over LGBT lessons"
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
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 (
|
||||
|
|
@ -53,8 +51,8 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
post = posts["hm0qct"]
|
||||
|
||||
self.assertEquals(post.rule, subreddit)
|
||||
self.assertEquals(
|
||||
self.assertEqual(post.rule, subreddit)
|
||||
self.assertEqual(
|
||||
post.title,
|
||||
"Linux Experiences/Rants or Education/Certifications thread - July 06, 2020",
|
||||
)
|
||||
|
|
@ -72,13 +70,13 @@ class RedditBuilderTestCase(TestCase):
|
|||
post.body,
|
||||
)
|
||||
|
||||
self.assertEquals(post.author, "AutoModerator")
|
||||
self.assertEquals(
|
||||
self.assertEqual(post.author, "AutoModerator")
|
||||
self.assertEqual(
|
||||
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))
|
||||
self.assertEqual(
|
||||
post.publication_date, datetime(2020, 7, 6, 6, 11, 22, tzinfo=timezone.utc)
|
||||
)
|
||||
|
||||
def test_empty_data(self):
|
||||
|
|
@ -91,7 +89,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
builder.build()
|
||||
builder.save()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
|
||||
def test_unknown_mock(self):
|
||||
builder = RedditBuilder
|
||||
|
|
@ -103,7 +101,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
builder.build()
|
||||
builder.save()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
|
||||
def test_html_sanitizing(self):
|
||||
builder = RedditBuilder
|
||||
|
|
@ -121,7 +119,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
post = posts["hnd7cy"]
|
||||
|
||||
self.assertEquals(post.body, "<article></article>")
|
||||
self.assertEqual(post.body, "<article></article>")
|
||||
|
||||
def test_long_author_text_is_truncated(self):
|
||||
builder = RedditBuilder
|
||||
|
|
@ -139,7 +137,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
post = posts["hnd7cy"]
|
||||
|
||||
self.assertEquals(post.author, "TheQuantumZeroTheQuantumZeroTheQuantumZ…")
|
||||
self.assertEqual(post.author, "TheQuantumZeroTheQuantumZeroTheQuantumZ…")
|
||||
|
||||
def test_long_title_text_is_truncated(self):
|
||||
builder = RedditBuilder
|
||||
|
|
@ -157,7 +155,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
post = posts["hnd7cy"]
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
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…',
|
||||
)
|
||||
|
|
@ -174,7 +172,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 2)
|
||||
self.assertEqual(Post.objects.count(), 2)
|
||||
self.assertCountEqual(("hm0qct", "hna75r"), posts.keys())
|
||||
|
||||
def test_duplicate_in_database(self):
|
||||
|
|
@ -191,7 +189,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 5)
|
||||
self.assertEqual(Post.objects.count(), 5)
|
||||
self.assertCountEqual(
|
||||
("hm0qct", "hna75r", "hngs71", "hngsj8", "hnd7cy"), posts.keys()
|
||||
)
|
||||
|
|
@ -220,11 +218,11 @@ class RedditBuilderTestCase(TestCase):
|
|||
)
|
||||
url = "https://i.redd.it/cm2qybia1va51.jpg"
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
"https://www.reddit.com/r/aww/comments/hr64xh/yall_i_just_cant_this_is_my_son_judah_my_wife_and/",
|
||||
post.url,
|
||||
)
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
f"<div><img alt='{title}' src='{url}' loading='lazy' /></div>", post.body
|
||||
)
|
||||
|
||||
|
|
@ -247,11 +245,11 @@ class RedditBuilderTestCase(TestCase):
|
|||
url = "http://gfycat.com/thatalivedogwoodclubgall"
|
||||
title = "Excited cows have a new brush!"
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
f"<div><a target='_blank' rel='noopener noreferrer' alt='{title}' href='{url}' class='link'>Direct url</a></div>",
|
||||
post.body,
|
||||
)
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
"https://www.reddit.com/r/aww/comments/hr41am/excited_cows_have_a_new_brush/",
|
||||
post.url,
|
||||
)
|
||||
|
|
@ -261,10 +259,10 @@ class RedditBuilderTestCase(TestCase):
|
|||
url = "https://i.imgur.com/usfMVUJ.jpg"
|
||||
title = "Novosibirsk Zoo welcomes 16 cobalt-eyed Pallas’s cat kittens"
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
f"<div><img alt='{title}' src='{url}' loading='lazy' /></div>", post.body
|
||||
)
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
"https://www.reddit.com/r/aww/comments/huoldn/novosibirsk_zoo_welcomes_16_cobalteyed_pallass/",
|
||||
post.url,
|
||||
)
|
||||
|
|
@ -287,11 +285,11 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
url = "https://v.redd.it/eyvbxaeqtta51/DASH_480.mp4?source=fallback"
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
post.url,
|
||||
"https://www.reddit.com/r/aww/comments/hr1r00/cool_catt_and_his_clingy_girlfriend/",
|
||||
)
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
f"<div><video controls muted><source src='{url}' type='video/mp4' /></video></div>",
|
||||
post.body,
|
||||
)
|
||||
|
|
@ -308,9 +306,9 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
post = Post.objects.get()
|
||||
|
||||
self.assertEquals(post.remote_identifier, "hulh8k")
|
||||
self.assertEqual(post.remote_identifier, "hulh8k")
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
post.url,
|
||||
"https://www.reddit.com/r/aww/comments/hulh8k/dog_splashing_in_water/",
|
||||
)
|
||||
|
|
@ -318,7 +316,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
title = "Dog splashing in water"
|
||||
url = "https://gfycat.com/excellentinfantileamericanwigeon"
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
f"<div><a target='_blank' rel='noopener noreferrer' alt='{title}' href='{url}' class='link'>Direct url</a></div>",
|
||||
post.body,
|
||||
)
|
||||
|
|
@ -335,13 +333,13 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
post = Post.objects.get()
|
||||
|
||||
self.assertEquals(post.remote_identifier, "humdlf")
|
||||
self.assertEqual(post.remote_identifier, "humdlf")
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
post.url, "https://www.reddit.com/r/aww/comments/humdlf/if_i_fits_i_sits/"
|
||||
)
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
"<div><video controls muted><source src='https://i.imgur.com/grVh2AG.mp4' type='video/mp4' /></video></div>",
|
||||
post.body,
|
||||
)
|
||||
|
|
@ -366,7 +364,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
post.body,
|
||||
)
|
||||
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
post.url,
|
||||
"https://www.reddit.com/r/linux/comments/hngsj8/keepassxc_260_released/",
|
||||
)
|
||||
|
|
@ -381,7 +379,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
builder.build()
|
||||
builder.save()
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
|
||||
def test_nsfw_not_allowed(self):
|
||||
builder = RedditBuilder
|
||||
|
|
@ -395,7 +393,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 1)
|
||||
self.assertEqual(Post.objects.count(), 1)
|
||||
self.assertCountEqual(("hna75r",), posts.keys())
|
||||
|
||||
def test_spoiler_not_allowed(self):
|
||||
|
|
@ -410,7 +408,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 1)
|
||||
self.assertEqual(Post.objects.count(), 1)
|
||||
self.assertCountEqual(("hm0qct",), posts.keys())
|
||||
|
||||
def test_already_seen_not_allowed(self):
|
||||
|
|
@ -425,7 +423,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 1)
|
||||
self.assertEqual(Post.objects.count(), 1)
|
||||
self.assertCountEqual(("hna75r",), posts.keys())
|
||||
|
||||
def test_upvote_minimum(self):
|
||||
|
|
@ -440,7 +438,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 1)
|
||||
self.assertEqual(Post.objects.count(), 1)
|
||||
self.assertCountEqual(("hna75r",), posts.keys())
|
||||
|
||||
def test_comments_minimum(self):
|
||||
|
|
@ -455,7 +453,7 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 1)
|
||||
self.assertEqual(Post.objects.count(), 1)
|
||||
self.assertCountEqual(("hm0qct",), posts.keys())
|
||||
|
||||
def test_downvote_maximum(self):
|
||||
|
|
@ -470,5 +468,5 @@ class RedditBuilderTestCase(TestCase):
|
|||
|
||||
posts = {post.remote_identifier: post for post in Post.objects.all()}
|
||||
|
||||
self.assertEquals(Post.objects.count(), 1)
|
||||
self.assertEqual(Post.objects.count(), 1)
|
||||
self.assertCountEqual(("hm0qct",), posts.keys())
|
||||
|
|
|
|||
|
|
@ -1,11 +1,8 @@
|
|||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
from unittest.mock import patch
|
||||
from uuid import uuid4
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils import timezone
|
||||
|
||||
import pytz
|
||||
|
||||
from newsreader.news.collection.choices import RuleTypeChoices
|
||||
from newsreader.news.collection.exceptions import (
|
||||
|
|
@ -73,23 +70,23 @@ class RedditCollectorTestCase(TestCase):
|
|||
|
||||
for subreddit in rules:
|
||||
with self.subTest(subreddit=subreddit):
|
||||
self.assertEquals(subreddit.succeeded, True)
|
||||
self.assertEquals(subreddit.last_run, timezone.now())
|
||||
self.assertEquals(subreddit.error, None)
|
||||
self.assertEqual(subreddit.succeeded, True)
|
||||
self.assertEqual(subreddit.last_run, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(subreddit.error, None)
|
||||
|
||||
post = Post.objects.get(
|
||||
remote_identifier="hph00n", rule__type=RuleTypeChoices.subreddit
|
||||
)
|
||||
|
||||
self.assertEquals(
|
||||
post.publication_date, pytz.utc.localize(datetime(2020, 7, 11, 22, 23, 24))
|
||||
self.assertEqual(
|
||||
post.publication_date, datetime(2020, 7, 11, 22, 23, 24, tzinfo=timezone.utc)
|
||||
)
|
||||
|
||||
self.assertEquals(post.author, "HannahB888")
|
||||
self.assertEquals(
|
||||
self.assertEqual(post.author, "HannahB888")
|
||||
self.assertEqual(
|
||||
post.title, "Drake Interplanetary Smartkey thing that I made!"
|
||||
)
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
post.url,
|
||||
"https://www.reddit.com/r/starcitizen/comments/hph00n/drake_interplanetary_smartkey_thing_that_i_made/",
|
||||
)
|
||||
|
|
@ -98,16 +95,16 @@ class RedditCollectorTestCase(TestCase):
|
|||
remote_identifier="hpr28u", rule__type=RuleTypeChoices.subreddit
|
||||
)
|
||||
|
||||
self.assertEquals(
|
||||
post.publication_date, pytz.utc.localize(datetime(2020, 7, 12, 10, 29, 10))
|
||||
self.assertEqual(
|
||||
post.publication_date, datetime(2020, 7, 12, 10, 29, 10, tzinfo=timezone.utc)
|
||||
)
|
||||
|
||||
self.assertEquals(post.author, "Sebaron")
|
||||
self.assertEquals(
|
||||
self.assertEqual(post.author, "Sebaron")
|
||||
self.assertEqual(
|
||||
post.title,
|
||||
"I am a medical student, and I recently programmed an open-source eye-tracker for brain research",
|
||||
)
|
||||
self.assertEquals(
|
||||
self.assertEqual(
|
||||
post.url,
|
||||
"https://www.reddit.com/r/Python/comments/hpr28u/i_am_a_medical_student_and_i_recently_programmed/",
|
||||
)
|
||||
|
|
@ -128,13 +125,13 @@ class RedditCollectorTestCase(TestCase):
|
|||
collector = RedditCollector()
|
||||
collector.collect(rules=rules)
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
|
||||
for subreddit in rules:
|
||||
with self.subTest(subreddit=subreddit):
|
||||
self.assertEquals(subreddit.succeeded, True)
|
||||
self.assertEquals(subreddit.last_run, timezone.now())
|
||||
self.assertEquals(subreddit.error, None)
|
||||
self.assertEqual(subreddit.succeeded, True)
|
||||
self.assertEqual(subreddit.last_run, datetime.now(tz=timezone.utc))
|
||||
self.assertEqual(subreddit.error, None)
|
||||
|
||||
def test_not_found(self):
|
||||
self.mocked_fetch.side_effect = StreamNotFoundException
|
||||
|
|
@ -148,9 +145,9 @@ class RedditCollectorTestCase(TestCase):
|
|||
collector = RedditCollector()
|
||||
collector.collect(rules=((rule,),))
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream not found")
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream not found")
|
||||
|
||||
@patch("newsreader.news.collection.reddit.RedditTokenTask")
|
||||
def test_denied(self, mocked_task):
|
||||
|
|
@ -165,9 +162,9 @@ class RedditCollectorTestCase(TestCase):
|
|||
collector = RedditCollector()
|
||||
collector.collect(rules=((rule,),))
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream does not have sufficient permissions")
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream does not have sufficient permissions")
|
||||
|
||||
mocked_task.delay.assert_called_once_with(rule.user.pk)
|
||||
|
||||
|
|
@ -183,9 +180,9 @@ class RedditCollectorTestCase(TestCase):
|
|||
collector = RedditCollector()
|
||||
collector.collect(rules=((rule,),))
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream forbidden")
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream forbidden")
|
||||
|
||||
def test_timed_out(self):
|
||||
self.mocked_fetch.side_effect = StreamTimeOutException
|
||||
|
|
@ -199,6 +196,6 @@ class RedditCollectorTestCase(TestCase):
|
|||
collector = RedditCollector()
|
||||
collector.collect(rules=((rule,),))
|
||||
|
||||
self.assertEquals(Post.objects.count(), 0)
|
||||
self.assertEquals(rule.succeeded, False)
|
||||
self.assertEquals(rule.error, "Stream timed out")
|
||||
self.assertEqual(Post.objects.count(), 0)
|
||||
self.assertEqual(rule.succeeded, False)
|
||||
self.assertEqual(rule.error, "Stream timed out")
|
||||
|
|
|
|||
|
|
@ -46,7 +46,6 @@ class CollectionRuleViewTestCase:
|
|||
name="new name",
|
||||
category=other_rule.category,
|
||||
url=other_rule.url,
|
||||
timezone=other_rule.timezone,
|
||||
)
|
||||
|
||||
other_url = reverse("news:collection:feed-update", args=[other_rule.pk])
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
from django.test import TestCase
|
||||
from django.urls import reverse
|
||||
|
||||
import pytz
|
||||
|
||||
from django_celery_beat.models import PeriodicTask
|
||||
|
||||
from newsreader.news.collection.choices import RuleTypeChoices
|
||||
|
|
@ -21,23 +19,21 @@ class FeedCreateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
self.form_data.update(
|
||||
name="new rule",
|
||||
url="https://www.rss.com/rss",
|
||||
timezone=pytz.utc,
|
||||
category=str(self.category.pk),
|
||||
)
|
||||
|
||||
def test_creation(self):
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
rule = CollectionRule.objects.get(name="new rule")
|
||||
|
||||
self.assertEquals(rule.type, RuleTypeChoices.feed)
|
||||
self.assertEquals(rule.url, "https://www.rss.com/rss")
|
||||
self.assertEquals(rule.timezone, str(pytz.utc))
|
||||
self.assertEquals(rule.favicon, None)
|
||||
self.assertEquals(rule.category.pk, self.category.pk)
|
||||
self.assertEquals(rule.user.pk, self.user.pk)
|
||||
self.assertEqual(rule.type, RuleTypeChoices.feed)
|
||||
self.assertEqual(rule.url, "https://www.rss.com/rss")
|
||||
self.assertEqual(rule.favicon, None)
|
||||
self.assertEqual(rule.category.pk, self.category.pk)
|
||||
self.assertEqual(rule.user.pk, self.user.pk)
|
||||
|
||||
self.assertTrue(
|
||||
PeriodicTask.objects.get(
|
||||
|
|
@ -59,18 +55,17 @@ class FeedUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
name=self.rule.name,
|
||||
category=self.rule.category.pk,
|
||||
url=self.rule.url,
|
||||
timezone=self.rule.timezone,
|
||||
)
|
||||
|
||||
def test_name_change(self):
|
||||
self.form_data.update(name="new name")
|
||||
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(self.rule.name, "new name")
|
||||
self.assertEqual(self.rule.name, "new name")
|
||||
|
||||
def test_category_change(self):
|
||||
new_category = CategoryFactory(user=self.user)
|
||||
|
|
@ -78,21 +73,21 @@ class FeedUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
self.form_data.update(category=new_category.pk)
|
||||
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(self.rule.category.pk, new_category.pk)
|
||||
self.assertEqual(self.rule.category.pk, new_category.pk)
|
||||
|
||||
def test_category_removal(self):
|
||||
self.form_data.update(category="")
|
||||
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(self.rule.category, None)
|
||||
self.assertEqual(self.rule.category, None)
|
||||
|
||||
def test_rules_only(self):
|
||||
rule = FeedFactory(
|
||||
|
|
@ -106,4 +101,4 @@ class FeedUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
|
||||
response = self.client.get(url)
|
||||
|
||||
self.assertEquals(response.status_code, 404)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
|
|
|||
|
|
@ -2,8 +2,6 @@ from django.test import TestCase
|
|||
from django.urls import reverse
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
import pytz
|
||||
|
||||
from newsreader.news.collection.choices import RuleTypeChoices
|
||||
from newsreader.news.collection.models import CollectionRule
|
||||
from newsreader.news.collection.reddit import REDDIT_API_URL, REDDIT_URL
|
||||
|
|
@ -32,16 +30,15 @@ class SubRedditCreateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
def test_creation(self):
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
rule = CollectionRule.objects.get(name="new rule")
|
||||
|
||||
self.assertEquals(rule.type, RuleTypeChoices.subreddit)
|
||||
self.assertEquals(rule.url, f"{REDDIT_API_URL}/r/aww")
|
||||
self.assertEquals(rule.timezone, str(pytz.utc))
|
||||
self.assertEquals(rule.favicon, None)
|
||||
self.assertEquals(rule.category.pk, self.category.pk)
|
||||
self.assertEquals(rule.user.pk, self.user.pk)
|
||||
self.assertEqual(rule.type, RuleTypeChoices.subreddit)
|
||||
self.assertEqual(rule.url, f"{REDDIT_API_URL}/r/aww")
|
||||
self.assertEqual(rule.favicon, None)
|
||||
self.assertEqual(rule.category.pk, self.category.pk)
|
||||
self.assertEqual(rule.user.pk, self.user.pk)
|
||||
|
||||
def test_regular_reddit_url(self):
|
||||
self.form_data.update(url=f"{REDDIT_URL}/r/aww")
|
||||
|
|
@ -70,7 +67,6 @@ class SubRedditUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
"name": self.rule.name,
|
||||
"url": self.rule.url,
|
||||
"category": str(self.category.pk),
|
||||
"timezone": pytz.utc,
|
||||
"reddit_allow_nfsw": False,
|
||||
"reddit_allow_spoiler": False,
|
||||
"reddit_allow_viewed": True,
|
||||
|
|
@ -82,11 +78,11 @@ class SubRedditUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
self.form_data.update(name="Python 2")
|
||||
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(self.rule.name, "Python 2")
|
||||
self.assertEqual(self.rule.name, "Python 2")
|
||||
|
||||
def test_category_change(self):
|
||||
new_category = CategoryFactory(user=self.user)
|
||||
|
|
@ -94,11 +90,11 @@ class SubRedditUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
self.form_data.update(category=new_category.pk)
|
||||
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.rule.refresh_from_db()
|
||||
|
||||
self.assertEquals(self.rule.category.pk, new_category.pk)
|
||||
self.assertEqual(self.rule.category.pk, new_category.pk)
|
||||
|
||||
def test_subreddit_rules_only(self):
|
||||
rule = SubredditFactory(
|
||||
|
|
@ -112,23 +108,22 @@ class SubRedditUpdateViewTestCase(CollectionRuleViewTestCase, TestCase):
|
|||
|
||||
response = self.client.get(url)
|
||||
|
||||
self.assertEquals(response.status_code, 404)
|
||||
self.assertEqual(response.status_code, 404)
|
||||
|
||||
def test_url_change(self):
|
||||
self.form_data.update(name="aww", url=f"{REDDIT_API_URL}/r/aww")
|
||||
|
||||
response = self.client.post(self.url, self.form_data)
|
||||
|
||||
self.assertEquals(response.status_code, 302)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
rule = CollectionRule.objects.get(name="aww")
|
||||
|
||||
self.assertEquals(rule.type, RuleTypeChoices.subreddit)
|
||||
self.assertEquals(rule.url, f"{REDDIT_API_URL}/r/aww")
|
||||
self.assertEquals(rule.timezone, str(pytz.utc))
|
||||
self.assertEquals(rule.favicon, None)
|
||||
self.assertEquals(rule.category.pk, self.category.pk)
|
||||
self.assertEquals(rule.user.pk, self.user.pk)
|
||||
self.assertEqual(rule.type, RuleTypeChoices.subreddit)
|
||||
self.assertEqual(rule.url, f"{REDDIT_API_URL}/r/aww")
|
||||
self.assertEqual(rule.favicon, None)
|
||||
self.assertEqual(rule.category.pk, self.category.pk)
|
||||
self.assertEqual(rule.user.pk, self.user.pk)
|
||||
|
||||
def test_regular_reddit_url(self):
|
||||
self.form_data.update(url=f"{REDDIT_URL}/r/aww")
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from django.conf import settings
|
||||
from django.db.models.fields import CharField, TextField
|
||||
from django.utils import timezone
|
||||
|
||||
import pytz
|
||||
import requests
|
||||
|
||||
from requests.exceptions import RequestException
|
||||
|
|
@ -15,14 +13,11 @@ from newsreader.news.collection.response_handler import ResponseHandler
|
|||
DEFAULT_HEADERS = {"User-Agent": f"linux:rss.fudiggity.nl:{settings.VERSION}"}
|
||||
|
||||
|
||||
def build_publication_date(dt, tz):
|
||||
def build_publication_date(_datetime_info: tuple) -> datetime:
|
||||
try:
|
||||
naive_datetime = datetime(*dt[:6])
|
||||
published_parsed = timezone.make_aware(naive_datetime, timezone=tz)
|
||||
return datetime(*_datetime_info[:6], tzinfo=timezone.utc)
|
||||
except (TypeError, ValueError):
|
||||
return timezone.now()
|
||||
|
||||
return published_parsed.astimezone(pytz.utc)
|
||||
return datetime.now(tz=timezone.utc)
|
||||
|
||||
|
||||
def fetch(url, auth=None, headers={}):
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
import json
|
||||
|
||||
from django.urls import reverse_lazy
|
||||
from zoneinfo import available_timezones
|
||||
|
||||
import pytz
|
||||
from django.urls import reverse_lazy
|
||||
|
||||
from django_celery_beat.models import IntervalSchedule, PeriodicTask
|
||||
|
||||
|
|
@ -25,7 +25,7 @@ class CollectionRuleDetailMixin:
|
|||
context_data = super().get_context_data(**kwargs)
|
||||
|
||||
categories = Category.objects.filter(user=self.request.user).order_by("name")
|
||||
timezones = [timezone for timezone in pytz.all_timezones]
|
||||
timezones = available_timezones()
|
||||
|
||||
context_data["categories"] = categories
|
||||
context_data["timezones"] = timezones
|
||||
|
|
|
|||
|
|
@ -1,5 +1,4 @@
|
|||
from django.utils.encoding import force_text
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from rest_framework import filters
|
||||
from rest_framework.compat import coreapi, coreschema
|
||||
|
|
@ -25,8 +24,8 @@ class ReadFilter(filters.BaseFilterBackend):
|
|||
required=False,
|
||||
location="query",
|
||||
schema=coreschema.String(
|
||||
title=force_text(self.query_param),
|
||||
description=force_text(_("Wether posts should be read or not")),
|
||||
title=str(self.query_param),
|
||||
description=str(_("Wether posts should be read or not")),
|
||||
),
|
||||
)
|
||||
]
|
||||
|
|
@ -52,8 +51,8 @@ class SavedFilter(filters.BaseFilterBackend):
|
|||
required=False,
|
||||
location="query",
|
||||
schema=coreschema.String(
|
||||
title=force_text(self.query_param),
|
||||
description=force_text(_("Wether posts should be saved or not")),
|
||||
title=str(self.query_param),
|
||||
description=str(_("Wether posts should be saved or not")),
|
||||
),
|
||||
)
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,12 +1,10 @@
|
|||
import json
|
||||
|
||||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from django.test import TestCase
|
||||
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.core.tests.factories import CategoryFactory, FeedPostFactory
|
||||
|
|
@ -29,15 +27,15 @@ class CategoryListViewTestCase(TestCase):
|
|||
def test_ordering(self):
|
||||
categories = [
|
||||
CategoryFactory(
|
||||
created=datetime(2019, 5, 20, 16, 7, 37, tzinfo=pytz.utc),
|
||||
created=datetime(2019, 5, 20, 16, 7, 37, tzinfo=timezone.utc),
|
||||
user=self.user,
|
||||
),
|
||||
CategoryFactory(
|
||||
created=datetime(2019, 7, 20, 18, 7, 37, tzinfo=pytz.utc),
|
||||
created=datetime(2019, 7, 20, 18, 7, 37, tzinfo=timezone.utc),
|
||||
user=self.user,
|
||||
),
|
||||
CategoryFactory(
|
||||
created=datetime(2019, 7, 20, 16, 7, 37, tzinfo=pytz.utc),
|
||||
created=datetime(2019, 7, 20, 16, 7, 37, tzinfo=timezone.utc),
|
||||
user=self.user,
|
||||
),
|
||||
]
|
||||
|
|
@ -428,37 +426,37 @@ class NestedCategoryPostView(TestCase):
|
|||
FeedPostFactory.create(
|
||||
title="Second Reuters post",
|
||||
rule=reuters_rule,
|
||||
publication_date=datetime(2019, 5, 21, 15, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 21, 15, tzinfo=timezone.utc),
|
||||
),
|
||||
FeedPostFactory.create(
|
||||
title="First Reuters post",
|
||||
rule=reuters_rule,
|
||||
publication_date=datetime(2019, 5, 20, 12, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 20, 12, tzinfo=timezone.utc),
|
||||
),
|
||||
]
|
||||
|
||||
FeedPostFactory.create(
|
||||
title="Second Guardian post",
|
||||
rule=guardian_rule,
|
||||
publication_date=datetime(2019, 5, 21, 14, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 21, 14, tzinfo=timezone.utc),
|
||||
)
|
||||
|
||||
FeedPostFactory.create(
|
||||
title="First Guardian post",
|
||||
rule=guardian_rule,
|
||||
publication_date=datetime(2019, 5, 20, 11, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 20, 11, tzinfo=timezone.utc),
|
||||
)
|
||||
|
||||
FeedPostFactory.create(
|
||||
title="Second BBC post",
|
||||
rule=bbc_rule,
|
||||
publication_date=datetime(2019, 5, 21, 16, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 21, 16, tzinfo=timezone.utc),
|
||||
)
|
||||
|
||||
FeedPostFactory.create(
|
||||
title="First BBC post",
|
||||
rule=bbc_rule,
|
||||
publication_date=datetime(2019, 5, 20, 13, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 20, 13, tzinfo=timezone.utc),
|
||||
)
|
||||
|
||||
response = self.client.get(
|
||||
|
|
|
|||
|
|
@ -1,10 +1,8 @@
|
|||
from datetime import datetime
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from django.test import TestCase
|
||||
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.core.tests.factories import CategoryFactory, FeedPostFactory
|
||||
|
|
@ -22,8 +20,8 @@ class PostListViewTestCase(TestCase):
|
|||
response = self.client.get(reverse("api:news:core:posts-list"))
|
||||
data = response.json()
|
||||
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertEquals(len(data["results"]), 3)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(len(data["results"]), 3)
|
||||
|
||||
def test_ordering(self):
|
||||
rule = FeedFactory(user=self.user, category=CategoryFactory(user=self.user))
|
||||
|
|
@ -32,24 +30,24 @@ class PostListViewTestCase(TestCase):
|
|||
FeedPostFactory(
|
||||
title="I'm the first post",
|
||||
rule=rule,
|
||||
publication_date=datetime(2019, 5, 20, 16, 7, 38, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 20, 16, 7, 38, tzinfo=timezone.utc),
|
||||
),
|
||||
FeedPostFactory(
|
||||
title="I'm the second post",
|
||||
rule=rule,
|
||||
publication_date=datetime(2019, 5, 20, 16, 7, 37, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 20, 16, 7, 37, tzinfo=timezone.utc),
|
||||
),
|
||||
FeedPostFactory(
|
||||
title="I'm the third post",
|
||||
rule=rule,
|
||||
publication_date=datetime(2019, 5, 20, 16, 7, 36, tzinfo=pytz.utc),
|
||||
publication_date=datetime(2019, 5, 20, 16, 7, 36, tzinfo=timezone.utc),
|
||||
),
|
||||
]
|
||||
|
||||
response = self.client.get(reverse("api:news:core:posts-list"))
|
||||
data = response.json()
|
||||
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
for index, post in enumerate(posts, start=0):
|
||||
with self.subTest(post=post):
|
||||
|
|
@ -68,8 +66,8 @@ class PostListViewTestCase(TestCase):
|
|||
data = response.json()
|
||||
posts = data["results"]
|
||||
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertEquals(len(data["results"]), 10)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(len(data["results"]), 10)
|
||||
|
||||
for post in posts:
|
||||
with self.subTest(post=post):
|
||||
|
|
@ -88,8 +86,8 @@ class PostListViewTestCase(TestCase):
|
|||
data = response.json()
|
||||
posts = data["results"]
|
||||
|
||||
self.assertEquals(response.status_code, 200)
|
||||
self.assertEquals(len(data["results"]), 10)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(len(data["results"]), 10)
|
||||
|
||||
for post in posts:
|
||||
with self.subTest(post=post):
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
from datetime import timezone
|
||||
|
||||
import factory
|
||||
import factory.fuzzy
|
||||
import pytz
|
||||
|
||||
from newsreader.accounts.tests.factories import UserFactory
|
||||
from newsreader.news.collection.reddit import REDDIT_API_URL
|
||||
|
|
@ -19,7 +20,7 @@ class PostFactory(factory.django.DjangoModelFactory):
|
|||
title = factory.Faker("sentence")
|
||||
body = factory.Faker("paragraph")
|
||||
author = factory.Faker("name")
|
||||
publication_date = factory.Faker("date_time_this_year", tzinfo=pytz.utc)
|
||||
publication_date = factory.Faker("date_time_this_year", tzinfo=timezone.utc)
|
||||
url = factory.Faker("url")
|
||||
remote_identifier = factory.Faker("uuid4")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue