# -*- coding: utf-8; -*-

from unittest import TestCase
from unittest.mock import MagicMock

from pyramid import testing

from wuttjamaican.conf import WuttaConfig
from wuttaweb import subscribers
from wuttaweb.menus import MenuHandler


class DataTestCase(TestCase):
    """
    Base class for test suites requiring a full (typical) database.
    """

    def setUp(self):
        self.setup_db()

    def setup_db(self):
        self.config = WuttaConfig(defaults={
            'wutta.db.default.url': 'sqlite://',
        })
        self.app = self.config.get_app()

        # init db
        model = self.app.model
        model.Base.metadata.create_all(bind=self.config.appdb_engine)
        self.session = self.app.make_session()

    def tearDown(self):
        self.teardown_db()

    def teardown_db(self):
        pass


class WebTestCase(DataTestCase):
    """
    Base class for test suites requiring a full (typical) web app.
    """

    def setUp(self):
        self.setup_web()

    def setup_web(self):
        self.setup_db()
        self.request = self.make_request()
        self.pyramid_config = testing.setUp(request=self.request, settings={
            'wutta_config': self.config,
            'mako.directories': ['wuttaweb:templates'],
            'pyramid_deform.template_search_path': 'wuttaweb:templates/deform',
        })

        # init web
        self.pyramid_config.include('pyramid_deform')
        self.pyramid_config.include('pyramid_mako')
        self.pyramid_config.add_directive('add_wutta_permission_group',
                                          'wuttaweb.auth.add_permission_group')
        self.pyramid_config.add_directive('add_wutta_permission',
                                          'wuttaweb.auth.add_permission')
        self.pyramid_config.add_subscriber('wuttaweb.subscribers.before_render',
                                           'pyramid.events.BeforeRender')
        self.pyramid_config.include('wuttaweb.static')

        # setup new request w/ anonymous user
        event = MagicMock(request=self.request)
        subscribers.new_request(event)
        def user_getter(request, **kwargs): pass
        subscribers.new_request_set_user(event, db_session=self.session,
                                         user_getter=user_getter)

    def tearDown(self):
        self.teardown_web()

    def teardown_web(self):
        testing.tearDown()
        self.teardown_db()

    def make_request(self):
        return testing.DummyRequest()


class NullMenuHandler(MenuHandler):
    """
    Dummy menu handler for testing.
    """
    def make_menus(self, request, **kwargs):
        return []
