
- Added request.notifications - Email configuration fixes - Set config_spec default SMTP port to `0` and switch to SSL/non-SSL default if `port == 0` - Added email_smtp_use_ssl configuration setting - Added migrations for notification tables - Added __repr__ to MediaComment(Mixin) - Added MediaComment.get_entry => MediaEntry - Added CommentSubscription, CommentNotification, Notification, ProcessingNotification tables - Added notifications.task to celery init - Fixed a bug in the video transcoder where pygst would hijack the --help argument. - Added notifications - views - silence - subscribe - routes - utility methods - celery task - Added half-hearted .active comment CSS style - Added quick JS to show header_dropdown - Added fragment template to show notifications in header_dropdown - Added fragment template to show subscribe/unsubscribe buttons on media/comment pages - Updated celery setup tests with notifications.task - Tried to fix test_misc tests that I broke - Added notification tests - Added and extended tests.tools fixtures - Integrated new notifications into media_home, media_post_comment views - Bumped SQLAlchemy dependency to >= 0.8.0 since we need polymorphic for the notifications to work
152 lines
5.2 KiB
Python
152 lines
5.2 KiB
Python
# GNU MediaGoblin -- federated, autonomous media hosting
|
|
# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Affero General Public License as published by
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Affero General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Affero General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
import pytest
|
|
|
|
import urlparse
|
|
|
|
from mediagoblin.tools import template, mail
|
|
|
|
from mediagoblin.db.models import Notification, CommentNotification, \
|
|
CommentSubscription
|
|
from mediagoblin.db.base import Session
|
|
|
|
from mediagoblin.notifications import mark_comment_notification_seen
|
|
|
|
from mediagoblin.tests.tools import fixture_add_comment, \
|
|
fixture_media_entry, fixture_add_user, \
|
|
fixture_comment_subscription
|
|
|
|
|
|
class TestNotifications:
|
|
@pytest.fixture(autouse=True)
|
|
def setup(self, test_app):
|
|
self.test_app = test_app
|
|
|
|
# TODO: Possibly abstract into a decorator like:
|
|
# @as_authenticated_user('chris')
|
|
self.test_user = fixture_add_user()
|
|
|
|
self.current_user = None
|
|
|
|
self.login()
|
|
|
|
def login(self, username=u'chris', password=u'toast'):
|
|
response = self.test_app.post(
|
|
'/auth/login/', {
|
|
'username': username,
|
|
'password': password})
|
|
|
|
response.follow()
|
|
|
|
assert urlparse.urlsplit(response.location)[2] == '/'
|
|
assert 'mediagoblin/root.html' in template.TEMPLATE_TEST_CONTEXT
|
|
|
|
ctx = template.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html']
|
|
|
|
assert Session.merge(ctx['request'].user).username == username
|
|
|
|
self.current_user = ctx['request'].user
|
|
|
|
def logout(self):
|
|
self.test_app.get('/auth/logout/')
|
|
self.current_user = None
|
|
|
|
@pytest.mark.parametrize('wants_email', [True, False])
|
|
def test_comment_notification(self, wants_email):
|
|
'''
|
|
Test
|
|
- if a notification is created when posting a comment on
|
|
another users media entry.
|
|
- that the comment data is consistent and exists.
|
|
|
|
'''
|
|
user = fixture_add_user('otherperson', password='nosreprehto',
|
|
wants_comment_notification=wants_email)
|
|
|
|
user_id = user.id
|
|
|
|
media_entry = fixture_media_entry(uploader=user.id, state=u'processed')
|
|
|
|
media_entry_id = media_entry.id
|
|
|
|
subscription = fixture_comment_subscription(media_entry)
|
|
|
|
subscription_id = subscription.id
|
|
|
|
media_uri_id = '/u/{0}/m/{1}/'.format(user.username,
|
|
media_entry.id)
|
|
media_uri_slug = '/u/{0}/m/{1}/'.format(user.username,
|
|
media_entry.slug)
|
|
|
|
self.test_app.post(
|
|
media_uri_id + 'comment/add/',
|
|
{
|
|
'comment_content': u'Test comment #42'
|
|
}
|
|
)
|
|
|
|
notifications = Notification.query.filter_by(
|
|
user_id=user.id).all()
|
|
|
|
assert len(notifications) == 1
|
|
|
|
notification = notifications[0]
|
|
|
|
assert type(notification) == CommentNotification
|
|
assert notification.seen == False
|
|
assert notification.user_id == user.id
|
|
assert notification.subject.get_author.id == self.test_user.id
|
|
assert notification.subject.content == u'Test comment #42'
|
|
|
|
if wants_email == True:
|
|
assert mail.EMAIL_TEST_MBOX_INBOX == [
|
|
{'from': 'notice@mediagoblin.example.org',
|
|
'message': 'Content-Type: text/plain; \
|
|
charset="utf-8"\nMIME-Version: 1.0\nContent-Transfer-Encoding: \
|
|
base64\nSubject: GNU MediaGoblin - chris commented on your \
|
|
post\nFrom: notice@mediagoblin.example.org\nTo: \
|
|
otherperson@example.com\n\nSGkgb3RoZXJwZXJzb24sCmNocmlzIGNvbW1lbnRlZCBvbiB5b3VyIHBvc3QgKGh0dHA6Ly9sb2Nh\nbGhvc3Q6ODAvdS9vdGhlcnBlcnNvbi9tL3NvbWUtdGl0bGUvYy8xLyNjb21tZW50KSBhdCBHTlUg\nTWVkaWFHb2JsaW4KClRlc3QgY29tbWVudCAjNDIKCkdOVSBNZWRpYUdvYmxpbg==\n',
|
|
'to': [u'otherperson@example.com']}]
|
|
else:
|
|
assert mail.EMAIL_TEST_MBOX_INBOX == []
|
|
|
|
# Save the ids temporarily because of DetachedInstanceError
|
|
notification_id = notification.id
|
|
comment_id = notification.subject.id
|
|
|
|
self.logout()
|
|
self.login('otherperson', 'nosreprehto')
|
|
|
|
self.test_app.get(media_uri_slug + '/c/{0}/'.format(comment_id))
|
|
|
|
notification = Notification.query.filter_by(id=notification_id).first()
|
|
|
|
assert notification.seen == True
|
|
|
|
self.test_app.get(media_uri_slug + '/notifications/silence/')
|
|
|
|
subscription = CommentSubscription.query.filter_by(id=subscription_id)\
|
|
.first()
|
|
|
|
assert subscription.notify == False
|
|
|
|
notifications = Notification.query.filter_by(
|
|
user_id=user_id).all()
|
|
|
|
# User should not have been notified
|
|
assert len(notifications) == 1
|