Skip to content

Commit aef6ccc

Browse files
Merge pull request #56 from BenjamenMeyer/enhancement_stack-decorator
Enhancement: Decorator with a generator or iterable
2 parents 7a13a35 + 8fca6ef commit aef6ccc

7 files changed

Lines changed: 309 additions & 7 deletions

File tree

setup.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ cover-package=stackinabox
66
cover-erase=1
77
cover-inclusive=true
88
cover-branches=true
9-
cover-min-percentage=91
9+
cover-min-percentage=92

stackinabox/tests/test_httpretty_decorator.py

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
"""
22
Stack-In-A-Box: Basic Test
33
"""
4+
import collections
5+
import types
46
import unittest
57

68
import requests
@@ -72,3 +74,93 @@ def test_basic(self):
7274

7375
res = requests.put('http://localhost/advanced2/i')
7476
self.assertEqual(res.status_code, 597)
77+
78+
79+
def httpretty_generator():
80+
yield HelloService()
81+
82+
83+
class TestHttprettyBasicWithDecoratorAndGenerator(unittest.TestCase):
84+
85+
def test_verify_generator(self):
86+
self.assertIsInstance(httpretty_generator(), types.GeneratorType)
87+
88+
@stack_decorator.stack_activate(
89+
'localhost',
90+
httpretty_generator()
91+
)
92+
def test_basic(self):
93+
res = requests.get('http://localhost/hello/')
94+
self.assertEqual(res.status_code, 200)
95+
self.assertEqual(res.text, 'Hello')
96+
97+
@stack_decorator.stack_activate(
98+
'localhost',
99+
httpretty_generator(),
100+
200, value='Hello'
101+
)
102+
def test_basic_with_parameters(self, response_code, value='alpha'):
103+
res = requests.get('http://localhost/hello/')
104+
self.assertEqual(res.status_code, response_code)
105+
self.assertEqual(res.text, value)
106+
107+
@stack_decorator.stack_activate(
108+
'localhost',
109+
httpretty_generator(),
110+
200, value='Hello',
111+
access_services="stack"
112+
)
113+
def test_basic_with_stack_acccess(self, response_code, value='alpha',
114+
stack=None):
115+
res = requests.get('http://localhost/hello/')
116+
self.assertEqual(res.status_code, response_code)
117+
self.assertEqual(res.text, value)
118+
self.assertEqual(len(stack), 1)
119+
self.assertTrue(HelloService().name in stack)
120+
self.assertIsInstance(stack[list(stack.keys())[0]], HelloService)
121+
122+
123+
def httpretty_list():
124+
return [
125+
HelloService()
126+
]
127+
128+
129+
class TestHttprettyBasicWithDecoratorAndList(unittest.TestCase):
130+
131+
def test_verify_list(self):
132+
self.assertIsInstance(httpretty_list(), collections.Iterable)
133+
134+
@stack_decorator.stack_activate(
135+
'localhost',
136+
httpretty_list()
137+
)
138+
def test_basic(self):
139+
res = requests.get('http://localhost/hello/')
140+
self.assertEqual(res.status_code, 200)
141+
self.assertEqual(res.text, 'Hello')
142+
143+
@stack_decorator.stack_activate(
144+
'localhost',
145+
httpretty_list(),
146+
200, value='Hello'
147+
)
148+
def test_basic_with_parameters(self, response_code, value='alpha'):
149+
res = requests.get('http://localhost/hello/')
150+
self.assertEqual(res.status_code, response_code)
151+
self.assertEqual(res.text, value)
152+
153+
@stack_decorator.stack_activate(
154+
'localhost',
155+
httpretty_list(),
156+
200, value='Hello',
157+
access_services="stack"
158+
)
159+
def test_basic_with_stack_acccess(self, response_code, value='alpha',
160+
stack=None):
161+
res = requests.get('http://localhost/hello/')
162+
self.assertEqual(res.status_code, response_code)
163+
self.assertEqual(res.text, value)
164+
self.assertEqual(len(stack), 1)
165+
self.assertTrue(HelloService().name in stack)
166+
self.assertIsInstance(stack[list(stack.keys())[0]], HelloService)

stackinabox/tests/test_requests_mock_decorator.py

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
"""
22
Stack-In-A-Box: Basic Test
33
"""
4+
import collections
45
import json
56
import logging
7+
import types
68
import unittest
79

810
import requests
@@ -92,3 +94,75 @@ def test_basic(self, session):
9294
self.assertEqual(res.status_code, 597)
9395

9496
session.close()
97+
98+
99+
def requests_mock_generator():
100+
yield HelloService()
101+
102+
103+
class TestRequestsMockBasicWithDecoratorAndGenerator(unittest.TestCase):
104+
105+
def test_verify_generator(self):
106+
self.assertIsInstance(requests_mock_generator(), types.GeneratorType)
107+
108+
@stack_decorator.stack_activate('localhost', requests_mock_generator())
109+
def test_basic_requests_mock(self):
110+
res = requests.get('http://localhost/hello/')
111+
self.assertEqual(res.status_code, 200)
112+
self.assertEqual(res.text, 'Hello')
113+
114+
@stack_decorator.stack_activate('localhost', requests_mock_generator(),
115+
200, value='Hello')
116+
def test_basic_with_parameters(self, response_code, value='alpha'):
117+
res = requests.get('http://localhost/hello/')
118+
self.assertEqual(res.status_code, response_code)
119+
self.assertEqual(res.text, value)
120+
121+
@stack_decorator.stack_activate('localhost', requests_mock_generator(),
122+
200, value='Hello',
123+
access_services="stack")
124+
def test_basic_with_stack_acccess(self, response_code, value='alpha',
125+
stack=None):
126+
res = requests.get('http://localhost/hello/')
127+
self.assertEqual(res.status_code, response_code)
128+
self.assertEqual(res.text, value)
129+
self.assertEqual(len(stack), 1)
130+
self.assertTrue(HelloService().name in stack)
131+
self.assertIsInstance(stack[list(stack.keys())[0]], HelloService)
132+
133+
134+
def requests_mock_list():
135+
return [
136+
HelloService()
137+
]
138+
139+
140+
class TestRequestsMockBasicWithDecoratorAndGenerator(unittest.TestCase):
141+
142+
def test_verify_list(self):
143+
self.assertIsInstance(requests_mock_list(), collections.Iterable)
144+
145+
@stack_decorator.stack_activate('localhost', requests_mock_list())
146+
def test_basic_requests_mock(self):
147+
res = requests.get('http://localhost/hello/')
148+
self.assertEqual(res.status_code, 200)
149+
self.assertEqual(res.text, 'Hello')
150+
151+
@stack_decorator.stack_activate('localhost', requests_mock_list(),
152+
200, value='Hello')
153+
def test_basic_with_parameters(self, response_code, value='alpha'):
154+
res = requests.get('http://localhost/hello/')
155+
self.assertEqual(res.status_code, response_code)
156+
self.assertEqual(res.text, value)
157+
158+
@stack_decorator.stack_activate('localhost', requests_mock_list(),
159+
200, value='Hello',
160+
access_services="stack")
161+
def test_basic_with_stack_acccess(self, response_code, value='alpha',
162+
stack=None):
163+
res = requests.get('http://localhost/hello/')
164+
self.assertEqual(res.status_code, response_code)
165+
self.assertEqual(res.text, value)
166+
self.assertEqual(len(stack), 1)
167+
self.assertTrue(HelloService().name in stack)
168+
self.assertIsInstance(stack[list(stack.keys())[0]], HelloService)

stackinabox/tests/test_responses_decorator.py

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
"""
22
Stack-In-A-Box: Basic Test
33
"""
4+
import collections
45
import json
56
import logging
7+
import types
68
import unittest
79

810
import requests
@@ -15,13 +17,45 @@
1517
logger = logging.getLogger(__name__)
1618

1719

20+
def responses_generator():
21+
yield HelloService()
22+
23+
24+
def responses_list():
25+
return [
26+
HelloService()
27+
]
28+
29+
30+
def test_verify_generator():
31+
assert isinstance(responses_generator(), types.GeneratorType)
32+
33+
34+
def test_verify_list():
35+
assert isinstance(responses_list(), collections.Iterable)
36+
37+
1838
@stack_decorator.stack_activate('localhost', HelloService())
1939
def test_basic_responses():
2040
res = requests.get('http://localhost/hello/')
2141
assert res.status_code == 200
2242
assert res.text == 'Hello'
2343

2444

45+
@stack_decorator.stack_activate('localhost', responses_generator())
46+
def test_basic_responses_and_generator():
47+
res = requests.get('http://localhost/hello/')
48+
assert res.status_code == 200
49+
assert res.text == 'Hello'
50+
51+
52+
@stack_decorator.stack_activate('localhost', responses_list())
53+
def test_basic_responses_and_list():
54+
res = requests.get('http://localhost/hello/')
55+
assert res.status_code == 200
56+
assert res.text == 'Hello'
57+
58+
2559
@stack_decorator.stack_activate('localhost', HelloService(),
2660
200, value='Hello')
2761
def test_basic_with_parameters(response_code, value='alpha'):
@@ -30,6 +64,22 @@ def test_basic_with_parameters(response_code, value='alpha'):
3064
assert res.text == value
3165

3266

67+
@stack_decorator.stack_activate('localhost', responses_generator(),
68+
200, value='Hello')
69+
def test_basic_with_parameters_and_generator(response_code, value='alpha'):
70+
res = requests.get('http://localhost/hello/')
71+
assert res.status_code == response_code
72+
assert res.text == value
73+
74+
75+
@stack_decorator.stack_activate('localhost', responses_list(),
76+
200, value='Hello')
77+
def test_basic_with_parameters_and_list(response_code, value='alpha'):
78+
res = requests.get('http://localhost/hello/')
79+
assert res.status_code == response_code
80+
assert res.text == value
81+
82+
3383
@stack_decorator.stack_activate('localhost', HelloService(),
3484
200, value='Hello',
3585
access_services="stack")
@@ -43,6 +93,32 @@ def test_basic_with_stack_acccess(response_code, value='alpha',
4393
assert isinstance(stack[list(stack.keys())[0]], HelloService)
4494

4595

96+
@stack_decorator.stack_activate('localhost', responses_generator(),
97+
200, value='Hello',
98+
access_services="stack")
99+
def test_basic_with_stack_acccess_and_generator(response_code, value='alpha',
100+
stack=None):
101+
res = requests.get('http://localhost/hello/')
102+
assert res.status_code == response_code
103+
assert res.text == value
104+
assert len(stack) == 1
105+
assert HelloService().name in stack
106+
assert isinstance(stack[list(stack.keys())[0]], HelloService)
107+
108+
109+
@stack_decorator.stack_activate('localhost', responses_list(),
110+
200, value='Hello',
111+
access_services="stack")
112+
def test_basic_with_stack_acccess_and_list(response_code, value='alpha',
113+
stack=None):
114+
res = requests.get('http://localhost/hello/')
115+
assert res.status_code == response_code
116+
assert res.text == value
117+
assert len(stack) == 1
118+
assert HelloService().name in stack
119+
assert isinstance(stack[list(stack.keys())[0]], HelloService)
120+
121+
46122
@stack_decorator.stack_activate('localhost', AdvancedService())
47123
def test_advanced_responses():
48124
res = requests.get('http://localhost/advanced/')

stackinabox/util/httpretty/decorator.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
"""
22
Stack-In-A-Box: HTTPretty Support via decorator
33
"""
4+
import collections
45
import functools
56
import logging
67
import re
8+
import types
79

810
import httpretty
911
import six
@@ -51,9 +53,27 @@ def __init__(self, uri, *args, **kwargs):
5153
else:
5254
self.enable_service_access = None
5355

56+
def process_service(arg_based_service, raise_on_type=True):
57+
if isinstance(arg_based_service, StackInABoxService):
58+
logger.debug("Registering {0}".format(arg_based_service.name))
59+
self.services[arg_based_service.name] = arg_based_service
60+
return True
61+
elif raise_on_type:
62+
raise TypeError(
63+
"Generator or Iterable must provide a "
64+
"StackInABoxService in all of its results."
65+
)
66+
return False
67+
5468
for arg in args:
55-
if isinstance(arg, StackInABoxService):
56-
self.services[arg.name] = arg
69+
if process_service(arg, raise_on_type=False):
70+
pass
71+
elif (
72+
isinstance(arg, types.GeneratorType) or
73+
isinstance(arg, collections.Iterable)
74+
):
75+
for sub_arg in arg:
76+
process_service(sub_arg, raise_on_type=True)
5777
else:
5878
self.args.append(arg)
5979

stackinabox/util/requests_mock/decorator.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
"""
22
Stack-In-A-Box: Requests-Mock Support via Decorator
33
"""
4+
import collections
45
import functools
56
import logging
67
import re
8+
import types
79

810
import requests
911

@@ -62,9 +64,27 @@ def __init__(self, uri, *args, **kwargs):
6264
else:
6365
self.session = None
6466

67+
def process_service(arg_based_service, raise_on_type=True):
68+
if isinstance(arg_based_service, StackInABoxService):
69+
logger.debug("Registering {0}".format(arg_based_service.name))
70+
self.services[arg_based_service.name] = arg_based_service
71+
return True
72+
elif raise_on_type:
73+
raise TypeError(
74+
"Generator or Iterable must provide a "
75+
"StackInABoxService in all of its results."
76+
)
77+
return False
78+
6579
for arg in args:
66-
if isinstance(arg, StackInABoxService):
67-
self.services[arg.name] = arg
80+
if process_service(arg, raise_on_type=False):
81+
pass
82+
elif (
83+
isinstance(arg, types.GeneratorType) or
84+
isinstance(arg, collections.Iterable)
85+
):
86+
for sub_arg in arg:
87+
process_service(sub_arg, raise_on_type=True)
6888
else:
6989
self.args.append(arg)
7090

0 commit comments

Comments
 (0)