* feat!: Remove all trivial mentions of PREVIEW_LMS_BASE There are a few more mentions but these are all the ones that don't need major further followup. BREAKING CHANGE: The learning MFE now supports preview functionality natively and it is no longer necessary to use a different domain on the LMS to render a preview of course content. See https://github.com/openedx/frontend-app-learning/issues/1455 for more details. * feat: Drop the `in_preview_mode` function. Since we're no longer using a separate domain, that check always returned false. Remove it and update any places/tests where it is used. * feat: Drop courseware_mfe_is_active function. With the removal of the preview check this function is also a no-op now so drop calls to it and update the places where it is called to not change other behavior. * feat!: Drop redirect to preview from the legacy courseware index. The CoursewareIndex view is going to be removed eventually but for now we're focusing on removing the PREVIEW_LMS_BASE setting. With this change, if someone tries to load the legacy courseware URL from the preview domain it will no longer redirect them to the MFE preview. This is not a problem that will occur for users coming from existing studio links because those links have already been updated to go directly to the new urls. The only way this path could execute is if someone goes directly to the old Preview URL that they saved off platform somewhere. eg. If they bookmarked it for some reason. BREAKING CHANGE: Saved links (including bookmarks) to the legacy preview URLs will no longer redirect to the MFE preview URLs. * test: Drop the set_preview_mode test helper. This test helper was setting the preview mode for tests by changing the hostname that was set while tests were running. This was mostly not being used to test preview but to run a bunch of legacy courseware tests while defaulting to the new learning MFE for the courseware. This commit updates various tests in the `courseware` app to not rely on the fact that we're in preview to test legacy courseware behavior and instead directly patches either the `_redirect_to_learning_mfe` function or uses the `_get_legacy_courseware_url` or both to be able to have the tests continue to test the legacy coursewary. This will hopefully make the tests more accuarte even though hopefully we'll just be removing many of them soon as a part of the legacy courseware cleanup. We're just doing the preview removal separately to reduce the number of things that are changing at once. * test: Drop the `_get_urls_function` With the other recent cleanup, this function is no longer being referenced by anything so we can just drop it. * test: Test student access to unpublihsed content. Ensure that students can't get access to unpublished content.
226 lines
12 KiB
INI
226 lines
12 KiB
INI
[tool:pytest]
|
|
# Note: The first file of settings found is used, there is no combining, so
|
|
# this file is only used for tests that don't find a pytest.ini file first.
|
|
# Details at https://docs.pytest.org/en/latest/reference/customize.html
|
|
|
|
DJANGO_SETTINGS_MODULE = lms.envs.test
|
|
addopts = --nomigrations --reuse-db --durations=20 --json-report --json-report-omit keywords streams collectors log traceback tests --json-report-file=none
|
|
# Enable default handling for all warnings, including those that are ignored by default;
|
|
# but hide rate-limit warnings (because we deliberately don't throttle test user logins)
|
|
# and field_data deprecation warnings (because fixing them requires a major low-priority refactoring)
|
|
filterwarnings =
|
|
default
|
|
ignore:No request passed to the backend, unable to rate-limit:UserWarning
|
|
ignore::xblock.exceptions.FieldDataDeprecationWarning
|
|
# Remove default_app_config warning after updating Django to 4.2
|
|
ignore:.*You can remove default_app_config.*:PendingDeprecationWarning
|
|
ignore:Instead access HTTPResponse.headers directly.*:DeprecationWarning:elasticsearch
|
|
# ABC deprecation Warning comes from libsass
|
|
ignore:Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated.*:DeprecationWarning:sass
|
|
ignore:'etree' is deprecated. Use 'xml.etree.ElementTree' instead.:DeprecationWarning:wiki
|
|
|
|
junit_family = xunit2
|
|
norecursedirs = .* *.egg build conf dist node_modules test_root cms/envs lms/envs
|
|
python_classes =
|
|
python_files = tests.py test_*.py tests_*.py *_tests.py __init__.py
|
|
|
|
[pycodestyle]
|
|
# error codes: https://pycodestyle.readthedocs.io/en/latest/intro.html#error-codes
|
|
# E501: line too long
|
|
# E265: block comment should start with '# '
|
|
# We ignore this because pep8 used to erroneously lump E266 into it also.
|
|
# We should probably fix these now.
|
|
# E266: too many leading '#' for block comment
|
|
# We have lots of comments that look like "##### HEADING #####" which violate
|
|
# this rule, because they don't have a space after the first #. However,
|
|
# they're still perfectly reasonable comments, so we disable this rule.
|
|
# W602: deprecated form of raising exception
|
|
# We do this in a few places to modify the exception message while preserving
|
|
# the traceback. See this blog post for more info:
|
|
# http://nedbatchelder.com/blog/200711/rethrowing_exceptions_in_python.html
|
|
# It's a little unusual, but we have good reasons for doing so, so we disable
|
|
# this rule.
|
|
# E305,E402,E722,E731,E741,E743,W503,W504: errors and warnings added since pep8/pycodestyle
|
|
# 1.5.7 that we haven't cleaned up yet
|
|
ignore=E265,E266,E305,E402,E501,E722,E731,E741,E743,W503,W504,W602
|
|
exclude=migrations,.git,.pycharm_helpers,.tox,test_root/staticfiles,node_modules
|
|
|
|
[isort]
|
|
indent=' '
|
|
line_length=120
|
|
multi_line_output=3
|
|
skip=
|
|
envs
|
|
migrations
|
|
|
|
[importlinter]
|
|
root_packages =
|
|
lms
|
|
cms
|
|
openedx
|
|
openedx_learning
|
|
include_external_packages = True
|
|
contract_types =
|
|
# Our custom contract which checks that we're only importing from 'api.py'
|
|
# for participating packages.
|
|
isolated_apps: openedx.testing.importlinter.isolated_apps_contract.IsolatedAppsContract
|
|
|
|
[importlinter:contract:1]
|
|
name = lms and cms are independent
|
|
type = independence
|
|
modules =
|
|
lms
|
|
cms
|
|
ignore_imports =
|
|
############################################################################
|
|
# lms side imports that we are ignoring for now
|
|
lms.djangoapps.course_home_api.outline.tests.test_view -> cms.djangoapps.contentstore.outlines
|
|
lms.djangoapps.course_home_api.tests.utils -> cms.djangoapps.contentstore.outlines
|
|
# lms.djangoapps.instructor.tests.test_api & lms.djangoapps.instructor.tests.test_tools
|
|
# -> openedx.core.djangoapps.course_date_signals.handlers
|
|
# -> cms.djangoapps.contentstore.config.waffle
|
|
openedx.core.djangoapps.course_date_signals.handlers -> cms.djangoapps.contentstore.config.waffle
|
|
############################################################################
|
|
# cms side imports that we are ignoring for now
|
|
cms.djangoapps.contentstore.views.tests.test_block -> lms.djangoapps.lms_xblock.mixin
|
|
cms.envs.common -> lms.envs.common
|
|
cms.djangoapps.contentstore.signals.handlers -> lms.djangoapps.grades.api
|
|
cms.djangoapps.contentstore.course_group_config -> lms.lib.utils
|
|
cms.djangoapps.contentstore.views.preview -> lms.djangoapps.lms_xblock.field_data
|
|
cms.envs.common -> lms.djangoapps.lms_xblock.mixin
|
|
cms.envs.test -> lms.envs.test
|
|
# cms.djangoapps.contentstore.views.tests.test_group_configurations
|
|
# -> openedx.features.content_type_gating.helpers
|
|
# -> lms.djangoapps.courseware.masquerade
|
|
openedx.features.content_type_gating.helpers -> lms.djangoapps.courseware.masquerade
|
|
# cms.djangoapps.contentstore.utils
|
|
# -> openedx.core.djangoapps.django_comment_common.models
|
|
# -> openedx.core.djangoapps.course_groups.cohorts
|
|
# -> lms.djangoapps.courseware.courses
|
|
openedx.core.djangoapps.course_groups.cohorts -> lms.djangoapps.courseware.courses
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.features.content_type_gating.partitions
|
|
# -> lms.djangoapps.commerce.utils
|
|
openedx.features.content_type_gating.partitions -> lms.djangoapps.commerce.utils
|
|
# cms.djangoapps.contentstore.course_group_config
|
|
# -> openedx.core.djangoapps.course_groups.partition_scheme
|
|
# -> lms.djangoapps.courseware.masquerade
|
|
openedx.core.djangoapps.course_groups.partition_scheme -> lms.djangoapps.courseware.masquerade
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.core.djangoapps.content.course_overviews.models
|
|
# -> lms.djangoapps.ccx.utils
|
|
# & lms.djangoapps.certificates.api
|
|
# & lms.djangoapps.discussion.django_comment_client
|
|
openedx.core.djangoapps.content.course_overviews.models -> lms.djangoapps.*.*
|
|
# cms.djangoapps.export_course_metadata.tasks
|
|
# -> openedx.core.djangoapps.schedules.content_highlights
|
|
# -> lms.djangoapps.courseware.block_render & lms.djangoapps.courseware.model_data
|
|
openedx.core.djangoapps.content_libraries.* -> lms.djangoapps.*.*
|
|
# cms.djangoapps.contentstore.tasks -> openedx.core.djangoapps.content_libraries.[various]
|
|
# -> lms.djangoapps.grades.api
|
|
openedx.core.djangoapps.xblock.*.* -> lms.djangoapps.*.*
|
|
# cms.djangoapps.contentstore.tasks -> openedx.core.djangoapps.content_libraries.[various] -> openedx.core.djangoapps.xblock.[various]
|
|
# -> lms.djangoapps.courseware & lms.djangoapps.courseware.grades
|
|
openedx.core.djangoapps.schedules.content_highlights -> lms.djangoapps.courseware.*
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.core.lib.gating.api
|
|
# -> lms.djangoapps.course_blocks.api & lms.djangoapps.courseware.access & lms.djangoapps.grades.api
|
|
openedx.core.lib.gating.api -> lms.djangoapps.*.*
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.features.content_type_gating.partitions
|
|
# -> openedx.features.discounts.utils
|
|
# -> lms.djangoapps.courseware.utils & lms.djangoapps.experiments.models
|
|
openedx.features.discounts.utils -> lms.djangoapps.courseware.utils
|
|
openedx.features.discounts.utils -> lms.djangoapps.experiments.models
|
|
# cms.djangoapps.contentstore.signals.handlers
|
|
# -> openedx.core.djangoapps.discussions.tasks
|
|
# -> openedx.core.djangoapps.discussions.utils
|
|
# -> lms.djangoapps.courseware.access
|
|
openedx.core.djangoapps.discussions.utils -> lms.djangoapps.courseware.access
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.features.content_type_gating.partitions
|
|
# -> openedx.features.discounts.utils
|
|
# -> openedx.features.discounts.applicability
|
|
# -> lms.djangoapps.courseware.toggles
|
|
# & lms.djangoapps.courseware.utils
|
|
# & lms.djangoapps.experiments.models
|
|
# & lms.djangoapps.experiments.stable_bucketing
|
|
openedx.features.discounts.applicability -> lms.djangoapps.courseware.*
|
|
openedx.features.discounts.applicability -> lms.djangoapps.experiments.*
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.core.djangoapps.content.learning_sequences.api
|
|
# -> openedx.core.djangoapps.content.learning_sequences.api.outlines
|
|
# -> openedx.core.djangoapps.content.learning_sequences.api.permissions
|
|
# -> lms.djangoapps.courseware.access
|
|
openedx.core.djangoapps.content.learning_sequences.api.permissions -> lms.djangoapps.courseware.access
|
|
# cms.djangoapps.contentstore.[various]
|
|
# -> openedx.features.content_type_gating.partitions
|
|
# -> openedx.features.discounts.utils
|
|
# -> openedx.features.discounts.applicability
|
|
# -> openedx.features.enterprise_support.utils
|
|
openedx.features.enterprise_support.utils -> lms.djangoapps.branding.api
|
|
cms.djangoapps.contentstore.rest_api.v1.views.settings -> lms.djangoapps.certificates.api
|
|
|
|
|
|
[importlinter:contract:2]
|
|
name = Do not depend on non-public API of isolated apps.
|
|
type = isolated_apps
|
|
isolated_apps =
|
|
openedx.core.djangoapps.agreements
|
|
openedx.core.djangoapps.bookmarks
|
|
openedx.core.djangoapps.content_libraries
|
|
openedx.core.djangoapps.content_staging
|
|
openedx.core.djangoapps.olx_rest_api
|
|
openedx.core.djangoapps.xblock
|
|
openedx.core.lib.xblock_serializer
|
|
allowed_modules =
|
|
# Only imports from api.py and data.py are allowed elsewhere in the code
|
|
# See https://open-edx-proposals.readthedocs.io/en/latest/best-practices/oep-0049-django-app-patterns.html#api-py
|
|
api
|
|
data
|
|
tests
|
|
|
|
[importlinter:contract:3]
|
|
name = Do not import apps from openedx-learning (only import from openedx_learning.api.* and openedx_learning.lib.*).
|
|
type = forbidden
|
|
source_modules =
|
|
cms
|
|
lms
|
|
openedx
|
|
forbidden_modules =
|
|
openedx_learning.apps
|
|
allow_indirect_imports = True
|
|
|
|
[importlinter:contract:4]
|
|
name = Low-level apps should not depend on high-level apps
|
|
type = layers
|
|
layers =
|
|
# Layers from high-level to low-level. Imports should only occur from higher to lower.
|
|
cms.lib.xblock.upstream_sync | openedx.core.djangoapps.content.search | openedx.core.djangoapps.olx_rest_api
|
|
openedx.core.djangoapps.content_libraries
|
|
openedx.core.djangoapps.content_staging
|
|
openedx.core.djangoapps.xblock
|
|
openedx.core.lib.xblock_serializer
|
|
openedx.core.djangoapps.content_tagging
|
|
ignore_imports =
|
|
# Test code can break these layering rules
|
|
**.tests.** -> **
|
|
|
|
# FIXME: the exceptions below are from before we added this import linting rule. Should refactor to eliminate them.
|
|
# In particular, the contentstore.helpers module is too big and has too many imports - split it up?
|
|
|
|
# The CSV export hard-codes support for courses and libraries. Refactor to do something like learning_context.get_children()
|
|
openedx.core.djangoapps.content_tagging.helpers.objecttag_export_helpers -> openedx.core.djangoapps.content_libraries.api
|
|
# The permissions checking code for tagging requires libraries model data to get all the orgs that a user is using:
|
|
openedx.core.djangoapps.content_tagging.utils -> openedx.core.djangoapps.content_libraries.api
|
|
# Content staging POST to clipboard API uses libraries APIs. We're working on moving this code to content_libraries
|
|
openedx.core.djangoapps.content_staging.views -> openedx.core.djangoapps.content_libraries.api
|
|
# content_staging.serializers imports contentstore.helpers which imports contentstore.utils which imports the libraries API.
|
|
openedx.core.djangoapps.content_staging.serializers -> cms.djangoapps.contentstore.helpers
|
|
# content_libraries.rest_api.libraries imports cms.djangoapps.contentstore.views.course which imports
|
|
# contentstore.toggles which imports djangoapps.content.search.api
|
|
openedx.core.djangoapps.content_libraries.rest_api.libraries -> cms.djangoapps.contentstore.views.course
|
|
# Content libraries imports contentstore.helpers which imports upstream_sync
|
|
openedx.core.djangoapps.content_libraries.api.blocks -> cms.djangoapps.contentstore.helpers
|
|
openedx.core.djangoapps.content_libraries.api.libraries -> cms.djangoapps.contentstore.helpers
|