@@ -251,125 +251,6 @@ def test_add_remove_files_to_session(self):
251251 self .assertEqual (len (annot ["c_uids" ]), 0 )
252252 self .assertEqual (len (annot ["sessions" ]), 0 )
253253
254- def test_create_external_session (self ):
255- """Test create_external_session with mocked requests.post and get_auth_token."""
256- from mock import MagicMock
257- from mock import patch
258-
259- # Case 1: session not found => returns sentinel string, no HTTP call made
260- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
261- patch ('imio.esign.utils.requests' ) as mock_requests :
262- result = create_external_session (999 )
263- self .assertEqual (result , "_session_not_found_" )
264- mock_requests .post .assert_not_called ()
265-
266- # Setup: create a session with two signers and a watcher
267- signers = [
268- ("user1" , "user1@sign.com" , "User 1" , "Position 1" ),
269- ("user2" , "user2@sign.com" , "User 2" , "Position 2" ),
270- ]
271- sid , session = add_files_to_session (
272- signers , (self .uids [0 ], self .uids [2 ],), title = u"Test session" , watchers = ("watcher@sign.com" ,)
273- )
274- self .assertEqual (sid , 0 )
275- self .assertEqual (session ["state" ], "draft" )
276-
277- # Case 2: HTTP 200 => state becomes "sent", request payload is verified
278- mock_response = MagicMock ()
279- mock_response .status_code = 200
280- mock_response .text = '{"message": "Request received"}'
281- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
282- patch ('imio.esign.utils.requests' ) as mock_requests :
283- mock_requests .post .return_value = mock_response
284- result = create_external_session (sid )
285- self .assertIs (result , mock_response )
286- self .assertEqual (session ["state" ], "sent" )
287- mock_requests .post .assert_called_once ()
288- call_args = mock_requests .post .call_args
289- posted_url = call_args [0 ][0 ]
290- self .assertIn ("imio/esign/v1/luxtrust/sessions" , posted_url )
291- self .assertEqual (call_args [1 ]["headers" ]["Authorization" ], "Bearer test_token" )
292- data = json .loads (call_args [1 ]["data" ]["data" ])
293- self .assertIn ("commonData" , data )
294- self .assertIn ("signData" , data )
295- self .assertNotIn ("sealData" , data )
296- self .assertEqual (data ["commonData" ]["sessionName" ], u"Test session" )
297- self .assertEqual (data ["commonData" ]["imioAppSessionId" ], session ["sign_id" ])
298- self .assertEqual (data ["signData" ]["users" ], ["user1@sign.com" , "user2@sign.com" ])
299- self .assertEqual (data ["signData" ]["watchers" ], ["watcher@sign.com" ])
300- files_param = call_args [1 ]["files" ]
301- self .assertEqual (len (files_param ), 2 )
302- self .assertEqual (files_param [0 ][0 ], "files" )
303- self .assertEqual (files_param [0 ][1 ][0 ], u"annex0.pdf" )
304- self .assertEqual (files_param [1 ][0 ], "files" )
305- self .assertEqual (files_param [1 ][1 ][0 ], u"annex2.pdf" )
306-
307- # Case 3: HTTP non-200 => state unchanged (stays "draft")
308- sid2 , session2 = add_files_to_session (signers , (self .uids [2 ],), title = u"Test session 2" )
309- mock_response_fail = MagicMock ()
310- mock_response_fail .status_code = 400
311- mock_response_fail .text = '{"error": "Bad request"}'
312- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
313- patch ('imio.esign.utils.requests' ) as mock_requests :
314- mock_requests .post .return_value = mock_response_fail
315- result = create_external_session (sid2 )
316- self .assertIs (result , mock_response_fail )
317- self .assertEqual (session2 ["state" ], "draft" )
318-
319- # Case 4: seal session without seal_code configured => returns "_no_seal_code_", no HTTP call
320- api .portal .set_registry_record ("imio.esign.seal_email" , u"seal@example.com" )
321- annex0_obj = uuidToObject (uuid = self .uids [0 ], unrestricted = True )
322- annex0_obj .file .filename = u"annex1.pdf"
323- sid3 , session3 = add_files_to_session (signers , (self .uids [4 ], self .uids [1 ], self .uids [0 ]), seal = "PADES_SEAL" )
324- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
325- patch ('imio.esign.utils.requests' ) as mock_requests :
326- result = create_external_session (sid3 )
327- self .assertEqual (result , "_no_seal_code_" )
328- mock_requests .post .assert_not_called ()
329-
330- # Case 5: seal session with seal_code, custom URL => sealData in payload, correct URL used
331- api .portal .set_registry_record ("imio.esign.seal_code" , u"PADES_SEAL" )
332- api .portal .set_registry_record ("imio.esign.seal_email" , u"seal@example.com" )
333- mock_response_seal = MagicMock ()
334- mock_response_seal .status_code = 200
335- mock_response_seal .text = '{"message": "OK"}'
336- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
337- patch ('imio.esign.utils.requests' ) as mock_requests :
338- mock_requests .post .return_value = mock_response_seal
339- result = create_external_session (sid3 , esign_root_url = "https://custom.example.com" )
340- self .assertIs (result , mock_response_seal )
341- self .assertEqual (session3 ["state" ], "sent" )
342- call_args = mock_requests .post .call_args
343- self .assertEqual (call_args [0 ][0 ], "https://custom.example.com/imio/esign/v1/luxtrust/sessions" )
344- data = json .loads (call_args [1 ]["data" ]["data" ])
345- self .assertIn ("sealData" , data )
346- self .assertEqual (data ["sealData" ]["sealCode" ], "PADES_SEAL" )
347- self .assertEqual (data ["sealData" ]["users" ], ["seal@example.com" ])
348- self .assertTrue (data ["sealData" ]["acroform" ])
349- files_param = call_args [1 ]["files" ]
350- self .assertEqual (len (files_param ), 3 )
351- self .assertEqual (files_param [0 ][0 ], "files" )
352- self .assertEqual (files_param [0 ][1 ][0 ], u"annex4.pdf" )
353- self .assertEqual (files_param [1 ][0 ], "files" )
354- self .assertEqual (files_param [1 ][1 ][0 ], u"annex1.pdf" )
355- self .assertEqual (files_param [2 ][1 ][0 ], u"annex1-1.pdf" )
356-
357- # Case 6: session without files to send => returns "_no_files_", no HTTP call
358- for i in range (len (session3 ["files" ])):
359- session3 ["files" ][i ]["uid" ] = "nonexistent_uid_{}" .format (i )
360- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
361- patch ('imio.esign.utils.requests' ) as mock_requests :
362- result = create_external_session (sid3 )
363- self .assertEqual (result , "_no_files_" )
364- mock_requests .post .assert_not_called ()
365-
366- # case 7: bad session number to send => returns "_session_not_found_", no HTTP call
367- with patch ('imio.esign.utils.get_auth_token' , return_value = 'test_token' ), \
368- patch ('imio.esign.utils.requests' ) as mock_requests :
369- result = create_external_session (99 )
370- self .assertEqual (result , "_session_not_found_" )
371- mock_requests .post .assert_not_called ()
372-
373254 def test_get_filesize (self ):
374255 """Test get_filesize returns the correct file size."""
375256 # even index => annex1.pdf (6968 bytes)
@@ -617,6 +498,7 @@ def test_create_external_session_seal_payload(self):
617498 with patch ("imio.esign.utils.requests.post" , return_value = mock_response ) as mock_post :
618499 with patch ("imio.esign.utils.get_auth_token" , return_value = "test-token" ):
619500 create_external_session (sid , esign_root_url = "http://test.example.com" )
501+ self .assertEqual (mock_post .call_args [0 ][0 ], "http://test.example.com/imio/esign/v1/luxtrust/sessions" )
620502 payload = json .loads (mock_post .call_args [1 ]["data" ]["data" ])
621503 self .assertEqual (
622504 payload ,
@@ -684,6 +566,15 @@ def test_create_external_session_both_payload(self):
684566 },
685567 )
686568
569+ def test_create_external_session_no_files (self ):
570+ """Returns _no_files_ when all file UIDs in the session resolve to nothing."""
571+ signers = [("user1" , "user1@sign.com" , "User 1" , "Position 1" )]
572+ sid , session = add_files_to_session (signers , (self .uids [0 ],))
573+ for i in range (len (session ["files" ])):
574+ session ["files" ][i ]["uid" ] = "nonexistent_uid_{}" .format (i )
575+ result = create_external_session (sid , esign_root_url = "http://test.example.com" )
576+ self .assertEqual (result , "_no_files_" )
577+
687578
688579# example of annotation content
689580"""
0 commit comments