def setUp(self): F = make_json( a=StringField(validators=[validators.DataRequired()]), b=StringField(), ) self.F1 = make_json('F1', a=ObjectField(F)) self.F2 = make_json('F2', a=ObjectField(F)) make_inner = lambda: AttrDict(a='ddd') self.F3 = make_json('F3', a=ObjectField(F, default=make_inner))
class ListFieldTest(TestCase): t = StringField(validators=[validators.DataRequired()]) def test_json(self): F = make_json(a=ListField(self.t)) data = ['foo', 'hi', 'rawr'] a = F(a=data).a self.assertEqual(a.entries[1].data, 'hi') self.assertEqual(a.entries[1].name, 'a') self.assertEqual(a.data, data) self.assertEqual(len(a.entries), 3) pdata = {'a': ['bleh', 'yarg', '', 'mmm']} json = F(pdata) self.assertEqual(len(json.a.entries), 4) self.assertEqual(json.a.data, ['bleh', 'yarg', '', 'mmm']) self.assertFalse(json.validate()) json = F(pdata, data) self.assertEqual(json.a.data, ['bleh', 'yarg', '', 'mmm']) self.assertFalse(json.validate()) pdata = {'a': ['a', 'b']} json = F(pdata, a=data) self.assertEqual(len(json.a.entries), 2) self.assertEqual(json['a'].data, ['a', 'b']) self.assertEqual(list(iter(json.a)), list(json.a.entries)) pdata = {'a': 'xx'} json = F(pdata) self.assertFalse(json.validate()) def test_enclosed_subjson(self): make_inner = lambda: AttrDict(a=None) F = make_json(a=ListField( ObjectField(make_json('FChild', a=self.t), default=make_inner))) data = [{'a': 'hello'}] json = F(a=data) self.assertEqual(json.a.data, data) self.assertTrue(json.validate()) json.a.append_entry() self.assertEqual(json.a.data, data + [{'a': None}]) self.assertFalse(json.validate()) pdata = {'a': [{'a': 'foo'}, {'a': 'bar'}]} json = F(pdata, a=data) self.assertEqual(json.a.data, [{'a': 'foo'}, {'a': 'bar'}]) self.assertTrue(json.validate()) # Test failure on populate obj2 = AttrDict(a=42) self.assertRaises(NotImplementedError, json.populate_obj, obj2) def test_entry_management(self): J = make_json(a=ListField(self.t)) a = J(a=['hello', 'bye']).a self.assertEqual(a.pop_entry().name, 'a') self.assertEqual(a.data, ['hello']) a.append_entry('orange') self.assertEqual(a.data, ['hello', 'orange']) self.assertEqual(a[-1].name, 'a') self.assertEqual(a.pop_entry().data, 'orange') self.assertEqual(a.pop_entry().name, 'a') self.assertRaises(IndexError, a.pop_entry) def test_min_max_entries(self): J = make_json(a=ListField(self.t, min_entries=1, max_entries=3)) a = J().a self.assertEqual(len(a), 1) self.assertEqual(a[0].data, None) big_input = ['foo', 'flaf', 'bar', 'baz'] self.assertRaises(AssertionError, J, a=big_input) def test_validators(self): def validator(json, field): if field.data and field.data[0] == 'fail': raise ValueError('fail') elif len(field.data) > 2: raise ValueError('too many') J = make_json(a=ListField(self.t, validators=[validator])) jdata = {'a': ['hello', 'bye', 'test3']} json = J(jdata) assert not json.validate() self.assertEqual(json.a.errors, ['too many']) jdata['a'] = ['fail'] json = J(jdata) assert not json.validate() self.assertEqual(json.a.errors, ['fail']) json = J({'a': ['']}) assert not json.validate() self.assertEqual(json.a.errors, [['This field is required.']]) def test_no_filters(self): my_filter = lambda x: x self.assertRaises(TypeError, ListField, self.t, filters=[my_filter], _json=Json(), _name='foo') def test_process_prefilled(self): data = ['foo', 'hi', 'rawr'] class A(object): def __init__(self, a): self.a = a obj = A(data) J = make_json(a=ListField(self.t)) # fill json json = J(obj=obj) self.assertEqual(len(json.a.entries), 3) # pretend to submit form unchanged pdata = {'a': ['foo', 'hi', 'rawr']} json.process(jsondata=pdata) # check if data still the same self.assertEqual(len(json.a.entries), 3) self.assertEqual(json.a.data, data)
class A(Json): a = ObjectField(self.F1, validators=[validators.DataRequired()])
def setUp(self): t = StringField(validators=[validators.DataRequired()]).bind( Json(), 'a') self.flags = t.flags
class F2(jsons.Json): a = StringField(validators=[validators.DataRequired(), validators.Length(max=3)])
class F(jsons.Json): class Meta: locales = ['en_US', 'en'] a = StringField(validators=[validators.DataRequired()])