source: main/waeup.ikoba/trunk/src/waeup/ikoba/documents/tests/test_browser.py @ 12243

Last change on this file since 12243 was 12243, checked in by Henrik Bettermann, 10 years ago

Redirect to portal root if content is not yet published.

Extend tests.

  • Property svn:keywords set to Id
File size: 12.7 KB
Line 
1## $Id: test_browser.py 12243 2014-12-15 11:18:31Z henrik $
2##
3## Copyright (C) 2014 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"""
19Test the customer-related UI components.
20"""
21import shutil
22import tempfile
23from datetime import datetime, timedelta, date
24from StringIO import StringIO
25import os
26from zope.event import notify
27from zope.component import createObject, queryUtility, getUtility
28from zope.component.hooks import setSite, clearSite
29from zope.schema.interfaces import ConstraintNotSatisfied
30from zope.catalog.interfaces import ICatalog
31from zope.security.interfaces import Unauthorized
32from zope.securitypolicy.interfaces import IPrincipalRoleManager
33from zope.testbrowser.testing import Browser
34from hurry.workflow.interfaces import (
35    IWorkflowInfo, IWorkflowState, InvalidTransitionError)
36from waeup.ikoba.testing import FunctionalLayer, FunctionalTestCase
37from waeup.ikoba.app import Company
38from waeup.ikoba.interfaces import (
39    IUserAccount, IJobManager, APPROVED, SUBMITTED, PUBLISHED,
40    IFileStoreNameChooser, IExtFileStore, IFileStoreHandler)
41from waeup.ikoba.imagestorage import (
42    FileStoreNameChooser, ExtFileStore, DefaultFileStoreHandler,
43    DefaultStorage)
44from waeup.ikoba.authentication import LocalRoleSetEvent
45from waeup.ikoba.tests.test_async import FunctionalAsyncTestCase
46from waeup.ikoba.interfaces import VERIFIED
47from waeup.ikoba.browser.tests.test_pdf import samples_dir
48
49PH_LEN = 15911  # Length of placeholder file
50
51SAMPLE_IMAGE = os.path.join(os.path.dirname(__file__), 'test_image.jpg')
52#SAMPLE_IMAGE_BMP = os.path.join(os.path.dirname(__file__), 'test_image.bmp')
53SAMPLE_PDF = os.path.join(os.path.dirname(__file__), 'test_pdf.pdf')
54
55class FullSetup(FunctionalTestCase):
56    # A test case that only contains a setup and teardown
57    #
58    # Complete setup for customers handlings is rather complex and
59    # requires lots of things created before we can start. This is a
60    # setup that does all this, creates a company etc.
61    # so that we do not have to bother with that in different
62    # test cases.
63
64    layer = FunctionalLayer
65
66    def setUp(self):
67        super(FullSetup, self).setUp()
68
69        # Setup a sample site for each test
70        app = Company()
71        self.dc_root = tempfile.mkdtemp()
72        app['datacenter'].setStoragePath(self.dc_root)
73
74        # Prepopulate the ZODB...
75        self.getRootFolder()['app'] = app
76        # we add the site immediately after creation to the
77        # ZODB. Catalogs and other local utilities are not setup
78        # before that step.
79        self.app = self.getRootFolder()['app']
80        # Set site here. Some of the following setup code might need
81        # to access grok.getSite() and should get our new app then
82        setSite(app)
83
84        self.login_path = 'http://localhost/app/login'
85        self.container_path = 'http://localhost/app/documents'
86
87        # Put the prepopulated site into test ZODB and prepare test
88        # browser
89        self.browser = Browser()
90        self.browser.handleErrors = False
91
92    def tearDown(self):
93        super(FullSetup, self).tearDown()
94        clearSite()
95        shutil.rmtree(self.dc_root)
96
97
98class DocumentUITests(FullSetup):
99    # Tests for document related views and pages
100
101    def test_manage_file_document(self):
102        # Managers can access the pages of documentsconter
103        # and can perform actions
104        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
105        self.browser.open('http://localhost/app')
106        self.assertEqual(self.browser.headers['Status'], '200 Ok')
107        self.browser.getLink("Documents").click()
108        self.assertEqual(self.browser.url, self.container_path)
109        self.browser.getLink("Manage").click()
110        self.browser.getControl("Add document").click()
111        self.browser.getControl(name="doctype").value = ['PDFDocument']
112        self.browser.getControl(name="form.title").value = 'My PDF Document'
113        self.browser.getControl("Add document").click()
114        self.assertTrue('PDF Document added.' in self.browser.contents)
115        document = self.app['documents']['d101']
116
117        # Document can be edited
118        self.browser.getLink("d101").click()
119        self.browser.getLink("Manage").click()
120        self.browser.getControl(name="form.title").value = 'My first doc'
121        self.browser.getControl("Save").click()
122        self.assertTrue('Form has been saved.' in self.browser.contents)
123        self.browser.getLink("View").click()
124        self.assertEqual(self.browser.url, self.container_path + '/d101/index')
125
126        # File can be uploaded
127        self.browser.getLink("Manage").click()
128        # Create a pseudo image file and select it to be uploaded
129        image = open(SAMPLE_IMAGE, 'rb')
130        ctrl = self.browser.getControl(name='pdfscanmanageupload')
131        file_ctrl = ctrl.mech_control
132        file_ctrl.add_file(image, filename='my_sample_scan.jpg')
133        self.browser.getControl(
134            name='upload_pdfscanmanageupload').click()
135        self.assertTrue(
136            'pdf file extension expected' in self.browser.contents)
137        ctrl = self.browser.getControl(name='pdfscanmanageupload')
138        file_ctrl = ctrl.mech_control
139        file_ctrl.add_file(image, filename='my_sample_scan.pdf')
140        self.browser.getControl(
141            name='upload_pdfscanmanageupload').click()
142        self.assertTrue(
143            'Could not determine file type' in self.browser.contents)
144        pdf = open(SAMPLE_PDF, 'rb')
145        ctrl = self.browser.getControl(name='pdfscanmanageupload')
146        file_ctrl = ctrl.mech_control
147        file_ctrl.add_file(pdf, filename='my_sample_scan.pdf')
148        self.browser.getControl(
149            name='upload_pdfscanmanageupload').click()
150        self.assertTrue(
151            'href="http://localhost/app/documents/d101/sample.pdf">PDF File</a>'
152            in self.browser.contents)
153        # Browsing the link shows a real pdf only if the document
154        # has been published
155        self.browser.getLink("PDF File").click()
156        self.assertTrue(
157            'The document requested has not yet been published'
158            in self.browser.contents)
159        IWorkflowState(document).setState(PUBLISHED)
160        self.browser.open(self.container_path + '/d101/sample.pdf')
161        self.assertEqual(
162            self.browser.headers['content-type'], 'application/pdf')
163
164        # Transitions can be performed
165        self.assertEqual(document.state, 'published')
166        self.browser.open(self.container_path + '/d101')
167        self.browser.getLink("Transition").click()
168        self.browser.getControl(name="transition").value = ['retract']
169        self.browser.getControl("Save").click()
170        self.assertEqual(document.state, 'created')
171
172        # Documents can be removed
173        self.browser.getLink("Documents").click()
174        self.browser.getLink("Manage").click()
175        ctrl = self.browser.getControl(name='val_id')
176        ctrl.getControl(value=document.document_id).selected = True
177        self.browser.getControl("Remove selected", index=0).click()
178        self.assertTrue('Successfully removed' in self.browser.contents)
179
180        # All actions are being logged
181        logfile = os.path.join(
182            self.app['datacenter'].storage, 'logs', 'main.log')
183        logcontent = open(logfile).read()
184
185        self.assertTrue(
186            'INFO - zope.mgr - %s - Document created' % document.document_id
187            in logcontent)
188        self.assertTrue(
189            'INFO - zope.mgr - documents.browser.DocumentAddFormPage - added: PDF Document %s'
190            % document.document_id in logcontent)
191        self.assertTrue(
192            'INFO - zope.mgr - documents.browser.DocumentManageFormPage - %s - saved: title'
193            % document.document_id in logcontent)
194        self.assertTrue(
195            'INFO - zope.mgr - documents.browser.DocumentManageFormPage - %s - uploaded: sample.pdf (my_sample_scan.pdf)'
196            % document.document_id in logcontent)
197        self.assertTrue(
198            'INFO - zope.mgr - %s - Document retracted' % document.document_id
199            in logcontent)
200        self.assertTrue(
201            'INFO - zope.mgr - documents.browser.DocumentsContainerManageFormPage - removed: %s'
202            % document.document_id in logcontent)
203
204    def test_manage_html_document(self):
205        # Managers can access the pages of documentsconter
206        # and can perform actions
207        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
208        self.browser.open('http://localhost/app')
209        self.assertEqual(self.browser.headers['Status'], '200 Ok')
210        self.browser.getLink("Documents").click()
211        self.assertEqual(self.browser.url, self.container_path)
212        self.browser.getLink("Manage").click()
213        self.browser.getControl("Add document").click()
214        self.browser.getControl(name="doctype").value = ['HTMLDocument']
215        self.browser.getControl(name="form.title").value = 'My HTML Document'
216        self.browser.getControl("Add document").click()
217        self.assertTrue('HTML Document added.' in self.browser.contents)
218        document = self.app['documents']['d101']
219
220        # Document can be edited
221        self.browser.getLink("d101").click()
222        self.browser.getLink("Manage").click()
223        self.browser.getControl(name="form.title").value = 'My second doc'
224        self.browser.getControl(name="form.html_multilingual").value = """
225<h1>Hello World</h1>
226>>de<<
227<h1>Hallo Welt</h1>
228"""
229        self.browser.getControl("Save").click()
230        self.assertTrue('Form has been saved.' in self.browser.contents)
231        self.browser.getLink("View").click()
232        self.assertEqual(self.browser.url, self.container_path + '/d101/index')
233        self.assertTrue(
234            '<h1>Hello World</h1>' in self.browser.contents)
235        self.assertFalse(
236            '<h1>Hallo Welt</h1>' in self.browser.contents)
237        self.browser.getLink("de").click()
238        self.assertFalse(
239            '<h1>Hello World</h1>' in self.browser.contents)
240        self.assertTrue(
241            '<h1>Hallo Welt</h1>' in self.browser.contents)
242        # The content can't be rendered yet
243        self.browser.open(self.container_path + '/d101/display')
244        self.assertTrue(
245            'The document requested has not yet been published'
246            in self.browser.contents)
247        # We have been redirected to the portal root
248        self.assertEqual(self.browser.url, 'http://localhost/app')
249
250        # Transitions can be performed
251        self.browser.open(self.container_path + '/d101')
252        self.browser.getLink("Transition").click()
253        self.browser.getControl(name="transition").value = ['publish']
254        self.browser.getControl("Speichern").click()
255        self.assertEqual(document.state, 'published')
256
257        # The content can be rendered
258        self.browser.open(self.container_path + '/d101/display')
259        self.assertTrue(
260            '<h1>Hallo Welt</h1>' in self.browser.contents)
261
262        # Documents can be removed
263        self.browser.getLink("en", index=2).click()
264        self.browser.getLink("Documents").click()
265        self.browser.getLink("Manage").click()
266        ctrl = self.browser.getControl(name='val_id')
267        ctrl.getControl(value=document.document_id).selected = True
268        self.browser.getControl("Remove selected", index=0).click()
269        self.assertTrue('Successfully removed' in self.browser.contents)
270
271        # All actions are being logged
272        logfile = os.path.join(
273            self.app['datacenter'].storage, 'logs', 'main.log')
274        logcontent = open(logfile).read()
275
276        self.assertTrue(
277            'INFO - zope.mgr - %s - Document created' % document.document_id
278            in logcontent)
279        self.assertTrue(
280            'INFO - zope.mgr - documents.browser.DocumentAddFormPage - added: HTML Document %s'
281            % document.document_id in logcontent)
282        self.assertTrue(
283            'INFO - zope.mgr - documents.browser.HTMLDocumentManageFormPage - %s - saved: title + html_multilingual'
284            % document.document_id in logcontent)
285        self.assertTrue(
286            'INFO - zope.mgr - %s - Document published' % document.document_id
287            in logcontent)
288        self.assertTrue(
289            'INFO - zope.mgr - documents.browser.DocumentsContainerManageFormPage - removed: %s'
290            % document.document_id in logcontent)
291
Note: See TracBrowser for help on using the repository browser.