44import contextlib
55import uuid
66
7+ import jsonschema
78import pytest
89
910from le_utils .constants import completion_criteria
1213from le_utils .constants import learning_objectives
1314from le_utils .constants import mastery_criteria
1415
15- try :
16- # the jsonschema package for python 3.4 is too old, so if not present, we'll just skip
17- import jsonschema
18- except ImportError :
19- jsonschema = None
2016
21-
22- # create a common decorator to skip tests if jsonschema is not available
23- skip_if_jsonschema_unavailable = pytest .mark .skipif (
24- jsonschema is None , reason = "jsonschema package is unavailable"
17+ # this is an example of how to include the mastery criteria schema, which is referenced by the
18+ # completion criteria schema, in the schema resolver so that it validates
19+ resolver = jsonschema .RefResolver .from_schema (mastery_criteria .SCHEMA )
20+ resolver .store .update (
21+ jsonschema .RefResolver .from_schema (completion_criteria .SCHEMA ).store
2522)
2623
2724
28- resolver = None
29- if jsonschema is not None :
30- # this is an example of how to include the mastery criteria schema, which is referenced by the
31- # completion criteria schema, in the schema resolver so that it validates
32- resolver = jsonschema .RefResolver .from_schema (mastery_criteria .SCHEMA )
33- resolver .store .update (
34- jsonschema .RefResolver .from_schema (completion_criteria .SCHEMA ).store
35- )
36-
37-
3825def _validate_embed_content_request (data ):
3926 """
4027 :param data: Dictionary of data to validate
@@ -73,7 +60,6 @@ def _assert_not_raises(not_expected):
7360 raise e
7461
7562
76- @skip_if_jsonschema_unavailable
7763def test_completion_criteria__time_model__valid ():
7864 with _assert_not_raises (jsonschema .ValidationError ):
7965 _validate_completion_criteria (
@@ -87,7 +73,6 @@ def test_completion_criteria__time_model__valid():
8773 )
8874
8975
90- @skip_if_jsonschema_unavailable
9176def test_completion_criteria__time_model__invalid ():
9277 with pytest .raises (jsonschema .ValidationError ):
9378 _validate_completion_criteria (
@@ -106,7 +91,6 @@ def test_completion_criteria__time_model__invalid():
10691 )
10792
10893
109- @skip_if_jsonschema_unavailable
11094def test_completion_criteria__approx_time_model__valid ():
11195 with _assert_not_raises (jsonschema .ValidationError ):
11296 _validate_completion_criteria (
@@ -120,7 +104,6 @@ def test_completion_criteria__approx_time_model__valid():
120104 )
121105
122106
123- @skip_if_jsonschema_unavailable
124107def test_completion_criteria__approx_time_model__invalid ():
125108 with pytest .raises (jsonschema .ValidationError ):
126109 _validate_completion_criteria (
@@ -139,7 +122,6 @@ def test_completion_criteria__approx_time_model__invalid():
139122 )
140123
141124
142- @skip_if_jsonschema_unavailable
143125def test_completion_criteria__pages_model__valid ():
144126 with _assert_not_raises (jsonschema .ValidationError ):
145127 _validate_completion_criteria (
@@ -153,7 +135,6 @@ def test_completion_criteria__pages_model__valid():
153135 )
154136
155137
156- @skip_if_jsonschema_unavailable
157138def test_completion_criteria__pages_model__percentage__valid ():
158139 with _assert_not_raises (jsonschema .ValidationError ):
159140 _validate_completion_criteria (
@@ -170,7 +151,6 @@ def test_completion_criteria__pages_model__percentage__valid():
170151 )
171152
172153
173- @skip_if_jsonschema_unavailable
174154def test_completion_criteria__pages_model__invalid ():
175155 with pytest .raises (jsonschema .ValidationError ):
176156 _validate_completion_criteria (
@@ -189,7 +169,6 @@ def test_completion_criteria__pages_model__invalid():
189169 )
190170
191171
192- @skip_if_jsonschema_unavailable
193172def test_completion_criteria__pages_model__percentage__invalid ():
194173 with pytest .raises (jsonschema .ValidationError ):
195174 _validate_completion_criteria (
@@ -208,7 +187,6 @@ def test_completion_criteria__pages_model__percentage__invalid():
208187 )
209188
210189
211- @skip_if_jsonschema_unavailable
212190def test_completion_criteria__mastery_model__valid ():
213191 with _assert_not_raises (jsonschema .ValidationError ):
214192 _validate_completion_criteria (
@@ -244,7 +222,6 @@ def test_completion_criteria__mastery_model__valid():
244222 )
245223
246224
247- @skip_if_jsonschema_unavailable
248225def test_completion_criteria__mastery_model__invalid ():
249226 with pytest .raises (jsonschema .ValidationError ):
250227 _validate_completion_criteria (
@@ -310,7 +287,6 @@ def test_completion_criteria__mastery_model__invalid():
310287 )
311288
312289
313- @skip_if_jsonschema_unavailable
314290def test_completion_criteria__reference__valid ():
315291 with _assert_not_raises (jsonschema .ValidationError ):
316292 _validate_completion_criteria ({"model" : "reference" , "learner_managed" : False })
@@ -321,7 +297,6 @@ def test_completion_criteria__reference__valid():
321297 )
322298
323299
324- @skip_if_jsonschema_unavailable
325300def test_completion_criteria__reference__invalid ():
326301 with pytest .raises (jsonschema .ValidationError ):
327302 _validate_completion_criteria (
@@ -341,7 +316,6 @@ def test_completion_criteria__reference__invalid():
341316 )
342317
343318
344- @skip_if_jsonschema_unavailable
345319def test_embed__topics__without_ancestors__valid ():
346320 with _assert_not_raises (jsonschema .ValidationError ):
347321 _validate_embed_topics_request (
@@ -363,7 +337,6 @@ def test_embed__topics__without_ancestors__valid():
363337 )
364338
365339
366- @skip_if_jsonschema_unavailable
367340def test_embed__topics__with_ancestors__valid ():
368341 with _assert_not_raises (jsonschema .ValidationError ):
369342 _validate_embed_topics_request (
@@ -393,7 +366,6 @@ def test_embed__topics__with_ancestors__valid():
393366 )
394367
395368
396- @skip_if_jsonschema_unavailable
397369def test_embed__topics__invalid_id ():
398370 with pytest .raises (jsonschema .ValidationError ):
399371 _validate_embed_topics_request (
@@ -415,7 +387,6 @@ def test_embed__topics__invalid_id():
415387 )
416388
417389
418- @skip_if_jsonschema_unavailable
419390def test_embed__topics__missing_language ():
420391 with pytest .raises (jsonschema .ValidationError ):
421392 _validate_embed_topics_request (
@@ -436,7 +407,6 @@ def test_embed__topics__missing_language():
436407 )
437408
438409
439- @skip_if_jsonschema_unavailable
440410def test_embed__topics__invalid_channel_id ():
441411 with pytest .raises (jsonschema .ValidationError ):
442412 _validate_embed_topics_request (
@@ -458,7 +428,6 @@ def test_embed__topics__invalid_channel_id():
458428 )
459429
460430
461- @skip_if_jsonschema_unavailable
462431def test_embed__topics__missing_channel_id ():
463432 with pytest .raises (jsonschema .ValidationError ):
464433 _validate_embed_topics_request (
@@ -479,7 +448,6 @@ def test_embed__topics__missing_channel_id():
479448 )
480449
481450
482- @skip_if_jsonschema_unavailable
483451def test_embed__content__valid ():
484452 with _assert_not_raises (jsonschema .ValidationError ):
485453 _validate_embed_content_request (
@@ -503,7 +471,6 @@ def test_embed__content__valid():
503471 )
504472
505473
506- @skip_if_jsonschema_unavailable
507474def test_embed__content__valid_with_files ():
508475 with _assert_not_raises (jsonschema .ValidationError ):
509476 _validate_embed_content_request (
@@ -544,7 +511,6 @@ def test_embed__content__valid_with_files():
544511 )
545512
546513
547- @skip_if_jsonschema_unavailable
548514def test_embed__content__invalid_id ():
549515 with pytest .raises (jsonschema .ValidationError ):
550516 _validate_embed_content_request (
@@ -568,7 +534,6 @@ def test_embed__content__invalid_id():
568534 )
569535
570536
571- @skip_if_jsonschema_unavailable
572537def test_embed__content__invalid_channel_id ():
573538 with pytest .raises (jsonschema .ValidationError ):
574539 _validate_embed_content_request (
@@ -592,7 +557,6 @@ def test_embed__content__invalid_channel_id():
592557 )
593558
594559
595- @skip_if_jsonschema_unavailable
596560def test_embed__content__invalid_content_id ():
597561 with pytest .raises (jsonschema .ValidationError ):
598562 _validate_embed_content_request (
@@ -616,7 +580,6 @@ def test_embed__content__invalid_content_id():
616580 )
617581
618582
619- @skip_if_jsonschema_unavailable
620583def test_embed__content__invalid_url_files ():
621584 with pytest .raises (jsonschema .ValidationError ):
622585 _validate_embed_content_request (
@@ -646,7 +609,6 @@ def test_embed__content__invalid_url_files():
646609 )
647610
648611
649- @skip_if_jsonschema_unavailable
650612def test_embed__content__invalid_preset_files ():
651613 with pytest .raises (jsonschema .ValidationError ):
652614 _validate_embed_content_request (
@@ -684,7 +646,6 @@ def _validate_learning_objectives(data):
684646 jsonschema .validate (instance = data , schema = learning_objectives .SCHEMA )
685647
686648
687- @skip_if_jsonschema_unavailable
688649def test_learning_objectives__valid ():
689650 with _assert_not_raises (jsonschema .ValidationError ):
690651 _validate_learning_objectives (
@@ -715,7 +676,6 @@ def test_learning_objectives__valid():
715676 )
716677
717678
718- @skip_if_jsonschema_unavailable
719679def test_learning_objectives__valid_uuid_v5 ():
720680 with _assert_not_raises (jsonschema .ValidationError ):
721681 _validate_learning_objectives (
@@ -752,7 +712,6 @@ def test_learning_objectives__valid_uuid_v5():
752712 )
753713
754714
755- @skip_if_jsonschema_unavailable
756715def test_learning_objectives__invalid_lo_structure ():
757716 with pytest .raises (jsonschema .ValidationError ):
758717 _validate_learning_objectives (
@@ -768,7 +727,6 @@ def test_learning_objectives__invalid_lo_structure():
768727 )
769728
770729
771- @skip_if_jsonschema_unavailable
772730def test_learning_objectives__invalid_assessment_mapping ():
773731 with pytest .raises (jsonschema .ValidationError ):
774732 _validate_learning_objectives (
@@ -784,7 +742,6 @@ def test_learning_objectives__invalid_assessment_mapping():
784742 )
785743
786744
787- @skip_if_jsonschema_unavailable
788745def test_learning_objectives__invalid_lesson_mapping ():
789746 with pytest .raises (jsonschema .ValidationError ):
790747 _validate_learning_objectives (
@@ -800,7 +757,6 @@ def test_learning_objectives__invalid_lesson_mapping():
800757 )
801758
802759
803- @skip_if_jsonschema_unavailable
804760def test_learning_objectives__missing_required_fields ():
805761 # Missing learning_objectives
806762 with pytest .raises (jsonschema .ValidationError ):
@@ -832,7 +788,6 @@ def test_learning_objectives__missing_required_fields():
832788 )
833789
834790
835- @skip_if_jsonschema_unavailable
836791def test_learning_objectives__empty_structures ():
837792 # Empty learning_objectives
838793 with pytest .raises (jsonschema .ValidationError ):
@@ -869,7 +824,6 @@ def test_learning_objectives__empty_structures():
869824 )
870825
871826
872- @skip_if_jsonschema_unavailable
873827def test_learning_objectives__invalid_uuid_format_in_learning_objectives ():
874828 # Invalid UUID format for learning objective ID
875829 with pytest .raises (jsonschema .ValidationError ):
@@ -884,7 +838,6 @@ def test_learning_objectives__invalid_uuid_format_in_learning_objectives():
884838 )
885839
886840
887- @skip_if_jsonschema_unavailable
888841def test_learning_objectives__invalid_uuid_format_in_references ():
889842 # Invalid UUID format in assessment and lesson objective references
890843 with pytest .raises (jsonschema .ValidationError ):
@@ -899,7 +852,6 @@ def test_learning_objectives__invalid_uuid_format_in_references():
899852 )
900853
901854
902- @skip_if_jsonschema_unavailable
903855def test_learning_objectives__invalid_question_id_pattern ():
904856 # Invalid question ID pattern (not a valid UUID v4)
905857 with pytest .raises (jsonschema .ValidationError ):
@@ -916,7 +868,6 @@ def test_learning_objectives__invalid_question_id_pattern():
916868 )
917869
918870
919- @skip_if_jsonschema_unavailable
920871def test_learning_objectives__invalid_lesson_id_pattern ():
921872 # Invalid lesson ID pattern (has extra characters)
922873 with pytest .raises (jsonschema .ValidationError ):
@@ -931,7 +882,6 @@ def test_learning_objectives__invalid_lesson_id_pattern():
931882 )
932883
933884
934- @skip_if_jsonschema_unavailable
935885def test_learning_objectives__invalid_text_patterns ():
936886 # Empty text after trimming whitespace
937887 with pytest .raises (jsonschema .ValidationError ):
0 commit comments