[7193] | 1 | ## $Id: test_objecthistory.py 9126 2012-08-30 08:11:58Z henrik $ |
---|
| 2 | ## |
---|
| 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. |
---|
| 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 | ## |
---|
[6467] | 18 | """Test object history. |
---|
| 19 | """ |
---|
| 20 | import grok |
---|
| 21 | import shutil |
---|
| 22 | import tempfile |
---|
| 23 | from persistent.list import PersistentList |
---|
| 24 | from zope.interface.verify import verifyObject, verifyClass |
---|
| 25 | from zope.security.management import newInteraction, endInteraction |
---|
| 26 | from zope.security.testing import Principal, Participation |
---|
[7811] | 27 | from waeup.kofa.app import University |
---|
[7819] | 28 | from waeup.kofa.interfaces import IObjectHistory, IKofaObject |
---|
[7811] | 29 | from waeup.kofa.testing import FunctionalTestCase, FunctionalLayer |
---|
| 30 | from waeup.kofa.objecthistory import ObjectHistory |
---|
[6467] | 31 | |
---|
| 32 | class SampleObject(grok.Model): |
---|
[7819] | 33 | grok.implements(IKofaObject) |
---|
[6467] | 34 | pass |
---|
| 35 | |
---|
| 36 | class ObjectHistoryTests(FunctionalTestCase): |
---|
| 37 | # Tests for helpers like get_access_code, disable_accesscode, ... |
---|
| 38 | |
---|
| 39 | layer = FunctionalLayer |
---|
| 40 | |
---|
| 41 | def setUp(self): |
---|
| 42 | super(ObjectHistoryTests, self).setUp() |
---|
| 43 | |
---|
| 44 | # Prepopulate ZODB |
---|
| 45 | app = University() |
---|
| 46 | self.dc_root = tempfile.mkdtemp() |
---|
| 47 | app['datacenter'].setStoragePath(self.dc_root) |
---|
| 48 | |
---|
| 49 | # Prepopulate the ZODB... |
---|
| 50 | self.getRootFolder()['app'] = app |
---|
| 51 | self.app = self.getRootFolder()['app'] |
---|
| 52 | self.obj = SampleObject() |
---|
| 53 | |
---|
| 54 | def tearDown(self): |
---|
| 55 | shutil.rmtree(self.dc_root) |
---|
| 56 | super(ObjectHistoryTests, self).tearDown() |
---|
| 57 | endInteraction() # Just in case, one is still lingering around |
---|
| 58 | |
---|
| 59 | def test_iface(self): |
---|
| 60 | # ObjectHistory class and instances provide the promised ifaces |
---|
| 61 | hist = IObjectHistory(self.obj) |
---|
| 62 | assert verifyObject(IObjectHistory, hist) |
---|
| 63 | assert verifyClass(IObjectHistory, ObjectHistory) |
---|
| 64 | |
---|
| 65 | def test_adapter(self): |
---|
| 66 | # We can get a history by adapting to IObjectHistory |
---|
| 67 | result = IObjectHistory(self.obj) |
---|
| 68 | assert isinstance(result, ObjectHistory) |
---|
| 69 | |
---|
| 70 | def test_add_messages(self): |
---|
| 71 | # We can add a message |
---|
| 72 | hist = IObjectHistory(self.obj) |
---|
| 73 | assert hist.messages == [] |
---|
| 74 | hist.addMessage('blah') |
---|
| 75 | assert 'blah' in ''.join(hist.messages) |
---|
| 76 | |
---|
| 77 | def test_add_messages_timestamp_and_user(self): |
---|
| 78 | # Messages added get a timestamp and the current user |
---|
| 79 | hist = IObjectHistory(self.obj) |
---|
| 80 | hist.addMessage('blah') |
---|
| 81 | result = ''.join(hist.messages) |
---|
[8234] | 82 | self.assertMatches('<YYYY-MM-DD hh:mm:ss> UTC - blah by system', result) |
---|
[6467] | 83 | |
---|
| 84 | def test_add_messages_existing_principal(self): |
---|
| 85 | principal = Principal('bob') |
---|
| 86 | principal.title = 'Bob' |
---|
| 87 | newInteraction(Participation(principal)) # set current user |
---|
| 88 | hist = IObjectHistory(self.obj) |
---|
| 89 | hist.addMessage('blah') |
---|
| 90 | result = ''.join(hist.messages) |
---|
[8234] | 91 | self.assertMatches('<YYYY-MM-DD hh:mm:ss> UTC - blah by Bob', result) |
---|
[6467] | 92 | |
---|
[9012] | 93 | def test_modify_messages(self): |
---|
| 94 | principal = Principal('bob') |
---|
| 95 | principal.title = 'Bob' |
---|
| 96 | newInteraction(Participation(principal)) # set current user |
---|
| 97 | hist = IObjectHistory(self.obj) |
---|
| 98 | hist.addMessage('blah') |
---|
| 99 | hist.modifyMessages('blah', 'blow') |
---|
| 100 | result = ''.join(hist.messages) |
---|
| 101 | self.assertMatches('<YYYY-MM-DD hh:mm:ss> UTC - blow by Bob', result) |
---|
| 102 | |
---|
[9125] | 103 | def test_remove_message(self): |
---|
| 104 | principal = Principal('bob') |
---|
| 105 | principal.title = 'Bob' |
---|
| 106 | newInteraction(Participation(principal)) # set current user |
---|
| 107 | hist = IObjectHistory(self.obj) |
---|
| 108 | hist.addMessage('blah') |
---|
| 109 | hist.addMessage('blow') |
---|
[9126] | 110 | self.assertEqual(len(hist._getMessages()), 2) |
---|
[9125] | 111 | result = ' '.join(hist.messages) |
---|
| 112 | self.assertTrue('blah by Bob' in result) |
---|
| 113 | self.assertTrue('blow by Bob' in result) |
---|
[9126] | 114 | success, text = hist.removeMessage('xyz') |
---|
| 115 | self.assertFalse(success) |
---|
| 116 | self.assertEqual(text, 'Not a number') |
---|
| 117 | success, text = hist.removeMessage(100) |
---|
| 118 | self.assertFalse(success) |
---|
| 119 | self.assertEqual(text, 'Number out of range') |
---|
| 120 | success, text = hist.removeMessage(1) |
---|
| 121 | self.assertTrue(success) |
---|
| 122 | self.assertMatches('<YYYY-MM-DD hh:mm:ss> UTC - blow by Bob', text) |
---|
| 123 | self.assertEqual(len(hist.messages), 1) |
---|
[9125] | 124 | result = ' '.join(hist.messages) |
---|
| 125 | self.assertFalse('blow by Bob' in result) |
---|
| 126 | |
---|
[6467] | 127 | def test_messages(self): |
---|
| 128 | # we get messages as a persistent list of strings |
---|
| 129 | hist = IObjectHistory(self.obj) |
---|
| 130 | hist.addMessage('foo') |
---|
| 131 | hist.addMessage('bar') |
---|
| 132 | assert isinstance(hist.messages, PersistentList) |
---|
| 133 | assert 'foo' in hist.messages[0] |
---|
| 134 | assert 'bar' in hist.messages[1] |
---|