INCR-239 (#20510)
* INCR-239: Run python-modernize and isort on openedx/core/djangoapps/programs [tests, tasks] * INCR-239: Grouped six package and represent unused variables with _
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
"""
|
||||
This file contains celery tasks for programs-related functionality.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
|
||||
from celery import task
|
||||
from celery.exceptions import MaxRetriesExceededError
|
||||
from celery.utils.log import get_task_logger
|
||||
@@ -16,8 +18,8 @@ from openedx.core.djangoapps.certificates.api import available_date_for_certific
|
||||
from openedx.core.djangoapps.content.course_overviews.models import CourseOverview
|
||||
from openedx.core.djangoapps.credentials.models import CredentialsApiConfig
|
||||
from openedx.core.djangoapps.credentials.utils import get_credentials, get_credentials_api_client
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
from openedx.core.djangoapps.programs.utils import ProgramProgressMeter
|
||||
from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers
|
||||
|
||||
LOGGER = get_task_logger(__name__)
|
||||
# Under cms the following setting is not defined, leading to errors during tests.
|
||||
|
||||
@@ -1,20 +1,23 @@
|
||||
"""
|
||||
Tests for programs celery tasks.
|
||||
"""
|
||||
from __future__ import absolute_import
|
||||
|
||||
import json
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
|
||||
import ddt
|
||||
import httpretty
|
||||
import mock
|
||||
import pytz
|
||||
from waffle.testutils import override_switch
|
||||
from celery.exceptions import MaxRetriesExceededError
|
||||
from django.conf import settings
|
||||
from django.test import override_settings, TestCase
|
||||
from django.test import TestCase, override_settings
|
||||
from edx_oauth2_provider.tests.factories import ClientFactory
|
||||
from edx_rest_api_client import exceptions
|
||||
from edx_rest_api_client.client import EdxRestApiClient
|
||||
from waffle.testutils import override_switch
|
||||
|
||||
from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory
|
||||
from openedx.core.djangoapps.catalog.tests.mixins import CatalogIntegrationMixin
|
||||
@@ -22,7 +25,7 @@ from openedx.core.djangoapps.certificates.config import waffle
|
||||
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
|
||||
from openedx.core.djangoapps.credentials.tests.mixins import CredentialsApiConfigMixin
|
||||
from openedx.core.djangoapps.programs.tasks.v1 import tasks
|
||||
from openedx.core.djangoapps.site_configuration.tests.factories import SiteFactory, SiteConfigurationFactory
|
||||
from openedx.core.djangoapps.site_configuration.tests.factories import SiteConfigurationFactory, SiteFactory
|
||||
from openedx.core.djangolib.testing.utils import skip_unless_lms
|
||||
from student.tests.factories import UserFactory
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
"""Factories for generating fake program-related data."""
|
||||
# pylint: disable=missing-docstring
|
||||
from __future__ import absolute_import
|
||||
|
||||
import factory
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
"""Mixins for use during testing."""
|
||||
from __future__ import absolute_import
|
||||
|
||||
from openedx.core.djangoapps.programs.models import ProgramsApiConfig
|
||||
|
||||
|
||||
|
||||
@@ -1,19 +1,22 @@
|
||||
"""Tests for the backpopulate_program_credentials management command."""
|
||||
from __future__ import absolute_import
|
||||
|
||||
import ddt
|
||||
import mock
|
||||
from django.core.management import call_command
|
||||
from django.test import TestCase
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from six.moves import range
|
||||
|
||||
from lms.djangoapps.certificates.models import CertificateStatuses
|
||||
from course_modes.models import CourseMode
|
||||
from lms.djangoapps.certificates.api import MODES
|
||||
from lms.djangoapps.certificates.models import CertificateStatuses
|
||||
from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from openedx.core.djangoapps.catalog.tests.factories import (
|
||||
generate_course_run_key,
|
||||
ProgramFactory,
|
||||
CourseFactory,
|
||||
CourseRunFactory,
|
||||
ProgramFactory,
|
||||
generate_course_run_key
|
||||
)
|
||||
from openedx.core.djangoapps.catalog.tests.mixins import CatalogIntegrationMixin
|
||||
from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory
|
||||
|
||||
@@ -2,16 +2,17 @@
|
||||
This module contains tests for programs-related signals and signal handlers.
|
||||
"""
|
||||
|
||||
from django.test import TestCase
|
||||
from __future__ import absolute_import
|
||||
|
||||
import mock
|
||||
|
||||
from django.test import TestCase
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from student.tests.factories import UserFactory
|
||||
|
||||
from openedx.core.djangoapps.signals.signals import COURSE_CERT_AWARDED, COURSE_CERT_CHANGED
|
||||
from openedx.core.djangoapps.programs.signals import handle_course_cert_awarded, handle_course_cert_changed
|
||||
from openedx.core.djangoapps.signals.signals import COURSE_CERT_AWARDED, COURSE_CERT_CHANGED
|
||||
from openedx.core.djangoapps.site_configuration.tests.factories import SiteConfigurationFactory
|
||||
from openedx.core.djangolib.testing.utils import skip_unless_lms
|
||||
from student.tests.factories import UserFactory
|
||||
|
||||
TEST_USERNAME = 'test-user'
|
||||
TEST_COURSE_KEY = CourseKey.from_string('course-v1:edX+test_course+1')
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
"""Tests covering Programs utilities."""
|
||||
from __future__ import absolute_import
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import uuid
|
||||
@@ -7,17 +9,18 @@ from copy import deepcopy
|
||||
import ddt
|
||||
import httpretty
|
||||
import mock
|
||||
import six
|
||||
from six.moves import range
|
||||
from django.conf import settings
|
||||
from django.urls import reverse
|
||||
from django.test import TestCase
|
||||
from django.test.utils import override_settings
|
||||
from django.urls import reverse
|
||||
from pytz import utc
|
||||
|
||||
from course_modes.models import CourseMode
|
||||
from entitlements.tests.factories import CourseEntitlementFactory
|
||||
from testfixtures import LogCapture
|
||||
from waffle.testutils import override_switch
|
||||
|
||||
from course_modes.models import CourseMode
|
||||
from entitlements.tests.factories import CourseEntitlementFactory
|
||||
from lms.djangoapps.certificates.api import MODES
|
||||
from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory
|
||||
from lms.djangoapps.commerce.tests.test_utils import update_commerce_config
|
||||
@@ -99,7 +102,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
|
||||
self.assertEqual(meter.engaged_programs, [])
|
||||
self._assert_progress(meter)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
def test_enrollments_but_no_programs(self, mock_get_programs):
|
||||
"""Verify behavior when enrollments exist, but no matching programs do."""
|
||||
@@ -111,7 +114,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
|
||||
self.assertEqual(meter.engaged_programs, [])
|
||||
self._assert_progress(meter)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
def test_entitlements_but_no_programs(self, mock_get_programs):
|
||||
""" Verify engaged_programs is empty when entitlements exist, but no matching programs do. """
|
||||
@@ -150,7 +153,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter,
|
||||
ProgressFactory(uuid=program['uuid'], in_progress=1, grades={course_run_key: 0.0})
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
def test_single_program_entitlement(self, mock_get_programs):
|
||||
"""
|
||||
@@ -374,7 +377,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter,
|
||||
*(ProgressFactory(uuid=program['uuid'], in_progress=1, grades=grades) for program in programs)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
def test_multiple_program_entitlement(self, mock_get_programs):
|
||||
"""
|
||||
@@ -447,7 +450,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
meter,
|
||||
*(ProgressFactory(uuid=program['uuid'], in_progress=1, grades=grades) for program in programs)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
def test_shared_entitlement_engagement(self, mock_get_programs):
|
||||
"""
|
||||
@@ -498,17 +501,17 @@ class TestProgramProgressMeter(TestCase):
|
||||
# No enrollments, no programs in progress.
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self._assert_progress(meter)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
# One enrollment, one program in progress.
|
||||
self._create_enrollments(first_course_run_key)
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
program, program_uuid = data[0], data[0]['uuid']
|
||||
_, program_uuid = data[0], data[0]['uuid']
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, in_progress=1, not_started=1, grades={first_course_run_key: 0.0})
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
# Two enrollments, all courses in progress.
|
||||
self._create_enrollments(second_course_run_key)
|
||||
@@ -524,7 +527,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
},
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
# One valid certificate earned, one course complete.
|
||||
self._create_certificates(first_course_run_key, mode=MODES.verified)
|
||||
@@ -541,7 +544,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
# Invalid certificate earned, still one course to complete. (invalid because mode doesn't match the course)
|
||||
second_cert = self._create_certificates(second_course_run_key, mode=MODES.honor)[0]
|
||||
@@ -559,7 +562,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
# Second valid certificate obtained, all courses complete.
|
||||
second_cert.mode = MODES.verified
|
||||
@@ -576,7 +579,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
}
|
||||
)
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [program_uuid])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [program_uuid])
|
||||
|
||||
def test_nonverified_course_run_completion(self, mock_get_programs):
|
||||
"""
|
||||
@@ -601,12 +604,12 @@ class TestProgramProgressMeter(TestCase):
|
||||
self._create_certificates(course_run_key)
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
|
||||
program, program_uuid = data[0], data[0]['uuid']
|
||||
_, program_uuid = data[0], data[0]['uuid']
|
||||
self._assert_progress(
|
||||
meter,
|
||||
ProgressFactory(uuid=program_uuid, completed=1, grades={course_run_key: 0.0})
|
||||
)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [program_uuid])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [program_uuid])
|
||||
|
||||
@mock.patch(UTILS_MODULE + '.available_date_for_certificate')
|
||||
def test_completed_programs_with_available_dates(self, mock_available_date_for_certificate, mock_get_programs):
|
||||
@@ -693,7 +696,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
|
||||
# Verify that the test program is not complete.
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [])
|
||||
|
||||
# Grant a 'no-id-professional' certificate for one of the course runs,
|
||||
# thereby completing the program.
|
||||
@@ -702,7 +705,7 @@ class TestProgramProgressMeter(TestCase):
|
||||
|
||||
# Verify that the program is complete.
|
||||
meter = ProgramProgressMeter(self.site, self.user)
|
||||
self.assertEqual(meter.completed_programs_with_available_dates.keys(), [program['uuid']])
|
||||
self.assertEqual(list(meter.completed_programs_with_available_dates.keys()), [program['uuid']])
|
||||
|
||||
@mock.patch(UTILS_MODULE + '.ProgramProgressMeter.completed_course_runs', new_callable=mock.PropertyMock)
|
||||
def test_credit_course_counted_complete_for_verified(self, mock_completed_course_runs, mock_get_programs):
|
||||
@@ -797,7 +800,7 @@ def _create_course(self, course_price, course_run_count=1, make_entitlement=Fals
|
||||
course.instructor_info = self.instructors
|
||||
course = self.update_course(course, self.user.id)
|
||||
|
||||
run = CourseRunFactory(key=unicode(course.id), seats=[SeatFactory(price=course_price)])
|
||||
run = CourseRunFactory(key=six.text_type(course.id), seats=[SeatFactory(price=course_price)])
|
||||
course_runs.append(run)
|
||||
entitlements = [EntitlementFactory()] if make_entitlement else []
|
||||
|
||||
@@ -833,7 +836,7 @@ class TestProgramDataExtender(ModuleStoreTestCase):
|
||||
self.course.end = datetime.datetime.now(utc) + datetime.timedelta(days=1)
|
||||
self.course = self.update_course(self.course, self.user.id)
|
||||
|
||||
self.course_run = CourseRunFactory(key=unicode(self.course.id))
|
||||
self.course_run = CourseRunFactory(key=six.text_type(self.course.id))
|
||||
self.catalog_course = CourseFactory(course_runs=[self.course_run])
|
||||
self.program = ProgramFactory(courses=[self.catalog_course])
|
||||
self.course_price = 100
|
||||
@@ -1475,7 +1478,7 @@ class TestProgramMarketingDataExtender(ModuleStoreTestCase):
|
||||
for __ in range(3):
|
||||
course = ModuleStoreCourseFactory()
|
||||
course = self.update_course(course, self.user.id)
|
||||
course_runs.append(CourseRunFactory(key=unicode(course.id), seats=[]))
|
||||
course_runs.append(CourseRunFactory(key=six.text_type(course.id), seats=[]))
|
||||
program = ProgramFactory(courses=[CourseFactory(course_runs=course_runs)])
|
||||
|
||||
data = ProgramMarketingDataExtender(program, self.user).extend()
|
||||
|
||||
Reference in New Issue
Block a user