Skip to content

Commit cbdf8d3

Browse files
authored
Merge pull request #2 from mild-blue/improve-reporting
Support scalar type definitions
2 parents 52fe1fd + 861efbe commit cbdf8d3

File tree

6 files changed

+87
-15
lines changed

6 files changed

+87
-15
lines changed

swagger_unittest/swagger_parser/swagger_parser.py

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -489,12 +489,12 @@ def validate_additional_properties(self, valid_response, response):
489489
except Exception:
490490
return False
491491

492-
def validate_definition(self, definition_name: str, dict_to_test: Dict, definition: Dict = None):
492+
def validate_definition(self, definition_name: str, expected_value: Dict, definition: Dict = None):
493493
"""Validate the given dict according to the given definition.
494494
495495
Args:
496496
definition_name: name of the the definition.
497-
dict_to_test: dict to test.
497+
expected_value: dict or scalar value to test.
498498
definition: definition
499499
500500
Returns:
@@ -507,19 +507,23 @@ def validate_definition(self, definition_name: str, dict_to_test: Dict, definiti
507507

508508
# Check all required in dict_to_test
509509
spec_def = definition or self.specification['definitions'][definition_name]
510-
all_required_keys_present = all(req in dict_to_test.keys() for req in spec_def.get('required', {}))
511-
if 'required' in spec_def and not all_required_keys_present:
512-
return False
510+
if isinstance(expected_value, dict):
511+
all_required_keys_present = all(req in expected_value.keys() for req in spec_def.get('required', {}))
512+
if 'required' in spec_def and not all_required_keys_present:
513+
return False
513514

514-
# Check no extra arg & type
515-
properties_dict = spec_def.get('properties', {})
516-
for key, value in dict_to_test.items():
517-
if value is not None:
518-
if key not in properties_dict: # Extra arg
519-
return False
520-
else: # Check type
521-
if not self._validate_type(properties_dict[key], value):
515+
# Check no extra arg & type
516+
properties_dict = spec_def.get('properties', {})
517+
for key, value in expected_value.items():
518+
if value is not None:
519+
if key not in properties_dict: # Extra arg
522520
return False
521+
else: # Check type
522+
if not self._validate_type(properties_dict[key], value):
523+
return False
524+
else:
525+
# Definition corresponds to scalar value (string for instance)
526+
return self.check_type(expected_value, spec_def['type'])
523527

524528
return True
525529

swagger_unittest/swagger_tester/swagger_tester.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,12 @@ def validate_definition(swagger_parser, valid_response, response):
8484
# Check if there is a definition that match body and response
8585
valid_definition = swagger_parser.get_dict_definition(valid_response, get_list=True)
8686
actual_definition = swagger_parser.get_dict_definition(response, get_list=True)
87-
assert len(set(valid_definition).intersection(actual_definition)) >= 1, \
88-
f'Responses {valid_response} and {response} not compatible'
87+
assert len(set(valid_definition).intersection(actual_definition)) >= 1, (
88+
f'Responses are not compatible. Definition of valid response is {valid_definition} which is different '
89+
f'than definition of actual response which is {actual_definition}. \n'
90+
f'Valid response: {valid_response} \n'
91+
f'Actual response: {response}'
92+
)
8993

9094

9195
def parse_parameters(url, action, path, request_args, swagger_parser):

tests/swagger_parser/conftest.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ def inline_parser():
2525
return SwaggerParser('data/inline.yaml')
2626

2727

28+
@pytest.fixture
29+
def swagger_enum_parser():
30+
return SwaggerParser('data/enum.yaml')
31+
32+
2833
@pytest.fixture(scope='module',
2934
params=['data/no_properties.yaml',
3035
'data/object_no_schema.yaml',
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
swagger: '2.0'
2+
info:
3+
version: '2016-01-19T11:24:50Z'
4+
title: authentication tests
5+
schemes:
6+
- http
7+
paths:
8+
/test:
9+
get:
10+
description: Get something
11+
responses:
12+
'200':
13+
description: OK
14+
schema:
15+
$ref: '#/definitions/my_enum'
16+
definitions:
17+
my_enum:
18+
type: string
19+
enum:
20+
- OPTION_A
21+
- OPTION_B

tests/swagger_parser/test_swagger_parser.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,17 @@ def test_validate_definition(swagger_parser, pet_definition_example):
218218
pet_definition_example['name'] = 2
219219
assert not swagger_parser.validate_definition('Pet', pet_definition_example)
220220

221+
# Check string instead of dict_to_test
222+
assert not swagger_parser.validate_definition('Pet', 'foo')
223+
224+
225+
def test_validate_enum_definition(swagger_enum_parser):
226+
# Check string instead of dict_to_test
227+
assert swagger_enum_parser.validate_definition('my_enum', 'OPTION_A')
228+
229+
# TODO: also check for correct enum value (currently enum is treated as string)
230+
assert swagger_enum_parser.validate_definition('my_enum', 'FOO_BAR')
231+
221232

222233
def test_get_paths_data(swagger_parser, post_put_path_data, get_path_data):
223234
swagger_parser.get_paths_data()
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# -*- coding:utf-8 -*-
2+
import pytest
3+
4+
from swagger_unittest.swagger_tester import swagger_tester
5+
6+
7+
def test_validate_definition(swagger_parser, pet_definition_example):
8+
valid_response = swagger_parser.definitions_example['Pet']
9+
10+
# Valid Pet is valid definition
11+
swagger_tester.validate_definition(swagger_parser, valid_response, valid_response)
12+
13+
# Changing list with emtpy list is valid definition of Pet
14+
response = valid_response.copy()
15+
assert len(response['tags']) > 0
16+
response['tags'] = []
17+
swagger_tester.validate_definition(swagger_parser, valid_response, response)
18+
19+
# Changing list with string is not valid definition of Pet
20+
with pytest.raises(AssertionError):
21+
response = valid_response.copy()
22+
response['tags'] = 'foo'
23+
swagger_tester.validate_definition(swagger_parser, valid_response, response)
24+
25+
# Empty dict is not valid Pet
26+
with pytest.raises(AssertionError, match=r".*Responses are not compatible\. Definition of valid response is.*"):
27+
swagger_tester.validate_definition(swagger_parser, valid_response, {})

0 commit comments

Comments
 (0)