source: main/waeup.kofa/trunk/src/waeup/kofa/documents/tests/test_browser.py @ 13215

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

Repair document manage form pages. Buttons were missing.

  • Property svn:keywords set to Id
File size: 16.0 KB
Line 
1## $Id: test_browser.py 13138 2015-07-05 07:42:37Z 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.kofa.testing import FunctionalLayer, FunctionalTestCase
37from waeup.kofa.app import University
38from waeup.kofa.interfaces import (
39    IUserAccount, IJobManager,
40    IFileStoreNameChooser, IExtFileStore, IFileStoreHandler)
41from waeup.kofa.imagestorage import (
42    FileStoreNameChooser, ExtFileStore, DefaultFileStoreHandler,
43    DefaultStorage)
44from waeup.kofa.authentication import LocalRoleSetEvent
45from waeup.kofa.tests.test_async import FunctionalAsyncTestCase
46from waeup.kofa.browser.tests.test_pdf import samples_dir
47from waeup.kofa.documents.workflow import PUBLISHED
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 = University()
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(name="form.document_id").value = 'DOC1'
114        self.browser.getControl("Add document").click()
115        self.assertTrue('PDF Document added.' in self.browser.contents)
116        document = self.app['documents']['DOC1']
117
118        # Document can be edited
119        self.browser.getControl(name="form.title").value = 'My first doc'
120        self.browser.getControl("Save").click()
121        self.assertTrue('Form has been saved.' in self.browser.contents)
122        self.browser.getLink("View").click()
123        self.assertEqual(self.browser.url, self.container_path + '/DOC1/index')
124
125        # File can be uploaded
126        self.browser.getLink("Manage").click()
127        # Create a pseudo image file and select it to be uploaded
128        image = open(SAMPLE_IMAGE, 'rb')
129        ctrl = self.browser.getControl(name='pdfscanmanageupload')
130        file_ctrl = ctrl.mech_control
131        file_ctrl.add_file(image, filename='my_sample_scan.jpg')
132        self.browser.getControl(
133            name='upload_pdfscanmanageupload').click()
134        self.assertTrue(
135            'pdf file format expected' in self.browser.contents)
136        ctrl = self.browser.getControl(name='pdfscanmanageupload')
137        file_ctrl = ctrl.mech_control
138        file_ctrl.add_file(image, filename='my_sample_scan.pdf')
139        self.browser.getControl(
140            name='upload_pdfscanmanageupload').click()
141        self.assertTrue(
142            'Could not determine file type' in self.browser.contents)
143        pdf = open(SAMPLE_PDF, 'rb')
144        ctrl = self.browser.getControl(name='pdfscanmanageupload')
145        file_ctrl = ctrl.mech_control
146        file_ctrl.add_file(pdf, filename='my_sample_scan.pdf')
147        self.browser.getControl(
148            name='upload_pdfscanmanageupload').click()
149        self.assertTrue(
150            'href="http://localhost/app/documents/DOC1/file.pdf">DOC1.pdf</a>'
151            in self.browser.contents)
152        # The file can be found in the file system
153        file = getUtility(IExtFileStore).getFileByContext(
154            document, attr='file.pdf')
155        file_content = file.read()
156        pdf.seek(0)
157        pdf_content = pdf.read()
158        self.assertEqual(file_content, pdf_content)
159        # Browsing the link shows a real pdf only if the document
160        # has been published
161        self.browser.getLink("DOC1.pdf").click()
162        self.assertTrue(
163            'The document requested has not yet been published'
164            in self.browser.contents)
165        IWorkflowState(document).setState(PUBLISHED)
166        self.browser.open(self.container_path + '/DOC1/file.pdf')
167        self.assertEqual(
168            self.browser.headers['content-type'], 'application/pdf')
169        # The name of the downloaded file will be different
170        self.assertEqual(
171            self.browser.headers['Content-Disposition'],
172            'attachment; filename="DOC1.pdf')
173
174        # Transitions can be performed
175        self.assertEqual(document.state, 'published')
176        self.browser.open(self.container_path + '/DOC1')
177        self.browser.getLink("Transition").click()
178        self.browser.getControl(name="transition").value = ['retract']
179        self.browser.getControl("Apply now").click()
180        self.assertEqual(document.state, 'created')
181
182        # Documents can be removed
183        self.browser.getLink("Documents").click()
184        self.browser.getLink("Manage").click()
185        ctrl = self.browser.getControl(name='val_id')
186        ctrl.getControl(value=document.document_id).selected = True
187        self.browser.getControl("Remove selected", index=0).click()
188        self.assertTrue('Successfully removed' in self.browser.contents)
189
190        # File has been removed too
191        file = getUtility(IExtFileStore).getFileByContext(
192            document, attr='file.pdf')
193        self.assertTrue(file is None)
194
195        # All actions are being logged
196        logfile = os.path.join(
197            self.app['datacenter'].storage, 'logs', 'main.log')
198        logcontent = open(logfile).read()
199
200        self.assertTrue(
201            'INFO - zope.mgr - %s - Document created' % document.document_id
202            in logcontent)
203        self.assertTrue(
204            'INFO - zope.mgr - documents.browser.DocumentAddFormPage - added: PDF Document %s'
205            % document.document_id in logcontent)
206        self.assertTrue(
207            'INFO - zope.mgr - documents.browser.DocumentManageFormPage - %s - saved: title'
208            % document.document_id in logcontent)
209        self.assertTrue(
210            'INFO - zope.mgr - documents.browser.DocumentManageFormPage - %s - uploaded: file.pdf (my_sample_scan.pdf)'
211            % document.document_id in logcontent)
212        self.assertTrue(
213            'INFO - zope.mgr - %s - Document retracted' % document.document_id
214            in logcontent)
215        self.assertTrue(
216            'INFO - zope.mgr - documents.browser.DocumentsContainerManageFormPage - removed: %s'
217            % document.document_id in logcontent)
218
219    def test_manage_html_document(self):
220        # Managers can access the pages of documentsconter
221        # and can perform actions
222        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
223        self.browser.open('http://localhost/app')
224        self.assertEqual(self.browser.headers['Status'], '200 Ok')
225        self.browser.getLink("Documents").click()
226        self.assertEqual(self.browser.url, self.container_path)
227        self.browser.getLink("Manage").click()
228        self.browser.getControl("Add document").click()
229        self.browser.getControl(name="doctype").value = ['HTMLDocument']
230        self.browser.getControl(name="form.document_id").value = 'DOC2'
231        self.browser.getControl(name="form.title").value = 'My HTML Document'
232        self.browser.getControl("Add document").click()
233        self.assertTrue('HTML Document added.' in self.browser.contents)
234        document = self.app['documents']['DOC2']
235        # All form action buttons are there
236        self.assertTrue('value="Add local role"' in self.browser.contents)
237        self.assertTrue('value="Save"' in self.browser.contents)
238        self.assertTrue('value="Cancel"' in self.browser.contents)
239        # Document can be edited
240        self.browser.getControl(name="form.title").value = 'My second doc'
241        self.browser.getControl(name="form.html_multilingual").value = """
242<h1>Hello World</h1>
243>>de<<
244<h1>Hallo Welt</h1>
245"""
246        self.browser.getControl("Save").click()
247        self.assertTrue('Form has been saved.' in self.browser.contents)
248        self.browser.getLink("View").click()
249        self.assertEqual(self.browser.url, self.container_path + '/DOC2/index')
250        self.assertTrue(
251            '<h1>Hello World</h1>' in self.browser.contents)
252        self.assertFalse(
253            '<h1>Hallo Welt</h1>' in self.browser.contents)
254        self.browser.getLink("de", index=2).click()
255        self.assertFalse(
256            '<h1>Hello World</h1>' in self.browser.contents)
257        self.assertTrue(
258            '<h1>Hallo Welt</h1>' in self.browser.contents)
259        # The content can't be rendered yet
260        self.browser.open(self.container_path + '/DOC2/display')
261        self.assertTrue(
262            'The document requested has not yet been published'
263            in self.browser.contents)
264        # We have been redirected to the portal root
265        self.assertEqual(self.browser.url, 'http://localhost/app')
266
267        # Transitions can be performed
268        self.browser.open(self.container_path + '/DOC2')
269        self.browser.getLink("Transition").click()
270        self.browser.getControl(name="transition").value = ['publish']
271        self.browser.getControl("Apply now").click() # not yet translated
272        self.assertEqual(document.state, 'published')
273
274        # The content can be rendered
275        self.browser.open(self.container_path + '/DOC2/display')
276        self.assertTrue(
277            '<h1>Hallo Welt</h1>' in self.browser.contents)
278
279        # Documents can be removed
280        self.browser.getLink("en", index=3).click()
281        self.browser.getLink("Documents").click()
282        self.browser.getLink("Manage").click()
283        ctrl = self.browser.getControl(name='val_id')
284        ctrl.getControl(value=document.document_id).selected = True
285        self.browser.getControl("Remove selected", index=0).click()
286        self.assertTrue('Successfully removed' in self.browser.contents)
287
288        # All actions are being logged
289        logfile = os.path.join(
290            self.app['datacenter'].storage, 'logs', 'main.log')
291        logcontent = open(logfile).read()
292
293        self.assertTrue(
294            'INFO - zope.mgr - %s - Document created' % document.document_id
295            in logcontent)
296        self.assertTrue(
297            'INFO - zope.mgr - documents.browser.DocumentAddFormPage - added: HTML Document %s'
298            % document.document_id in logcontent)
299        self.assertTrue(
300            'INFO - zope.mgr - documents.browser.HTMLDocumentManageFormPage - %s - saved: title + html_multilingual'
301            % document.document_id in logcontent)
302        self.assertTrue(
303            'INFO - zope.mgr - %s - Document published' % document.document_id
304            in logcontent)
305        self.assertTrue(
306            'INFO - zope.mgr - documents.browser.DocumentsContainerManageFormPage - removed: %s'
307            % document.document_id in logcontent)
308
309    def test_manage_rest_document(self):
310        # Managers can access the pages of documentsconter
311        # and can perform actions
312        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
313        self.browser.open('http://localhost/app')
314        self.assertEqual(self.browser.headers['Status'], '200 Ok')
315        self.browser.getLink("Documents").click()
316        self.assertEqual(self.browser.url, self.container_path)
317        self.browser.getLink("Manage").click()
318        self.browser.getControl("Add document").click()
319        self.browser.getControl(name="doctype").value = ['RESTDocument']
320        self.browser.getControl(name="form.document_id").value = 'DOC3'
321        self.browser.getControl(name="form.title").value = 'My REST Document'
322        self.browser.getControl("Add document").click()
323        self.assertTrue('REST Document added.' in self.browser.contents)
324        document = self.app['documents']['DOC3']
325
326        # Document can be edited
327        self.browser.getControl(name="form.rest_multilingual").value = """
328----------
329Main Title
330----------
331
332Subtitle
333========
334>>de<<
335----------
336Haupttitel
337----------
338
339Untertitel
340==========
341"""
342        self.browser.getControl("Save").click()
343        self.assertTrue('Form has been saved.' in self.browser.contents)
344        self.browser.getLink("View").click()
345        self.assertEqual(self.browser.url, self.container_path + '/DOC3/index')
346        self.assertTrue(
347            '<h1 class="title">Main Title</h1>' in self.browser.contents)
348        self.assertTrue(
349            '<h2 class="subtitle" id="subtitle">Subtitle</h2>'
350            in self.browser.contents)
351        self.assertFalse(
352            '<h1 class="title">Haupttitel</h1>' in self.browser.contents)
353        self.browser.getLink("de", index=2).click()
354        self.assertFalse(
355            '<h1 class="title">Main Title</h1>' in self.browser.contents)
356        self.assertTrue(
357            '<h1 class="title">Haupttitel</h1>' in self.browser.contents)
358        # The content can be rendered
359        IWorkflowState(document).setState(PUBLISHED)
360        self.browser.open(self.container_path + '/DOC3/display')
361        self.assertTrue(
362            '<h1 class="title">Haupttitel</h1>' in self.browser.contents)
363        # The page label (object title) is not displayed
364        self.assertFalse(
365            '<h1 class="kofa-content-label">My REST Document</h1>'
366            in self.browser.contents)
Note: See TracBrowser for help on using the repository browser.