Exemple #1
0
def test_remove_team_registrations_and_cancel_scheduled_reminders(
    registered_email, team_email, expected_reminders_cancelled, webinar, mocker
):
    """
    Test that the is_team_member_registration is marked False successfully for all the given members
    """
    mocked_cancel_all_reminders = mocker.patch('openedx.adg.lms.webinars.models.cancel_all_reminders')
    total_emails = []
    if registered_email:
        total_emails.append(registered_email)
        WebinarRegistrationFactory(email=registered_email, webinar=webinar, is_registered=True)

    if team_email:
        total_emails.append(team_email)
        WebinarRegistrationFactory(
            email=team_email, webinar=webinar, is_registered=False, is_team_member_registration=True
        )

    registrations = WebinarRegistration.remove_team_registrations_and_cancel_scheduled_reminders(total_emails, webinar)

    (cancelled_registrations,) = mocked_cancel_all_reminders.call_args.args
    cancelled_reminder_email_addresses = cancelled_registrations.values_list('email', flat=True)

    assert sorted(cancelled_reminder_email_addresses) == sorted(expected_reminders_cancelled)
    assert not any(registrations.values_list('is_team_member_registration', flat=True))
Exemple #2
0
def test_create_team_registrations_and_schedule_reminder(
    registered_email, team_email, expected_reminders_scheduled, webinar, mocker
):
    """
    Test that the team registrations are created for the given emails successfully
    """
    mocked_schedule_webinar_reminders = mocker.patch('openedx.adg.lms.webinars.models.schedule_webinar_reminders')

    total_emails = []
    if registered_email:
        total_emails.append(registered_email)
        WebinarRegistrationFactory(email=registered_email, webinar=webinar, is_registered=True)

    if team_email:
        total_emails.append(team_email)
        WebinarRegistrationFactory(
            email=team_email, webinar=webinar, is_registered=False, is_team_member_registration=True
        )

    WebinarRegistration.create_team_registrations_and_schedule_reminder(total_emails, webinar)
    scheduled_reminder_email_addresses, _ = mocked_schedule_webinar_reminders.call_args.args

    assert sorted(scheduled_reminder_email_addresses) == sorted(expected_reminders_scheduled)
    assert all(WebinarRegistration.objects.filter(email__in=total_emails).values_list(
        'is_team_member_registration', flat=True)
    )
Exemple #3
0
def test_send_cancellation_emails_for_given_webinars(
    mocker, registered_users_with_response, team_member, expected_email_addresses, webinar
):
    """
    Test if emails are sent to all the registered users without any duplicates
    """
    mocked_send_mandrill_email = mocker.patch('openedx.adg.lms.webinars.helpers.task_send_mandrill_email')

    email, invite_response = registered_users_with_response
    WebinarRegistrationFactory(email=email, webinar=webinar, is_registered=invite_response)

    if team_member:
        WebinarRegistrationFactory(email=team_member, webinar=webinar, is_team_member_registration=True)

    send_cancellation_emails_for_given_webinars([webinar])

    expected_context = {
        'webinar_id': webinar.id,
        'webinar_title': webinar.title,
        'webinar_description': webinar.description,
        'webinar_start_time': webinar.start_date_time_AST,
        'webinar_link': webinar.meeting_link,
    }

    if expected_email_addresses:
        actual_template, actual_email_addresses, actual_context, _ = mocked_send_mandrill_email.delay.call_args.args
        assert actual_template == MandrillClient.WEBINAR_CANCELLATION
        assert actual_context == expected_context
        assert sorted(actual_email_addresses) == sorted(expected_email_addresses)
    else:
        mocked_send_mandrill_email.assert_not_called()
Exemple #4
0
def test_update_all_webinar_registrations_to_new_email():
    """
    Test that the registrations are updated successfully
    """
    old_email = '*****@*****.**'
    new_email = '*****@*****.**'

    total_registrations = 5
    WebinarRegistrationFactory.create_batch(total_registrations, email=old_email)

    update_all_webinar_registrations_to_new_email(old_email, new_email)

    assert WebinarRegistration.objects.filter(email=new_email).count() == total_registrations
    assert WebinarRegistration.objects.filter(email=old_email).count() == 0
Exemple #5
0
def test_cancel_reminder_emails(mocker, is_registered,
                                is_team_member_registration,
                                expected_call_count):
    """
    Test that upon deleting webinar registration, reminder emails of a registered user
    or a webinar team member are cancelled
    """
    mock_cancel_all_reminders = mocker.patch(
        'openedx.adg.lms.webinars.handlers.cancel_all_reminders')

    registration = WebinarRegistrationFactory(
        is_registered=is_registered,
        is_team_member_registration=is_team_member_registration)
    registration.delete()

    assert mock_cancel_all_reminders.call_count == expected_call_count
Exemple #6
0
def test_webinar_registration_view_register_user_with_prior_registration(
        action, user_client, is_registered, mocker):
    """
    Test webinar registration and cancellation if webinar was previously registered or canceled by user
    """
    mock_send_registration_email = mocker.patch(
        'openedx.adg.lms.webinars.api.views.send_webinar_registration_email')
    user, client = user_client
    registration = WebinarRegistrationFactory(email=user.email,
                                              is_registered=is_registered)

    response = client.post(
        reverse('webinars_api:webinar_registration',
                kwargs={
                    'pk': registration.webinar.id,
                    'action': action
                }))

    expected_registration = WebinarRegistration.objects.filter(
        webinar=registration.webinar, email=user.email).first()
    assert expected_registration.is_registered == (action == 'register')
    if action == 'register' and not is_registered:
        mock_send_registration_email.assert_called_once_with(
            registration.webinar, user.email)
    else:
        mock_send_registration_email.assert_not_called()

    assert response.status_code == HTTP_200_OK
Exemple #7
0
def test_dashboard_view_context_data(user_with_profile, courses, webinar,
                                     mocker, request):
    """
    Test dashboard page context data
    """
    mocker.patch(
        'openedx.adg.lms.student.views.DashboardView.get_filtered_enrolled_courses'
    )
    mocker.patch('openedx.adg.lms.student.views.get_course_by_id',
                 return_value=courses['test_course1'])
    mocker.patch('openedx.adg.lms.student.views.reverse',
                 return_value='/account/settings')

    dashboard_request = request
    user_with_profile.is_active = False
    dashboard_request.user = user_with_profile

    CourseEnrollment.enroll(user=user_with_profile,
                            course_key=courses['test_course1'].id)
    CourseEnrollment.enroll(user=user_with_profile,
                            course_key=courses['test_course2'].id)

    PersistentCourseGrade.update_or_create(
        user_id=user_with_profile.id,
        course_id=courses['test_course1'].id,
        percent_grade=0.8,
        passed=True)

    WebinarRegistrationFactory(email=user_with_profile.email,
                               webinar=webinar,
                               is_registered=True)

    GeneratedCertificateFactory(user=user_with_profile,
                                course_id=courses['test_course1'].id,
                                status=CertificateStatuses.downloadable)

    context_data = DashboardView(request=dashboard_request).get_context_data()

    assert 'user' in context_data
    assert 'user_profile' in context_data
    assert 'profile_image_url' in context_data
    assert 'edit_account_link' in context_data
    assert 'application_link' in context_data
    assert 'courses' in context_data
    assert 'courses_filter_options' in context_data
    assert 'courses_filter' in context_data
    assert 'webinars' in context_data
    assert 'webinars_filter_options' in context_data
    assert 'webinars_filter' in context_data
    assert 'certificates' in context_data
    assert 'activate_account_message' in context_data
    assert 'account_activation_messages' in context_data
    assert context_data[
        'profile_image_url'] == get_profile_image_urls_for_user(
            user_with_profile)['full']
    assert context_data['edit_account_link'] == '/account/settings'
    assert context_data['user'] == user_with_profile
    assert len(context_data['webinars']) == 1
Exemple #8
0
def test_update_webinar_team_registrations_and_schedule_reminder_emails(
    old_panelists, new_panelists, old_alt_hosts, new_alt_hosts, newly_added_emails, removed_emails, webinar, mocker
):  # pylint: disable=protected-access
    """
    Test that the `_update_webinar_team_registrations_and_schedule_reminder_emails` adds team member
    registrations and schedules reminder emails for newly added team members. And updates the registrations
    and cancels scheduled reminders for the removed team members.
    """
    mocker.patch('openedx.adg.lms.webinars.models.schedule_webinar_reminders')
    mocker.patch('openedx.adg.lms.webinars.models.cancel_all_reminders')

    total_emails = newly_added_emails + removed_emails
    emails_iter = factory.Iterator(total_emails)

    WebinarRegistrationFactory.create_batch(len(total_emails), email=emails_iter, webinar=webinar)
    webinar._loaded_values = {
        'panelists': old_panelists,
        'alternative_hosts': old_alt_hosts,
        'is_published': old_panelists or old_alt_hosts
    }

    webinar.panelists = new_panelists
    webinar.alternative_hosts = new_alt_hosts
    webinar.save()

    webinar._update_webinar_team_registrations()

    actual_added_emails = WebinarRegistration.objects.filter(webinar=webinar, email__in=newly_added_emails).values_list(
        'is_team_member_registration', flat=True
    )
    actual_removed_emails = WebinarRegistration.objects.filter(webinar=webinar, email__in=removed_emails).values_list(
        'is_team_member_registration', flat=True
    )
    assert len(actual_added_emails) == len(newly_added_emails)
    assert len(actual_removed_emails) == len(removed_emails)

    assert all(actual_added_emails)
    assert not any(actual_removed_emails)
Exemple #9
0
def test_get_invitee_recipients_for_invitation_emails(
    old_invites_by_email,
    new_invites_by_email,
    old_cohort,
    new_cohort,
    cohort_users,
    is_already_published,
    registered_emails,
    expected_emails,
    webinar
):
    """
    Tests that `get_invitee_recipients_for_invitation_emails` returns expected invitee emails.
    """
    old_webinar_data = {
        'title': webinar.title,
        'description': webinar.description,
        'start_time': webinar.start_time,
        'is_published': is_already_published,
        'panelists': '',
        'alternative_hosts': '',
        'invites_by_email_address': old_invites_by_email,
        'invited_user_cohort': old_cohort
    }
    webinar._loaded_values = old_webinar_data  # pylint: disable=protected-access
    webinar.invites_by_email_address = new_invites_by_email
    webinar.invited_user_cohort = new_cohort
    webinar.save()

    BusinessLineFactory(title=old_cohort)
    business_line = BusinessLineFactory(title=new_cohort)

    if new_cohort != INVITE_ALL_USERS:
        for email in cohort_users:
            user = UserFactory(email=email)
            UserApplicationFactory(business_line=business_line, user=user)
    else:
        for email in cohort_users:
            UserFactory(email=email)

    for email in registered_emails:
        WebinarRegistrationFactory(email=email, webinar=webinar)

    actual_team_emails = webinar.get_invitee_recipients_for_invitation_emails(False)

    if new_cohort == INVITE_ALL_USERS:
        expected_emails.append(webinar.created_by.email)

    assert sorted(list(actual_team_emails)) == sorted(expected_emails)
Exemple #10
0
def test_webinar_update_emails(change_field, mocker, webinar, test_team_member_emails):
    """
    Test that webinar update emails are sent correctly to all the registered members when
    there is a change in webinar contents
    """
    mocker.patch('openedx.adg.lms.webinars.models.send_webinar_invitation_emails')
    mock_zoom_client = mocker.patch.object(ZoomClient, 'create_webinar')
    mock_send_webinar_emails = mocker.patch('openedx.adg.lms.webinars.helpers.send_webinar_emails')

    mock_zoom_client.return_value = {
        'join_url': webinar.meeting_link,
        'id': webinar.id,
    }

    if not test_team_member_emails:
        WebinarRegistrationFactory(email=EMAILS[0], webinar=webinar, is_registered=True)

    panelists = '*****@*****.**' if test_team_member_emails else ''
    values = {
        'is_published': True,
        'panelists': panelists
    }
    if change_field:
        field, value = change_field
        values.update({
            field: value
        })

    webinar._loaded_values = values  # pylint: disable=protected-access
    webinar.is_published = False
    webinar.panelists = panelists
    webinar.publish()

    expected_email_recipients = (
        extract_emails_from_string(panelists) if test_team_member_emails else [EMAILS[0]]
    )
    mock_send_webinar_emails.assert_called_once_with(
        MandrillClient.WEBINAR_UPDATED, webinar, expected_email_recipients
    )
Exemple #11
0
def webinar_registration():
    return WebinarRegistrationFactory()