Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
20876b7a
Commit
20876b7a
authored
Jan 05, 2017
by
Simon Chen
Committed by
GitHub
Jan 05, 2017
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #14263 from edx/schen/ECOM-6581
Remove Sailthru enrollment related signal handlers
parents
a637121d
3bda3c4a
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
5 additions
and
489 deletions
+5
-489
lms/djangoapps/email_marketing/signals.py
+1
-48
lms/djangoapps/email_marketing/tasks.py
+0
-226
lms/djangoapps/email_marketing/tests/test_signals.py
+4
-215
No files found.
lms/djangoapps/email_marketing/signals.py
View file @
20876b7a
...
...
@@ -6,16 +6,14 @@ import datetime
import
logging
from
django.conf
import
settings
from
django.core.urlresolvers
import
reverse
from
django.dispatch
import
receiver
from
student.models
import
ENROLL_STATUS_CHANGE
from
student.cookies
import
CREATE_LOGON_COOKIE
from
student.views
import
REGISTER_USER
from
email_marketing.models
import
EmailMarketingConfiguration
from
util.model_utils
import
USER_FIELD_CHANGED
from
lms.djangoapps.email_marketing.tasks
import
(
update_user
,
update_user_email
,
update_course_enrollment
update_user
,
update_user_email
)
from
sailthru.sailthru_client
import
SailthruClient
...
...
@@ -29,51 +27,6 @@ CHANGED_FIELDNAMES = ['username', 'is_active', 'name', 'gender', 'education',
'country'
]
@receiver
(
ENROLL_STATUS_CHANGE
)
def
handle_enroll_status_change
(
sender
,
event
=
None
,
user
=
None
,
mode
=
None
,
course_id
=
None
,
**
kwargs
):
# pylint: disable=unused-argument
"""
Signal receiver for enroll/unenroll/purchase events
"""
email_config
=
EmailMarketingConfiguration
.
current
()
if
not
email_config
.
enabled
or
not
event
or
not
user
or
not
mode
or
not
course_id
:
return
# skip tracking (un)enrolls if simulated cost=0
if
email_config
.
sailthru_enroll_cost
==
0
:
return
request
=
crum
.
get_current_request
()
if
not
request
:
return
# get string course_id serializable to send through celery
course_id_string
=
unicode
(
course_id
)
# figure out course url
course_url
=
_build_course_url
(
request
,
course_id_string
,
email_config
)
# pass event to email_marketing.tasks
update_course_enrollment
.
delay
(
user
.
email
,
course_url
,
event
,
mode
,
course_id
=
course_id_string
,
message_id
=
request
.
COOKIES
.
get
(
'sailthru_bid'
))
def
_build_course_url
(
request
,
course_id
,
email_config
):
"""
Build a course url from a course id and the host from the current request
or use override in config
:param request:
:param course_id:
:return:
"""
path
=
reverse
(
'info'
,
kwargs
=
{
'course_id'
:
course_id
})
if
email_config
.
sailthru_lms_url_override
:
return
'{}{}'
.
format
(
email_config
.
sailthru_lms_url_override
,
path
)
else
:
return
'{}://{}{}'
.
format
(
request
.
scheme
,
request
.
get_host
(),
path
)
@receiver
(
CREATE_LOGON_COOKIE
)
def
add_email_marketing_cookies
(
sender
,
response
=
None
,
user
=
None
,
**
kwargs
):
# pylint: disable=unused-argument
...
...
lms/djangoapps/email_marketing/tasks.py
View file @
20876b7a
...
...
@@ -9,8 +9,6 @@ from django.core.cache import cache
from
django.conf
import
settings
from
email_marketing.models
import
EmailMarketingConfiguration
from
student.models
import
EnrollStatusChange
from
sailthru.sailthru_client
import
SailthruClient
from
sailthru.sailthru_error
import
SailthruClientError
...
...
@@ -131,175 +129,6 @@ def _create_email_user_param(sailthru_vars, sailthru_client, email, new_user, em
return
sailthru_user
# pylint: disable=not-callable
@task
(
bind
=
True
,
default_retry_delay
=
3600
,
max_retries
=
24
)
def
update_course_enrollment
(
self
,
email
,
course_url
,
event
,
mode
,
course_id
=
None
,
message_id
=
None
):
# pylint: disable=unused-argument
"""
Adds/updates Sailthru when a user enrolls/unenrolls/adds to cart/purchases/upgrades a course
Args:
email(str): The user's email address
course_url(str): Course home page url
event(str): event type
mode(str): enroll mode (audit, verification, ...)
unit_cost: cost if purchase event
course_id(str): course run id
currency(str): currency if purchase event - currently ignored since Sailthru only supports USD
Returns:
None
The event can be one of the following:
EnrollStatusChange.enroll
A free enroll (mode=audit or honor)
EnrollStatusChange.unenroll
An unenroll
EnrollStatusChange.upgrade_start
A paid upgrade added to cart - ignored
EnrollStatusChange.upgrade_complete
A paid upgrade purchase complete - ignored
EnrollStatusChange.paid_start
A non-free course added to cart - ignored
EnrollStatusChange.paid_complete
A non-free course purchase complete - ignored
"""
email_config
=
EmailMarketingConfiguration
.
current
()
if
not
email_config
.
enabled
:
return
# Use event type to figure out processing required
unenroll
=
False
send_template
=
None
cost_in_cents
=
0
if
event
==
EnrollStatusChange
.
enroll
:
send_template
=
email_config
.
sailthru_enroll_template
# set cost so that Sailthru recognizes the event
cost_in_cents
=
email_config
.
sailthru_enroll_cost
elif
event
==
EnrollStatusChange
.
unenroll
:
# unenroll - need to update list of unenrolled courses for user in Sailthru
unenroll
=
True
else
:
# All purchase events should be handled by ecommerce, so ignore
return
sailthru_client
=
SailthruClient
(
email_config
.
sailthru_key
,
email_config
.
sailthru_secret
)
# update the "unenrolled" course array in the user record on Sailthru
if
not
_update_unenrolled_list
(
sailthru_client
,
email
,
course_url
,
unenroll
):
raise
self
.
retry
(
countdown
=
email_config
.
sailthru_retry_interval
,
max_retries
=
email_config
.
sailthru_max_retries
)
# if there is a cost, call Sailthru purchase api to record
if
cost_in_cents
:
# get course information if configured and appropriate event
course_data
=
{}
if
email_config
.
sailthru_get_tags_from_sailthru
:
course_data
=
_get_course_content
(
course_url
,
sailthru_client
,
email_config
)
# build item description
item
=
_build_purchase_item
(
course_id
,
course_url
,
cost_in_cents
,
mode
,
course_data
)
# build purchase api options list
options
=
{}
# add appropriate send template
if
send_template
:
options
[
'send_template'
]
=
send_template
if
not
_record_purchase
(
sailthru_client
,
email
,
item
,
message_id
,
options
):
raise
self
.
retry
(
countdown
=
email_config
.
sailthru_retry_interval
,
max_retries
=
email_config
.
sailthru_max_retries
)
def
_build_purchase_item
(
course_id_string
,
course_url
,
cost_in_cents
,
mode
,
course_data
):
"""
Build Sailthru purchase item object
:return: item
"""
# build item description
item
=
{
'id'
:
"{}-{}"
.
format
(
course_id_string
,
mode
),
'url'
:
course_url
,
'price'
:
cost_in_cents
,
'qty'
:
1
,
}
# make up title if we don't already have it from Sailthru
if
'title'
in
course_data
:
item
[
'title'
]
=
course_data
[
'title'
]
else
:
item
[
'title'
]
=
'Course {} mode: {}'
.
format
(
course_id_string
,
mode
)
if
'tags'
in
course_data
:
item
[
'tags'
]
=
course_data
[
'tags'
]
# add vars to item
item
[
'vars'
]
=
dict
(
course_data
.
get
(
'vars'
,
{}),
mode
=
mode
,
course_run_id
=
course_id_string
)
return
item
def
_record_purchase
(
sailthru_client
,
email
,
item
,
message_id
,
options
):
"""
Record a purchase in Sailthru
:param sailthru_client:
:param email:
:param item:
:param incomplete:
:param message_id:
:param options:
:return: False it retryable error
"""
try
:
sailthru_response
=
sailthru_client
.
purchase
(
email
,
[
item
],
message_id
=
message_id
,
options
=
options
)
if
not
sailthru_response
.
is_ok
():
error
=
sailthru_response
.
get_error
()
log
.
error
(
"Error attempting to record purchase in Sailthru:
%
s"
,
error
.
get_message
())
return
not
_retryable_sailthru_error
(
error
)
except
SailthruClientError
as
exc
:
log
.
error
(
"Exception attempting to record purchase for
%
s in Sailthru -
%
s"
,
email
,
unicode
(
exc
))
return
False
return
True
def
_get_course_content
(
course_url
,
sailthru_client
,
email_config
):
"""
Get course information using the Sailthru content api.
If there is an error, just return with an empty response.
:param course_url:
:param sailthru_client:
:return: dict with course information
"""
# check cache first
response
=
cache
.
get
(
course_url
)
if
not
response
:
try
:
sailthru_response
=
sailthru_client
.
api_get
(
"content"
,
{
"id"
:
course_url
})
if
not
sailthru_response
.
is_ok
():
return
{}
response
=
sailthru_response
.
json
cache
.
set
(
course_url
,
response
,
email_config
.
sailthru_content_cache_age
)
except
SailthruClientError
:
response
=
{}
return
response
def
_get_or_create_user_list_for_site
(
sailthru_client
,
site
=
None
,
default_list_name
=
None
):
"""
Get the user list name from cache if exists else create one and return the name,
...
...
@@ -393,61 +222,6 @@ def _create_user_list(sailthru_client, list_name):
return
True
def
_update_unenrolled_list
(
sailthru_client
,
email
,
course_url
,
unenroll
):
"""
Maintain a list of courses the user has unenrolled from in the Sailthru user record
:param sailthru_client:
:param email:
:param email_config:
:param course_url:
:param unenroll:
:return: False if retryable error, else True
"""
try
:
# get the user 'vars' values from sailthru
sailthru_response
=
sailthru_client
.
api_get
(
"user"
,
{
"id"
:
email
,
"fields"
:
{
"vars"
:
1
}})
if
not
sailthru_response
.
is_ok
():
error
=
sailthru_response
.
get_error
()
log
.
info
(
"Error attempting to read user record from Sailthru:
%
s"
,
error
.
get_message
())
return
not
_retryable_sailthru_error
(
error
)
response_json
=
sailthru_response
.
json
unenroll_list
=
[]
if
response_json
and
"vars"
in
response_json
and
response_json
[
"vars"
]
\
and
"unenrolled"
in
response_json
[
"vars"
]:
unenroll_list
=
response_json
[
"vars"
][
"unenrolled"
]
changed
=
False
# if unenrolling, add course to unenroll list
if
unenroll
:
if
course_url
not
in
unenroll_list
:
unenroll_list
.
append
(
course_url
)
changed
=
True
# if enrolling, remove course from unenroll list
elif
course_url
in
unenroll_list
:
unenroll_list
.
remove
(
course_url
)
changed
=
True
if
changed
:
# write user record back
sailthru_response
=
sailthru_client
.
api_post
(
"user"
,
{
'id'
:
email
,
'key'
:
'email'
,
"vars"
:
{
"unenrolled"
:
unenroll_list
}})
if
not
sailthru_response
.
is_ok
():
error
=
sailthru_response
.
get_error
()
log
.
info
(
"Error attempting to update user record in Sailthru:
%
s"
,
error
.
get_message
())
return
not
_retryable_sailthru_error
(
error
)
# everything worked
return
True
except
SailthruClientError
as
exc
:
log
.
error
(
"Exception attempting to update user record for
%
s in Sailthru -
%
s"
,
email
,
unicode
(
exc
))
return
False
def
_retryable_sailthru_error
(
error
):
""" Return True if error should be retried.
...
...
lms/djangoapps/email_marketing/tests/test_signals.py
View file @
20876b7a
...
...
@@ -8,19 +8,17 @@ from django.contrib.sites.models import Site
from
mock
import
patch
,
ANY
from
util.json_request
import
JsonResponse
from
email_marketing.signals
import
handle_enroll_status_change
,
\
email_marketing_register_user
,
\
from
email_marketing.signals
import
email_marketing_register_user
,
\
email_marketing_user_field_changed
,
\
add_email_marketing_cookies
from
email_marketing.tasks
import
(
update_user
,
update_user_email
,
update_course_enrollmen
t
,
_get_
course_content
,
_update_unenrolled_list
,
_get_or_create_user_list
,
_get_list_from_email_marketing_provider
,
_create_user_list
)
update_user
,
update_user_email
,
_get_or_create_user_lis
t
,
_get_
list_from_email_marketing_provider
,
_create_user_list
)
from
email_marketing.models
import
EmailMarketingConfiguration
from
django.test.client
import
RequestFactory
from
student.tests.factories
import
UserFactory
,
UserProfileFactory
from
student.models
import
EnrollStatusChange
from
opaque_keys.edx.keys
import
CourseKey
from
sailthru.sailthru_response
import
SailthruResponse
...
...
@@ -246,11 +244,6 @@ class EmailMarketingTests(TestCase):
self
.
assertFalse
(
mock_log_error
.
called
)
self
.
assertFalse
(
mock_sailthru
.
called
)
update_course_enrollment
.
delay
(
self
.
user
.
username
,
TEST_EMAIL
,
'http://course'
,
EnrollStatusChange
.
enroll
,
'audit'
)
self
.
assertFalse
(
mock_log_error
.
called
)
self
.
assertFalse
(
mock_sailthru
.
called
)
update_email_marketing_config
(
enabled
=
True
)
@patch
(
'email_marketing.signals.log.error'
)
...
...
@@ -260,9 +253,6 @@ class EmailMarketingTests(TestCase):
"""
update_email_marketing_config
(
enabled
=
False
)
handle_enroll_status_change
(
None
)
self
.
assertFalse
(
mock_log_error
.
called
)
add_email_marketing_cookies
(
None
)
self
.
assertFalse
(
mock_log_error
.
called
)
...
...
@@ -279,55 +269,6 @@ class EmailMarketingTests(TestCase):
email_marketing_user_field_changed
(
None
,
user
=
anon
)
self
.
assertFalse
(
mock_log_error
.
called
)
# make sure enroll ignored when cost = 0
update_email_marketing_config
(
enroll_cost
=
0
)
handle_enroll_status_change
(
None
,
event
=
EnrollStatusChange
.
enroll
,
user
=
self
.
user
,
mode
=
'audit'
,
course_id
=
self
.
course_id
)
self
.
assertFalse
(
mock_log_error
.
called
)
@patch
(
'email_marketing.signals.crum.get_current_request'
)
@patch
(
'lms.djangoapps.email_marketing.tasks.update_course_enrollment.delay'
)
def
test_handle_enroll_status_change
(
self
,
mock_update_course_enrollment
,
mock_get_current_request
):
"""
Test that the enroll status change signal handler properly calls the task routine
"""
# should just return if no current request found
mock_get_current_request
.
return_value
=
None
handle_enroll_status_change
(
None
)
self
.
assertFalse
(
mock_update_course_enrollment
.
called
)
# now test with current request
mock_get_current_request
.
return_value
=
self
.
request
self
.
request
.
COOKIES
[
'sailthru_bid'
]
=
'cookie_bid'
handle_enroll_status_change
(
None
,
event
=
EnrollStatusChange
.
enroll
,
user
=
self
.
user
,
mode
=
'audit'
,
course_id
=
self
.
course_id
,
cost
=
None
,
currency
=
None
)
self
.
assertTrue
(
mock_update_course_enrollment
.
called
)
mock_update_course_enrollment
.
assert_called_with
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
enroll
,
'audit'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
# now test with current request constructing url from request
mock_get_current_request
.
return_value
=
self
.
request
update_email_marketing_config
(
lms_url_override
=
''
)
self
.
request
.
COOKIES
[
'sailthru_bid'
]
=
'cookie_bid'
handle_enroll_status_change
(
None
,
event
=
EnrollStatusChange
.
enroll
,
user
=
self
.
user
,
mode
=
'audit'
,
course_id
=
self
.
course_id
,
cost
=
None
,
currency
=
None
)
self
.
assertTrue
(
mock_update_course_enrollment
.
called
)
mock_update_course_enrollment
.
assert_called_with
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
enroll
,
'audit'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
@patch
(
'email_marketing.tasks.SailthruClient.api_post'
)
def
test_change_email
(
self
,
mock_sailthru
):
"""
...
...
@@ -341,158 +282,6 @@ class EmailMarketingTests(TestCase):
self
.
assertEquals
(
userparms
[
'id'
],
"old@edx.org"
)
self
.
assertEquals
(
userparms
[
'keys'
][
'email'
],
TEST_EMAIL
)
@patch
(
'email_marketing.tasks.log.error'
)
@patch
(
'email_marketing.tasks.log.info'
)
@patch
(
'email_marketing.tasks.SailthruClient.purchase'
)
@patch
(
'email_marketing.tasks.SailthruClient.api_get'
)
@patch
(
'email_marketing.tasks.SailthruClient.api_post'
)
def
test_update_course_enrollment
(
self
,
mock_sailthru_api_post
,
mock_sailthru_api_get
,
mock_sailthru_purchase
,
mock_log_info
,
mock_log_error
):
"""
test async method in task posts enrolls and purchases
"""
mock_sailthru_api_post
.
return_value
=
SailthruResponse
(
JsonResponse
({
'ok'
:
True
}))
mock_sailthru_api_get
.
return_value
=
SailthruResponse
(
JsonResponse
({
'vars'
:
{
'unenrolled'
:
[
'course_u1'
]}}))
mock_sailthru_purchase
.
return_value
=
SailthruResponse
(
JsonResponse
({
'ok'
:
True
}))
# test enroll
update_course_enrollment
.
delay
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
enroll
,
'audit'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
mock_sailthru_purchase
.
assert_called_with
(
TEST_EMAIL
,
[{
'vars'
:
{
'course_run_id'
:
self
.
course_id_string
,
'mode'
:
'audit'
},
'title'
:
'Course '
+
self
.
course_id_string
+
' mode: audit'
,
'url'
:
self
.
course_url
,
'price'
:
100
,
'qty'
:
1
,
'id'
:
self
.
course_id_string
+
'-audit'
}],
options
=
{
'send_template'
:
'enroll_template'
},
message_id
=
'cookie_bid'
)
# test unenroll
update_course_enrollment
.
delay
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
unenroll
,
'audit'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
mock_sailthru_purchase
.
assert_called_with
(
TEST_EMAIL
,
[{
'vars'
:
{
'course_run_id'
:
self
.
course_id_string
,
'mode'
:
'audit'
},
'title'
:
'Course '
+
self
.
course_id_string
+
' mode: audit'
,
'url'
:
self
.
course_url
,
'price'
:
100
,
'qty'
:
1
,
'id'
:
self
.
course_id_string
+
'-audit'
}],
options
=
{
'send_template'
:
'enroll_template'
},
message_id
=
'cookie_bid'
)
# test purchase API error
mock_sailthru_purchase
.
return_value
=
SailthruResponse
(
JsonResponse
({
'error'
:
100
,
'errormsg'
:
'Got an error'
}))
update_course_enrollment
.
delay
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
enroll
,
'verified'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
self
.
assertTrue
(
mock_log_error
.
called
)
# test purchase API exception
mock_sailthru_purchase
.
side_effect
=
SailthruClientError
update_course_enrollment
.
delay
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
enroll
,
'verified'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
self
.
assertTrue
(
mock_log_error
.
called
)
# test unsupported event
mock_sailthru_purchase
.
side_effect
=
SailthruClientError
mock_log_info
.
reset_mock
()
update_course_enrollment
.
delay
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
upgrade_start
,
'verified'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
self
.
assertFalse
(
mock_log_info
.
called
)
# test error updating user
mock_sailthru_api_get
.
return_value
=
SailthruResponse
(
JsonResponse
({
'error'
:
100
,
'errormsg'
:
'Got an error'
}))
update_course_enrollment
.
delay
(
TEST_EMAIL
,
self
.
course_url
,
EnrollStatusChange
.
enroll
,
'verified'
,
course_id
=
self
.
course_id_string
,
message_id
=
'cookie_bid'
)
self
.
assertTrue
(
mock_log_info
.
called
)
@patch
(
'email_marketing.tasks.SailthruClient'
)
def
test_get_course_content
(
self
,
mock_sailthru_client
):
"""
test routine which fetches data from Sailthru content api
"""
mock_sailthru_client
.
api_get
.
return_value
=
SailthruResponse
(
JsonResponse
({
"title"
:
"The title"
}))
response_json
=
_get_course_content
(
'course:123'
,
mock_sailthru_client
,
EmailMarketingConfiguration
.
current
())
self
.
assertEquals
(
response_json
,
{
"title"
:
"The title"
})
mock_sailthru_client
.
api_get
.
assert_called_with
(
'content'
,
{
'id'
:
'course:123'
})
# test second call uses cache
response_json
=
_get_course_content
(
'course:123'
,
mock_sailthru_client
,
EmailMarketingConfiguration
.
current
())
self
.
assertEquals
(
response_json
,
{
"title"
:
"The title"
})
mock_sailthru_client
.
api_get
.
assert_not_called
()
# test error from Sailthru
mock_sailthru_client
.
api_get
.
return_value
=
\
SailthruResponse
(
JsonResponse
({
'error'
:
100
,
'errormsg'
:
'Got an error'
}))
self
.
assertEquals
(
_get_course_content
(
'course:124'
,
mock_sailthru_client
,
EmailMarketingConfiguration
.
current
()),
{})
# test exception
mock_sailthru_client
.
api_get
.
side_effect
=
SailthruClientError
self
.
assertEquals
(
_get_course_content
(
'course:125'
,
mock_sailthru_client
,
EmailMarketingConfiguration
.
current
()),
{})
@patch
(
'email_marketing.tasks.SailthruClient'
)
def
test_update_unenrolled_list
(
self
,
mock_sailthru_client
):
"""
test routine which updates the unenrolled list in Sailthru
"""
# test a new unenroll
mock_sailthru_client
.
api_get
.
return_value
=
\
SailthruResponse
(
JsonResponse
({
'vars'
:
{
'unenrolled'
:
[
'course_u1'
]}}))
self
.
assertTrue
(
_update_unenrolled_list
(
mock_sailthru_client
,
TEST_EMAIL
,
self
.
course_url
,
True
))
mock_sailthru_client
.
api_get
.
assert_called_with
(
"user"
,
{
"id"
:
TEST_EMAIL
,
"fields"
:
{
"vars"
:
1
}})
mock_sailthru_client
.
api_post
.
assert_called_with
(
'user'
,
{
'vars'
:
{
'unenrolled'
:
[
'course_u1'
,
self
.
course_url
]},
'id'
:
TEST_EMAIL
,
'key'
:
'email'
})
# test an enroll of a previously unenrolled course
mock_sailthru_client
.
api_get
.
return_value
=
\
SailthruResponse
(
JsonResponse
({
'vars'
:
{
'unenrolled'
:
[
self
.
course_url
]}}))
self
.
assertTrue
(
_update_unenrolled_list
(
mock_sailthru_client
,
TEST_EMAIL
,
self
.
course_url
,
False
))
mock_sailthru_client
.
api_post
.
assert_called_with
(
'user'
,
{
'vars'
:
{
'unenrolled'
:
[]},
'id'
:
TEST_EMAIL
,
'key'
:
'email'
})
# test get error from Sailthru
mock_sailthru_client
.
api_get
.
return_value
=
\
SailthruResponse
(
JsonResponse
({
'error'
:
43
,
'errormsg'
:
'Got an error'
}))
self
.
assertFalse
(
_update_unenrolled_list
(
mock_sailthru_client
,
TEST_EMAIL
,
self
.
course_url
,
False
))
# test post error from Sailthru
mock_sailthru_client
.
api_post
.
return_value
=
\
SailthruResponse
(
JsonResponse
({
'error'
:
43
,
'errormsg'
:
'Got an error'
}))
mock_sailthru_client
.
api_get
.
return_value
=
\
SailthruResponse
(
JsonResponse
({
'vars'
:
{
'unenrolled'
:
[
self
.
course_url
]}}))
self
.
assertFalse
(
_update_unenrolled_list
(
mock_sailthru_client
,
TEST_EMAIL
,
self
.
course_url
,
False
))
# test exception
mock_sailthru_client
.
api_get
.
side_effect
=
SailthruClientError
self
.
assertFalse
(
_update_unenrolled_list
(
mock_sailthru_client
,
TEST_EMAIL
,
self
.
course_url
,
False
))
@patch
(
'email_marketing.tasks.SailthruClient'
)
def
test_get_or_create_sailthru_list
(
self
,
mock_sailthru_client
):
"""
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment