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

This commit is contained in:
Chris Rossi
2013-12-19 17:29:20 -05:00
committed by Diana Huang
parent dc5dfe6259
commit fd1d98f7de
3 changed files with 70 additions and 86 deletions

View File

@@ -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()

View File

@@ -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(
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(fred.linkedin.emailed_courses), ['TEST1', 'TEST2'])
self.assertEqual(
json.loads(self.barney.linkedin.emailed_courses), ['TEST3'])

View File

@@ -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