diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 867a86e..29e2a7a 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -4,6 +4,7 @@ import contextlib import uuid +import jsonschema import pytest from le_utils.constants import completion_criteria @@ -12,29 +13,15 @@ from le_utils.constants import learning_objectives from le_utils.constants import mastery_criteria -try: - # the jsonschema package for python 3.4 is too old, so if not present, we'll just skip - import jsonschema -except ImportError: - jsonschema = None - -# create a common decorator to skip tests if jsonschema is not available -skip_if_jsonschema_unavailable = pytest.mark.skipif( - jsonschema is None, reason="jsonschema package is unavailable" +# this is an example of how to include the mastery criteria schema, which is referenced by the +# completion criteria schema, in the schema resolver so that it validates +resolver = jsonschema.RefResolver.from_schema(mastery_criteria.SCHEMA) +resolver.store.update( + jsonschema.RefResolver.from_schema(completion_criteria.SCHEMA).store ) -resolver = None -if jsonschema is not None: - # this is an example of how to include the mastery criteria schema, which is referenced by the - # completion criteria schema, in the schema resolver so that it validates - resolver = jsonschema.RefResolver.from_schema(mastery_criteria.SCHEMA) - resolver.store.update( - jsonschema.RefResolver.from_schema(completion_criteria.SCHEMA).store - ) - - def _validate_embed_content_request(data): """ :param data: Dictionary of data to validate @@ -73,7 +60,6 @@ def _assert_not_raises(not_expected): raise e -@skip_if_jsonschema_unavailable def test_completion_criteria__time_model__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -87,7 +73,6 @@ def test_completion_criteria__time_model__valid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__time_model__invalid(): with pytest.raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -106,7 +91,6 @@ def test_completion_criteria__time_model__invalid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__approx_time_model__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -120,7 +104,6 @@ def test_completion_criteria__approx_time_model__valid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__approx_time_model__invalid(): with pytest.raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -139,7 +122,6 @@ def test_completion_criteria__approx_time_model__invalid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__pages_model__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -153,7 +135,6 @@ def test_completion_criteria__pages_model__valid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__pages_model__percentage__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -170,7 +151,6 @@ def test_completion_criteria__pages_model__percentage__valid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__pages_model__invalid(): with pytest.raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -189,7 +169,6 @@ def test_completion_criteria__pages_model__invalid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__pages_model__percentage__invalid(): with pytest.raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -208,7 +187,6 @@ def test_completion_criteria__pages_model__percentage__invalid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__mastery_model__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -244,7 +222,6 @@ def test_completion_criteria__mastery_model__valid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__mastery_model__invalid(): with pytest.raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -310,7 +287,6 @@ def test_completion_criteria__mastery_model__invalid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__reference__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_completion_criteria({"model": "reference", "learner_managed": False}) @@ -321,7 +297,6 @@ def test_completion_criteria__reference__valid(): ) -@skip_if_jsonschema_unavailable def test_completion_criteria__reference__invalid(): with pytest.raises(jsonschema.ValidationError): _validate_completion_criteria( @@ -341,7 +316,6 @@ def test_completion_criteria__reference__invalid(): ) -@skip_if_jsonschema_unavailable def test_embed__topics__without_ancestors__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_embed_topics_request( @@ -363,7 +337,6 @@ def test_embed__topics__without_ancestors__valid(): ) -@skip_if_jsonschema_unavailable def test_embed__topics__with_ancestors__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_embed_topics_request( @@ -393,7 +366,6 @@ def test_embed__topics__with_ancestors__valid(): ) -@skip_if_jsonschema_unavailable def test_embed__topics__invalid_id(): with pytest.raises(jsonschema.ValidationError): _validate_embed_topics_request( @@ -415,7 +387,6 @@ def test_embed__topics__invalid_id(): ) -@skip_if_jsonschema_unavailable def test_embed__topics__missing_language(): with pytest.raises(jsonschema.ValidationError): _validate_embed_topics_request( @@ -436,7 +407,6 @@ def test_embed__topics__missing_language(): ) -@skip_if_jsonschema_unavailable def test_embed__topics__invalid_channel_id(): with pytest.raises(jsonschema.ValidationError): _validate_embed_topics_request( @@ -458,7 +428,6 @@ def test_embed__topics__invalid_channel_id(): ) -@skip_if_jsonschema_unavailable def test_embed__topics__missing_channel_id(): with pytest.raises(jsonschema.ValidationError): _validate_embed_topics_request( @@ -479,7 +448,6 @@ def test_embed__topics__missing_channel_id(): ) -@skip_if_jsonschema_unavailable def test_embed__content__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -503,7 +471,6 @@ def test_embed__content__valid(): ) -@skip_if_jsonschema_unavailable def test_embed__content__valid_with_files(): with _assert_not_raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -544,7 +511,6 @@ def test_embed__content__valid_with_files(): ) -@skip_if_jsonschema_unavailable def test_embed__content__invalid_id(): with pytest.raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -568,7 +534,6 @@ def test_embed__content__invalid_id(): ) -@skip_if_jsonschema_unavailable def test_embed__content__invalid_channel_id(): with pytest.raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -592,7 +557,6 @@ def test_embed__content__invalid_channel_id(): ) -@skip_if_jsonschema_unavailable def test_embed__content__invalid_content_id(): with pytest.raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -616,7 +580,6 @@ def test_embed__content__invalid_content_id(): ) -@skip_if_jsonschema_unavailable def test_embed__content__invalid_url_files(): with pytest.raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -646,7 +609,6 @@ def test_embed__content__invalid_url_files(): ) -@skip_if_jsonschema_unavailable def test_embed__content__invalid_preset_files(): with pytest.raises(jsonschema.ValidationError): _validate_embed_content_request( @@ -684,7 +646,6 @@ def _validate_learning_objectives(data): jsonschema.validate(instance=data, schema=learning_objectives.SCHEMA) -@skip_if_jsonschema_unavailable def test_learning_objectives__valid(): with _assert_not_raises(jsonschema.ValidationError): _validate_learning_objectives( @@ -715,7 +676,6 @@ def test_learning_objectives__valid(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__valid_uuid_v5(): with _assert_not_raises(jsonschema.ValidationError): _validate_learning_objectives( @@ -752,7 +712,6 @@ def test_learning_objectives__valid_uuid_v5(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_lo_structure(): with pytest.raises(jsonschema.ValidationError): _validate_learning_objectives( @@ -768,7 +727,6 @@ def test_learning_objectives__invalid_lo_structure(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_assessment_mapping(): with pytest.raises(jsonschema.ValidationError): _validate_learning_objectives( @@ -784,7 +742,6 @@ def test_learning_objectives__invalid_assessment_mapping(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_lesson_mapping(): with pytest.raises(jsonschema.ValidationError): _validate_learning_objectives( @@ -800,7 +757,6 @@ def test_learning_objectives__invalid_lesson_mapping(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__missing_required_fields(): # Missing learning_objectives with pytest.raises(jsonschema.ValidationError): @@ -832,7 +788,6 @@ def test_learning_objectives__missing_required_fields(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__empty_structures(): # Empty learning_objectives with pytest.raises(jsonschema.ValidationError): @@ -869,7 +824,6 @@ def test_learning_objectives__empty_structures(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_uuid_format_in_learning_objectives(): # Invalid UUID format for learning objective ID with pytest.raises(jsonschema.ValidationError): @@ -884,7 +838,6 @@ def test_learning_objectives__invalid_uuid_format_in_learning_objectives(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_uuid_format_in_references(): # Invalid UUID format in assessment and lesson objective references with pytest.raises(jsonschema.ValidationError): @@ -899,7 +852,6 @@ def test_learning_objectives__invalid_uuid_format_in_references(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_question_id_pattern(): # Invalid question ID pattern (not a valid UUID v4) with pytest.raises(jsonschema.ValidationError): @@ -916,7 +868,6 @@ def test_learning_objectives__invalid_question_id_pattern(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_lesson_id_pattern(): # Invalid lesson ID pattern (has extra characters) with pytest.raises(jsonschema.ValidationError): @@ -931,7 +882,6 @@ def test_learning_objectives__invalid_lesson_id_pattern(): ) -@skip_if_jsonschema_unavailable def test_learning_objectives__invalid_text_patterns(): # Empty text after trimming whitespace with pytest.raises(jsonschema.ValidationError):