import io import os import re import xml.etree.ElementTree as ET from unittest import mock import pytest from quixote.http_request import Upload as QuixoteUpload from webtest import Upload from wcs import fields from wcs.carddef import CardDef from wcs.categories import WorkflowCategory from wcs.formdef import FormDef from wcs.mail_templates import MailTemplate from wcs.qommon.errors import ConnectionError from wcs.qommon.form import UploadedFile from wcs.qommon.http_request import HTTPRequest from wcs.wf.create_carddata import CreateCarddataWorkflowStatusItem from wcs.wf.create_formdata import CreateFormdataWorkflowStatusItem, Mapping from wcs.wf.dispatch import DispatchWorkflowStatusItem from wcs.wf.edit_carddata import EditCarddataWorkflowStatusItem from wcs.wf.export_to_model import ExportToModel from wcs.wf.external_workflow import ExternalWorkflowGlobalAction from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef from wcs.wf.jump import JumpWorkflowStatusItem from wcs.wf.redirect_to_url import RedirectToUrlWorkflowStatusItem from wcs.wf.register_comment import RegisterCommenterWorkflowStatusItem from wcs.wf.roles import AddRoleWorkflowStatusItem, RemoveRoleWorkflowStatusItem from wcs.wf.wscall import WebserviceCallStatusItem from wcs.workflows import ( ChoiceWorkflowStatusItem, CommentableWorkflowStatusItem, DisplayMessageWorkflowStatusItem, JumpOnSubmitWorkflowStatusItem, SendmailWorkflowStatusItem, Workflow, WorkflowBackofficeFieldsFormDef, WorkflowCriticalityLevel, WorkflowVariablesFieldsFormDef, item_classes, ) from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login from .test_all import create_superuser def pytest_generate_tests(metafunc): if 'pub' in metafunc.fixturenames: metafunc.parametrize('pub', ['pickle', 'sql'], indirect=True) @pytest.fixture def pub(request): pub = create_temporary_pub(sql_mode=bool('sql' in request.param)) req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'}) pub.set_app_dir(req) pub.cfg['identification'] = {'methods': ['password']} pub.cfg['language'] = {'language': 'en'} pub.write_cfg() return pub def teardown_module(module): clean_temporary_pub() def test_workflows(pub): create_superuser(pub) app = login(get_app(pub)) app.get('/backoffice/workflows/') def test_workflows_default(pub): create_superuser(pub) app = login(get_app(pub)) resp = app.get('/backoffice/workflows/') assert 'Default' in resp.text resp = resp.click(href=r'^_default/') assert 'Just Submitted' in resp.text assert 'This is the default workflow' in resp.text # makes sure it cannot be edited assert 'Edit' not in resp.text # and makes sure status are not editable either resp = resp.click('Just Submitted') assert '

Just Submitted' in resp.text assert 'Change Status Name' not in resp.text assert 'Delete' not in resp.text def test_workflows_new(pub): create_superuser(pub) Workflow.wipe() app = login(get_app(pub)) resp = app.get('/backoffice/workflows/') # create a new workflow resp = resp.click('New Workflow') resp.forms[0]['name'] = 'a new workflow' resp = resp.forms[0].submit('submit') assert resp.location == 'http://example.net/backoffice/workflows/1/' resp = resp.follow() assert 'There are not yet any status defined in this workflow' in resp.text assert 'Dispatch Type: Multiple' '
  • Rules: ' '' '
  • ' ) in resp.text assert ( '
  • Dispatch Type: Simple
  • ' '
  • Role: foobar
  • ' ) in resp.text def test_workflows_unused(pub): create_superuser(pub) FormDef.wipe() Workflow.wipe() app = login(get_app(pub)) resp = app.get('/backoffice/workflows/') assert 'Unused' not in resp.text workflow = Workflow(name='Workflow One') workflow.store() resp = app.get('/backoffice/workflows/') assert 'Unused' in resp.text formdef = FormDef() formdef.name = 'form title' formdef.fields = [] formdef.store() resp = app.get('/backoffice/workflows/') assert 'Unused' in resp.text formdef.workflow = workflow formdef.store() resp = app.get('/backoffice/workflows/') assert 'Unused' not in resp.text workflow = Workflow(name='Workflow Two') workflow.store() resp = app.get('/backoffice/workflows/') assert 'Unused' in resp.text def test_workflows_categories_in_index(pub): create_superuser(pub) FormDef.wipe() Workflow.wipe() WorkflowCategory.wipe() wf1 = Workflow(name='wf1') wf1.store() wf2 = Workflow(name='wf2') wf2.store() app = login(get_app(pub)) resp = app.get('/backoffice/workflows/') assert 'Uncategorised' not in resp.text cat = WorkflowCategory(name='XcategoryY') cat.store() resp = app.get('/backoffice/workflows/') assert 'Uncategorised' in resp.text assert 'XcategoryY' not in resp.text wf2.category_id = cat.id wf2.store() resp = app.get('/backoffice/workflows/') assert 'Uncategorised' in resp.text assert 'XcategoryY' in resp.text def test_workflow_category_management_roles(pub, backoffice_user, backoffice_role): app = login(get_app(pub), username='backoffice-user', password='backoffice-user') app.get('/backoffice/workflows/', status=403) WorkflowCategory.wipe() cat = WorkflowCategory(name='Foo') cat.store() Workflow.wipe() workflow = Workflow() workflow.name = 'workflow title' workflow.category_id = cat.id workflow.store() cat = WorkflowCategory(name='Bar') cat.management_roles = [backoffice_role] cat.store() resp = app.get('/backoffice/workflows/') assert 'Foo' not in resp.text # not a category managed by user assert 'workflow title' not in resp.text # workflow in that category assert 'Bar' not in resp.text # not yet any form in this category resp = resp.click('New Workflow') resp.forms[0]['name'] = 'workflow in category' assert len(resp.forms[0]['category_id'].options) == 1 # single option assert resp.forms[0]['category_id'].value == cat.id # the category managed by user resp = resp.forms[0].submit().follow() # check category select only let choose one resp = resp.click(href='category') assert len(resp.forms[0]['category_id'].options) == 1 # single option assert resp.forms[0]['category_id'].value == cat.id # the category managed by user resp = app.get('/backoffice/workflows/') assert 'Bar' in resp.text # now there's a form in this category assert 'workflow in category' in resp.text # no access to subdirectories assert 'href="categories/"' not in resp.text assert 'href="data-sources/"' not in resp.text assert 'href="mail-templates/"' not in resp.text app.get('/backoffice/workflows/categories/', status=403) app.get('/backoffice/workflows/data-sources/', status=403) app.get('/backoffice/workflows/mail-templates/', status=403) # no import into other category workflow_xml = ET.tostring(workflow.export_to_xml(include_id=True)) resp = resp.click(href='import') resp.forms[0]['file'] = Upload('workflow.wcs', workflow_xml) resp = resp.forms[0].submit() assert 'Invalid File (unauthorized category)' in resp.text # access to default workflows app.get('/backoffice/workflows/_carddef_default/') resp = app.get('/backoffice/workflows/_default/') # duplicate on default workflows should open a dialog resp = resp.click(href='duplicate') assert len(resp.forms[0]['category_id'].options) == 1 # single option resp = resp.forms[0].submit('cancel').follow() resp = resp.click(href='duplicate') resp = resp.forms[0].submit('submit').follow()