# Tests for FacultyContainer.
import logging
import unittest
from StringIO import StringIO
from zope.interface.verify import verifyObject, verifyClass
from waeup.sirp.testing import FunctionalTestCase, FunctionalLayer
from waeup.sirp.university.interfaces import IFacultyContainer
from waeup.sirp.university import FacultyContainer
from waeup.sirp.university.facultycontainer import AcademicsPlugin

class FakeLogger(object):

    _stream = None

    def get_logger(self):
        logger = logging.getLogger('test')
        logger.propagate = False
        self._stream = StringIO()
        self.handler = logging.StreamHandler(self._stream)
        logger.setLevel(logging.DEBUG)
        logger.addHandler(self.handler)
        return logger

    def close(self, logger):
        # Remove handler from logger
        handler = self.handler
        if handler not in logger.handlers:
            return
        del logger.handlers[logger.handlers.index(handler)]
        return

    def get_messages(self):
        self._stream.seek(0)
        result = self._stream.read()
        self._stream.seek(0, 2) # Seek to end of stream
        return result

class FacultyContainerTests(unittest.TestCase):

    def test_ifaces(self):
        container = FacultyContainer()
        self.assertTrue(verifyClass(IFacultyContainer, FacultyContainer))
        self.assertTrue(verifyObject(IFacultyContainer, container))

class AcademicsPluginTests(unittest.TestCase):

    def setUp(self):
        self._logger_factory = FakeLogger()
        self.logger = self._logger_factory.get_logger()

    def tearDown(self):
        self._logger_factory.close(self.logger)

    def test_setup(self):
        site = dict()
        logger = self.logger
        plugin = AcademicsPlugin()
        plugin.setup(site, 'testsite', logger)
        self.assertTrue('faculties' in site.keys())
        self.assertTrue(isinstance(site['faculties'], FacultyContainer))
        self.assertEqual(
            self._logger_factory.get_messages(),
            'Created faculty container for University\n'
            )

    def test_setup_already_set_up(self):
        site = dict(faculties=object())
        logger = self.logger
        plugin = AcademicsPlugin()
        plugin.setup(site, 'testsite', logger)
        self.assertTrue('faculties' in site.keys())
        self.assertEqual(
            self._logger_factory.get_messages(),
            'Could not create faculty container in WAeUP SIRP.\n'
            )

    def test_update(self):
        site = dict()
        logger = self.logger
        plugin = AcademicsPlugin()
        plugin.update(site, 'testsite', logger)
        self.assertTrue('faculties' in site.keys())
        self.assertTrue(isinstance(site['faculties'], FacultyContainer))
        self.assertEqual(
            self._logger_factory.get_messages(),
            'Created faculty container for University\n'
            )

    def test_update_already_set_up(self):
        site = dict(faculties=object())
        logger = self.logger
        plugin = AcademicsPlugin()
        plugin.update(site, 'testsite', logger)
        self.assertTrue('faculties' in site.keys())
        self.assertEqual(
            self._logger_factory.get_messages(), '')
