11from datetime import datetime
2+ from ftw .builder import Builder
3+ from ftw .builder import create
24from ftw .testbrowser import browsing
35from ftw .testing import freeze
46from opengever .dossier .resolve import LockingResolveManager
57from opengever .testing import IntegrationTestCase
68from plone import api
9+ import json
710
811
912class TestDossierWorkflowRESTAPITransitions (IntegrationTestCase ):
@@ -21,12 +24,14 @@ def assert_state(self, expected_state, obj):
2124 self .assertEquals (expected_state ,
2225 api .content .get_state (obj ))
2326
24- def api_transition (self , obj , transition , browser ):
27+ def api_transition (self , obj , transition , browser , data = None ):
2528 url = '/' .join ((obj .absolute_url (), '@workflow' , transition ))
2629 browser .open (
2730 url ,
28- headers = {'Accept' : 'application/json' },
29- method = 'POST' )
31+ headers = self .api_headers ,
32+ method = 'POST' ,
33+ data = data
34+ )
3035
3136 @browsing
3237 def test_resolve_via_restapi (self , browser ):
@@ -199,3 +204,77 @@ def test_archive_offered_via_restapi_is_forbidden(self, browser):
199204 {u'message' : u"Invalid transition 'dossier-transition-archive'.\n Valid transitions are:\n " ,
200205 u'type' : u'Bad Request' }},
201206 browser .json )
207+
208+ @browsing
209+ def test_resolve_dossier_auto_close_tasks (self , browser ):
210+
211+ self .login (self .secretariat_user , browser )
212+
213+ open_task = create (
214+ Builder ('task' )
215+ .within (self .resolvable_subdossier )
216+ .in_state ('task-state-open' )
217+ .titled (u'Task 1' )
218+ .having (
219+ issuer = self .secretariat_user .id ,
220+ responsible = self .secretariat_user .id ,
221+ responsible_client = 'fa' ,
222+ )
223+ )
224+ in_progress_task = create (
225+ Builder ('task' )
226+ .within (self .resolvable_subdossier )
227+ .in_state ('task-state-in-progress' )
228+ .titled (u'Task 2' )
229+ .having (
230+ issuer = self .secretariat_user .id ,
231+ responsible = self .secretariat_user .id ,
232+ responsible_client = 'fa' ,
233+ task_type = 'approval' ,
234+ )
235+ )
236+ resolved_task = create (
237+ Builder ('task' )
238+ .within (self .resolvable_subdossier )
239+ .in_state ('task-state-resolved' )
240+ .titled (u'Task 3' )
241+ .having (
242+ issuer = self .secretariat_user .id ,
243+ responsible = self .secretariat_user .id ,
244+ responsible_client = 'fa' ,
245+ )
246+ )
247+ with freeze (datetime (2018 , 4 , 30 )):
248+ with browser .expect_http_error ():
249+ self .api_transition (self .resolvable_subdossier , 'dossier-transition-resolve' , browser )
250+ self .assertEqual (400 , browser .status_code )
251+ self .assertDictEqual (
252+ {
253+ u'error' : {u'message' : u'' , u'errors' : [u'not all task are closed' ], u'type' : u'PreconditionsViolated' }
254+ },
255+ browser .json )
256+
257+ # dossier and tasks state did not change
258+ self .assert_state ('dossier-state-active' , self .resolvable_subdossier )
259+
260+ self .assert_state ('task-state-open' , open_task )
261+ self .assert_state ('task-state-in-progress' , in_progress_task )
262+ self .assert_state ('task-state-resolved' , resolved_task )
263+
264+ with freeze (datetime (2018 , 4 , 30 )):
265+
266+ self .api_transition (
267+ self .resolvable_subdossier ,
268+ 'dossier-transition-resolve' ,
269+ browser ,
270+ data = json .dumps ({"auto_close_tasks" : True })
271+ )
272+
273+ self .assertEqual (200 , browser .status_code )
274+
275+ # dossier and tasks states were changed
276+ self .assert_state ('dossier-state-resolved' , self .resolvable_subdossier )
277+
278+ self .assert_state ('task-state-cancelled' , open_task )
279+ self .assert_state ('task-state-tested-and-closed' , in_progress_task )
280+ self .assert_state ('task-state-tested-and-closed' , resolved_task )
0 commit comments