|
6 | 6 | from datetime import timedelta |
7 | 7 | from imio.esign.browser.views import DownloadFileView |
8 | 8 | from imio.esign.browser.views import ExternalSessionCreateView |
| 9 | +from imio.esign.browser.views import ItemSessionInfoViewlet |
9 | 10 | from imio.esign.browser.views import SessionDeleteView |
10 | 11 | from imio.esign.testing import IMIO_ESIGN_FUNCTIONAL_TESTING |
11 | 12 | from imio.esign.testing import IMIO_ESIGN_INTEGRATION_TESTING |
@@ -393,3 +394,96 @@ def test_download_file_view(self): |
393 | 394 | self.assertIn("The corresponding file identifier cannot be retrieved (aabbccddee)", browser.contents) |
394 | 395 | browser.open("{}/download-file/{}".format(portal_url, "aabbccddee?param=value")) |
395 | 396 | self.assertIn("The corresponding file identifier cannot be retrieved (aabbccddee)", browser.contents) |
| 397 | + |
| 398 | + |
| 399 | +class TestItemSessionInfoViewlet(unittest.TestCase): |
| 400 | + """Test ItemSessionInfoViewlet multi-session support.""" |
| 401 | + |
| 402 | + layer = IMIO_ESIGN_INTEGRATION_TESTING |
| 403 | + |
| 404 | + def setUp(self): |
| 405 | + self.portal = self.layer["portal"] |
| 406 | + self.request = self.portal.REQUEST |
| 407 | + setRoles(self.portal, TEST_USER_ID, ["Manager"]) |
| 408 | + at_folder = api.content.create( |
| 409 | + container=self.portal, id="annexes_types", title="Annexes Types", |
| 410 | + type="ContentCategoryConfiguration", exclude_from_nav=True, |
| 411 | + ) |
| 412 | + category_group = api.content.create( |
| 413 | + type="ContentCategoryGroup", title="Annexes", |
| 414 | + container=at_folder, id="annexes", |
| 415 | + ) |
| 416 | + icon_path = os.path.join( |
| 417 | + os.path.dirname(collective.iconifiedcategory.__file__), "tests", u"ic\xf4ne1.png" |
| 418 | + ) |
| 419 | + with open(icon_path, "rb") as fl: |
| 420 | + api.content.create( |
| 421 | + type="ContentCategory", title="To sign", |
| 422 | + container=category_group, |
| 423 | + icon=NamedBlobImage(fl.read(), filename=u"ic\xf4ne1.png"), |
| 424 | + id="to_sign", predefined_title="To be signed", |
| 425 | + to_sign=True, show_preview=False, |
| 426 | + ) |
| 427 | + api.user.create(email="user1@sign.com", username="user1", password="password1") |
| 428 | + self.folder = api.content.create( |
| 429 | + container=self.portal, type="Folder", |
| 430 | + id="test_folder", title="Test Folder", |
| 431 | + ) |
| 432 | + tests_dir = os.path.dirname(__file__) |
| 433 | + self.annexes = [] |
| 434 | + for i in range(2): |
| 435 | + with open(os.path.join(tests_dir, "annex1.pdf"), "rb") as f: |
| 436 | + annex = api.content.create( |
| 437 | + container=self.folder, type="annex", |
| 438 | + id="annex{}".format(i), title="Annex {}".format(i), |
| 439 | + content_category=calculate_category_id( |
| 440 | + self.portal["annexes_types"]["annexes"]["to_sign"] |
| 441 | + ), |
| 442 | + scan_id="0123456000000{:02d}".format(i), |
| 443 | + file=NamedBlobFile( |
| 444 | + data=f.read(), filename=u"annex{}.pdf".format(i), |
| 445 | + contentType="application/pdf", |
| 446 | + ), |
| 447 | + ) |
| 448 | + self.annexes.append(annex) |
| 449 | + self.signers = [("user1", "user1@sign.com", "User 1", "Position 1")] |
| 450 | + for key in list(self.request.form.keys()): |
| 451 | + del self.request.form[key] |
| 452 | + |
| 453 | + def test_sessions_empty(self): |
| 454 | + """No files in esign annotation → sessions returns empty list.""" |
| 455 | + viewlet = ItemSessionInfoViewlet(self.folder, self.request, None, None) |
| 456 | + self.assertEqual(viewlet.sessions, []) |
| 457 | + self.assertEqual(viewlet.render(), "") |
| 458 | + |
| 459 | + def test_sessions_single_session(self): |
| 460 | + """All context files in one session → sessions returns one dict.""" |
| 461 | + uids = [a.UID() for a in self.annexes] |
| 462 | + add_files_to_session(self.signers, uids) |
| 463 | + viewlet = ItemSessionInfoViewlet(self.folder, self.request, None, None) |
| 464 | + sessions = viewlet.sessions |
| 465 | + self.assertEqual(len(sessions), 1) |
| 466 | + self.assertEqual(sessions[0]["id"], 0) |
| 467 | + |
| 468 | + def test_sessions_multiple_sessions(self): |
| 469 | + """Files in two sessions (different discriminators) → sessions returns two dicts.""" |
| 470 | + add_files_to_session(self.signers, [self.annexes[0].UID()], discriminators=("a",)) |
| 471 | + add_files_to_session(self.signers, [self.annexes[1].UID()], discriminators=("b",)) |
| 472 | + viewlet = ItemSessionInfoViewlet(self.folder, self.request, None, None) |
| 473 | + sessions = viewlet.sessions |
| 474 | + self.assertEqual(len(sessions), 2) |
| 475 | + session_ids = {s["id"] for s in sessions} |
| 476 | + self.assertEqual(session_ids, {0, 1}) |
| 477 | + |
| 478 | + rendered_ids = [] |
| 479 | + def mock_index(): |
| 480 | + rendered_ids.append(viewlet._current_session["id"]) |
| 481 | + return u"<div>session {}</div>".format(viewlet._current_session["id"]) |
| 482 | + viewlet.index = mock_index |
| 483 | + result = viewlet.render() |
| 484 | + self.assertEqual(len(rendered_ids), 2) |
| 485 | + self.assertIn(0, rendered_ids) |
| 486 | + self.assertIn(1, rendered_ids) |
| 487 | + self.assertIn(u"<div>session 0</div>", result) |
| 488 | + self.assertIn(u"<div>session 1</div>", result) |
| 489 | + self.assertIsNone(viewlet._current_session) |
0 commit comments