def fake_learners_to_retire():
    """
    A simple hard-coded list of fake learners with the only piece of
    information this script cares about.
    """

    return [
        get_fake_user_retirement(original_username="******"),
        get_fake_user_retirement(original_username="******"),
        get_fake_user_retirement(original_username="******"),
    ]
Ejemplo n.º 2
0
def test_bulk_delete_success(setup_regulation_api):  # pylint: disable=redefined-outer-name
    """
    Test simple success case
    """
    mock_post, segment = setup_regulation_api
    mock_post.return_value = FakeResponse()

    learner = TEST_SEGMENT_CONFIG['learner']
    segment.delete_and_suppress_learners(learner, 1000)

    assert mock_post.call_count == 1

    expected_learner = get_fake_user_retirement()
    learners_vals = [
        text_type(expected_learner['user']['id']),
        expected_learner['original_username'],
        expected_learner['ecommerce_segment_id'],
    ]

    fake_json = {
        "regulation_type": "Suppress_With_Delete",
        "attributes": {
            "name": "userId",
            "values": learners_vals
        }
    }

    url = TEST_SEGMENT_CONFIG['fake_base_url'] + BULK_REGULATE_URL.format(
        TEST_SEGMENT_CONFIG['fake_workspace'])
    mock_post.assert_any_call(url,
                              json=fake_json,
                              headers=TEST_SEGMENT_CONFIG['headers'])
Ejemplo n.º 3
0
def test_bulk_unsuppress_success(setup_regulation_api):  # pylint: disable=redefined-outer-name
    """
    Test simple success case
    """
    mock_post, segment = setup_regulation_api
    mock_post.return_value = FakeResponse()

    learner = TEST_SEGMENT_CONFIG['learner']
    segment.unsuppress_learners_by_key('original_username', learner, 100)

    assert mock_post.call_count == 1

    expected_learner = get_fake_user_retirement()

    fake_json = {
        "regulation_type": "Unsuppress",
        "attributes": {
            "name": "userId",
            "values": [
                expected_learner['original_username'],
            ]
        }
    }

    url = TEST_SEGMENT_CONFIG['fake_base_url'] + BULK_REGULATE_URL.format(
        TEST_SEGMENT_CONFIG['fake_workspace'])
    mock_post.assert_any_call(url,
                              json=fake_json,
                              headers=TEST_SEGMENT_CONFIG['headers'])
Ejemplo n.º 4
0
def test_get_segment_id_error(*args, **kwargs):
    username = '******'

    mock_get_tracking_key = args[0]
    mock_get_access_token = args[1]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']
    mock_update_learner_state = kwargs['update_learner_retirement_state']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)

    test_exception_message = 'Test Exception!'
    mock_get_tracking_key.side_effect = Exception(test_exception_message)

    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username, )

    mock_get_retirement_state.return_value = {
        'original_username': username,
        'current_state': {
            'state_name': 'PENDING'
        }
    }

    result = _call_script(username, fetch_ecom_segment_id=True)
    mock_get_tracking_key.assert_called_once_with(
        mock_get_retirement_state.return_value)
    mock_update_learner_state.assert_not_called()

    assert result.exit_code == ERR_SETUP_FAILED
    assert 'Unexpected error fetching Ecommerce tracking id!' in result.output
    assert test_exception_message in result.output
Ejemplo n.º 5
0
def test_successful_retirement(*args, **kwargs):
    username = '******'

    mock_get_access_token = args[1]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']
    mock_update_learner_state = kwargs['update_learner_retirement_state']
    mock_retire_forum = kwargs['retirement_retire_forum']
    mock_retire_mailings = kwargs['retirement_retire_mailings']
    mock_unenroll = kwargs['retirement_unenroll']
    mock_lms_retire = kwargs['retirement_lms_retire']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username)

    result = _call_script(username, fetch_ecom_segment_id=True)

    # Called once per API we instantiate (LMS, ECommerce, Credentials)
    assert mock_get_access_token.call_count == 3
    mock_get_retirement_state.assert_called_once_with(username)
    assert mock_update_learner_state.call_count == 9

    # Called once per retirement
    for mock_call in (mock_retire_forum, mock_retire_mailings, mock_unenroll,
                      mock_lms_retire):
        mock_call.assert_called_once_with(
            mock_get_retirement_state.return_value)

    assert result.exit_code == 0
    assert 'Retirement complete' in result.output
Ejemplo n.º 6
0
def test_get_segment_id_success(*args, **kwargs):
    username = '******'

    mock_get_tracking_key = args[0]
    mock_get_access_token = args[1]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']
    mock_retirement_retire_forum = kwargs['retirement_retire_forum']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_tracking_key.return_value = {
        'id': 1,
        'ecommerce_tracking_id': 'ecommerce-1'
    }

    # The learner starts off with these values, 'ecommerce_segment_id' is added during script
    # startup
    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username, )

    _call_script(username, fetch_ecom_segment_id=True)
    mock_get_tracking_key.assert_called_once_with(
        mock_get_retirement_state.return_value)

    config_after_get_segment_id = mock_get_retirement_state.return_value
    config_after_get_segment_id['ecommerce_segment_id'] = 'ecommerce-1'

    mock_retirement_retire_forum.assert_called_once_with(
        config_after_get_segment_id)
Ejemplo n.º 7
0
def test_success(*args, **kwargs):
    mock_get_access_token = args[0]
    mock_get_learners_to_retire = kwargs['learners_to_retire']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_learners_to_retire.return_value = [
        get_fake_user_retirement(original_username='******'),
        get_fake_user_retirement(original_username='******'),
    ]

    result = _call_script(2)

    # Called once per API we instantiate (LMS, ECommerce, Credentials)
    assert mock_get_access_token.call_count == 1
    mock_get_learners_to_retire.assert_called_once()

    assert result.exit_code == 0
def _fake_learner(ordinal):
    """
    Creates a simple fake learner
    """
    return get_fake_user_retirement(
        user_id=ordinal,
        original_username='******'.format(ordinal),
        original_email='test{}@edx.invalid'.format(ordinal),
        original_name='test {}'.format(ordinal),
        retired_username='******'.format(ordinal),
        retired_email='retired_test{}@edx.invalid'.format(ordinal),
        last_state_name='COMPLETE')
Ejemplo n.º 9
0
def test_skipping_states(*args, **kwargs):
    username = '******'

    mock_get_access_token = args[0]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']
    mock_update_learner_state = kwargs['update_learner_retirement_state']
    mock_retire_forum = kwargs['retirement_retire_forum']
    mock_retire_mailings = kwargs['retirement_retire_mailings']
    mock_unenroll = kwargs['retirement_unenroll']
    mock_lms_retire = kwargs['retirement_lms_retire']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username,
        current_state_name='EMAIL_LISTS_COMPLETE'
    )

    result = _call_script(username)

    # Called once per API we instantiate (LMS, ECommerce, Credentials)
    assert mock_get_access_token.call_count == 3
    mock_get_retirement_state.assert_called_once_with(username)
    assert mock_update_learner_state.call_count == 5

    # Skipped
    for mock_call in (
            mock_retire_forum,
            mock_retire_mailings
    ):
        mock_call.assert_not_called()

    # Called once per retirement
    for mock_call in (
            mock_unenroll,
            mock_lms_retire
    ):
        mock_call.assert_called_once_with(mock_get_retirement_state.return_value)

    assert result.exit_code == 0

    for required_output in (
            'RETIRING_FORUMS completed in previous run',
            'RETIRING_EMAIL_LISTS completed in previous run',
            'Starting state RETIRING_ENROLLMENTS',
            'State RETIRING_ENROLLMENTS completed',
            'Starting state RETIRING_LMS',
            'State RETIRING_LMS completed',
            'Retirement complete'
    ):
        assert required_output in result.output
Ejemplo n.º 10
0
def test_user_in_bad_state(*args, **kwargs):
    username = '******'
    bad_state = 'BOGUS_STATE'
    mock_get_access_token = args[0]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']
    mock_update_learner_state = kwargs['update_learner_retirement_state']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username, current_state_name=bad_state)
    result = _call_script(username)

    assert mock_get_access_token.call_count == 3
    mock_get_retirement_state.assert_called_once_with(username)
    mock_update_learner_state.assert_not_called()

    assert result.exit_code == ERR_UNKNOWN_STATE
    assert bad_state in result.output
Ejemplo n.º 11
0
def test_user_in_working_state(*args, **kwargs):
    username = '******'

    mock_get_access_token = args[0]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']
    mock_update_learner_state = kwargs['update_learner_retirement_state']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username, current_state_name='RETIRING_FORUMS')

    result = _call_script(username)

    assert mock_get_access_token.call_count == 3
    mock_get_retirement_state.assert_called_once_with(username)
    mock_update_learner_state.assert_not_called()

    assert result.exit_code == ERR_USER_IN_WORKING_STATE
    assert 'in a working state' in result.output
Ejemplo n.º 12
0
def test_get_segment_id_not_found(*args, **kwargs):
    username = '******'

    mock_get_tracking_key = args[0]
    mock_get_access_token = args[1]
    mock_get_retirement_state = kwargs['get_learner_retirement_state']

    mock_get_access_token.return_value = ('THIS_IS_A_JWT', None)
    mock_get_tracking_key.side_effect = HttpNotFoundError('{} not found'.format(username))

    mock_get_retirement_state.return_value = get_fake_user_retirement(
        original_username=username,
    )

    result = _call_script(username, fetch_ecom_segment_id=True)
    mock_get_tracking_key.assert_called_once_with(mock_get_retirement_state.return_value)
    assert 'Setting Ecommerce Segment ID to None' in result.output

    # Reset our call counts for the next test
    mock_get_access_token.reset_mock()
    mock_get_retirement_state.reset_mock()
Ejemplo n.º 13
0
"""
import json
import mock
import pytest

import requests
from six import text_type

from tubular.segment_api import SegmentApi, BULK_REGULATE_URL
from tubular.tests.retirement_helpers import get_fake_user_retirement

FAKE_AUTH_TOKEN = 'FakeToken'
TEST_SEGMENT_CONFIG = {
    'projects_to_retire': ['project_1', 'project_2'],
    'learner': [
        get_fake_user_retirement(),
    ],
    'fake_base_url': 'https://segment.invalid/',
    'fake_auth_token': FAKE_AUTH_TOKEN,
    'fake_workspace': 'FakeEdx',
    'headers': {
        "Authorization": "Bearer {}".format(FAKE_AUTH_TOKEN),
        "Content-Type": "application/json"
    }
}


class FakeResponse:
    """
    Fakes out requests.post response
    """