1import json 2import os.path 3 4import uritemplate 5 6 7def fixture_file_path(filename): 8 absolute_dir = os.path.abspath(os.path.dirname(__file__)) 9 filename = filename + '.json' 10 return os.path.join(absolute_dir, 'fixtures', filename) 11 12 13def load_examples(filename): 14 path = fixture_file_path(filename) 15 with open(path, 'r') as examples_file: 16 examples = json.load(examples_file) 17 return examples 18 19 20def expected_set(expected): 21 if isinstance(expected, list): 22 return set(expected) 23 return set([expected]) 24 25 26class FixtureMixin(object): 27 def _get_test(self, section): 28 test = self.examples.get(section, {}) 29 return test.get('variables', {}), test.get('testcases', []) 30 31 def _test(self, testname): 32 variables, testcases = self._get_test(testname) 33 for template, expected in testcases: 34 expected = expected_set(expected) 35 expanded = uritemplate.expand(template, variables) 36 assert expanded in expected 37 38 39class TestSpecExamples(FixtureMixin): 40 examples = load_examples('spec-examples') 41 42 def test_level_1(self): 43 """Check that uritemplate.expand matches Level 1 expectations.""" 44 self._test('Level 1 Examples') 45 46 def test_level_2(self): 47 """Check that uritemplate.expand matches Level 2 expectations.""" 48 self._test('Level 2 Examples') 49 50 def test_level_3(self): 51 """Check that uritemplate.expand matches Level 3 expectations.""" 52 self._test('Level 3 Examples') 53 54 def test_level_4(self): 55 """Check that uritemplate.expand matches Level 4 expectations.""" 56 self._test('Level 4 Examples') 57 58 59class TestSpecExamplesByRFCSection(FixtureMixin): 60 examples = load_examples('spec-examples-by-section') 61 62 def test_variable_expansion(self): 63 """Check variable expansion.""" 64 self._test('3.2.1 Variable Expansion') 65 66 def test_simple_string_expansion(self): 67 """Check simple string expansion.""" 68 self._test('3.2.2 Simple String Expansion') 69 70 def test_reserved_expansion(self): 71 """Check reserved expansion.""" 72 self._test('3.2.3 Reserved Expansion') 73 74 def test_fragment_expansion(self): 75 """Check fragment expansion.""" 76 self._test('3.2.4 Fragment Expansion') 77 78 def test_dot_prefixed_label_expansion(self): 79 """Check label expansion with dot-prefix.""" 80 self._test('3.2.5 Label Expansion with Dot-Prefix') 81 82 def test_path_segment_expansion(self): 83 """Check path segment expansion.""" 84 self._test('3.2.6 Path Segment Expansion') 85 86 def test_path_style_parameter_expansion(self): 87 """Check path-style param expansion.""" 88 self._test('3.2.7 Path-Style Parameter Expansion') 89 90 def test_form_style_query_expansion(self): 91 """Check form-style query expansion.""" 92 self._test('3.2.8 Form-Style Query Expansion') 93 94 def test_form_style_query_cntinuation(self): 95 """Check form-style query continuation.""" 96 self._test('3.2.9 Form-Style Query Continuation') 97 98 99class TestExtendedTests(FixtureMixin): 100 examples = load_examples('extended-tests') 101 102 def test_additional_examples_1(self): 103 """Check Additional Examples 1.""" 104 self._test('Additional Examples 1') 105 106 def test_additional_examples_2(self): 107 """Check Additional Examples 2.""" 108 self._test('Additional Examples 2') 109 110 def test_additional_examples_3(self): 111 """Check Additional Examples 3.""" 112 self._test('Additional Examples 3: Empty Variables') 113 114 def test_additional_examples_4(self): 115 """Check Additional Examples 4.""" 116 self._test('Additional Examples 4: Numeric Keys') 117