def test_find_existing_incoming(self): mock_model = Mock() class MockResource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] @classmethod def get_by_source_dict(cls, ctx, sub_source_dict): return cls(mock_model) field = SubModelResourceField(attribute='foo', resource_class=MockResource) source_dict = { 'foo': {'bar': 20}, } # The django ORM makes me sad that this is not a None or AttributeError class MockFailsOnFooAccess(Mock): def __getattr__(self, name): if name == 'foo': raise ObjectDoesNotExist else: return super(Mock, self).__getattr__(name) target_object = MockFailsOnFooAccess() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual(20, target_object.foo.bar) self.assertEqual(mock_model, target_object.foo) target_object.foo.save.assert_called()
def test_find_existing_by_uri_incoming(self): class MockResource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=MockResource) source_dict = { 'foo': { 'resourceUri': 'http://testsever/api/v1/bar/20', 'bar': 20 }, } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' ctx = mock_context() ctx.resolve_resource_uri = Mock() foo_20 = ctx.resolve_resource_uri.return_value = MockResource(Mock()) field.handle_incoming(ctx, source_dict, target_object) ctx.resolve_resource_uri.assert_called_with( source_dict['foo']['resourceUri']) target_object.foo.save.assert_called() self.assertEqual(foo_20.model, target_object.foo) self.assertEqual(20, target_object.foo.bar)
def test_find_existing_by_uri_incoming(self): class MockResource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=MockResource) source_dict = { 'foo': { 'resourceUri': 'http://testsever/api/v1/bar/20', 'bar': 20 }, } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' ctx = mock_context() ctx.resolve_resource_uri = Mock() foo_20 = ctx.resolve_resource_uri.return_value = MockResource(Mock()) field.handle_incoming(ctx, source_dict, target_object) ctx.resolve_resource_uri.assert_called_with(source_dict['foo']['resourceUri']) target_object.foo.save.assert_called() self.assertEqual(foo_20.model, target_object.foo) self.assertEqual(20, target_object.foo.bar)
def test_incoming_read_only(self): class Resource(ModelResource): model_class = Mock(spec=[]) fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField( attribute='foo', resource_class=Resource, read_only=True, ) source_dict = { 'foo': { 'bar': 20 }, } target_object = Mock() target_object.foo = Mock(['save']) field.handle_incoming(mock_context(), source_dict, target_object) self.assertFalse(hasattr(target_object.foo, 'bar')) self.assertFalse(target_object.foo.save.called)
def test_incoming_read_only(self): class Resource(ModelResource): model_class = Mock(spec=[]) fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField( attribute='foo', resource_class=Resource, read_only=True, ) source_dict = { 'foo': {'bar': 20}, } target_object = Mock() target_object.foo = Mock(['save']) field.handle_incoming(mock_context(), source_dict, target_object) self.assertFalse(hasattr(target_object.foo, 'bar')) self.assertFalse(target_object.foo.save.called)
def test_incoming_with_reverse_foreign_key(self): class User(mock_orm.Model): name = Mock() class UserOwner(mock_orm.Model): user = Mock( django.db.models.fields.related. ReverseSingleRelatedObjectDescriptor(Mock())) type = Mock() class UserOwnerResource(resources.ModelResource): model_class = UserOwner fields = [ fields.AttributeField(attribute='type', type=str), ] class MockResource(ModelResource): model_class = User owner_field = fields.SubModelResourceField( attribute='owner', resource_class=UserOwnerResource) fields = [AttributeField(attribute='name', type=str), owner_field] field = SubModelResourceField(attribute='user', resource_class=MockResource) source_dict = { 'user': { 'name': 'username', 'owner': { 'type': 'ownertype' } }, } # The django ORM makes me sad that this is not a None or AttributeError class MockFailsOnFooAccess(Mock): def model(self): return Mock() def __getattr__(self, name): if name == 'user': raise ObjectDoesNotExist else: return super(Mock, self).__getattr__(name) target_object = MockFailsOnFooAccess() target_object._meta.get_field().related.field.name = 'name' User.objects.filter().get()._meta.get_field( ).related.field.name = 'name' field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual('username', target_object.user.name) self.assertEqual('ownertype', target_object.user.owner.type) target_object.user.save.assert_called()
def test_incoming_with_reverse_foreign_key(self): class User(mock_orm.Model): name = Mock() class UserOwner(mock_orm.Model): user = Mock(django.db.models.fields.related.ReverseSingleRelatedObjectDescriptor(Mock())) type = Mock() class UserOwnerResource(resources.ModelResource): model_class = UserOwner fields = [ fields.AttributeField(attribute='type', type=str), ] class MockResource(ModelResource): model_class = User owner_field = fields.SubModelResourceField(attribute='owner', resource_class=UserOwnerResource) fields = [ AttributeField(attribute='name', type=str), owner_field ] field = SubModelResourceField(attribute='user', resource_class=MockResource) source_dict = { 'user': {'name': 'username', 'owner': {'type': 'ownertype'}}, } # The django ORM makes me sad that this is not a None or AttributeError class MockFailsOnFooAccess(Mock): def model(self): return Mock() def __getattr__(self, name): if name == 'user': raise ObjectDoesNotExist else: return super(Mock, self).__getattr__(name) target_object = MockFailsOnFooAccess() target_object._meta.get_field().related.field.name = 'name' User.objects.filter().get()._meta.get_field().related.field.name = 'name' field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual('username', target_object.user.name) self.assertEqual('ownertype', target_object.user.owner.type) target_object.user.save.assert_called()
def test_prepare(self): class MockResource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar.baz', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=MockResource) related = Related() field.prepare(mock_context(), related) self.assertEqual(related._select, {'foo', 'foo__bar'})
def test_incoming_with_none_subresource(self): class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = {'foo': {}} target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertIsNotNone(target_object.foo)
def test_incoming_with_none_source(self): class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = {} target_object = Mock() field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual(target_object.foo, None)
def test_prepare(self): class MockResource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar.baz', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=MockResource) related = Related() field.prepare(mock_context(), related) self.assertEqual(related._select, { 'foo', 'foo__bar' })
def test_outgoing_with_simple_none(self): class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_object = Mock() source_object.foo.bar = None target_dict = dict() field.handle_outgoing(mock_context(), source_object, target_dict) self.assertEqual(target_dict['foo'], {'bar': None})
def test_incoming_with_none_subresource(self): class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = { 'foo': {} } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertIsNotNone(target_object.foo)
def test_incoming_update_not_dirty(self, get_object): target = Mock() target.is_dirty.return_value = False get_object.return_value = target class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = { 'foo': {'bar': 20}, } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertFalse(target.save.called)
def test_incoming_update_existing(self): class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = { 'foo': {'bar': 20}, } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual(target_object.foo.bar, 20) target_object.foo.save.assert_called_with()
def test_incoming_update_existing(self): class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = { 'foo': { 'bar': 20 }, } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual(target_object.foo.bar, 20) target_object.foo.save.assert_called_with()
def test_incoming_update_not_dirty(self, get_object): target = Mock() target.is_dirty.return_value = False get_object.return_value = target class Resource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] field = SubModelResourceField(attribute='foo', resource_class=Resource) source_dict = { 'foo': { 'bar': 20 }, } target_object = Mock() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertFalse(target.save.called)
def test_find_existing_incoming(self): mock_model = Mock() class MockResource(ModelResource): model_class = Mock() fields = [ AttributeField(attribute='bar', type=int), ] @classmethod def get_by_source_dict(cls, ctx, sub_source_dict): return cls(mock_model) field = SubModelResourceField(attribute='foo', resource_class=MockResource) source_dict = { 'foo': { 'bar': 20 }, } # The django ORM makes me sad that this is not a None or AttributeError class MockFailsOnFooAccess(Mock): def __getattr__(self, name): if name == 'foo': raise ObjectDoesNotExist else: return super(Mock, self).__getattr__(name) target_object = MockFailsOnFooAccess() target_object._meta.get_field().related.field.name = 'bar' field.handle_incoming(mock_context(), source_dict, target_object) self.assertEqual(20, target_object.foo.bar) self.assertEqual(mock_model, target_object.foo) target_object.foo.save.assert_called()
class Resource(ModelResource): model_class = Mock() fields = [ SubModelResourceField(attribute='bar', resource_class=OtherResource), ]