Commit fd1d98f7 by Chris Rossi Committed by Diana Huang

Fix tests, one bug. Adopt a more Django-ish testing style.

parent dc5dfe62
......@@ -57,16 +57,19 @@ class Command(BaseCommand):
emailed = json.loads(account.emailed_courses)
certificates = GeneratedCertificate.objects.filter(user=user)
certificates = certificates.filter(status='downloadable')
print 'HUH?', certificates
certificates = [cert for cert in certificates
if cert.course_id not in emailed]
print 'DUH?', certificates
if not certificates:
continue
print 'WTF?', emailed
if grandfather:
self.send_grandfather_email(user, certificates)
emailed.extend([cert.course_id for cert in certificates])
else:
for certificate in certificates:
self.send_email(user, certificate)
self.send_triggered_email(user, certificate)
emailed.append(certificate.course_id)
account.emailed_courses = json.dumps(emailed)
account.save()
......
......@@ -3,119 +3,93 @@ Test email scripts.
"""
import json
import mock
import unittest
from certificates.models import GeneratedCertificate
from django.contrib.auth.models import User
from django.test import TestCase
from student.models import UserProfile
from linkedin.models import LinkedIn
from linkedin.management.commands import linkedin_mailusers as mailusers
MODULE = 'linkedin.management.commands.linkedin_mailusers.'
class MailusersTests(unittest.TestCase):
class MailusersTests(TestCase):
"""
Test mail users command.
"""
@mock.patch(MODULE + 'send_triggered_email')
@mock.patch(MODULE + 'GeneratedCertificate')
@mock.patch(MODULE + 'LinkedIn')
def test_mail_users(self, linkedin, certificates, send_email):
def setUp(self):
courses = {
'TEST1': mock.Mock(org='TestX', number='1'),
'TEST2': mock.Mock(org='TestX', number='2'),
'TEST3': mock.Mock(org='TestX', number='3'),
}
def get_course_by_id(id):
return courses.get(id)
patcher = mock.patch(MODULE + 'get_course_by_id', get_course_by_id)
patcher.start()
self.addCleanup(patcher.stop)
self.fred = fred = User(username='fred')
fred.save()
UserProfile(user=fred, name='Fred Flintstone').save()
LinkedIn(user=fred, has_linkedin_account=True).save()
self.barney = barney = User(username='barney')
barney.save()
LinkedIn(user=barney, has_linkedin_account=True).save()
UserProfile(user=barney, name='Barney Rubble').save()
cert1 = GeneratedCertificate(
status='downloadable',
user=fred,
course_id='TEST1')
cert1.save()
cert2 = GeneratedCertificate(
status='downloadable',
user=fred,
course_id='TEST2')
cert2.save()
cert3 = GeneratedCertificate(
status='downloadable',
user=barney,
course_id='TEST3')
cert3.save()
def test_mail_users(self):
"""
Test emailing users.
"""
fut = mailusers.Command().handle
cert1 = mock.Mock(course_id=1)
cert2 = mock.Mock(course_id=2)
cert3 = mock.Mock(course_id=3)
fred = mock.Mock(
emailed_courses="[]",
user=mock.Mock(certificates=[cert1, cert2]))
barney = mock.Mock(
emailed_courses="[]",
user=mock.Mock(certificates=[cert3]))
linkedin.objects.filter.return_value = [fred, barney]
def filter_user(user):
"Mock querying the database."
queryset = mock.Mock()
queryset.filter.return_value = user.certificates
return queryset
certificates.objects.filter = filter_user
fut()
self.assertEqual(
send_email.call_args_list,
[((fred.user, cert1),),
((fred.user, cert2),),
((barney.user, cert3),)])
self.assertEqual(json.loads(fred.emailed_courses), [1, 2])
self.assertEqual(json.loads(barney.emailed_courses), [3])
json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
self.assertEqual(
json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])
@mock.patch(MODULE + 'send_grandfather_email')
@mock.patch(MODULE + 'GeneratedCertificate')
@mock.patch(MODULE + 'LinkedIn')
def test_mail_users_grandfather(self, linkedin, certificates, send_email):
def test_mail_users_grandfather(self):
"""
Test sending grandfather emails.
"""
fut = mailusers.Command().handle
cert1 = mock.Mock(course_id=1)
cert2 = mock.Mock(course_id=2)
cert3 = mock.Mock(course_id=3)
fred = mock.Mock(
emailed_courses="[]",
user=mock.Mock(certificates=[cert1, cert2]))
barney = mock.Mock(
emailed_courses="[]",
user=mock.Mock(certificates=[cert3]))
linkedin.objects.filter.return_value = [fred, barney]
def filter_user(user):
"Mock querying the database."
queryset = mock.Mock()
queryset.filter.return_value = user.certificates
return queryset
certificates.objects.filter = filter_user
fut(grandfather=True)
self.assertEqual(
send_email.call_args_list,
[((fred.user, [cert1, cert2]),),
((barney.user, [cert3]),)])
self.assertEqual(json.loads(fred.emailed_courses), [1, 2])
self.assertEqual(json.loads(barney.emailed_courses), [3])
json.loads(self.fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
self.assertEqual(
json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])
@mock.patch(MODULE + 'send_triggered_email')
@mock.patch(MODULE + 'GeneratedCertificate')
@mock.patch(MODULE + 'LinkedIn')
def test_mail_users_only_new_courses(self, linkedin, certificates,
send_email):
def test_mail_users_only_new_courses(self):
"""
Test emailing users, making sure they are only emailed about new
certificates.
"""
self.fred.linkedin.emailed_courses = json.dumps(['TEST1'])
self.fred.linkedin.save()
fut = mailusers.Command().handle
cert1 = mock.Mock(course_id=1)
cert2 = mock.Mock(course_id=2)
cert3 = mock.Mock(course_id=3)
fred = mock.Mock(
emailed_courses="[1]",
user=mock.Mock(certificates=[cert1, cert2]))
barney = mock.Mock(
emailed_courses="[]",
user=mock.Mock(certificates=[cert3]))
linkedin.objects.filter.return_value = [fred, barney]
def filter_user(user):
"Mock querying the database."
queryset = mock.Mock()
queryset.filter.return_value = user.certificates
return queryset
certificates.objects.filter = filter_user
fut()
fred = User.objects.get(username='fred')
self.assertEqual(
json.loads(fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
self.assertEqual(
send_email.call_args_list,
[((fred.user, cert2),),
((barney.user, cert3),)])
self.assertEqual(json.loads(fred.emailed_courses), [1, 2])
self.assertEqual(json.loads(barney.emailed_courses), [3])
json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])
......@@ -257,6 +257,13 @@ XQUEUE_PORT = 8040
YOUTUBE_PORT = 8031
LTI_PORT = 8765
############################ LinkedIn Integration #############################
INSTALLED_APPS += ('linkedin',)
LINKEDIN_API = {
'COMPANY_NAME': 'edX',
'COMPANY_ID': '0000000',
'EMAIL_FROM': 'The Team <team@test.foo>',
}
################### Make tests faster
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment