[7193] | 1 | ## $Id: test_root.py 7811 2012-03-08 19:00:51Z uli $ |
---|
[5646] | 2 | ## |
---|
[7193] | 3 | ## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann |
---|
[5646] | 4 | ## This program is free software; you can redistribute it and/or modify |
---|
| 5 | ## it under the terms of the GNU General Public License as published by |
---|
| 6 | ## the Free Software Foundation; either version 2 of the License, or |
---|
| 7 | ## (at your option) any later version. |
---|
[7193] | 8 | ## |
---|
[5646] | 9 | ## This program is distributed in the hope that it will be useful, |
---|
| 10 | ## but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
| 11 | ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
| 12 | ## GNU General Public License for more details. |
---|
[7193] | 13 | ## |
---|
[5646] | 14 | ## You should have received a copy of the GNU General Public License |
---|
| 15 | ## along with this program; if not, write to the Free Software |
---|
| 16 | ## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
---|
| 17 | ## |
---|
| 18 | """ |
---|
[5676] | 19 | Test applicants root. |
---|
[5646] | 20 | """ |
---|
[5659] | 21 | import logging |
---|
[6120] | 22 | import shutil |
---|
| 23 | import tempfile |
---|
[5646] | 24 | import unittest |
---|
[5659] | 25 | from StringIO import StringIO |
---|
[6659] | 26 | from zope.component.hooks import setSite, clearSite |
---|
[5646] | 27 | from zope.interface.verify import verifyClass, verifyObject |
---|
[7811] | 28 | from waeup.kofa.app import University |
---|
| 29 | from waeup.kofa.applicants import ( |
---|
[7375] | 30 | interfaces, Applicant, ApplicantsContainer, |
---|
[5808] | 31 | ) |
---|
[7811] | 32 | from waeup.kofa.applicants.root import ( |
---|
[5676] | 33 | ApplicantsRoot, ApplicantsPlugin, |
---|
[5659] | 34 | ) |
---|
[7811] | 35 | from waeup.kofa.testing import ( |
---|
[7063] | 36 | FunctionalLayer, FunctionalTestCase, remove_logger) |
---|
[5646] | 37 | |
---|
[5808] | 38 | |
---|
[5659] | 39 | class FakeSite(dict): |
---|
| 40 | pass |
---|
| 41 | |
---|
[6442] | 42 | class ApplicantsRootTestCase(FunctionalTestCase): |
---|
[5646] | 43 | |
---|
[6442] | 44 | layer = FunctionalLayer |
---|
| 45 | |
---|
| 46 | def setUp(self): |
---|
[7811] | 47 | remove_logger('waeup.kofa.app.applicants') |
---|
[6442] | 48 | super(ApplicantsRootTestCase, self).setUp() |
---|
| 49 | # Setup a sample site for each test |
---|
| 50 | # Prepopulate the ZODB... |
---|
[6578] | 51 | app = University() |
---|
[6442] | 52 | self.getRootFolder()['app'] = app |
---|
| 53 | self.app = self.getRootFolder()['app'] |
---|
| 54 | setSite(self.app) |
---|
[6578] | 55 | self.dc_root = tempfile.mkdtemp() |
---|
| 56 | app['datacenter'].setStoragePath(self.dc_root) |
---|
[6442] | 57 | return |
---|
| 58 | |
---|
| 59 | def tearDown(self): |
---|
| 60 | super(ApplicantsRootTestCase, self).tearDown() |
---|
| 61 | shutil.rmtree(self.dc_root) |
---|
[6658] | 62 | clearSite() |
---|
[6442] | 63 | return |
---|
| 64 | |
---|
[5646] | 65 | def test_interfaces(self): |
---|
| 66 | # Make sure the correct interfaces are implemented. |
---|
| 67 | self.assertTrue( |
---|
| 68 | verifyClass( |
---|
[5676] | 69 | interfaces.IApplicantsRoot, ApplicantsRoot) |
---|
[5646] | 70 | ) |
---|
| 71 | self.assertTrue( |
---|
| 72 | verifyObject( |
---|
[5676] | 73 | interfaces.IApplicantsRoot, ApplicantsRoot()) |
---|
[5646] | 74 | ) |
---|
| 75 | return |
---|
| 76 | |
---|
[6442] | 77 | def test_logger(self): |
---|
| 78 | # We can get a logger from root |
---|
| 79 | logger = self.app['applicants'].logger |
---|
| 80 | assert logger is not None |
---|
[7811] | 81 | assert logger.name == 'waeup.kofa.app.applicants' |
---|
[6442] | 82 | handlers = logger.handlers |
---|
| 83 | assert len(handlers) == 1 |
---|
| 84 | filename = logger.handlers[0].baseFilename |
---|
| 85 | assert filename.endswith('applicants.log') |
---|
| 86 | assert filename.startswith(self.dc_root) |
---|
| 87 | |
---|
[6443] | 88 | def test_logger_multiple(self): |
---|
| 89 | # Make sure the logger is still working after 2nd call |
---|
| 90 | # First time we call it, it might be registered |
---|
| 91 | logger = self.app['applicants'].logger |
---|
| 92 | # At second call the already registered logger should be returned |
---|
| 93 | logger = self.app['applicants'].logger |
---|
| 94 | assert logger is not None |
---|
[7811] | 95 | assert logger.name == 'waeup.kofa.app.applicants' |
---|
[6443] | 96 | handlers = logger.handlers |
---|
| 97 | assert len(handlers) == 1 |
---|
| 98 | filename = logger.handlers[0].baseFilename |
---|
| 99 | assert filename.endswith('applicants.log') |
---|
| 100 | assert filename.startswith(self.dc_root) |
---|
| 101 | |
---|
[5676] | 102 | class ApplicantsRootPluginTestCase(unittest.TestCase): |
---|
[5659] | 103 | def create_logger(self): |
---|
| 104 | # create a logger suitable for local tests. |
---|
[7811] | 105 | test_logger = logging.getLogger('waeup.kofa.applicants.testlogger') |
---|
[5659] | 106 | log = StringIO() |
---|
| 107 | handler = logging.StreamHandler(log) |
---|
| 108 | handler.setLevel(logging.DEBUG) |
---|
| 109 | test_logger.addHandler(handler) |
---|
| 110 | test_logger.setLevel(logging.DEBUG) |
---|
| 111 | self.logger = test_logger |
---|
| 112 | self.log = log |
---|
| 113 | self.handler = handler |
---|
| 114 | return self.logger |
---|
| 115 | |
---|
| 116 | def remove_logger(self): |
---|
| 117 | del self.handler |
---|
| 118 | del self.logger |
---|
| 119 | del self.log |
---|
| 120 | pass |
---|
| 121 | |
---|
| 122 | def get_log(self): |
---|
| 123 | self.log.seek(0) |
---|
| 124 | return self.log.read() |
---|
| 125 | |
---|
| 126 | def setUp(self): |
---|
| 127 | self.create_logger() |
---|
| 128 | return |
---|
| 129 | |
---|
| 130 | def tearDown(self): |
---|
| 131 | self.remove_logger() |
---|
| 132 | return |
---|
| 133 | |
---|
| 134 | # Real tests start here... |
---|
| 135 | def test_pluginsetup(self): |
---|
[5676] | 136 | # Make sure we can add ApplicantsRoot to sites. |
---|
[5659] | 137 | site = FakeSite() |
---|
[5676] | 138 | plugin = ApplicantsPlugin() |
---|
[5659] | 139 | plugin.setup(site, 'blah', self.logger) |
---|
[5676] | 140 | self.assertTrue('applicants' in site.keys()) |
---|
[5659] | 141 | log = self.get_log() |
---|
[5676] | 142 | self.assertTrue('Installed applicants root.' in log) |
---|
[5659] | 143 | return |
---|
| 144 | |
---|
| 145 | def test_update_new(self): |
---|
[5676] | 146 | # Run update on a site without applicants root. |
---|
[5659] | 147 | site = FakeSite() |
---|
[5676] | 148 | plugin = ApplicantsPlugin() |
---|
[5659] | 149 | plugin.update(site, 'blah', self.logger) |
---|
[5676] | 150 | self.assertTrue('applicants' in site.keys()) |
---|
[5659] | 151 | log = self.get_log() |
---|
[5684] | 152 | self.assertTrue('Updating site at <Unnamed Site>' in log) |
---|
[5676] | 153 | self.assertTrue('Installed applicants root.' in log) |
---|
[5659] | 154 | return |
---|
| 155 | |
---|
| 156 | def test_update_outdated(self): |
---|
[5676] | 157 | # Run update on a site with outdated applicants root. |
---|
[5659] | 158 | site = FakeSite() |
---|
[5676] | 159 | root = object() # # This is not a proper applicants root |
---|
| 160 | site['applicants'] = root |
---|
| 161 | plugin = ApplicantsPlugin() |
---|
[5659] | 162 | plugin.update(site, 'blah', self.logger) |
---|
[5676] | 163 | self.assertTrue(site['applicants'] is not root) |
---|
| 164 | self.assertTrue(isinstance(site['applicants'], ApplicantsRoot)) |
---|
[5659] | 165 | log = self.get_log() |
---|
[5676] | 166 | self.assertTrue('Outdated applicants folder detected' in log) |
---|
[5684] | 167 | self.assertTrue('Updating site at <Unnamed Site>' in log) |
---|
[5676] | 168 | self.assertTrue('Installed applicants root.' in log) |
---|
[5659] | 169 | return |
---|
| 170 | |
---|
| 171 | def test_update_uptodate(self): |
---|
[5676] | 172 | # Run update on a site with proper applicants root. |
---|
[5659] | 173 | site = FakeSite() |
---|
[5676] | 174 | root = ApplicantsRoot() |
---|
| 175 | site['applicants'] = root |
---|
| 176 | plugin = ApplicantsPlugin() |
---|
[5659] | 177 | plugin.update(site, 'blah', self.logger) |
---|
[5676] | 178 | self.assertTrue(site['applicants'] is root) |
---|
[5659] | 179 | log = self.get_log() |
---|
[5684] | 180 | self.assertTrue('Updating site at <Unnamed Site>' in log) |
---|
[5659] | 181 | self.assertTrue('Nothing to do' in log) |
---|
| 182 | return |
---|
| 183 | |
---|
| 184 | def test_update_log(self): |
---|
| 185 | # Check that sitename is used in log messages on updates. |
---|
| 186 | site = FakeSite() |
---|
| 187 | site.__name__ = 'my_site' |
---|
[5676] | 188 | plugin = ApplicantsPlugin() |
---|
[5659] | 189 | plugin.update(site, 'blah', self.logger) |
---|
| 190 | log = self.get_log() |
---|
| 191 | self.assertTrue('Updating site at my_site.' in log) |
---|
| 192 | return |
---|
[5766] | 193 | |
---|
[5646] | 194 | def suite(): |
---|
| 195 | suite = unittest.TestSuite() |
---|
[5659] | 196 | for testcase in [ |
---|
[5676] | 197 | ApplicantsRootTestCase, |
---|
| 198 | ApplicantsRootPluginTestCase, |
---|
[5659] | 199 | ]: |
---|
[5809] | 200 | suite.addTests(unittest.makeSuite(testcase)) |
---|
[5646] | 201 | return suite |
---|
| 202 | |
---|
| 203 | test_suite = suite |
---|