def test_defaults(self): data = { 'extra_data': { 'test_foo': -1, 'bar': -2 }, 'test_data': { 'baz': -3 }, 'baf': -4 } model = Model(data, 'test', {'bar','baf','fizz'}, { 'foo': 1, 'bar': 2, 'baz': 3, 'baf': 4, 'fizz': 5, 'buzz': 6 }) self.assertEqual(model.foo, -1) self.assertEqual(model.bar, -2) self.assertEqual(model.baz, -3) self.assertEqual(model.baf, -4) self.assertEqual(model.fizz, 5) self.assertEqual(model.buzz, 6) model.foo, model.bar, model.baz, model.baf = range(11, 15) self.assertEqual(model.foo, 11) self.assertEqual(model.bar, 12) self.assertEqual(model.baz, 13) self.assertEqual(model.baf, 14) self.assertEqual(model.fizz, 5) self.assertEqual(model.buzz, 6)
def test_to_dict(self): data = { 'id': 'some_uuid', 'extra_data': { 'test_foo': 5, 'fizz': 'buzz', 'spam': 'eggs' }, 'test_data': { 'bar': 'baz' } } model = Model(data, 'test', {'fizz'}) serialized = { 'id': 'some_uuid', 'foo': 5, 'bar': 'baz', 'fizz': 'buzz', 'extra_data': { 'spam': 'eggs' } } self.assertEqual(model.to_dict(), serialized) serialized.pop('extra_data') self.assertEqual(dict(model), serialized)
def test_defaults(self): data = { 'extra_data': { 'test_foo': -1, 'bar': -2 }, 'test_data': { 'baz': -3 }, 'baf': -4 } model = Model(data, 'test', {'bar', 'baf', 'fizz'}, { 'foo': 1, 'bar': 2, 'baz': 3, 'baf': 4, 'fizz': 5, 'buzz': 6 }) self.assertEqual(model.foo, -1) self.assertEqual(model.bar, -2) self.assertEqual(model.baz, -3) self.assertEqual(model.baf, -4) self.assertEqual(model.fizz, 5) self.assertEqual(model.buzz, 6) model.foo, model.bar, model.baz, model.baf = range(11, 15) self.assertEqual(model.foo, 11) self.assertEqual(model.bar, 12) self.assertEqual(model.baz, 13) self.assertEqual(model.baf, 14) self.assertEqual(model.fizz, 5) self.assertEqual(model.buzz, 6)
def test_both_data(self): data = { 'id': 'some_uuid', 'extra_data': { 'test_foo': 5 }, 'test_data': { 'bar': { 'baz': 'baf' } } } self.assert_model(data) model = Model(data, 'test') model.fizz = 'buzz' model['buzz'] = 'fizz' self.assertEqual('fizz', model._data['test_data']['buzz']) self.assertEqual('buzz', model._data['test_data']['fizz']) model.foo = 6 model.bar = {'baf': 'baz'} self.assertEqual({}, model._data['extra_data']) self.assertEqual(6, model.foo) self.assertEqual({'baf': 'baz'}, model['bar']) self.assertEqual(6, model._data['test_data']['foo']) self.assertEqual({'baf': 'baz'}, model._data['test_data']['bar'])
def test_unpromoted_not_present(self): data = {'id': 'some_uuid'} model = Model(data, 'test', unpromoted={'foo'}) self.assertIs(None, model.foo) model.foo = 'bar' self.assertEqual('bar', model.foo) self.assertNotIn('foo', model._data) self.assertEqual('bar', model._data['extra_data']['foo'])
def test_id_unsettable(self): model = Model({'id': 'some_uuid'}, 'test') model.id = 'some_uuid' model['id'] = 'some_uuid' self.assertEqual(model.id, 'some_uuid') with self.assertRaises(Exception): model.id = 'another_uuid' with self.assertRaises(Exception): model['id'] = 'another_uuid'
def test_project_data(self): d = {'id': 'some_uuid', 'test_data': {'foo': 5, 'bar': {'baz': 'baf'}}} for data in [d, dict(d, extra_data={})]: self.assert_model(data) model = Model(data, 'test') model.fizz = 'buzz' model['buzz'] = 'fizz' self.assertEqual('fizz', model._data['test_data']['buzz']) self.assertEqual('buzz', model._data['test_data']['fizz'])
def test_query(self): model = Model({'_model': 'Test', 'id': 'some_uuid'}, 'test') self.assertEqual(model.query, { '_model': 'Test', 'field': 'id', 'value': 'some_uuid' }) for data in [{}, {'_model': 'Test'}, {'id': 'some_uuid'}]: with self.assertRaises(Exception): Model(data, 'test').query
def test_unpromoted_postpromotion(self): data = { 'id': 'some_uuid', 'foo': 5, 'extra_data': { 'test_bar': {'baz': 'baf'} } } self.assert_model(data, {'foo'}) model = Model(data, 'test', unpromoted={'foo'}) model.foo = 6 self.assertEqual(6, model.foo) self.assertEqual(6, model._data['foo']) self.assertNotIn('foo', model._data['extra_data'])
def test_project_data(self): d = { 'id': 'some_uuid', 'test_data': { 'foo': 5, 'bar': {'baz': 'baf'} } } for data in [d, dict(d, extra_data={})]: self.assert_model(data) model = Model(data, 'test') model.fizz = 'buzz' model['buzz'] = 'fizz' self.assertEqual('fizz', model._data['test_data']['buzz']) self.assertEqual('buzz', model._data['test_data']['fizz'])
def test_unpromoted_postpromotion(self): data = { 'id': 'some_uuid', 'foo': 5, 'extra_data': { 'test_bar': { 'baz': 'baf' } } } self.assert_model(data, {'foo'}) model = Model(data, 'test', unpromoted={'foo'}) model.foo = 6 self.assertEqual(6, model.foo) self.assertEqual(6, model._data['foo']) self.assertNotIn('foo', model._data['extra_data'])
def assert_model(self, data, unpromoted=None): model = Model(data, 'test', unpromoted) self.assertEqual('some_uuid', model.id) self.assertEqual('some_uuid', model['id']) self.assertEqual(5, model.foo) self.assertEqual(5, model['foo']) self.assertEqual({'baz': 'baf'}, model.bar) self.assertEqual({'baz': 'baf'}, model['bar'])
def test_to_dict(self): data = { 'id': 'some_uuid', 'extra_data': { 'test_foo': 5, 'fizz': 'buzz', 'spam': 'eggs' }, 'test_data': {'bar': 'baz'} } model = Model(data, 'test', {'fizz'}) serialized = { 'id': 'some_uuid', 'foo': 5, 'bar': 'baz', 'fizz': 'buzz', 'extra_data': {'spam': 'eggs'} } self.assertEqual(model.to_dict(), serialized) serialized.pop('extra_data') self.assertEqual(dict(model), serialized)
def test_both_data(self): data = { 'id': 'some_uuid', 'extra_data': { 'test_foo': 5 }, 'test_data': { 'bar': {'baz': 'baf'} } } self.assert_model(data) model = Model(data, 'test') model.fizz = 'buzz' model['buzz'] = 'fizz' self.assertEqual('fizz', model._data['test_data']['buzz']) self.assertEqual('buzz', model._data['test_data']['fizz']) model.foo = 6 model.bar = {'baf': 'baz'} self.assertEqual({}, model._data['extra_data']) self.assertEqual(6, model.foo) self.assertEqual({'baf': 'baz'}, model['bar']) self.assertEqual(6, model._data['test_data']['foo']) self.assertEqual({'baf': 'baz'}, model._data['test_data']['bar'])
def test_user_defined_types(self): assert not is_listy(Model({}, 'test')) class AlwaysEmptySequence(Sequence): def __len__(self): return 0 def __getitem__(self, i): return [][i] assert is_listy(AlwaysEmptySequence()) class AlwaysEmptySet(Set): def __len__(self): return 0 def __iter__(self): return iter([]) def __contains__(self, x): return False assert is_listy(AlwaysEmptySet())
def test_dirty(self): data = { 'id': 'some_uuid', 'spam': 'eggs', 'extra_data': { 'test_foo': 5 }, 'test_data': { 'bar': {'baz': 'baf'} } } self.assertEqual(Model(data, 'test').dirty, {}) model = Model(data, 'test') model.spam = 'nee' self.assertEqual(model.dirty, {'spam': 'nee'}) model = Model(data, 'test') model.foo = 6 self.assertEqual(model.dirty, {'extra_data': {}, 'test_data': {'foo': 6, 'bar': {'baz': 'baf'}}}) model = Model(data, 'test') model.bar = {'fizz': 'buzz'} self.assertEqual(model.dirty, {'test_data': {'bar': {'fizz': 'buzz'}}}) model = Model(data, 'test') model.bar['baz'] = 'zab' self.assertEqual(model.dirty, {'test_data': {'bar': {'baz': 'zab'}}}) model = Model(data, 'test') model.foo = 6 model.bar = 'baz' model.spam = 'nee' model.fizz = 'buzz' self.assertEqual(model.dirty, { 'spam': 'nee', 'test_data': { 'foo': 6, 'bar': 'baz', 'fizz': 'buzz' }, 'extra_data': {} }) model = Model({}, 'test') model.foo = 'bar' self.assertEqual(model.dirty, {'extra_data': {'test_foo': 'bar'}})
def test_dirty(self): data = { 'id': 'some_uuid', 'spam': 'eggs', 'extra_data': { 'test_foo': 5 }, 'test_data': { 'bar': { 'baz': 'baf' } } } self.assertEqual(Model(data, 'test').dirty, {}) model = Model(data, 'test') model.spam = 'nee' self.assertEqual(model.dirty, {'spam': 'nee'}) model = Model(data, 'test') model.foo = 6 self.assertEqual(model.dirty, { 'extra_data': {}, 'test_data': { 'foo': 6, 'bar': { 'baz': 'baf' } } }) model = Model(data, 'test') model.bar = {'fizz': 'buzz'} self.assertEqual(model.dirty, {'test_data': {'bar': {'fizz': 'buzz'}}}) model = Model(data, 'test') model.bar['baz'] = 'zab' self.assertEqual(model.dirty, {'test_data': {'bar': {'baz': 'zab'}}}) model = Model(data, 'test') model.foo = 6 model.bar = 'baz' model.spam = 'nee' model.fizz = 'buzz' self.assertEqual( model.dirty, { 'spam': 'nee', 'test_data': { 'foo': 6, 'bar': 'baz', 'fizz': 'buzz' }, 'extra_data': {} }) model = Model({}, 'test') model.foo = 'bar' self.assertEqual(model.dirty, {'extra_data': {'test_foo': 'bar'}})
def test_missing_key(self): model = Model({}, 'test') self.assertIs(None, model.does_not_exist)