class TestErrorViews(TestCase):

    def setUp(self):
        self.request = HTTPRequest('', {})

    def test_exceptionviewbase(self):
        view = http.ExceptionViewBase(Exception(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(str(view), '')
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 500)

    def test_exceptionview(self):
        view = http.ExceptionView(Exception(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(str(view), '')
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 500)

    def test_systemerrormixin_view(self):
        class SystemErrorView(http.ExceptionViewBase,
                              http.SystemErrorViewMixin):
            pass
        view = SystemErrorView(Exception(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertTrue(ISystemErrorView.providedBy(view))
        self.assertTrue(view.isSystemError())
        self.assertEqual(str(view), '')
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 500)

    def test_traversalexceptionview(self):
        view = http.TraversalExceptionView(TraversalException(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 404)

        self.request = HTTPRequest('', {'REQUEST_METHOD': 'MKCOL'})
        view = http.TraversalExceptionView(TraversalException(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 404)

        self.request.setTraversalStack(['foo', 'bar'])
        view = http.TraversalExceptionView(TraversalException(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 409)

    def test_unauthorizedexceptionview(self):
        view = http.UnauthorizedView(Unauthorized(), self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 401)
        self.assertTrue(
            self.request.response.getHeader(
                'WWW-Authenticate', '', True).startswith('basic'))

    def test_methodnotallowedview(self):
        error = MethodNotAllowed(object(), self.request)
        view = http.MethodNotAllowedView(error, self.request)
        self.assertTrue(IHTTPException.providedBy(view))
        self.assertEqual(view(), '')
        self.assertEqual(self.request.response.getStatus(), 405)
        self.assertEqual(self.request.response.getHeader('Allow'), '')

        class MyMethodNotAllowedView(http.MethodNotAllowedView):
            def allowed(self):
                return 'GET', 'POST', 'PUT', 'DELETE'

        MyMethodNotAllowedView(error, self.request)()
        self.assertEqual(self.request.response.getStatus(), 405)
        self.assertEqual(
            self.request.response.getHeader('Allow'), 'GET, POST, PUT, DELETE')