def testDeleteSuccess(self):
    self.mox.StubOutWithMock(util, 'GetInstance')
    self.mox.StubOutWithMock(resource, '_IsResourceReferenced')
    handler = resource.ResourceHandler()
    dummy_id = object()
    handler.request = {'resource_id': dummy_id}
    mock_resource1 = self.mox.CreateMock(model.Resource)
    mock_resource1.blob = None
    mock_resource2 = self.mox.CreateMock(model.Resource)
    mock_resource2.blob = self.mox.CreateMockAnything()
    dummy_layer = object()

    util.GetInstance(model.Resource, dummy_id, dummy_layer).AndReturn(
        mock_resource1)
    resource._IsResourceReferenced(mock_resource1).AndReturn(False)
    mock_resource1.delete()

    util.GetInstance(model.Resource, dummy_id, dummy_layer).AndReturn(
        mock_resource2)
    resource._IsResourceReferenced(mock_resource2).AndReturn(False)
    mock_resource2.delete()
    mock_resource2.blob.delete()

    self.mox.ReplayAll()
    # Blobless resource.
    handler.Delete(dummy_layer)
    # Blobful resource.
    handler.Delete(dummy_layer)
  def testIsResourceReferenced(self):
    layer = model.Layer(name='a', world='earth')
    layer.put()
    resource1 = model.Resource(layer=layer, filename='a', type='icon')
    resource1.put()
    resource2 = model.Resource(layer=layer, filename='b', type='icon')
    resource2.put()
    resource3 = model.Resource(layer=layer, filename='c', type='icon')
    resource3.put()
    resource4 = model.Resource(layer=layer, filename='d', type='model')
    resource4.put()
    layer.icon = resource1
    layer.put()
    model.Folder(layer=layer, name='a', icon=resource2).put()
    model.Model(model=resource4, location=db.GeoPt(1, 2)).put()

    self.assertTrue(resource._IsResourceReferenced(resource1))
    self.assertTrue(resource._IsResourceReferenced(resource2))
    self.assertFalse(resource._IsResourceReferenced(resource3))
    self.assertTrue(resource._IsResourceReferenced(resource4))
  def testDeleteFailure(self):
    self.mox.StubOutWithMock(util, 'GetInstance')
    self.mox.StubOutWithMock(resource, '_IsResourceReferenced')
    handler = resource.ResourceHandler()
    dummy_id = object()
    handler.request = {'resource_id': dummy_id}
    mock_resource = self.mox.CreateMock(model.Resource)
    dummy_layer = object()

    util.GetInstance(model.Resource, dummy_id, dummy_layer).AndRaise(
        util.BadRequest)

    util.GetInstance(model.Resource, dummy_id, dummy_layer).AndReturn(
        mock_resource)
    resource._IsResourceReferenced(mock_resource).AndReturn(True)

    self.mox.ReplayAll()
    # GetInstance() returns None.
    self.assertRaises(util.BadRequest, handler.Delete, dummy_layer)
    # _IsResourceReferenced() returns True.
    self.assertRaises(util.BadRequest, handler.Delete, dummy_layer)