source: main/waeup.ikoba/trunk/src/waeup/ikoba/mandates/tests.py @ 17388

Last change on this file since 17388 was 14221, checked in by Henrik Bettermann, 8 years ago

Count mandates on configuration page and provide 'Purge' button.

  • Property svn:keywords set to Id
File size: 8.3 KB
RevLine 
[8846]1## $Id: tests.py 14221 2016-10-20 21:13:17Z henrik $
2##
3## Copyright (C) 2012 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.
8##
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.
13##
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"""
19Tests for mandates.
20"""
21import tempfile
22import shutil
[8860]23import os
[8848]24from zope.testbrowser.testing import Browser
[8846]25from datetime import datetime, timedelta
26from zope.interface.verify import verifyClass, verifyObject
27from zope.component import createObject
28from zope.component.hooks import setSite, clearSite
[11954]29from waeup.ikoba.app import Company
[11949]30from waeup.ikoba.interfaces import IUserAccount
31from waeup.ikoba.mandates.interfaces import (
[8846]32    IMandatesContainer, IMandate)
[11949]33from waeup.ikoba.mandates.container import MandatesContainer
34from waeup.ikoba.mandates.mandate import PasswordMandate
35from waeup.ikoba.testing import (FunctionalLayer, FunctionalTestCase)
[8846]36
37class MandatesContainerTestCase(FunctionalTestCase):
38
39    layer = FunctionalLayer
40
41    def test_interfaces(self):
42        # Make sure the correct interfaces are implemented.
43        self.assertTrue(
44            verifyClass(
45                IMandatesContainer, MandatesContainer)
46            )
47        self.assertTrue(
48            verifyObject(
49                IMandatesContainer, MandatesContainer())
50            )
51        self.assertTrue(
52            verifyClass(
[8857]53                IMandate, PasswordMandate)
[8846]54            )
55        self.assertTrue(
56            verifyObject(
[8857]57                IMandate, PasswordMandate())
[8846]58            )
59        return
60
61    def setUp(self):
62        super(MandatesContainerTestCase, self).setUp()
63
64        # Setup a sample site for each test
[11954]65        app = Company()
[8846]66        self.dc_root = tempfile.mkdtemp()
67        app['datacenter'].setStoragePath(self.dc_root)
68
69        # Prepopulate the ZODB...
70        self.getRootFolder()['app'] = app
71        # we add the site immediately after creation to the
72        # ZODB. Catalogs and other local utilities are not setup
73        # before that step.
74        self.app = self.getRootFolder()['app']
75        # Set site here. Some of the following setup code might need
76        # to access grok.getSite() and should get our new app then
77        setSite(app)
78
[8848]79        self.browser = Browser()
80        self.browser.handleErrors = False
81
[8846]82    def tearDown(self):
83        super(MandatesContainerTestCase, self).tearDown()
84        clearSite()
85        shutil.rmtree(self.dc_root)
86
[11984]87    def test_set_customer_password(self):
88        customer = createObject('waeup.Customer')
[8846]89        # Add and execute a mandate with missing parameters.
[8857]90        mandate = PasswordMandate()
[14221]91        IUserAccount(customer).setPassword('old_pw')
[8846]92        self.app['mandates'].addMandate(mandate)
[14221]93        (msg, redirect_path) = mandate.execute()
[8846]94        self.assertEqual(msg, u'Wrong mandate parameters.')
95        # Add and execute an expired mandate.
[8857]96        mandate = PasswordMandate(days=0)
[14221]97        mandate.params['user'] = customer
98        mandate.params['password'] = 'mypwd1'
[8846]99        self.app['mandates'].addMandate(mandate)
[14221]100        (msg, redirect_path) = mandate.execute()
[8846]101        self.assertEqual(msg, u'Mandate expired.')
[14221]102        self.assertEqual(redirect_path, '')
103        # Password has not been set
104        self.assertTrue(IUserAccount(customer).checkPassword('old_pw'))
[8848]105        # Add and execute a perfect mandate
[8857]106        mandate = PasswordMandate()
[11984]107        mandate.params['user'] = customer
[8846]108        mandate.params['password'] = 'mypwd1'
109        self.app['mandates'].addMandate(mandate)
[14221]110        (msg, redirect_path) = mandate.execute()
[8846]111        # Password has been set.
[11681]112        self.assertEqual(msg, 'Password has been successfully set. Login with your new password.')
[11984]113        self.assertTrue(IUserAccount(customer).checkPassword('mypwd1'))
[8846]114        # All mandates have been removed.
115        self.assertEqual(len(self.app['mandates'].keys()), 0)
[8860]116        logfile = os.path.join(
117            self.app['datacenter'].storage, 'logs', 'main.log')
118        logcontent = open(logfile).read()
119        self.assertTrue('system - PasswordMandate used: K1000000' in logcontent)
[8846]120
[8857]121    def test_set_officer_password(self):
122        self.app['users'].addUser('bob', 'bobssecret')
123        officer = self.app['users']['bob']
124        mandate = PasswordMandate()
[8858]125        mandate.params['user'] = officer
[8857]126        mandate.params['password'] = 'mypwd1'
127        self.app['mandates'].addMandate(mandate)
[14221]128        (msg, redirect_path) = mandate.execute()
[8857]129        # Password has been set.
[11681]130        self.assertEqual(msg, 'Password has been successfully set. Login with your new password.')
[8857]131        self.assertTrue(IUserAccount(officer).checkPassword('mypwd1'))
[8860]132        logfile = os.path.join(
133            self.app['datacenter'].storage, 'logs', 'main.log')
134        logcontent = open(logfile).read()
135        self.assertTrue('system - PasswordMandate used: bob' in logcontent)
[8857]136
[8846]137    def test_remove_expired(self):
138        # mandate1 is an old mandate which just expired.
[8857]139        mandate1 = PasswordMandate(days=0)
[8846]140        self.app['mandates'].addMandate(mandate1)
141        # mandate2 is a new mandate with default time delta.
[8857]142        mandate2 = PasswordMandate(mandate_id='23456')
[8846]143        self.app['mandates'].addMandate(mandate2)
144        self.assertEqual(len(self.app['mandates'].keys()), 2)
[8910]145        num_deleted = self.app['mandates'].removeExpired()
146        self.assertEqual(num_deleted, 1)
[8846]147        # Only the new mandate remains in the container.
148        self.assertEqual(len(self.app['mandates'].keys()), 1)
149        self.assertEqual([i for i in self.app['mandates'].keys()], [u'23456'])
[14221]150        logfile = os.path.join(
151            self.app['datacenter'].storage, 'logs', 'main.log')
152        logcontent = open(logfile).read()
153        self.assertTrue('system - 1 mandates purged' in logcontent)
[8848]154
[14221]155    def test_purge_mandates(self):
156        # mandate1 is an old mandate which just expired.
157        mandate1 = PasswordMandate(days=0)
158        self.app['mandates'].addMandate(mandate1)
159        # mandate2 is a new mandate with default time delta.
160        mandate2 = PasswordMandate(mandate_id='23456')
161        self.app['mandates'].addMandate(mandate2)
162        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
163        self.browser.open('http://localhost/app/configuration')
164        self.assertEqual(self.app['mandates'].count, (1, 1, 2))
165        self.assertTrue('<span>expired</span>' in self.browser.contents)
166        self.browser.getControl("Purge mandates").click()
167        self.assertTrue('1 mandate(s) were purged' in self.browser.contents)
168        self.assertEqual(self.app['mandates'].count, (1, 0, 1))
169        return
170
[11984]171    def test_browser(self):
172        customer = createObject('waeup.Customer')
173        self.app['customers'].addCustomer(customer)
[8857]174        mandate = PasswordMandate()
[11984]175        mandate.params['user'] = customer
[8848]176        mandate.params['password'] = 'mypwd1'
177        self.app['mandates'].addMandate(mandate)
178        self.browser.open('http://localhost/app/mandate?mandate_id=%s'
179            % mandate.mandate_id)
180        # Password has been set.
[12816]181        self.assertTrue(
182            'Password has been successfully set. Login with your new password.'
[8848]183            in self.browser.contents)
[11984]184        self.assertTrue(IUserAccount(customer).checkPassword('mypwd1'))
[8848]185        # All mandates have been removed.
[8853]186        self.assertEqual(len(self.app['mandates'].keys()), 0)
[11680]187        # We redirect to login page not to the frontpage.
[12816]188        self.assertEqual(
189            self.browser.url,
190            'http://localhost/app/login?camefrom=PasswordMandate')
191        # After login we redirect to the changepassword page.
192        self.browser.getControl(name="form.login").value = customer.customer_id
193        self.browser.getControl(name="form.password").value = 'mypwd1'
194        self.browser.getControl("Login").click()
195        self.assertEqual(
196            self.browser.url,
197            'http://localhost/app/customers/%s/changepassword'
198            % customer.customer_id)
Note: See TracBrowser for help on using the repository browser.