diff --git a/pyswagger/primitives/render.py b/pyswagger/primitives/render.py index 8c0a646..158a59d 100644 --- a/pyswagger/primitives/render.py +++ b/pyswagger/primitives/render.py @@ -186,6 +186,7 @@ def _generate(self, obj, opt): template = opt['object_template'] out = None if type_ == 'object': + max_p = opt['max_property'] out = {} max_ = obj.maxProperties if obj.maxProperties else opt['max_prop_count'] min_ = obj.minProperties if obj.minProperties else None @@ -194,7 +195,7 @@ def _generate(self, obj, opt): if name in template: out[name] = template[name] continue - if not name in obj.required: + if not max_p and not name in obj.required: if random.randint(0, 1) == 0 or opt['minimal_property']: continue out[name] = self._generate(prop, opt) @@ -250,6 +251,8 @@ def default(): - files: registered file object: refer to pyswagger.primitives.File for details - object_template: dict of default values assigned for properties when 'name' matched - parameter_template: dict of default values assigned for parameters when 'name matched + - max_property: all properties are generated, ignore 'required' + - max_parameter: all parameters are generated, ignore 'required' :return: options :rtype: dict @@ -266,6 +269,8 @@ def default(): files=[], object_template={}, parameter_template={}, + max_property=False, + max_parameter=False, ) def render(self, obj, opt=None): @@ -304,6 +309,7 @@ def render_all(self, op, exclude=[], opt=None): raise ValueError('Not a dict: {0}'.format(opt)) template = opt['parameter_template'] + max_p = opt['max_parameter'] out = {} for p in op.parameters: if p.name in exclude: @@ -311,7 +317,7 @@ def render_all(self, op, exclude=[], opt=None): if p.name in template: out.update({p.name: template[p.name]}) continue - if not p.required: + if not max_p and not p.required: if random.randint(0, 1) == 0 or opt['minimal_parameter']: continue out.update({p.name: self.render(p, opt=opt)}) diff --git a/pyswagger/tests/data/v2_0/render/object/swagger.json b/pyswagger/tests/data/v2_0/render/object/swagger.json index 85d941e..409ea3b 100644 --- a/pyswagger/tests/data/v2_0/render/object/swagger.json +++ b/pyswagger/tests/data/v2_0/render/object/swagger.json @@ -6,6 +6,24 @@ }, "definitions":{ + "user2":{ + "type":"object", + "properties":{ + "id":{ + "type":"integer", + "format":"int32", + "maximum":100, + "minimum":1 + }, + "name":{ + "type":"string" + }, + "email":{ + "type":"string", + "format":"email" + } + } + }, "user":{ "type":"object", "properties":{ diff --git a/pyswagger/tests/data/v2_0/render/operation/swagger.json b/pyswagger/tests/data/v2_0/render/operation/swagger.json index 994efb4..c8e7016 100644 --- a/pyswagger/tests/data/v2_0/render/operation/swagger.json +++ b/pyswagger/tests/data/v2_0/render/operation/swagger.json @@ -121,6 +121,36 @@ "description":"successful operation" } } + }, + "get":{ + "parameters":[ + { + "name":"p1", + "in":"query", + "required":false, + "type":"string", + "format":"email" + }, + { + "name":"p2", + "in":"query", + "required":false, + "type":"string", + "format":"email" + }, + { + "name":"p3", + "in":"query", + "required":false, + "type":"string", + "format":"email" + } + ], + "responses":{ + "default":{ + "description":"successful operation" + } + } } } }, @@ -147,4 +177,4 @@ ] } } -} \ No newline at end of file +} diff --git a/pyswagger/tests/test_render.py b/pyswagger/tests/test_render.py index 3b07661..dc9346a 100644 --- a/pyswagger/tests/test_render.py +++ b/pyswagger/tests/test_render.py @@ -331,6 +331,21 @@ def test_template(self): self.assertTrue(validate_email(o['comment'])) self.assertTrue(isinstance(o['time'], datetime.datetime), 'should be a datetime, not {0}'.format(str(type(o['time'])))) + def test_max_property(self): + """ make sure max_property works """ + opt = self.rnd.default() + opt['max_property'] = True + obj = self.app.resolve('#/definitions/user2') + for _ in six.moves.xrange(50): + o = self.rnd.render( + obj, + opt=opt + ) + self.assertTrue('id' in o, 'should have id') + self.assertTrue('name' in o, 'should have name') + self.assertTrue('email' in o, 'should have email') + + class ParameterTestCase(unittest.TestCase): """ test case for rendering a single Parameter, type/format specific tests are covered by other @@ -552,6 +567,17 @@ def test_minimal(self): self.assertTrue('p3' in ps, 'p3 should exist') self.assertTrue(count > 0, 'count should be larger than zero, not {0}'.format(count)) + def test_max_parameter(self): + """ make sure max_parameter works """ + op = self.app.s('api.2').get + opt = self.rnd.default() + opt['max_parameter'] = True + for _ in six.moves.xrange(50): + ps = self.rnd.render_all(op, opt=opt) + self.assertTrue('p1' in ps, 'p1 should exists') + self.assertTrue('p2' in ps, 'p2 should exists') + self.assertTrue('p2' in ps, 'p3 should exists') + def test_exclude(self): """ make sure exclude works """ op = self.app.s('api.1').get