def test_api_namespace(self): ns = ApiNamespace('files') a1 = Struct('A1', None, ns) a1.set_attributes(None, [StructField('f1', Boolean(), None, None)]) a2 = Struct('A2', None, ns) a2.set_attributes(None, [StructField('f2', Boolean(), None, None)]) l = List(a1) s = String() route = ApiRoute('test/route', None) route.set_attributes(None, None, l, a2, s, None) ns.add_route(route) # Test that only user-defined types are returned. route_io = ns.get_route_io_data_types() self.assertIn(a1, route_io) self.assertIn(a2, route_io) self.assertNotIn(l, route_io) self.assertNotIn(s, route_io)
def _make_namespace_with_many_structs(): # type: (...) -> ApiNamespace ns = ApiNamespace('ns_with_many_structs') struct1 = Struct(name='Struct1', namespace=ns, token=None) struct1.set_attributes(None, [StructField('f1', Boolean(), None, None)]) ns.add_data_type(struct1) struct2 = Struct(name='Struct2', namespace=ns, token=None) struct2.set_attributes(doc=None, fields=[ StructField('f2', List(UInt64()), None, None), StructField('f3', Timestamp(ISO_8601_FORMAT), None, None), StructField('f4', Map(String(), UInt64()), None, None) ]) ns.add_data_type(struct2) return ns
def test_string(self): s = String(min_length=1, max_length=3) # check correct str s.check('1') # check correct unicode s.check(u'\u2650') # check bad item with self.assertRaises(ValueError) as cm: s.check(99) self.assertIn('not a valid string', cm.exception.args[0]) # check too many characters with self.assertRaises(ValueError) as cm: s.check('12345') self.assertIn('more than 3 character(s)', cm.exception.args[0]) # check too few characters with self.assertRaises(ValueError) as cm: s.check('') self.assertIn('fewer than 1 character(s)', cm.exception.args[0])
def test_check_example(self): # # Test string # s = String(min_length=1, max_length=5) s.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value='hello', )) with self.assertRaises(InvalidSpec) as cm: s.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value='', )) self.assertIn("'' has fewer than 1 character(s)", cm.exception.msg) # # Test list # l = List(String(min_length=1), min_items=1, max_items=3) l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=['asd'], )) with self.assertRaises(InvalidSpec) as cm: l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[], )) self.assertIn("has fewer than 1 item(s)", cm.exception.msg) # # Test list of lists # l = List(List(String(min_length=1), min_items=1)) l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[['asd']], )) with self.assertRaises(InvalidSpec) as cm: l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[[]], )) self.assertIn("has fewer than 1 item(s)", cm.exception.msg) s = Struct('S', None, None) s.set_attributes( "Docstring", [ StructField('a', UInt64(), 'a field', None), StructField('b', List(String()), 'a field', None), ], ) s._add_example( StoneExample( 'test.stone', lineno=1, lexpos=0, label='default', text='Default example', fields={ 'a': StoneExampleField( path='test.stone', lineno=2, lexpos=0, name='a', value=132, ), 'b': StoneExampleField( path='test.stone', lineno=2, lexpos=0, name='b', value=['a'], ), } ))
def test_check_example(self): # # Test string # s = String(min_length=1, max_length=5) s.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value='hello', )) with self.assertRaises(InvalidSpec) as cm: s.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value='', )) self.assertIn("'' has fewer than 1 character(s)", cm.exception.msg) # # Test list # l = List(String(min_length=1), min_items=1, max_items=3) l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=['asd'], )) with self.assertRaises(InvalidSpec) as cm: l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[], )) self.assertIn("has fewer than 1 item(s)", cm.exception.msg) # # Test list of lists # l = List(List(String(min_length=1), min_items=1)) l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[['asd']], )) with self.assertRaises(InvalidSpec) as cm: l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[[]], )) self.assertIn("has fewer than 1 item(s)", cm.exception.msg) s = Struct('S', None, None) s.set_attributes( "Docstring", [ StructField('a', UInt64(), 'a field', None), StructField('b', List(String()), 'a field', None), ], ) s._add_example( StoneExample('test.stone', lineno=1, lexpos=0, label='default', text='Default example', fields={ 'a': StoneExampleField( path='test.stone', lineno=2, lexpos=0, name='a', value=132, ), 'b': StoneExampleField( path='test.stone', lineno=2, lexpos=0, name='b', value=['a'], ), }))
def test_union(self): ns = ApiNamespace('files') update_parent_rev = Struct( 'UpdateParentRev', None, ns, ) update_parent_rev.set_attributes( "Overwrite existing file if the parent rev matches.", [ StructField('parent_rev', String(), 'The revision to be updated.', None) ], ) update_parent_rev._add_example( StoneExample(path=None, lineno=None, lexpos=None, label='default', text=None, fields={ 'parent_rev': StoneExampleField(None, None, None, 'parent_rev', 'xyz123') })) # test variants with only tags, as well as those with structs. conflict = Union( 'WriteConflictPolicy', None, ns, True, ) conflict.set_attributes( 'Policy for managing write conflicts.', [ UnionField('reject', Void(), 'On a write conflict, reject the new file.', None), UnionField( 'overwrite', Void(), 'On a write conflict, overwrite the existing file.', None), UnionField( 'update_if_matching_parent_rev', update_parent_rev, 'On a write conflict, overwrite the existing file.', None), ], ) conflict._add_example( StoneExample(path=None, lineno=None, lexpos=None, label='default', text=None, fields={ 'update_if_matching_parent_rev': StoneExampleField( None, None, None, 'update_if_matching_parent_rev', StoneExampleRef(None, None, None, 'default')) })) conflict._compute_examples() # test that only null value is returned for an example of a Void type self.assertEqual(conflict.get_examples()['reject'].value, {'.tag': 'reject'}) # test that dict is returned for a tagged struct variant self.assertEqual(conflict.get_examples()['default'].value, { '.tag': 'update_if_matching_parent_rev', 'parent_rev': 'xyz123' })
def test_struct(self): ns = ApiNamespace('test') quota_info = Struct( 'QuotaInfo', None, ns, ) quota_info.set_attributes( "Information about a user's space quota.", [ StructField('quota', UInt64(), 'Total amount of space.', None), ], ) # add an example that doesn't fit the definition of a struct with self.assertRaises(InvalidSpec) as cm: quota_info._add_example( StoneExample(path=None, lineno=None, lexpos=None, label='default', text=None, fields={ 'bad_field': StoneExampleField(None, None, None, 'bad_field', 'xyz123') })) self.assertIn('has unknown field', cm.exception.msg) quota_info._add_example( StoneExample(path=None, lineno=None, lexpos=None, label='default', text=None, fields={ 'quota': StoneExampleField(None, None, None, 'quota', 64000) })) # set null for a required field with self.assertRaises(InvalidSpec) as cm: quota_info._add_example( StoneExample(path=None, lineno=None, lexpos=None, label='null', text=None, fields={ 'quota': StoneExampleField(None, None, None, 'quota', None) })) self.assertEqual( "Bad example for field 'quota': null is not a valid integer", cm.exception.msg) self.assertTrue(quota_info._has_example('default')) quota_info.nullable = True # test for structs within structs account_info = Struct( 'AccountInfo', None, ns, ) account_info.set_attributes( "Information about an account.", [ StructField('account_id', String(), 'Unique identifier for account.', None), StructField('quota_info', quota_info, 'Quota', None) ], ) account_info._add_example( StoneExample(path=None, lineno=None, lexpos=None, label='default', text=None, fields={ 'account_id': StoneExampleField(None, None, None, 'account_id', 'xyz123'), 'quota_info': StoneExampleField( None, None, None, 'quota_info', StoneExampleRef(None, None, None, 'default')) })) account_info._compute_examples() # ensure that an example for quota_info is propagated up self.assertIn('quota_info', account_info.get_examples()['default'].value)
def test_check_example(self): # # Test string # s = String(min_length=1, max_length=5) s.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value='hello', )) with self.assertRaises(InvalidSpec) as cm: s.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value='', )) self.assertIn("'' has fewer than 1 character(s)", cm.exception.msg) # # Test list # l = List(String(min_length=1), min_items=1, max_items=3) l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=['asd'], )) with self.assertRaises(InvalidSpec) as cm: l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[], )) self.assertIn("has fewer than 1 item(s)", cm.exception.msg) # # Test list of lists # l = List(List(String(min_length=1), min_items=1)) l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[['asd']], )) with self.assertRaises(InvalidSpec) as cm: l.check_example( StoneExampleField( path='test.stone', lineno=1, lexpos=0, name='v', value=[[]], )) self.assertIn("has fewer than 1 item(s)", cm.exception.msg) # # Test Map type # m = Map(String(), String()) # valid example m.check_example( StoneExampleField(path='test.stone', lineno=1, lexpos=0, name='v', value={"foo": "bar"})) # does not conform to declared type with self.assertRaises(InvalidSpec): m.check_example( StoneExampleField(path='test.stone', lineno=1, lexpos=0, name='v', value={1: "bar"})) with self.assertRaises(ParameterError): # errors because only string types can be used as keys Map(Int32(), String()) s = Struct('S', None, None) s.set_attributes( "Docstring", [ StructField('a', UInt64(), 'a field', None), StructField('b', List(String()), 'a field', None), ], ) s._add_example( StoneExample('test.stone', lineno=1, lexpos=0, label='default', text='Default example', fields={ 'a': StoneExampleField( path='test.stone', lineno=2, lexpos=0, name='a', value=132, ), 'b': StoneExampleField( path='test.stone', lineno=2, lexpos=0, name='b', value=['a'], ), }))