# tests.py

import unittest

import flask
from flask import abort, url_for, g
from flask_testing import TestCase

from app import create_app


class TestBase(TestCase):

    def create_app(self):
        app = create_app('testing')
        return app

    def setUp(self):
        """
        Will be called before every test
        """
        app = create_app('testing')
        return app

    def tearDown(self):
        """
        Will be called after every test
        """


class TestModels(TestBase):
    # TODO: make tests
    pass


class TestViews(TestBase):
    # TODO: make tests

    def test_index_view(self):
        """
        Test that homepage is accessible.
        """

        response = self.client.get(url_for('index'))
        self.assertEqual(response.status_code, 200)

        # with self.app.test_client() as c:
        #     rv = c.get('/')
        #     assert flask.session['REMOTE_USER'] == 'bobby'

    def test_page_resources(self):
        """
        Test that all resources load are found.
        """
        with self.app.test_request_context('/?redir=test'):
            assert flask.request.path == '/'
            c = flask.app.request.args['redir']
            assert c == 'test'

    # def test_logout_view(self):
    #     """
    #     Test that logout link is inaccessible without login
    #     and redirects to login page then to logout
    #     """
    #     target_url = url_for('auth.logout')
    #     redirect_url = url_for('auth.login', next=target_url)
    #     response = self.client.get(target_url)
    #     self.assertEqual(response.status_code, 302)
    #     self.assertRedirects(response, redirect_url)\


class TestErrorPages(TestBase):

    def test_403_forbidden(self):
        # create route to abort the request with the 403 Error
        @self.app.route('/403')
        def forbidden_error():
            abort(403)

        response = self.client.get('/403')
        self.assertEqual(response.status_code, 403)
        self.assertTrue("403 Error" in response.data)

    def test_404_not_found(self):
        response = self.client.get('/nothinghere')
        self.assertEqual(response.status_code, 404)
        self.assertTrue("404 Error" in response.data)

    def test_500_internal_server_error(self):
        # create route to abort the request with the 500 Error
        @self.app.route('/500')
        def internal_server_error():
            abort(500)

        response = self.client.get('/500')
        self.assertEqual(response.status_code, 500)
        self.assertTrue("500 Error" in response.data)


if __name__ == '__main__':
    unittest.main()