| import json |
| import os.path |
| |
| import uritemplate |
| |
| |
| def fixture_file_path(filename): |
| absolute_dir = os.path.abspath(os.path.dirname(__file__)) |
| filename = filename + '.json' |
| return os.path.join(absolute_dir, 'fixtures', filename) |
| |
| |
| def load_examples(filename): |
| path = fixture_file_path(filename) |
| with open(path, 'r') as examples_file: |
| examples = json.load(examples_file) |
| return examples |
| |
| |
| def expected_set(expected): |
| if isinstance(expected, list): |
| return set(expected) |
| return set([expected]) |
| |
| |
| class FixtureMixin(object): |
| def _get_test(self, section): |
| test = self.examples.get(section, {}) |
| return test.get('variables', {}), test.get('testcases', []) |
| |
| def _test(self, testname): |
| variables, testcases = self._get_test(testname) |
| for template, expected in testcases: |
| expected = expected_set(expected) |
| expanded = uritemplate.expand(template, variables) |
| assert expanded in expected |
| |
| |
| class TestSpecExamples(FixtureMixin): |
| examples = load_examples('spec-examples') |
| |
| def test_level_1(self): |
| """Check that uritemplate.expand matches Level 1 expectations.""" |
| self._test('Level 1 Examples') |
| |
| def test_level_2(self): |
| """Check that uritemplate.expand matches Level 2 expectations.""" |
| self._test('Level 2 Examples') |
| |
| def test_level_3(self): |
| """Check that uritemplate.expand matches Level 3 expectations.""" |
| self._test('Level 3 Examples') |
| |
| def test_level_4(self): |
| """Check that uritemplate.expand matches Level 4 expectations.""" |
| self._test('Level 4 Examples') |
| |
| |
| class TestSpecExamplesByRFCSection(FixtureMixin): |
| examples = load_examples('spec-examples-by-section') |
| |
| def test_variable_expansion(self): |
| """Check variable expansion.""" |
| self._test('3.2.1 Variable Expansion') |
| |
| def test_simple_string_expansion(self): |
| """Check simple string expansion.""" |
| self._test('3.2.2 Simple String Expansion') |
| |
| def test_reserved_expansion(self): |
| """Check reserved expansion.""" |
| self._test('3.2.3 Reserved Expansion') |
| |
| def test_fragment_expansion(self): |
| """Check fragment expansion.""" |
| self._test('3.2.4 Fragment Expansion') |
| |
| def test_dot_prefixed_label_expansion(self): |
| """Check label expansion with dot-prefix.""" |
| self._test('3.2.5 Label Expansion with Dot-Prefix') |
| |
| def test_path_segment_expansion(self): |
| """Check path segment expansion.""" |
| self._test('3.2.6 Path Segment Expansion') |
| |
| def test_path_style_parameter_expansion(self): |
| """Check path-style param expansion.""" |
| self._test('3.2.7 Path-Style Parameter Expansion') |
| |
| def test_form_style_query_expansion(self): |
| """Check form-style query expansion.""" |
| self._test('3.2.8 Form-Style Query Expansion') |
| |
| def test_form_style_query_cntinuation(self): |
| """Check form-style query continuation.""" |
| self._test('3.2.9 Form-Style Query Continuation') |
| |
| |
| class TestExtendedTests(FixtureMixin): |
| examples = load_examples('extended-tests') |
| |
| def test_additional_examples_1(self): |
| """Check Additional Examples 1.""" |
| self._test('Additional Examples 1') |
| |
| def test_additional_examples_2(self): |
| """Check Additional Examples 2.""" |
| self._test('Additional Examples 2') |
| |
| def test_additional_examples_3(self): |
| """Check Additional Examples 3.""" |
| self._test('Additional Examples 3: Empty Variables') |
| |
| def test_additional_examples_4(self): |
| """Check Additional Examples 4.""" |
| self._test('Additional Examples 4: Numeric Keys') |