source: main/waeup.kofa/trunk/src/waeup/kofa/tests/test_configuration.py @ 17929

Last change on this file since 17929 was 17787, checked in by Henrik Bettermann, 6 months ago

Add SessionConfigurationProcessor.
Add ConfigurationContainerProcessor.
Add ConfigurationContainerExporter.

  • Property svn:keywords set to Id
File size: 8.7 KB
RevLine 
[7193]1## $Id: test_configuration.py 17787 2024-05-15 06:42:58Z henrik $
2##
[6919]3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
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##
[6919]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##
[6919]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"""Tests for configuration containers and related.
19"""
[17782]20import os
21import shutil
22import tempfile
23import unittest
24from zope.component import queryUtility
25from zope.component.hooks import setSite, clearSite
[6919]26from zope.component.interfaces import IFactory
27from zope.interface import verify
[7811]28from waeup.kofa.testing import FunctionalLayer, FunctionalTestCase
[17782]29from waeup.kofa.app import University
[7811]30from waeup.kofa.configuration import (
[17782]31    ConfigurationContainer, SessionConfiguration, SessionConfigurationFactory,
[17787]32    ConfigurationContainerExporter, SessionConfigurationExporter,
33    ConfigurationContainerProcessor, SessionConfigurationProcessor)
34from waeup.kofa.interfaces import(ICSVExporter, IBatchProcessor,
[6921]35    IConfigurationContainer, ISessionConfiguration, ISessionConfigurationAdd)
[6919]36
37class ConfigurationTest(FunctionalTestCase):
38
39    layer = FunctionalLayer
40
41    def setUp(self):
42        super(ConfigurationTest, self).setUp()
43        self.confcontainer = ConfigurationContainer()
44        self.sessionconf = SessionConfiguration()
45        return
46
47    def tearDown(self):
48        super(ConfigurationTest, self).tearDown()
49        return
50
51    def test_interfaces(self):
52        verify.verifyClass(IConfigurationContainer, ConfigurationContainer)
53        verify.verifyObject(IConfigurationContainer, self.confcontainer)
54        verify.verifyClass(ISessionConfiguration, SessionConfiguration)
55        verify.verifyObject(ISessionConfiguration, self.sessionconf)
[6921]56        verify.verifyClass(ISessionConfigurationAdd, SessionConfiguration)
57        verify.verifyObject(ISessionConfigurationAdd, self.sessionconf)
[6919]58
59class SessionConfigurationFactoryTest(FunctionalTestCase):
60
61    layer = FunctionalLayer
62
63    def setUp(self):
64        super(SessionConfigurationFactoryTest, self).setUp()
65        self.factory = SessionConfigurationFactory()
66
67    def tearDown(self):
68        super(SessionConfigurationFactoryTest, self).tearDown()
69
70    def test_interfaces(self):
71        verify.verifyClass(IFactory, SessionConfigurationFactory)
72        verify.verifyObject(IFactory, self.factory)
73
74    def test_factory(self):
75        obj = self.factory()
76        assert isinstance(obj, SessionConfiguration)
77
78    def test_getInterfaces(self):
79        implemented_by = self.factory.getInterfaces()
80        assert implemented_by.isOrExtends(ISessionConfiguration)
[17782]81
82
83class ConfigurationImportExportSetup(FunctionalTestCase):
84
85    layer = FunctionalLayer
86
87    def setUp(self):
88        super(ConfigurationImportExportSetup, self).setUp()
89        # Setup a sample site for each test
90        app = University()
91        self.dc_root = tempfile.mkdtemp()
92        app['datacenter'].setStoragePath(self.dc_root)
93        self.getRootFolder()['app'] = app
94        self.app = self.getRootFolder()['app']
95        setSite(app)
96        self.workdir = tempfile.mkdtemp()
97        self.outfile = os.path.join(self.workdir, 'myoutput.csv')
98        return
99
100    def tearDown(self):
101        super(ConfigurationImportExportSetup, self).tearDown()
102        shutil.rmtree(self.workdir)
103        shutil.rmtree(self.dc_root)
104        clearSite()
105        return
106
107class BaseConfigurationExportTests(ConfigurationImportExportSetup):
108
109    def test_ifaces(self):
110        # make sure we fullfill interface contracts
111        obj = ConfigurationContainerExporter()
112        verify.verifyObject(ICSVExporter, obj)
113        verify.verifyClass(ICSVExporter, ConfigurationContainerExporter)
114        return
115
116    def test_get_as_utility(self):
117        # we can get a faculty exporter as utility
118        result = queryUtility(ICSVExporter, name="base_configuration")
119        self.assertTrue(result is not None)
120        return
121
122    def test_export_all(self):
123        exporter = ConfigurationContainerExporter()
124        exporter.export_all(self.app, self.outfile)
125        result = open(self.outfile, 'rb').read()
126        self.assertTrue(
[17787]127            'acronym,carry_over,current_academic_session,email_admin,'
128            'email_subject,export_disabled_message,frontpage,'
[17782]129            'maintmode_enabled_by,name,name_admin,next_matric_integer,'
130            'next_matric_integer_2,next_matric_integer_3,'
131            'next_matric_integer_4,smtp_mailer,curr_stud_id\r\n'
[17787]132            'WAeUP.Kofa,0,,contact@waeup.org,Kofa Contact,,'
[17782]133            '"<h1>Welcome to WAeUP.Kofa\n<br>' in result
134            )
135        return
136
137class SessionConfigurationExportTests(ConfigurationImportExportSetup):
138
139    def test_ifaces(self):
140        # make sure we fullfill interface contracts
[17787]141        obj = SessionConfigurationExporter()
[17782]142        verify.verifyObject(ICSVExporter, obj)
[17787]143        verify.verifyClass(ICSVExporter, SessionConfigurationExporter)
[17782]144        return
145
146    def test_get_as_utility(self):
147        # we can get a faculty exporter as utility
[17787]148        result = queryUtility(ICSVExporter, name="sessionconfigurations")
[17782]149        self.assertTrue(result is not None)
150        return
151
152    def test_export_all(self):
153        self.sessionconfig = SessionConfiguration()
154        self.sessionconfig.academic_session = 2022
155        self.sessionconfig.clearance_fee = 3000.6
156        self.app['configuration'].addSessionConfiguration(self.sessionconfig)
[17787]157        exporter = SessionConfigurationExporter()
[17782]158        exporter.export_all(self.app, self.outfile)
159        result = open(self.outfile, 'rb').read()
160        self.assertEqual(result,
161            'academic_session,booking_fee,clearance_enabled,clearance_fee,'
162            'coursereg_deadline,late_registration_fee,maint_fee,'
163            'payment_disabled,transcript_fee,transfer_fee\r\n'
164            '2022,0.0,0,3000.6,,0.0,0.0,[],0.0,0.0\r\n'
165            )
166        return
[17787]167
168BASECONFIG_SAMPLE_DATA = open(
169    os.path.join(os.path.dirname(__file__), 'sample_baseconfig_data.csv'),
170    'rb').read()
171
172BASECONFIG_HEADER_FIELDS = BASECONFIG_SAMPLE_DATA.split(
173    '\n')[0].split(',')
174
175class BaseConfigurationProcessorTests(ConfigurationImportExportSetup):
176
177    layer = FunctionalLayer
178
179    def setUp(self):
180        super(BaseConfigurationProcessorTests, self).setUp()
181        self.processor = ConfigurationContainerProcessor()
182
183    def test_interface(self):
184        # Make sure we fulfill the interface contracts.
185        assert verify.verifyObject(IBatchProcessor, self.processor) is True
186        assert verify.verifyClass(
187            IBatchProcessor, ConfigurationContainerProcessor) is True
188
189    def test_import(self):
190        self.csv_file = os.path.join(
191            self.workdir, 'sample_baseconfig_data.csv')
192        open(self.csv_file, 'wb').write(BASECONFIG_SAMPLE_DATA)
193        num, num_warns, fin_file, fail_file = self.processor.doImport(
194            self.csv_file, BASECONFIG_HEADER_FIELDS,'update')
195        self.assertEqual(num_warns,0)
196        configcontainer = self.processor.getEntry(dict(), self.app)
197        self.assertEqual(configcontainer.frontpage, 'Hello World')
198
199SESSIONCONFIG_SAMPLE_DATA = open(
200    os.path.join(os.path.dirname(__file__), 'sample_sessionconfig_data.csv'),
201    'rb').read()
202
203SESSIONCONFIG_HEADER_FIELDS = SESSIONCONFIG_SAMPLE_DATA.split(
204    '\n')[0].split(',')
205
206class SessionConfigurationProcessorTests(ConfigurationImportExportSetup):
207
208    layer = FunctionalLayer
209
210    def setUp(self):
211        super(SessionConfigurationProcessorTests, self).setUp()
212        self.processor = SessionConfigurationProcessor()
213
214    def test_interface(self):
215        # Make sure we fulfill the interface contracts.
216        assert verify.verifyObject(IBatchProcessor, self.processor) is True
217        assert verify.verifyClass(
218            IBatchProcessor, SessionConfigurationProcessor) is True
219
220    def test_import(self):
221        self.csv_file = os.path.join(
222            self.workdir, 'sample_sessionconfig_data.csv')
223        open(self.csv_file, 'wb').write(SESSIONCONFIG_SAMPLE_DATA)
224        num, num_warns, fin_file, fail_file = self.processor.doImport(
225            self.csv_file, SESSIONCONFIG_HEADER_FIELDS,'create')
226        self.assertEqual(num_warns,0)
227        sessionconfig = self.processor.getEntry({'academic_session':'2017'}, self.app)
228        self.assertEqual(sessionconfig.payment_disabled[0], 'sf_all')
229
230
Note: See TracBrowser for help on using the repository browser.