|
1 | 1 | # -*- coding: utf-8 -*- |
2 | 2 | """Browser views tests for this package.""" |
| 3 | +from collective.iconifiedcategory.utils import calculate_category_id |
3 | 4 | from datetime import datetime |
4 | 5 | from datetime import timedelta |
5 | 6 | from imio.esign.browser.views import DownloadFileView |
| 7 | +from imio.esign.browser.views import ItemSessionInfoViewlet |
6 | 8 | from imio.esign.testing import IMIO_ESIGN_FUNCTIONAL_TESTING |
| 9 | +from imio.esign.testing import IMIO_ESIGN_INTEGRATION_TESTING |
| 10 | +from imio.esign.utils import add_files_to_session |
7 | 11 | from imio.pyutils.utils import shortuid_encode_id |
8 | 12 | from plone import api |
9 | 13 | from plone.app.testing import logout |
@@ -158,3 +162,95 @@ def test_download_file_view(self): |
158 | 162 | browser.open("{}/download-file/{}".format(portal_url, "aabbccddee?param=value")) |
159 | 163 | self.assertIn("The corresponding file identifier cannot be retrieved (aabbccddee)", browser.contents) |
160 | 164 |
|
| 165 | + |
| 166 | +class TestItemSessionInfoViewlet(unittest.TestCase): |
| 167 | + """Test ItemSessionInfoViewlet multi-session support.""" |
| 168 | + |
| 169 | + layer = IMIO_ESIGN_INTEGRATION_TESTING |
| 170 | + |
| 171 | + def setUp(self): |
| 172 | + self.portal = self.layer["portal"] |
| 173 | + self.request = self.portal.REQUEST |
| 174 | + setRoles(self.portal, TEST_USER_ID, ["Manager"]) |
| 175 | + at_folder = api.content.create( |
| 176 | + container=self.portal, id="annexes_types", title="Annexes Types", |
| 177 | + type="ContentCategoryConfiguration", exclude_from_nav=True, |
| 178 | + ) |
| 179 | + category_group = api.content.create( |
| 180 | + type="ContentCategoryGroup", title="Annexes", |
| 181 | + container=at_folder, id="annexes", |
| 182 | + ) |
| 183 | + icon_path = os.path.join( |
| 184 | + os.path.dirname(collective.iconifiedcategory.__file__), "tests", u"ic\xf4ne1.png" |
| 185 | + ) |
| 186 | + with open(icon_path, "rb") as fl: |
| 187 | + api.content.create( |
| 188 | + type="ContentCategory", title="To sign", |
| 189 | + container=category_group, |
| 190 | + icon=NamedBlobImage(fl.read(), filename=u"ic\xf4ne1.png"), |
| 191 | + id="to_sign", predefined_title="To be signed", |
| 192 | + to_sign=True, show_preview=False, |
| 193 | + ) |
| 194 | + api.user.create(email="user1@sign.com", username="user1", password="password1") |
| 195 | + self.folder = api.content.create( |
| 196 | + container=self.portal, type="Folder", |
| 197 | + id="test_folder", title="Test Folder", |
| 198 | + ) |
| 199 | + tests_dir = os.path.dirname(__file__) |
| 200 | + self.annexes = [] |
| 201 | + for i in range(2): |
| 202 | + with open(os.path.join(tests_dir, "annex1.pdf"), "rb") as f: |
| 203 | + annex = api.content.create( |
| 204 | + container=self.folder, type="annex", |
| 205 | + id="annex{}".format(i), title="Annex {}".format(i), |
| 206 | + content_category=calculate_category_id( |
| 207 | + self.portal["annexes_types"]["annexes"]["to_sign"] |
| 208 | + ), |
| 209 | + scan_id="0123456000000{:02d}".format(i), |
| 210 | + file=NamedBlobFile( |
| 211 | + data=f.read(), filename=u"annex{}.pdf".format(i), |
| 212 | + contentType="application/pdf", |
| 213 | + ), |
| 214 | + ) |
| 215 | + self.annexes.append(annex) |
| 216 | + self.signers = [("user1", "user1@sign.com", "User 1", "Position 1")] |
| 217 | + for key in list(self.request.form.keys()): |
| 218 | + del self.request.form[key] |
| 219 | + |
| 220 | + def test_sessions_empty(self): |
| 221 | + """No files in esign annotation → sessions returns empty list.""" |
| 222 | + viewlet = ItemSessionInfoViewlet(self.folder, self.request, None, None) |
| 223 | + self.assertEqual(viewlet.sessions, []) |
| 224 | + self.assertEqual(viewlet.render(), "") |
| 225 | + |
| 226 | + def test_sessions_single_session(self): |
| 227 | + """All context files in one session → sessions returns one dict.""" |
| 228 | + uids = [a.UID() for a in self.annexes] |
| 229 | + add_files_to_session(self.signers, uids) |
| 230 | + viewlet = ItemSessionInfoViewlet(self.folder, self.request, None, None) |
| 231 | + sessions = viewlet.sessions |
| 232 | + self.assertEqual(len(sessions), 1) |
| 233 | + self.assertEqual(sessions[0]["id"], 0) |
| 234 | + |
| 235 | + def test_sessions_multiple_sessions(self): |
| 236 | + """Files in two sessions (different discriminators) → sessions returns two dicts.""" |
| 237 | + add_files_to_session(self.signers, [self.annexes[0].UID()], discriminators=("a",)) |
| 238 | + add_files_to_session(self.signers, [self.annexes[1].UID()], discriminators=("b",)) |
| 239 | + viewlet = ItemSessionInfoViewlet(self.folder, self.request, None, None) |
| 240 | + sessions = viewlet.sessions |
| 241 | + self.assertEqual(len(sessions), 2) |
| 242 | + session_ids = {s["id"] for s in sessions} |
| 243 | + self.assertEqual(session_ids, {0, 1}) |
| 244 | + |
| 245 | + rendered_ids = [] |
| 246 | + def mock_index(): |
| 247 | + rendered_ids.append(viewlet._current_session["id"]) |
| 248 | + return u"<div>session {}</div>".format(viewlet._current_session["id"]) |
| 249 | + viewlet.index = mock_index |
| 250 | + result = viewlet.render() |
| 251 | + self.assertEqual(len(rendered_ids), 2) |
| 252 | + self.assertIn(0, rendered_ids) |
| 253 | + self.assertIn(1, rendered_ids) |
| 254 | + self.assertIn(u"<div>session 0</div>", result) |
| 255 | + self.assertIn(u"<div>session 1</div>", result) |
| 256 | + self.assertIsNone(viewlet._current_session) |
0 commit comments