-
Notifications
You must be signed in to change notification settings - Fork 98
/
build_resources_test.py
129 lines (102 loc) · 4.48 KB
/
build_resources_test.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
# -*- coding: utf-8 -*-
import pytest
from bravado_core.param import Param
from bravado_core.resource import build_resources
from bravado_core.spec import Spec
def test_empty():
spec_dict = {'paths': {}}
spec = Spec(spec_dict)
assert {} == build_resources(spec)
def test_resource_with_a_single_operation_associated_by_tag(paths_spec):
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
assert 1 == len(resources)
assert resources['pet'].findPetsByStatus
def test_resource_with_sanitized_tag(paths_spec):
paths_spec['/pet/findByStatus']['get']['tags'][0] = 'Pets & Animals'
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
assert 1 == len(resources)
assert 'Pets & Animals' in resources
assert 'Pets_Animals' in resources
assert resources['Pets_Animals'] is resources['Pets & Animals']
def test_resource_with_a_single_operation_associated_by_path_name(paths_spec):
# rename path so we know resource name will not be 'pet'
paths_spec['/foo/findByStatus'] = paths_spec['/pet/findByStatus']
del paths_spec['/pet/findByStatus']
# remove tags on operation so path name is used to assoc with a resource
del paths_spec['/foo/findByStatus']['get']['tags']
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
assert 1 == len(resources)
assert resources['foo'].findPetsByStatus
def test_resource__associated_by_sanitized_path_name(paths_spec):
# rename path so we know resource name will not be 'pet'
paths_spec['/foo-bar/findByStatus'] = paths_spec['/pet/findByStatus']
del paths_spec['/pet/findByStatus']
# remove tags on operation so path name is used to assoc with a resource
del paths_spec['/foo-bar/findByStatus']['get']['tags']
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
assert 1 == len(resources)
assert 'foo-bar' in resources
assert 'foo_bar' in resources
assert resources['foo_bar'] is resources['foo-bar']
def test_many_resources_with_the_same_operation_cuz_multiple_tags(paths_spec):
tags = ['foo', 'bar', 'baz', 'bing', 'boo']
paths_spec['/pet/findByStatus']['get']['tags'] = tags
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
assert len(tags) == len(resources)
for tag in tags:
assert resources[tag].findPetsByStatus
def test_get_undefined_operation(paths_spec):
paths_spec['/pet/findByStatus']['get']['tags'] = ['tag']
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
resource = resources['tag']
with pytest.raises(AttributeError) as excinfo:
resource.undefined_operation
assert "Resource 'tag' has no operation 'undefined_operation'" in str(excinfo.value)
def test_resource_with_shared_parameters(paths_spec):
# insert a shared parameter into the spec
shared_parameter = {
'name': 'filter',
'in': 'query',
'description': 'Filter the pets by attribute',
'required': False,
'type': 'string',
}
paths_spec['/pet/findByStatus']['parameters'] = [shared_parameter]
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
# verify shared param associated with operation
assert isinstance(
resources['pet'].findPetsByStatus.params['filter'], Param,
)
def test_resource_with_vendor_extension(paths_spec):
"""Make sure vendor extensions are ignored."""
paths_spec['/pet/findByStatus']['x-foo'] = 'bar'
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
assert 1 == len(resources)
assert resources['pet'].findPetsByStatus
@pytest.mark.parametrize(
'internally_dereference_refs', [True, False],
)
def test_refs(minimal_swagger_dict, paths_spec, pet_spec, internally_dereference_refs):
minimal_swagger_dict['paths'] = paths_spec
minimal_swagger_dict['definitions'] = {'Pet': pet_spec}
swagger_spec = Spec(
spec_dict=minimal_swagger_dict,
origin_url='',
config={'internally_dereference_refs': internally_dereference_refs},
)
resources = build_resources(swagger_spec)
assert len(resources) == 1
assert 'pet' in resources
def test_get_operations(paths_spec):
spec_dict = {'paths': paths_spec}
resources = build_resources(Spec(spec_dict))
resource = resources['pet']
assert list(dir(resource)) == [paths_spec['/pet/findByStatus']['get']['operationId']]