From d537d43b5b52fe08d53cb28315021521a1c1b16f Mon Sep 17 00:00:00 2001 From: Alexander Bychinskiy Date: Mon, 6 Jul 2026 12:03:12 +0300 Subject: [PATCH] test(artifacts): fix CI-breaking fixture gap + post-merge review findings (PR #123 follow-up) The @artifacts suite (TC-030..043) could never actually run in CI: its 24 fixture files lived only under the gitignored, local-only Elitea-testing-WebQAPreExecuted/Elitea_test_data/artifacts/ directory, so every fixturePath() call resolved to a path absent on a fresh checkout. Established tests/fixtures/artifacts/ as this project's first committed- binary-fixture convention and copied the 24 needed files there (SHA-256 verified byte-identical). test-large-image.png (27MB) is generated in-memory instead of committed (buildOversizedImagePayload()). Also fixed the .gitignore case-typo that made this invisible locally. Also addresses post-merge review findings: strengthened 5 assertions that only checked toBeVisible()/a trivial regex where their own AFS calls for real content-specific proof; fixed TC-035's GH#114 chat-modal check (a src-attribute comparison that could never detect GIF animation) to use the same screenshot-diff technique its sibling check already uses; implemented TC-034's claimed size/bounding-box comparison; row-scoped messageThumbnail() to match its siblings; added TC-036's missing download.failure() assertion and its own assistant-reply wait; and added real teardown to TC-043 (was permanently leaking 10 files/run). --- .gitignore | 2 +- .../l3_upload-11-images-reject_TC-043.md | 8 +- tests/artifacts.spec.ts | 304 ++++++++++++++---- tests/fixtures/artifacts/test-animated.gif | Bin 0 -> 14866 bytes tests/fixtures/artifacts/test-batch-01.png | Bin 0 -> 8078 bytes tests/fixtures/artifacts/test-batch-02.png | Bin 0 -> 10448 bytes tests/fixtures/artifacts/test-batch-03.png | Bin 0 -> 8945 bytes tests/fixtures/artifacts/test-batch-04.png | Bin 0 -> 7261 bytes tests/fixtures/artifacts/test-batch-05.png | Bin 0 -> 7676 bytes tests/fixtures/artifacts/test-batch-06.png | Bin 0 -> 7986 bytes tests/fixtures/artifacts/test-batch-07.png | Bin 0 -> 8516 bytes tests/fixtures/artifacts/test-batch-08.png | Bin 0 -> 10937 bytes tests/fixtures/artifacts/test-batch-09.png | Bin 0 -> 8381 bytes tests/fixtures/artifacts/test-batch-1.png | Bin 0 -> 6925 bytes tests/fixtures/artifacts/test-batch-10.png | Bin 0 -> 8479 bytes tests/fixtures/artifacts/test-batch-11.png | Bin 0 -> 7925 bytes tests/fixtures/artifacts/test-batch-2.jpg | Bin 0 -> 13760 bytes tests/fixtures/artifacts/test-batch-3.png | Bin 0 -> 6886 bytes .../fixtures/artifacts/test-delete-target.png | Bin 0 -> 5502 bytes tests/fixtures/artifacts/test-document.pdf | Bin 0 -> 606 bytes .../artifacts/test-download-image.png | Bin 0 -> 8692 bytes tests/fixtures/artifacts/test-drag-drop.png | Bin 0 -> 10039 bytes tests/fixtures/artifacts/test-image-small.png | Bin 0 -> 8637 bytes tests/fixtures/artifacts/test-notes.txt | 4 + tests/fixtures/artifacts/test-paste.png | Bin 0 -> 6100 bytes .../fixtures/artifacts/test-preview-image.png | Bin 0 -> 7938 bytes tests/fixtures/artifacts/test-unsupported.exe | 2 + tests/pages/artifacts.page.ts | 27 +- 28 files changed, 284 insertions(+), 63 deletions(-) create mode 100644 tests/fixtures/artifacts/test-animated.gif create mode 100644 tests/fixtures/artifacts/test-batch-01.png create mode 100644 tests/fixtures/artifacts/test-batch-02.png create mode 100644 tests/fixtures/artifacts/test-batch-03.png create mode 100644 tests/fixtures/artifacts/test-batch-04.png create mode 100644 tests/fixtures/artifacts/test-batch-05.png create mode 100644 tests/fixtures/artifacts/test-batch-06.png create mode 100644 tests/fixtures/artifacts/test-batch-07.png create mode 100644 tests/fixtures/artifacts/test-batch-08.png create mode 100644 tests/fixtures/artifacts/test-batch-09.png create mode 100644 tests/fixtures/artifacts/test-batch-1.png create mode 100644 tests/fixtures/artifacts/test-batch-10.png create mode 100644 tests/fixtures/artifacts/test-batch-11.png create mode 100644 tests/fixtures/artifacts/test-batch-2.jpg create mode 100644 tests/fixtures/artifacts/test-batch-3.png create mode 100644 tests/fixtures/artifacts/test-delete-target.png create mode 100644 tests/fixtures/artifacts/test-document.pdf create mode 100644 tests/fixtures/artifacts/test-download-image.png create mode 100644 tests/fixtures/artifacts/test-drag-drop.png create mode 100644 tests/fixtures/artifacts/test-image-small.png create mode 100644 tests/fixtures/artifacts/test-notes.txt create mode 100644 tests/fixtures/artifacts/test-paste.png create mode 100644 tests/fixtures/artifacts/test-preview-image.png create mode 100644 tests/fixtures/artifacts/test-unsupported.exe diff --git a/.gitignore b/.gitignore index da1f9af..bf26ff6 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ agents.md .agents /smoke -/Elitea-testing-webQAPreExecuted +/Elitea-testing-WebQAPreExecuted .env # Node / Playwright diff --git a/test-specs/artifacts/l3_upload-11-images-reject_TC-043.md b/test-specs/artifacts/l3_upload-11-images-reject_TC-043.md index c31d7c1..19b622d 100644 --- a/test-specs/artifacts/l3_upload-11-images-reject_TC-043.md +++ b/test-specs/artifacts/l3_upload-11-images-reject_TC-043.md @@ -116,7 +116,7 @@ No new tracker issue filed. This is a genuine pass matching the case's own accep | Step 14: verify only 10 files from batch appear (01–10), not 11 | exactly 10, 11 absent | step 10 | step 10 (pagination footer "1 - 10 of 10" + row-name check) | asserted | | Expected Final State — Ideal (Behavior A) | rejected, nothing sent | — | — | **not applicable** — live product implements Behavior B, not A (case explicitly allows either) | | Expected Final State — Fallback (Behavior B) | truncate to 10, 11th rejected silently/with warning, 10 files uploaded | steps 5–10 | steps 5–10 | asserted — matches almost exactly; the "warning" takes the form of a persistent disabled/ambient composer state, not a transient toast | -| Teardown: "if uploaded (B), delete files 01–10 from artifacts" | cleanup performed | — | — | **out-of-scope by project precedent** — see § Cleanup; this batch's additive, non-destructive uploads follow the same no-cleanup convention already established for TC-001/TC-002/TC-032/TC-036/TC-038 | +| Teardown: "if uploaded (B), delete files 01–10 from artifacts" | cleanup performed | — | outer `finally` teardown, `deleteArtifactAndVerify()` | **asserted** *(amended post-merge review, 2026-07-06 — see § Cleanup; originally deferred as out-of-scope by the TC-001/TC-002/TC-032/TC-036/TC-038 no-cleanup precedent, but that precedent doesn't transfer to a real 10-file storage footprint left on every run with no expiry — automation now deletes this run's own uuid folder)* | | Teardown: "if not uploaded (A), no cleanup needed" | n/a | — | — | **not applicable** — Behavior B occurred, files were uploaded; see prior row for the applicable teardown guidance | ### Axis 2 — Analyst additions @@ -129,9 +129,11 @@ No new tracker issue filed. This is a genuine pass matching the case's own accep - Explicit no-toast check (`[role=alert]`, `[role=status]`, toast/snackbar-class selectors, sampled immediately post-truncation) — *added: rules out a transient warning this AFS's snapshots might otherwise have missed; none found. Documented as a deliberate absence-check, not an omission.* ## Cleanup -The sent 10-image message is **not destructive** — same category as TC-001/TC-002's "chat messages persist, no teardown" precedent, and consistent with TC-032/TC-036/TC-038's cleanup decisions elsewhere in this module. Recommended: **no automated cleanup**, especially given other sibling analysts (TC-039, TC-042) are concurrently mutating the same shared `${TEST_USER}` account this session — an extra delete-after-test step adds one more concurrent mutation for no correctness benefit. +The sent 10-image message is **not destructive** — same category as TC-001/TC-002's "chat messages persist, no teardown" precedent, and consistent with TC-032/TC-036/TC-038's cleanup decisions elsewhere in this module. Originally recommended **no automated cleanup**, especially given other sibling analysts (TC-039, TC-042) are concurrently mutating the same shared `${TEST_USER}` account this session — an extra delete-after-test step adds one more concurrent mutation for no correctness benefit. -If strict account hygiene is later required: +**Amendment (post-merge review, 2026-07-06, implementer): this recommendation is superseded — automation now deletes the 10 retained files in a `finally` teardown, matching TC-042's pattern.** The "no cleanup" reasoning above was sound for a bare chat message (TC-001/002/032/036/038's category: additive, non-destructive, no *storage* cost beyond the message row itself) but doesn't transfer to this case's own Behavior-B path: a real, successful 10-image upload leaves 10 files sitting in the shared, finite Artifacts bucket on every automated run (CI + local + the orchestrator's repeat independent-gate runs), with no compensating expiry — a permanent per-run leak, not a merely-additive record. The concurrency concern that motivated skipping cleanup still doesn't apply: this test's delete only ever touches its OWN uuid folder (captured from its own upload responses), never a sibling's, so it carries no more concurrent-mutation risk than TC-039/TC-042's own teardowns already accept for the identical reason. If a future case in this module ever needs a genuinely non-destructive, no-storage-footprint variant of this scenario, prefer read-only assertions against already-uploaded fixtures over reintroducing an uncleaned batch upload. + +If strict account hygiene is later required beyond the above: 1. Delete the conversation named `Test batch upload of 11 images - expect rejection` (conversation id captured at step 7). 2. Delete the artifact folder `attachments/{uuid}/` (from step 7's response) via the Artifacts UI's row-level delete action. diff --git a/tests/artifacts.spec.ts b/tests/artifacts.spec.ts index 09fc7c0..a0fd55a 100644 --- a/tests/artifacts.spec.ts +++ b/tests/artifacts.spec.ts @@ -134,15 +134,60 @@ const test = base.extend<{ authenticatedPage: Page }, { artifactsStorageState: S }, }); -/** Local, gitignored, pre-generated fixture files shared across this module - * (per `.agents/test-automation.yaml` § additional_sources note) -- - * `Elitea-testing-WebQAPreExecuted/Elitea_test_data/artifacts/*`. */ -const FIXTURES_DIR = path.resolve(__dirname, '..', 'Elitea-testing-WebQAPreExecuted', 'Elitea_test_data', 'artifacts'); +/** + * Committed fixture files shared across this module -- `tests/fixtures/artifacts/`. + * + * **Post-merge review fix (PR #123 follow-up)**: this module originally + * pointed at the gitignored, local-only + * `Elitea-testing-WebQAPreExecuted/Elitea_test_data/artifacts/*` directory + * (per `.agents/test-automation.yaml` § additional_sources) -- which meant + * the fixtures this suite depends on were never committed, so the entire + * `@artifacts` suite could not run in CI at all (every `fixturePath()` call + * resolved to a path that didn't exist on a fresh checkout). Compounding + * this, `.gitignore` carried a case-typo (`webQAPreExecuted` vs. the real + * `WebQAPreExecuted`) that happened to make the gap invisible locally -- + * macOS defaults to a case-insensitive filesystem/git config + * (`core.ignorecase=true`), so `git check-ignore` reported a match despite + * the pattern being wrong; the project's actual CI runner (`ubuntu-latest`) + * is case-sensitive, so the directory was never actually ignored there + * either -- moot only because nothing referenced it from a committed path. + * Fixed by establishing `tests/fixtures/artifacts/` as this project's first + * committed-binary-fixture convention (no prior precedent existed) and + * copying the byte-identical files the module actually needs (verified via + * SHA-256 against the original WebQAPreExecuted copies) so `actions/ + * checkout` alone makes them available in CI -- no separate provisioning + * step required. `test-large-image.png` (27MB, TC-033 only) is deliberately + * NOT among the copied files -- see `buildOversizedImagePayload()` below. + */ +const FIXTURES_DIR = path.resolve(__dirname, 'fixtures', 'artifacts'); function fixturePath(fileName: string): string { return path.join(FIXTURES_DIR, fileName); } +/** + * Builds an in-memory oversized PNG `FilePayload` for TC-033's size-limit + * rejection test, instead of committing a 27MB binary fixture to the repo. + * Seeds from the genuinely-valid, already-committed `test-image-small.png` + * and pads its raw bytes with zero-filled filler -- this app's own + * size-limit check is confirmed (TC-033's AFS, § Network Behavior) to be an + * immediate, client-side, no-server-round-trip rejection based on the + * `File`/`Blob`'s own byte length, not on decoding pixel content, so a + * decodable-past-IEND-or-not PNG makes no difference to the assertion under + * test (the toast's exact wording/threshold-number is asserted via a shape + * regex, per TC-033's own AFS Axis-2 addition, precisely so it doesn't + * depend on today's specific enforced limit). `targetBytes` only needs to + * clear whatever threshold is live (confirmed 3MB as of this AFS, previously + * documented as high as 5MB/20MB depending on source -- see GH#115) with + * comfortable margin; 4MB does that without the repo/CI cost of a + * multi-megabyte fixture, committed or generated-to-disk. + */ +function buildOversizedImagePayload(fileName: string, targetBytes: number): { name: string; mimeType: string; buffer: Buffer } { + const seed = fs.readFileSync(fixturePath('test-image-small.png')); + const buffer = seed.length >= targetBytes ? seed : Buffer.concat([seed, Buffer.alloc(targetBytes - seed.length, 0)]); + return { name: fileName, mimeType: 'image/png', buffer }; +} + /** * Root-caused during implementation (not documented by any AFS -- every AFS * ran its own case exactly once): the shared `${TEST_USER}` account's chat @@ -308,7 +353,7 @@ test.describe('@artifacts', () => { await test.step('8. Sent message row shows the text and the attachment thumbnail', async () => { await expect(artifacts.userMessageRow(messageText)).toContainText(messageText); - await expect(artifacts.messageThumbnail('test-image-small.png')).toBeVisible(); + await expect(artifacts.messageThumbnail('test-image-small.png', messageText)).toBeVisible(); }); await test.step("9. Assistant's reply demonstrably describes the actual uploaded image content", async () => { @@ -317,11 +362,22 @@ test.describe('@artifacts', () => { // streams in -- a one-shot `.textContent()` read right after // visibility raced an empty placeholder. `toContainText()` polls // until real content lands, the correct condition-wait here. - await expect(artifacts.assistantReply(messageText)).toContainText(/\S/, { timeout: 30_000 }); + // + // Post-merge review fix: a bare `/\S/` regex only proves SOME text + // arrived, not that the model genuinely processed the image -- this + // AFS's own § Axis 2 explicitly calls for "the strongest available + // proof the image was genuinely processed server-side," matching + // TC-031/032/040/041's content-specific assertions. The fixture + // (`test-image-small.png`, `generate_test_images.py`) renders the + // literal text "Test Small" on a blue background -- a vision model + // reading the image reliably transcribes that literal text (this + // AFS's own observed run: "a solid blue background with the text + // 'Test Small'... centered near the lower-middle area"). + await expect(artifacts.assistantReply(messageText)).toContainText(/Test Small/i, { timeout: 30_000 }); }); await test.step('10. Thumbnail is previewable via a forced click (GH#117 -- a plain click times out)', async () => { - await artifacts.openThumbnailPreview('test-image-small.png'); + await artifacts.openThumbnailPreview('test-image-small.png', messageText); await expect(artifacts.previewModal()).toContainText('test-image-small.png'); await artifacts.closePreviewModal(); }); @@ -462,6 +518,11 @@ test.describe('@artifacts', () => { await test.step('6. Attachment chip renders -- no rejection at the picker layer', async () => { await expect(artifacts.preSendChip('test-notes.txt')).toBeVisible(); + // Post-merge review nit fix: this AFS's own step 4-5 Verify calls out + // the "Attach Files (N left)" counter decrementing by exactly 1 + // (10 -> 9) -- `attachCounterText()` already exists and is used + // correctly elsewhere in this module but wasn't called here. + await expect(artifacts.attachCounterText()).toHaveAccessibleName(/9 left/); }); let upload: Awaited>; @@ -502,7 +563,11 @@ test.describe('@artifacts', () => { }) => { const console_ = trackConsoleErrors(page); const artifacts = new ArtifactsPage(page); - const filePath = fixturePath('test-large-image.png'); + // In-memory oversized-PNG payload -- see `buildOversizedImagePayload()`'s + // own doc comment for why this replaced the previously-committed 27MB + // `test-large-image.png` binary (post-merge review fix, PR #123 + // follow-up). + const oversizedFile = buildOversizedImagePayload('test-large-image.png', 4 * 1024 * 1024); const messageText = uniqueMessage('Test large file rejection'); // Native beforeunload dialog on navigating away from an active chat -- // first confirmed on a Chat route (not just dirty Agent/Pipeline CRUD @@ -525,7 +590,7 @@ test.describe('@artifacts', () => { await test.step('4-5. Select the oversized fixture -- immediate client-side rejection, no server round trip', async () => { const menu = await artifacts.openAttachMenu(); const [fileChooser] = await Promise.all([page.waitForEvent('filechooser'), artifacts.attachFilesMenuItem(menu).click()]); - await fileChooser.setFiles(filePath); + await fileChooser.setFiles(oversizedFile); const toast = page.getByRole('alert'); await expect(toast).toBeVisible(); await expect(toast).toContainText(/exceeds the \d+(\.\d+)? MB image size limit/i); @@ -588,8 +653,11 @@ test.describe('@artifacts', () => { expect(upload.fileSize).toBe(7938); }); + let thumbnailBox: { width: number; height: number } | null = null; await test.step('8. Thumbnail renders at good visual quality', async () => { - await expect(artifacts.messageThumbnail('test-preview-image.png')).toBeVisible(); + const thumbnail = artifacts.messageThumbnail('test-preview-image.png', messageText); + await expect(thumbnail).toBeVisible(); + thumbnailBox = await thumbnail.boundingBox(); }); // Root-caused during this debugging pass (not documented by the AFS, @@ -611,10 +679,31 @@ test.describe('@artifacts', () => { await expect(artifacts.assistantReply(messageText)).toContainText(/\S/, { timeout: 30_000 }); }); - await test.step('9-10. Force-click opens a genuine preview dialog with filename, enlarged image, and the three action buttons', async () => { - await artifacts.openThumbnailPreview('test-preview-image.png'); + await test.step('9-10. Force-click opens a genuine preview dialog with filename, enlarged image (visibly larger than the inline thumbnail), and the three action buttons', async () => { + await artifacts.openThumbnailPreview('test-preview-image.png', messageText); await expect(artifacts.previewModal()).toContainText('test-preview-image.png'); - await expect(artifacts.previewModal().getByRole('img', { name: 'test-preview-image.png' })).toBeVisible(); + const modalImage = artifacts.previewModal().getByRole('img', { name: 'test-preview-image.png' }); + await expect(modalImage).toBeVisible(); + // Post-merge review fix: the AFS claims "renders correctly at larger + // size (not broken, full quality, visible in viewport)" and its own + // Coverage Map / Automation Hints explicitly call for a "size + // comparison vs. the inline thumbnail" as the concrete, falsifiable + // proxy for "full size/zoom" -- previously only `toBeVisible()` was + // implemented, which can't distinguish "larger" from "identical" or + // "smaller." Comparing bounding boxes (not the AFS's own literal + // observed pixel values, e.g. "260x146" vs "500x400" -- those are + // this-run/this-viewport specific, not a portable contract) is the + // real, run-independent proof the modal image is genuinely enlarged + // relative to the thumbnail it was opened from. + const modalBox = await modalImage.boundingBox(); + expect(thumbnailBox, 'thumbnail bounding box must be measurable before the preview opens').not.toBeNull(); + expect(modalBox, 'preview modal image bounding box must be measurable').not.toBeNull(); + expect(modalBox!.width, 'preview modal image should render wider than the inline thumbnail').toBeGreaterThan( + thumbnailBox!.width, + ); + expect(modalBox!.height, 'preview modal image should render taller than the inline thumbnail').toBeGreaterThan( + thumbnailBox!.height, + ); await expect(artifacts.previewModalDownloadButton()).toBeVisible(); await expect(artifacts.previewModalRemoveButton()).toBeVisible(); await expect(artifacts.previewModalCloseButton()).toBeVisible(); @@ -625,14 +714,14 @@ test.describe('@artifacts', () => { await artifacts.closePreviewModal(); // Backdrop click -- confirmed working. - await artifacts.openThumbnailPreview('test-preview-image.png'); + await artifacts.openThumbnailPreview('test-preview-image.png', messageText); await page.mouse.click(10, 10); await expect(artifacts.previewModal()).toHaveCount(0); - // ESC key -- genuine, filed, non-blocking product defect (GH#119). - // Asserts the documented-correct behavior (ESC closes the dialog), - // not weakened to match the current buggy behavior. - await artifacts.openThumbnailPreview('test-preview-image.png'); + // Known defect: GH#119 -- ESC does not close the image preview + // modal. Asserts the documented-correct behavior (ESC closes the + // dialog), not weakened to match the current buggy behavior. + await artifacts.openThumbnailPreview('test-preview-image.png', messageText); await page.keyboard.press('Escape'); await expect .soft(artifacts.previewModal(), 'Known defect: GH#119 (ESC key does not close the image preview modal)') @@ -690,32 +779,59 @@ test.describe('@artifacts', () => { await test.step("8. Sent message shows text + attachment; assistant's reply corroborates first-frame-only processing", async () => { await expect(artifacts.userMessageRow(messageText)).toContainText(messageText); - await expect(artifacts.messageThumbnail('test-animated.gif')).toBeVisible(); - await expect(artifacts.assistantReply(messageText)).toBeVisible({ timeout: 30_000 }); + await expect(artifacts.messageThumbnail('test-animated.gif', messageText)).toBeVisible(); + // Post-merge review fix: a bare `toBeVisible()` only proves a reply + // container mounted, not that the model's own vision pipeline + // corroborates first-frame-only processing -- this AFS's own Axis 2 + // addition explicitly calls for "a loose text-contains assertion + // (non-brittle: assert the reply mentions 'first frame' or similar, + // not an exact string)" as a secondary confirmation channel, since + // the fixture's own frames are labeled "Frame 1".."Frame 5" + // (`generate_test_images.py`) and this AFS's observed run quoted the + // reply verbatim: "The GIF appears to show the first frame only: a + // solid red background with the text 'Frame 1' centered." + await expect(artifacts.assistantReply(messageText)).toContainText(/first frame|frame 1/i, { timeout: 30_000 }); }); await test.step('9. Inline chat thumbnail is static, first-frame-only (PASSES -- pre-rasterized JPEG data URI, cannot animate)', async () => { - const src = await artifacts.messageThumbnail('test-animated.gif').getAttribute('src'); + const src = await artifacts.messageThumbnail('test-animated.gif', messageText).getAttribute('src'); expect(src).toMatch(/^data:image\/jpeg/); }); await test.step('10-11. Chat-side preview modal: expected static first-frame-only (Known defect: GH#114)', async () => { - await artifacts.openThumbnailPreview('test-animated.gif'); + await artifacts.openThumbnailPreview('test-animated.gif', messageText); const modalImg = artifacts.previewModal().getByRole('img', { name: 'test-animated.gif' }); await expect(modalImg).toBeVisible(); - const srcAtOpen = await modalImg.getAttribute('src'); - // Two-screenshot(src)-apart technique -- the documented way to prove + // Post-merge review fix: an ``'s `src` ATTRIBUTE + // does not mutate while the browser decodes and plays successive GIF + // frames internally -- a blob URL points at the same underlying + // Blob object regardless of which frame is currently rendered, so + // comparing `src` before/after a wait can never detect frame + // animation; this assertion was structurally incapable of failing + // regardless of whether the defect was present or fixed. The + // sibling Artifacts-bucket-panel check below (13-16) already proves + // out the correct technique for exactly this reason -- pixel-diffing + // via `.screenshot()`, which captures actually-rendered content, not + // a static DOM attribute. Applying the same technique here so this + // is a real, functioning assertion. + const shot1 = await modalImg.screenshot(); + // Two-screenshot-apart technique -- the documented way to prove // animation vs. a static render from a static-assertion harness: a // single sample can't distinguish "static, showing frame N" from // "animating, caught mid-frame." This is a proven animation window // with no DOM-observable condition to wait FOR (the check's whole - // point is whether the src changes unprompted) -- the one - // documented exception to Hard Rule 5 (no sleeps). + // point is whether the rendered content changes unprompted) -- the + // one documented exception to Hard Rule 5 (no sleeps). await page.waitForTimeout(2_000); - const srcAfterDelay = await modalImg.getAttribute('src'); + const shot2 = await modalImg.screenshot(); + // Known defect: GH#114 -- the chat-side preview modal plays the full + // GIF animation instead of rendering first-frame-only. expect - .soft(srcAfterDelay, 'Known defect: GH#114 (chat-side preview modal plays full GIF animation instead of first-frame-only)') - .toBe(srcAtOpen); + .soft( + shot2.equals(shot1), + 'Known defect: GH#114 (chat-side preview modal plays full GIF animation instead of first-frame-only)', + ) + .toBe(true); await artifacts.closePreviewModal(); }); @@ -735,6 +851,8 @@ test.describe('@artifacts', () => { // Same documented Hard-Rule-5 exception as step 10-11 above. await page.waitForTimeout(2_000); const shot2 = await previewImg.screenshot(); + // Known defect: GH#114 -- the Artifacts bucket preview panel plays + // the full GIF animation instead of rendering first-frame-only. expect .soft( shot2.equals(shot1), @@ -772,7 +890,25 @@ test.describe('@artifacts', () => { }); await test.step('7. Message renders with the attachment thumbnail', async () => { - await expect(artifacts.messageThumbnail('test-download-image.png')).toBeVisible(); + await expect(artifacts.messageThumbnail('test-download-image.png', messageText)).toBeVisible(); + }); + + // Post-merge review fix: this test previously hovered/clicked Download + // immediately after the thumbnail rendered, with no wait for the + // assistant's reply -- despite two sibling doc comments elsewhere in + // this module (TC-034's and TC-037's own "root-caused" notes) already + // claiming "every other single-attachment test in this module + // (TC-030/034/035/036 or /037) already does this before its own next + // step." That claim was false for TC-036 specifically. Added for real + // now, both to make those sibling comments accurate and because the + // same underlying race they document -- the assistant's still-in- + // flight reply appending new content can trigger a broader message- + // list re-render that lands mid-interaction with the hover-revealed + // `.attachActionButtons` overlay this step's `downloadAttachmentImage()` + // depends on -- applies here too (Download and Remove attachment live + // in the identical overlay). + await test.step("Wait for the assistant's reply to finish before interacting with the hover-revealed action buttons (avoids racing an in-flight list re-render)", async () => { + await expect(artifacts.assistantReply(messageText)).toContainText(/\S/, { timeout: 30_000 }); }); let downloadedPath: string | null = null; @@ -780,6 +916,11 @@ test.describe('@artifacts', () => { const download = await artifacts.downloadAttachmentImage('test-download-image.png'); expect(download.suggestedFilename()).toBe('test-download-image.png'); expect(download.url()).toMatch(/^blob:/); + // Post-merge review fix: this AFS's own Axis 2 addition explicitly + // calls for asserting `download.failure()` is `null` -- distinguishes + // a genuine client-side re-save (expected here, no server round + // trip) from a failed/retried network-backed download. + expect(await download.failure()).toBeNull(); downloadedPath = await download.path(); expect(downloadedPath).not.toBeNull(); }); @@ -830,7 +971,7 @@ test.describe('@artifacts', () => { await test.step('7. Message row shows the sent text and the thumbnail', async () => { await expect(artifacts.userMessageRow(messageText)).toContainText(messageText); - await expect(artifacts.messageThumbnail('test-delete-target.png')).toBeVisible(); + await expect(artifacts.messageThumbnail('test-delete-target.png', messageText)).toBeVisible(); }); // Root-caused during this debugging pass (not documented by the AFS, @@ -898,7 +1039,7 @@ test.describe('@artifacts', () => { // state to catch up and re-render, which this shared, heavily- // loaded account has shown can lag past the default 5s elsewhere // in this module. - await expect(artifacts.messageThumbnail('test-delete-target.png')).toHaveCount(0, { timeout: 15_000 }); + await expect(artifacts.messageThumbnail('test-delete-target.png', messageText)).toHaveCount(0, { timeout: 15_000 }); await expect(artifacts.userMessageRow(messageText)).toContainText(messageText); }); @@ -1092,14 +1233,28 @@ test.describe('@artifacts', () => { await test.step("9-10. All 3 render as valid inline thumbnails; assistant's reply distinguishes all 3 individually", async () => { for (const fileName of fileNames) { - await expect(artifacts.messageThumbnail(fileName)).toBeVisible(); + await expect(artifacts.messageThumbnail(fileName, messageText)).toBeVisible(); } - await expect(artifacts.assistantReply(messageText)).toBeVisible({ timeout: 30_000 }); + // Post-merge review fix: a bare `toBeVisible()` only proves a reply + // container mounted, not that all 3 images were genuinely processed + // individually (vs. silently dropped or only-first-N accepted) -- + // this AFS's own Axis 2 addition explicitly calls this out as "the + // strongest available proof all 3 attachments were genuinely + // processed server-side." The 3 fixtures each embed a distinct + // literal label (`generate_test_images.py`: "Batch 1"/"Batch 2"/ + // "Batch 3" on blue/green/yellow backgrounds respectively), which + // this AFS's own observed run confirmed the reply named correctly -- + // asserted as 3 independent substring checks (not a single exact- + // sentence match) so LLM wording variation doesn't make this brittle. + const reply = artifacts.assistantReply(messageText); + await expect(reply).toContainText(/Batch 1/i, { timeout: 30_000 }); + await expect(reply).toContainText(/Batch 2/i); + await expect(reply).toContainText(/Batch 3/i); }); await test.step('11. Each of the 3 thumbnails independently opens a preview lightbox (force-click required)', async () => { for (const fileName of fileNames) { - await artifacts.openThumbnailPreview(fileName); + await artifacts.openThumbnailPreview(fileName, messageText); await artifacts.closePreviewModal(); } }); @@ -1193,12 +1348,23 @@ test.describe('@artifacts', () => { }); await test.step("9. Message renders with the attachment thumbnail; assistant's reply describes the real content", async () => { - await expect(artifacts.messageThumbnail('test-drag-drop.png')).toBeVisible(); - await expect(artifacts.assistantReply(messageText)).toBeVisible({ timeout: 30_000 }); + await expect(artifacts.messageThumbnail('test-drag-drop.png', messageText)).toBeVisible(); + // Post-merge review fix: a bare `toBeVisible()` only proves a reply + // container mounted, not that the model genuinely processed the + // dragged-and-dropped image -- this AFS's own Axis 2 addition + // explicitly calls for asserting the reply "demonstrably describes + // the image's real visual content ... strongest available proof the + // attachment was genuinely processed server-side" (same enrichment + // pattern as TC-032/TC-036). The fixture (`test-drag-drop.png`) + // renders the literal text "Drag Drop" on a purple background + // (`generate_test_images.py`) -- this AFS's own observed run quoted + // the reply verbatim: "...a purple background and the text 'Drag + // Drop' centered." + await expect(artifacts.assistantReply(messageText)).toContainText(/Drag Drop/i, { timeout: 30_000 }); }); await test.step('10. Thumbnail is clickable and opens a genuine preview dialog', async () => { - await artifacts.openThumbnailPreview('test-drag-drop.png'); + await artifacts.openThumbnailPreview('test-drag-drop.png', messageText); await artifacts.closePreviewModal(); }); @@ -1262,15 +1428,25 @@ test.describe('@artifacts', () => { }); await test.step('11. Sent message shows a REAL rendered thumbnail (unlike the pre-send generic-icon chip, GH#121)', async () => { - await expect(artifacts.messageThumbnail(upload!.fileName)).toBeVisible(); + await expect(artifacts.messageThumbnail(upload!.fileName, messageText)).toBeVisible(); }); await test.step("12. Assistant's reply demonstrably describes the pasted image's actual content", async () => { - await expect(artifacts.assistantReply(messageText)).toContainText(/\S/, { timeout: 30_000 }); + // Post-merge review fix: a bare `/\S/` regex only proves SOME text + // arrived, not that the model genuinely read the pasted image via + // vision -- this AFS's own Axis 2 addition explicitly calls this out + // as "the strongest available proof the image was actually + // processed server-side via vision, not silently dropped" (same + // rationale as TC-032's AFS). The fixture (`test-paste.png`) renders + // the literal text "Paste" on a cyan background + // (`generate_test_images.py`) -- this AFS's own observed run quoted + // the reply verbatim: "...a cyan background with the word 'Paste' + // centered in white text." + await expect(artifacts.assistantReply(messageText)).toContainText(/Paste/i, { timeout: 30_000 }); }); await test.step('13. Thumbnail opens a full-size preview modal via a forced click (GH#117, reconfirmed for paste-produced attachments)', async () => { - await artifacts.openThumbnailPreview(upload!.fileName); + await artifacts.openThumbnailPreview(upload!.fileName, messageText); await expect(artifacts.previewModal()).toContainText(upload!.fileName); await artifacts.closePreviewModal(); }); @@ -1313,7 +1489,7 @@ test.describe('@artifacts', () => { // needed to. Added both here. await page.goto(`${env.BASE_URL}/app/chat/${upload!.conversationId}`); await dismissAnnouncementBanner(page); - await expect(artifacts.messageThumbnail(upload!.fileName)).toBeVisible({ timeout: 30_000 }); + await expect(artifacts.messageThumbnail(upload!.fileName, messageText)).toBeVisible({ timeout: 30_000 }); const response = await artifacts.removeAttachmentFromChatMessage(true, upload!.fileName); expect(response.status()).toBe(204); expect(response.url()).toContain('keep_in_storage=0'); @@ -1373,15 +1549,15 @@ test.describe('@artifacts', () => { await test.step("10. Message renders exactly 10 thumbnails; assistant's reply acknowledges all 10", async () => { for (const fileName of fileNames) { - await expect(artifacts.messageThumbnail(fileName)).toBeVisible(); + await expect(artifacts.messageThumbnail(fileName, messageText)).toBeVisible(); } await expect(artifacts.assistantReply(messageText)).toContainText(/10/, { timeout: 30_000 }); }); await test.step('11. Two random thumbnails each independently open their own preview (force-click required)', async () => { - await artifacts.openThumbnailPreview(fileNames[0]); + await artifacts.openThumbnailPreview(fileNames[0], messageText); await artifacts.closePreviewModal(); - await artifacts.openThumbnailPreview(fileNames[9]); + await artifacts.openThumbnailPreview(fileNames[9], messageText); await artifacts.closePreviewModal(); }); @@ -1417,6 +1593,12 @@ test.describe('@artifacts', () => { const rejectedFileName = 'test-batch-11.png'; const filePaths = [...retainedFileNames, rejectedFileName].map((f) => fixturePath(f)); const messageText = uniqueMessage('Test batch upload of 11 images - expect rejection'); + // Post-merge review fix: hoisted out of the inner block below (which is + // scoped to the outer `try`, not visible from the outer `finally`) so + // the teardown added there can reach them. See the outer `finally`'s own + // comment for why this AFS's original "no cleanup" call was overridden. + let projectId = ''; + let uuid = ''; try { await test.step('1-3. Navigate, dismiss banner, start a fresh isolated conversation', async () => { @@ -1447,8 +1629,6 @@ test.describe('@artifacts', () => { }); const uploads = trackAttachmentUploads(page); - let projectId = ''; - let uuid = ''; try { await test.step('6-7. Type message, send -- exactly 10 attachment POSTs fire, never 11', async () => { await artifacts.typeMessage(messageText); @@ -1466,9 +1646,9 @@ test.describe('@artifacts', () => { await test.step('8-9. Sent message contains exactly 10 thumbnails, never the 11th; assistant reply renders', async () => { for (const fileName of retainedFileNames) { - await expect(artifacts.messageThumbnail(fileName)).toBeVisible(); + await expect(artifacts.messageThumbnail(fileName, messageText)).toBeVisible(); } - await expect(artifacts.messageThumbnail(rejectedFileName)).toHaveCount(0); + await expect(artifacts.messageThumbnail(rejectedFileName, messageText)).toHaveCount(0); await expect(artifacts.assistantReply(messageText)).toBeVisible({ timeout: 30_000 }); }); @@ -1486,12 +1666,26 @@ test.describe('@artifacts', () => { }); } finally { console_.stop(); - // No cleanup -- this AFS's own explicit recommendation, matching the - // TC-001/TC-002 "chat history persists" precedent: the sent 10-image - // message is non-destructive, and TC-039/TC-042 (concurrently - // mutating the same shared account) already exercise the cleanup - // path for this module. An extra delete-after-test step here adds - // one more concurrent mutation for no correctness benefit. + // Post-merge review fix (AFS amendment -- see + // test-specs/artifacts/l3_upload-11-images-reject_TC-043.md's own + // Cleanup section): the AFS's original "no automated cleanup" + // recommendation followed the TC-001/TC-002/TC-032/TC-036/TC-038 + // "chat history persists, non-destructive" precedent, reasoned + // specifically for a TEXT message. This case's own Behavior-B path + // additionally persists 10 real files in the shared Artifacts bucket + // on every run, with no compensating expiry -- unlike a bare chat + // message, that's a permanent per-run leak into shared, finite + // storage, not a merely-additive non-destructive record. Deleting + // them here, via the same authoritative-S3-listing-verified helper + // TC-042 already uses, closes that leak without reintroducing the + // concurrency concern the AFS was guarding against (TC-039/TC-042 + // mutate their OWN distinct uuid folders concurrently; this delete + // only ever touches this run's own folder). + if (uuid && projectId) { + await test.step("Teardown: bulk-delete this run's own 10 retained files", async () => { + await deleteArtifactAndVerify(artifacts, 'attachments', projectId, uuid, retainedFileNames); + }); + } } }); }); diff --git a/tests/fixtures/artifacts/test-animated.gif b/tests/fixtures/artifacts/test-animated.gif new file mode 100644 index 0000000000000000000000000000000000000000..920109bd204b62d8130a99d647c6cd12155f4704 GIT binary patch literal 14866 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-04.png b/tests/fixtures/artifacts/test-batch-04.png new file mode 100644 index 0000000000000000000000000000000000000000..075853eaf0efd905e3f7636087500d0c6edfc1b6 GIT binary patch literal 7261 zcmeHM`&-iI`zOuHnYvbKN$RYXYgSgK<_X=JbIql5ir|@|=1LJw@c@G5p)y^rR@y;j zW@^4sK+Pip9v0e6D2;;$z|uT`f~J5%$d~;K`|W#u_Um)q*K^(1{XF;Ue%-HE{!amZ zrk_}S0s?_dPk;aI&mfTD=OB;)e2anpWao~Z_8`!nFHV2^bx3;Yf)LlafQgz};=De! z<;Img+d3<5xZU{mrV4y%_{%Q`;g`&ZJMZqlRy!Gz3I+GR{;8mDn`w|$??A}izrL^j za_|;ApZ3xWPe?3+9mW)kaP`e%ToN0?nL+C8#B~0sw9XL6{D@~V zTm*AQunVz!aS}ogI=QKoq2?8ojy@rCNuySjY3_~}wHH*aAxgOKz(15zptikd$5kL{5pS2e6IKsmUwL?#e!B{ffC<+~A)z z|Jq?(CH3ttnvJRf8_G2bl*U6mA;1Hc$6C=RGqKL9p|c-2T68z@-;;vK92X#-x`n>zrQ zQLw5%$t@=-tyQb^?o}2b&JWm;@Dv*pbIEA>3o7CaimdL9?mdC^(>kWB($1l+3nO8e z6tPWP;UgeARIxc{$xmSsc92poBYcNAZD3+CL4rD3fxZ8(&+s7C+!DGks^_ZLTvQBW z%epX%_fyH4ikj@QlCJFMs|5ga&(?&LGDNJRvAh2{)c!~9q7+xg%e`)Ype(IcjUFra zNG;S*{2%k-CxopyO*lrwAE?*1m2Dp-3gCxhh}qAh`X+Rb;y4}(mSmjn|s zQhHAgsa)V%=0#OG3MqkgW6ctpSKi9t`mHQJa~~&iq8;Oa{nZhIgQMN4wP>g&feWQO z2;9mlh_jV>IW8eywXHAHQ^foXe)$$!HG1tM4d6h_L^|Zzbs=J^Gy173$q5iOF7#JJ z>?hFESSW5~YQnnJs=dN7UwDGw)Xfe+boUglKkmRPXGWNkDyZWuIefiqZu3f%Hlo;9 z2j!v_n`#C$>0Fhg#;6x6uwOY7>o7{^uyGmk2X1e1>P$KghK~`OQrp4OT)>;e?LZPA zuNEL_w-<(O#bZqvw5-gTK$mdhwyiH9rs~?uXFdWBG|N_{;qoS4gvUs$(jOXAF0BOx z=Tc8r#;y&f)c(R@oJ$IFEC>V0-=SuQ)PDd>nIyckBm`eCaqW{_`t_83{~XjdOt?d0 zS7v2@xPdRtwO_$7f;|+xH$vQ_5o6*b)yOrvhxl|!AjSQcvD<;1##x*D=S?jRz5HwR zZCF;54X@8&Ju}dNy^!REZ0k1-P{{(^Gsva~Z;{>8@>M8bzfe45CNTCxClF{#Hojo( z?vgI*LrCbLz?8aYoM)*s^JcxU$mHAQdRU?x`Cgf=ByT|=I z@tN`yqBqRr_T#S#8UtrXN~`t=f^Rz7dQ{2mNrbAB?;V@gvAPDFx$Vdwg~REZ&oG#? zT#~wVHCLrPx5igKT**Ju2_rVEvfBxb_?p)HSU;|}8DpMGKoi}RTPae0lST4*jrn(s zhMTcqujvn6wT4oWmL0zUF!BuGhxNdBMp%I^(2T90ae3QUL(5z2Vyq?fVDKbe(f|(% z#nUAMvm5fQkme+eQGJg#sxZWwL9-sQ1i80V6bOH(`7hrJH)-M5>>!|xoX7*^ux`; z0Y4%ot*3VgfxR-wt_K83^6VHgNAsgf05fZuTI~hQ>)t&F>4K+Uyawj?(T1=vwl4wm*M^F>x2YTzm*RZ<5(#DvH0o5&elM5 z>Ed|p@Y#V26|t0*Jh_XvtFp%?D()O{Ztuk(__ydEE{dv7VO5m+C|=VGpKD#&zV5B| z%;__pi8O8P)!-(@GVQd!Rl=z8T73G%o zbFabTsN`L;#$y+ZZjFvFKi{4jF&6~hZ0`=^d~5Eo=l&mE*?H|xONu$qs-`aB{l<<# z`&1`*Zus(-7nAX-fkhq28XmJ~oZCV%2X1N9uaLUin20J2g42y+oYXHLn@F zZLNF2PPefV-EjAuP3)0w8oNNJv^p4`8~5E}k}M{Zmeue6wmqZzJx)FUu*jaFf#%%K zH`#TtXb!*sK2Wq+E5@fm3ch|MA%W_bu43T{`R**r1N>Qy1(B$= ztF&u=7dciZJDLiOzjqb0e8^jnW?MSj*)I2l54s;kTK+VZ& zbNN^bjep`sbi4H>18a8`Gayj6LyKklG|n7JNdAaGjmVYJ%|7=X;76+rs|A!aD#(zkOylg>`ebiEo}ad7oc7 zJ`^4~MN6W7C%H9eJL!L>2!f)zjpWghTYk5vem+|ap-rnrc3Ov4QCn*TSh^}gB=?B$ zo7iWOuGxdJ!Dz-}7qA)X^{jO=oEBl^huTGYK{=vyEr)8O|9>E^t})OsO{9B;ZHVs2x;hV_&`i{f#MEyJ4X+C|2uXxMn%PL7LO zknev@HGgkDg4O^QicRY5t{N4jWN>LL7LhSzX#1MxLqD6J9mZ;=-(BAiWk$A+`7Sw! zpJC>7WZoP$u1QnfGl(0=XK%kg^Kn$bi1E48m2IS16igtCwM9$)B3@>C-P@;+aCq%z z5}`%1q3gkT=+t z-)=1A&Kn)2gGuCFQf&u^)^SZRYL;eO zZF~~(`k$L}SQhvg*HkkO0YAjf^~dI2K7ZumZ?Yt}8p#cmAA^!+TZUZboWfz366jSD zluc*O=1|N&n`cADBf}@-6LAPAK65OqbBVXzD0I>;2c0q}h@A1RQ-izJcKTYEJG-RI z1iQP;chmY;D%wK@^T$(bkplB%RYqvwbP&tTkvK9;wO%gF|@ z%3`_xjoamXXE^O8BQ)NZxQAvZ^P9l}Gh4rdxQ0IVC@oUtRn-d{Bx_CH9FxuaVqa=n zH|fmh|B%2@=g8a$K5?$6XRS56{jWv2rj87xkl6{by3+qI_Xi*%ORQdwEZqH~m&OWRxe53kUaIvttmy*B zX7yVzU3ZN%OHj^_Cej-O}PEF{V9oD&Kd2Z7fZyUtT6q%QolxY8+g{uBoucP zu5|2YFP}Q!4*!)Ozy@!H)JSIH!h3u3Nm9wfaC)l~;=2r1kbIo)VgP@$AH4a8V)O_(3F zDsP-ObX6MloW-wG0F_^i9rY^%lj@WgDK#y^A*VQ)igzY!g#Sf3btPHPaBE7m)wWh( z&uaeV!`@KUEF((y*S%szUAmhDoO7Ef$!CuxpfkU*^>dEeja(XtZHkfX{kcM8pCJw>Ocfi-prPonb6UxgOF}(0~_QzIb z)OC#+tEgVB@(NseArdUdVB3cvP+j$~vY$8JHwk&ZKNIMbA}9 zRr1D<(?5vG>ciLwB2P8e+|<^_hk22ZalZTzdZlHjxx9H}izV2FCf}I)#Upk0t4ZwA zDgla90gF-+gPVM7W(Cve9h0MdoGPW)-jevAQ_W^|HcE&9MEvMZ);UR7=WkH4SUO@Z zpX!JZA4!V}JP;kNaMgwo!~HZ-gKw!3x|_CejF0>v_7rohL`lPk$}5^>6iK&P;6JL{ zgS{L7Q?mbe^}B!VXZ$C9{_E2HXDa<`U+pWY&cN$jrcFi48=T%Y1fBK`_?G+)BK!XU D!z(P3 literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-05.png b/tests/fixtures/artifacts/test-batch-05.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a2a12eb0f5215aef45fd0cd758bf9d58ba07a1 GIT binary patch literal 7676 zcmeHM*H;tRw?+{gpp%7=p^1RXs7MhB1dv!L;~+&*>0JyhAOr{@5EOKXwCJFK5QEr2 zAyi2Sp^l+QG15~Yks7Hn0g^x{m$`qyeYxvC{MMbfv-atGpZ)EH=fjTKJ;x$D*!>f8Nh_ zYLSby;-hUdf_^(~w{YEvmzH+-w)Z(ZqlCe8#p} z)cuy-QYFwmvQn?|c3Quktdx>UJD@9d-+%YNqJK5<@0<8PcLk{jGE$W>M#(Z#PS<>Q zNgYvem6B@Pqa=0FaHr!xL-Y@Z(Cd|3|DWRr;iKg--Na%mHPCF6iIt~DB#hby;ADzJ zs8DUoLe`5vQ?xCI=ykT#!?_Er#w2Qmjm7ba`_VqaA8}2!-MC8C2FBCZF_T)}3X!u~ z_|RKNp_GzHcWT8E^@BOG#ryr%W3%Eys0;wF*YNQPsNTdEz_x1Sr|Y~~`h^K;fR3o7 z6hl8Xu?FB^;%2n)k=yn4yP5lS^PZD2I#WMsn>m9hv@i7qfS2V8hd2K<9a4y?(LzV` zG=?kig_r;xdp64P6YyI>OERPWio+W+??xPp)H{$5wYCt?pigwu(SX9obX5OXVNS6u zx1Dp{xAobJsY6C2IMr5rNtyqKAnD~?pdC1O!Q3k0_=FI~sn?y@1aPfA|9U5}1I%k3 z3J(3CGs9p7v?qi-ka0d)`Kqu{U=;BXwjA2gun=lbZ317b)!VimSk&4woTy@NJYVbu zh=Rfz^d_(Z|Kv=M@T5dbF%0=&{E3SdPKDnViC=Fy;H_t{w|IY1XXaX8Tp-m1-rvs$ z(9-KdsZRm9qzhY}n0?4)m&$$9?+#zl!`3-c%~fKId7;RmDRWhpi*-XFPT>*aOX%g) z1-xzELidS>-;P!K=I;e;=fm^dD@u|cnwaDnd46&KS;br6^{(xOU4gmY6J{oCJMRjg8!@)&Y+8%_}FE~%(K{8e(w6w%txAg z$xLOZu5psSL-O=?ykkLiuuvAz`;6@{@O-7m8<2@wQXqB z%%lryaU~|@+1lQe>6{^C;e8qwiT>$lv@r}sO=VNQ2)B$ZYgz|BSAP61F zc$@<7J~lA`i0F}Vu$5R*-`H5b0?SJ50s24q)rd|M_k#IIk6KiBLo-`_d2lFOFoe%Z z-Nd? zR~kDWblaUbZ8GfCOMp`+USnKhMsAgobqPsWF|Vwgf%=2`2oMoeTKax1=D9;3Xddp3Y!U^|*$=_sFBqDI1uH?lAorgRxp(V6U;D?$QkWp&_8qSRg+T9T zI=gg)-z@@6yJZ{@UmVQBU(1}z!kCgK6Ft7wWAvxi2C6LdCRW<>oCwlP5E|D1#+VkS zC)O?)KV+o2WBQ{b^eAgQd43YV*6MRk99^K+6{0tFLB3Sm^2N*ZRb$K1<8>qMTk&|g zmtnedmH>^s8K2DF7L}>qJvz&T_8b-#M<)eLl7gJ6xjKoluL{7f1_~mq_+@)L3307Q zC90t3(Xik1`5MUAuZNkTQKx>sJck!z<9zYLdTW+ld z_F+G8z1_Um0r2;ESaxn(qM`m%Rly)S_m`!YK#n|FPk$A1(toovv00Tris4|yZj&CR zN{E^8ONV*CYN8yotP{%uDpmpdG@x*~orE{&yHi%Pyf7!L)ifX+gD;b}J}!D7x-|S$ z^5K1Y9@IW}o^}&TG+7{>hUgrpO-AjhqAkAGc>3qQ(5yrapagEV)MV#GNzeM{B#5z*(#G zdg;Ff{(qVGd?O>9Dz^LOB-RT9bn&0;7g5=&f~YpmSk&ZPUXG42F|5nzPt^`^XQ`_6 zan?*@m4|IXzV}mLurT@(J5BQBtclRAI&^pMEl~Vz-_lEXeRgDbCJSL9UXms7BZEN$ zxyu>{Mxd7oU#u@2S~Oj(gR%XVJCMfGl_z$9HtIUnNXb1A)j7S!AoA||AUf^lPTq6S zu6+OL^-OH0PMU>=+0qTiV(#fO35?8lS(h2EMc$3og@Sg6($pq6N80iq8x3E;7vuw9 zgCe3$E9TR_V#FaQXKh(%b~8;h&IeS4b#KDpx6)D82@wr0^4<6y&?LjNyb{kszF3Y% z!@Y`oj#_+%j)vdfUNzzV zSy+R4bY2I(C8l^9Ww$T~K}q3H-?2s;$(?NtE;H5YNd?j+Q0}XlLScDnLBnq&L|FW6 zUdMy!ulto&YFx0ZX~ZvC3`;JS_goav7*&fch)MCvW_M*l|QUT$^O)=3~;t=i7vjCTPr`MK-Mbp6q@6+m-?+{t|QyJW%) zGenTgX!>*b0Mr9pXwv^SwCg6)_ZHc-_|Apes?9z?#S4M+=l&g#@7fENp8bSD%s@6% z7qVr&n&LJ-FFgr;R?&;g_vsz~3Ls?_Fv4M6Ee{vf!jHkgcK@;n&t~wa&c9t}nBj{S zDH_{!VoQ8pOY-(kwr~G_Z?Ya1STf$OVjRa)W=>IE#^~>L+#lP|Fu85Lpp%yG7%O&ziWim~=sxpJHDDdqx-O-6>Vw~@ zduhMioqyN>LU&5r>Zvs8jl?a0ouL8V<1w*^3=%*t5Az{DvC%!3=NAggAGNu>PtURQ z?Y%o~@ZY-*gONpB-wrf+a3PxoqJS*i=dJOlg&x2_yO+78xWYmg{jG%=RhtkmUWj3F zOHSd8@pBTb`LRxc$#BD6_!W=O_E+ZR4S`6OhO5oaC5AJ}n3nu@;c$z)BA=!nvpR%H z>O^gA*5C#$dW01QRf5!l$7C#_)zbo17d;FMMG?(ZeU%!>S=+9Fo(+}rWB%$9n| z+f?`GF81E}+y=dkwh?8!4d;zH3%fd6jw%nx=S^ya=vAP9DBJ_^H{12uBp|>Q4kKj| zGt76wM{C$vBdlK(0~3wAWh0o%QNdIn;7hyweq$=v%EG_yTya9=H)p`ClP z@ymsrIA3efgr)45CIwpypnyQ=*ORT>>C3MQSSGv^28`Ek64Kc5SLA!rWxhGV_Zjig ztado-y&R_o_GC6ip|_Gjgp~yRA!16d1$4&(u(%&iy#;a8daN5rHiv!kO8+Ebn^KzvAft|~yIa3!cxZATSFFSYSw#LYos=9T$GT0z+Ruk~4A*EcR_ z7TrPqpB#x^zlg+-55?RG=;oT~d3(4!z&v4ybc{|$5)Kj+1|~}!7n@li2O)PSvD|EV zGOy+E;zv;BwSQJ7MeBO56cICToiH3}>Ti6vHK;A~K)A&w-#aGu{^RiwK=pn`tetqPj-DmE%B+pV1c*?Ab&3by)B9I76 zxYi;6oKmLh26_|G0QX}3<_?#sc(1^^yP>AcfBj=V63{%dQ!xadw-Hn|sQ7lC(LOX= z#q*?6nC0%SKj%`LLnYFQH!UL^5gB36sEPXKPkmh67g`n(CYzsvvfv$?z_N(Vpb1+10@@1gdwA_C zJ1vs&t5rioRpc$bVT1ML`?tUs>18y1+Xh6D&gKm&WoNuavyxheyDA?7?gvd(V{&yr z>6cmTmR%>Gha3TJFrPt(%fGxUuzVgMeR$Dw2BD2N5?qDQiTn~=xAFSTF=;{6Ch6>X z0l9ep}mp|xeC@Nr1*#VXW#w1`iz2RJU&>1&pS!BeL1 z*&ljlc0y;{fu#smiQek$SinuX5=6(zrZk1bbJ(Agxbjb-RDG!XrUPr8$LZWBXI}*| zn;>ZWv^)mm2czAF$JOE0%gXBArm#Xzh~Bg@Z^1(R2s{)fY0%)b0-A>-cdt-A*{@gE z>r#yFq%QP51!#}Hft?)Pa<*KqwWYc+PiELQZ7B$1$8x9Th?JRQKZ?{RujwC!9vqa` zc9`E^cZvF9O|t#clkZ2`fP;@0lIF9V(&tvF1ZY8j$tVdJ{; zMsP=;ra;qupz&puDT?ikUEL<*)$a2s3oS&F~ZH<(R)S$hg9&yHI8Vc#s4vaI6YAIdZ&XhM35y?>VXOAtx( za~rzblYF0Tc|cO$WP+>``-bQpCZ#?ia$s5qtUT|QU7joCZ;Y8DUnfGI1KagXi;vz0 zJ&<_^nzk2}e|6I>%#2I=3WsPFXG3%+7RhRTd$MTos~xMV-DFK@2jo}>x~Y*NtYPKs zjT^sgEBT%6G~NFctDI=gwFk!}a&)^bp-aPDD~BRUb1>I4$4)A&=D?dq`AM!e-L6JtKj8;V_PfP9(vqtPDw z7wb`E!G8Jw&1x3!-}NuA{x7fozvb00?r`N{V;TRUjQM{Mx&QA`|EC|B!F7l!#yml1 U-@vDxUtOuI)(%$Xmwl7}3kz%VSpWb4 literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-06.png b/tests/fixtures/artifacts/test-batch-06.png new file mode 100644 index 0000000000000000000000000000000000000000..6b08bc289b085d88ace35add1d6bfdc4f58b7315 GIT binary patch literal 7986 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 Ioe#YKAMYfK>Hq)$ literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-07.png b/tests/fixtures/artifacts/test-batch-07.png new file mode 100644 index 0000000000000000000000000000000000000000..b552f1add01243ee5384bdf952cf9b2e5219fcee GIT binary patch literal 8516 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 HcjA8m9)tcM literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-08.png b/tests/fixtures/artifacts/test-batch-08.png new file mode 100644 index 0000000000000000000000000000000000000000..6112ca999bc449e6d17ed0815bebbe47705f12b9 GIT binary patch literal 10937 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 F{ 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-09.png b/tests/fixtures/artifacts/test-batch-09.png new file mode 100644 index 0000000000000000000000000000000000000000..caad490d0c0b84c8e22d594182622f59a9f97b34 GIT binary patch literal 8381 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 X!spj%C*{8-C|thaY+rT$=7awM{31Ay literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-1.png b/tests/fixtures/artifacts/test-batch-1.png new file mode 100644 index 0000000000000000000000000000000000000000..cf895e1f8a1e3814d4312184dfbbceafd4449125 GIT binary patch literal 6925 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 Y(LU`T(wH3#TyufWpM{>O{1uV-Z-&lQn*aa+ literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-10.png b/tests/fixtures/artifacts/test-batch-10.png new file mode 100644 index 0000000000000000000000000000000000000000..3777bf5e08c7620f168ec554943d8346515c884a GIT binary patch literal 8479 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 ad|>Rf^A&gw@W%(Elg9$Tr+ydx>wf^pVWWru literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-11.png b/tests/fixtures/artifacts/test-batch-11.png new file mode 100644 index 0000000000000000000000000000000000000000..39da265499b8988f94a10c1ec644f3718cc9c7b3 GIT binary patch literal 7925 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 Vi8FF@z&IOp;jF{ol)t?0{|B2pwdDW+ literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-2.jpg b/tests/fixtures/artifacts/test-batch-2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..50d9ae71b8d2dfc218fb04ce6ac2ef2d981e0447 GIT binary patch literal 13760 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-batch-3.png b/tests/fixtures/artifacts/test-batch-3.png new file mode 100644 index 0000000000000000000000000000000000000000..d11000d6ed7b5647d018397f96e921771cb3d37e GIT binary patch literal 6886 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-delete-target.png b/tests/fixtures/artifacts/test-delete-target.png new file mode 100644 index 0000000000000000000000000000000000000000..11c106ef607c51053a05320c528377c2b9f43289 GIT binary patch literal 5502 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 R3Gh`x_CGnCDzSyd{tM7nMbrQQ literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-document.pdf b/tests/fixtures/artifacts/test-document.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f901b0445abb984794519a13ea7b2522d35408d6 GIT binary patch literal 606 zcmZXSU2no56o&85uQ)d*+l2#K>qla|@GDEUWk$I(yTBH;rj`b%ar^ZHs>V6er10_{ z-lwOu7Snl~y>x&fMYTD=a0rBdR}#rYSW&1QkcHSugOM{VVKf3+X5Q%6e+z;S$XlKn zT*u!21!SV?(jvPn^gI6xeTG^*CA3-&~F<#xh^g;zu9RUoT+V*{`k8IZ9s zGWf}>EKbtqsqpE|Lq24di?KT6nmUdyi?BC{0%vJmyupqKzr*$GEAG22cXp2~qTXPv zmf{Fw?)aD!k#B)fioJv)&)|tmW6|{&rz)+F{@dEfCv6(DXXFQ<*p3>b^B63ZMN?Om z(pF}8$_1u-VX>|XC9+U3r_&!mt2O(a!!L%QpsfG^ literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-download-image.png b/tests/fixtures/artifacts/test-download-image.png new file mode 100644 index 0000000000000000000000000000000000000000..1a57eeb37c01893c1d1a3a0c67a90d280172fb4c GIT binary patch literal 8692 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 i|D!W32N#8+^W@^9Tc>*vz=1dsX| literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-image-small.png b/tests/fixtures/artifacts/test-image-small.png new file mode 100644 index 0000000000000000000000000000000000000000..3963dbcb2514dd6c5a8acc09f836e353fe96f1a5 GIT binary patch literal 8637 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 I$NuGi0IUcR^Z)<= literal 0 HcmV?d00001 diff --git a/tests/fixtures/artifacts/test-notes.txt b/tests/fixtures/artifacts/test-notes.txt new file mode 100644 index 0000000..81e3807 --- /dev/null +++ b/tests/fixtures/artifacts/test-notes.txt @@ -0,0 +1,4 @@ +This is a test text file. + +Line 2. +Line 3. \ No newline at end of file diff --git a/tests/fixtures/artifacts/test-paste.png b/tests/fixtures/artifacts/test-paste.png new file mode 100644 index 0000000000000000000000000000000000000000..72e225f09ad905b306a8fb14fb51ea39d918edab GIT binary patch literal 6100 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 { - await this.messageThumbnail(fileName).click({ force: true }); + async openThumbnailPreview(fileName: string, messageText?: string): Promise { + await this.messageThumbnail(fileName, messageText).click({ force: true }); await expect(this.previewModal()).toBeVisible(); }