# Copyright (c) 2005-2006 Simplistix Ltd
#
# This Software is released under the MIT License:
# http://www.opensource.org/licenses/mit-license.html
# See license.txt for more details.

import os
from AccessControl.SecurityManagement import newSecurityManager
from AccessControl.SecurityManagement import noSecurityManager
from AccessControl.User import system as SystemUser,SimpleUser
from OFS.Folder import Folder
from test_MailTemplate import DummyMailHost,Zope,get_transaction
from Testing.makerequest import makerequest
from unittest import TestCase,TestSuite,makeSuite,main

try:
    import Products.CMFCore
except ImportError:
    # no CMF, no use ;-)
    class TestFSMailTemplate(TestCase):
        pass
else:
    from Products.CMFCore.DirectoryView import addDirectoryViews
    from Products.CMFCore.tests.base.testcase import FSDVTest
    from AccessControl import ClassSecurityInfo
    from App.class_init import default__class_init__ as InitializeClass

    class DummyMember:

        security = ClassSecurityInfo()

        security.declareObjectPublic()
        security.setDefaultAccess('allow')

        security.declarePublic('getUserName')
        def getUserName(self):
            return 'Test Member'

        security.declarePublic('getProperty')
        def getProperty(self,name):
            return 'member@example.com'

    InitializeClass(DummyMember)

    class DummyMembershipTool:

        security = ClassSecurityInfo()

        security.declareObjectPublic()
        security.setDefaultAccess('allow')

        security.declarePublic('listMembers')
        def listMembers(self):
            return (DummyMember(),)

    InitializeClass(DummyMembershipTool)

    class TestFSMailTemplate(FSDVTest):

        _sourceprefix = os.path.dirname(__file__)

        def setUp(self):
            FSDVTest.setUp(self)
            self.app = makerequest(Zope.app())
            self._registerDirectory()
            ob = self.ob = self.app
            addDirectoryViews(ob, self._skinname, self.tempname)
            self.r = self.app.REQUEST
            self.r.other['URL1'] = 'http://foo/test_mt'
            self._add= self.app.manage_addProduct['MailTemplates'].addMailTemplate
            self.folder = Folder('folder')
            if getattr(self.app,'test_mt',None):
                self.app.manage_delObjects(ids=['test_mt'])
            if getattr(self.app,'MailHost',None):
                self.app.manage_delObjects(ids=['MailHost'])
            self.MailHost = self.app.MailHost = DummyMailHost()
            newSecurityManager( None, SystemUser )

        def tearDown(self):
            noSecurityManager()
            get_transaction().abort()
            self.app._p_jar.close()
            try:
                FSDVTest.tearDown(self)
            except OSError:
                # waggh, on windows, files in .svn get locked for some reason :-(
                pass


        def test_render(self):
            self.MailHost.setExpected(mfrom='from@example.com',
                                      mto=('to@example.com','to2@example.com'),
                                      filename='mail_FSSendSimple.txt')

            self.ob.fake_skin.test.send(subject=self.ob.fake_skin.test.subject % 'out',
                                        mcc=('cc@example.com',),
                                        mbcc=('bcc@example.com',),
                                        headers={
                'To':('to@example.com','to2@example.com'),
                'Subject':'cheese',
                })

            self.MailHost.checkSent()

            # check we're not setting a content type
            self.assertFalse(self.r.RESPONSE.headers.get('content-type'),
                        self.r.RESPONSE.headers)

        def test_properties(self):
            self.assertEqual(self.ob.fake_skin.test.mailhost,'MailHost')
            self.assertEqual(self.ob.fake_skin.test.subject,'Hello %s there')
            self.assertEqual(self.ob.fake_skin.test.mfrom,'from@example.com')

        def test_zodbclone(self):
            from Products.MailTemplates.MailTemplate import MailTemplate
            clone = self.ob.fake_skin.test._createZODBClone()
            self.assertTrue(isinstance(clone,MailTemplate),'Clone not a MailTemplate!')
            self.assertEqual(self.ob.fake_skin.test.read(),clone.read())
            self.assertEqual(clone.getProperty('mailhost'),None)
            self.assertEqual(clone.mailhost,'MailHost')
            self.assertEqual(clone.getProperty('subject'),'Hello %s there')
            self.assertEqual(clone.getProperty('mfrom'),'from@example.com')
            self.assertEqual(clone.content_type,'text/notplain')

        def test_view_manage_workspace(self):
            from zExceptions import Redirect
            try:
                self.assertRaises(self.ob.fake_skin.test.manage_workspace(self.r))
            except Redirect,r:
                # this may appear to be incorrect, but http://foo/test_mt
                # is what we set as REQUEST['URL1']
                self.assertEqual(r.args,('http://foo/test_mt/manage_main',))
            self.ob.fake_skin.test.manage_main()
            # ugh, okay, so we can't really test for security, but lets
            # test for the missing docstring that was causing problems!
            self.assertTrue(self.ob.fake_skin.test.__doc__)

        def test_example2(self):
            # login
            noSecurityManager()
            self.app.aq_chain[-1].id = 'testing'
            newSecurityManager(
                None,
                SimpleUser('Test User','',('Manager',),[]).__of__(self.app)
                )
            try:
                # setup
                self.app.portal_membership = DummyMembershipTool()
                # set expected
                self.MailHost.setExpected(mfrom='webmaster@example.com',
                                          mto='member@example.com',
                                          filename='example2.txt')
                # test
                self.ob.fake_skin.send_mails()
            finally:
                # logout
                noSecurityManager()
                newSecurityManager( None, SystemUser )

def test_suite():
    return TestSuite((
        makeSuite(TestFSMailTemplate),
        ))

if __name__ == '__main__':
    main(defaultTest='test_suite')