def test_blob_does_not_exist(self):
        request = webapp2.Request.blank('/blobstore/blob/non-existent')
        response = webapp2.Response()
        handler = blobstore_viewer.BlobRequestHandler(request, response)

        blobstore.BlobInfo.get('non-existent').AndReturn(None)

        self.mox.ReplayAll()
        handler.get('non-existent')
        self.mox.VerifyAll()
        self.assertEqual(302, response.status_int)
        self.assertEqual('http://localhost/blobstore',
                         response.headers.get('Location'))
    def test_display_blob_inline_and_binary(self):
        request = webapp2.Request.blank('/blob/blobkey?display=inline')
        response = webapp2.Response()
        handler = blobstore_viewer.BlobRequestHandler(request, response)

        blob_info = self.mox.CreateMock(blobstore.BlobInfo)
        blob_info.content_type = 'application/octet-stream'
        blobstore.BlobInfo.get('blobkey').AndReturn(blob_info)
        reader = self.mox.CreateMockAnything()
        blob_info.open().AndReturn(reader)
        reader.read().AndReturn('blob bytes')
        reader.close()

        self.mox.ReplayAll()
        handler.get('blobkey')
        self.mox.VerifyAll()

        self.assertEqual('text/plain', response.headers.get('Content-Type'))
        self.assertEqual('inline', response.headers.get('Content-Disposition'))
        self.assertEqual('blob bytes', response.body)
    def test_display_blob_attachment(self):
        request = webapp2.Request.blank('/blob/blobkey?display=attachment')
        response = webapp2.Response()
        handler = blobstore_viewer.BlobRequestHandler(request, response)

        blob_info = self.mox.CreateMock(blobstore.BlobInfo)
        blob_info.content_type = 'image/png'
        blob_info.filename = 'profile.png'
        blobstore.BlobInfo.get('blobkey').AndReturn(blob_info)
        reader = self.mox.CreateMockAnything()
        blob_info.open().AndReturn(reader)
        reader.read().AndReturn('blob bytes')
        reader.close()

        self.mox.ReplayAll()
        handler.get('blobkey')
        self.mox.VerifyAll()

        self.assertEqual('image/png', response.headers.get('Content-Type'))
        self.assertEqual('attachment; filename=profile.png',
                         response.headers.get('Content-Disposition'))
        self.assertEqual('blob bytes', response.body)
    def test_display_blob_info_non_inlineable(self):
        request = webapp2.Request.blank('/blobstore/blob/blobkey')
        response = webapp2.Response()
        handler = blobstore_viewer.BlobRequestHandler(request, response)

        blob = self.mox.CreateMock(blobstore.BlobInfo)
        blob.content_type = 'application/octet-stream'

        blobstore.BlobInfo.get('blobkey').AndReturn(blob)
        handler.render(
            'blob_viewer.html', {
                'blob_info': blob,
                'delete_uri': '/blobstore',
                'download_uri': request.path + '?display=attachment',
                'inline_uri': request.path + '?display=inline',
                'inlineable': False,
                'return_to': '/blobstore'
            })

        self.mox.ReplayAll()
        handler.get('blobkey')
        self.mox.VerifyAll()