Summary
Perform end-to-end QA testing on the Reactions feature for both articles and comments, covering the full lifecycle: creating, reading, updating, and deleting reactions on both entity types. The goal is to verify that the optimistic update flow, popover interactions (hover, click, long-press), auth gating, and cache invalidation all behave correctly across desktop and mobile viewports.
Scope
API Routes
GET /api/article-reactions?articleId= — article reactions list
POST /api/article-reactions — create article reaction
PATCH /api/article-reactions — update article reaction
DELETE /api/article-reactions — delete article reaction
GET /api/comment-reactions?commentId= — comment reactions list
POST /api/comment-reactions — create comment reaction
PATCH /api/comment-reactions — update comment reaction
DELETE /api/comment-reactions — delete comment reaction
UI Components
ReactionPopover — core shared popover (hover, click, long-press)
ArticleReactionPopover — article wrapper (article header + landing cards)
CommentReactionPopover — comment wrapper (inside CommentItem)
- Integration points:
ArticleHeader, ArticleItem (landing), CommentItem
Critical Flows
- Click reaction button (default "like") on an article — create
- Open reaction picker via hover/long-press and select a non-default type — create
- Click a different reaction type to switch — update
- Click the same reaction type to toggle off — delete
- Verify reaction count increments/decrements correctly
- Verify top-3 reaction icons update in the button display
- Repeat all flows 1–6 for comments
- Two users reacting to the same article/comment (concurrent state)
- Unauthenticated user clicks reaction — should open login modal
- Optimistic update: verify UI updates immediately before API responds
- Optimistic rollback: simulate network failure and verify count reverts
- Hover open/close timing (800ms open, 300ms close debounce)
- Long-press on mobile (500ms touch hold to open picker)
- Quick tap on mobile — should default to "like" without opening picker
Deliverables
- QA Test Report —
docs/qa/reactions-qa-report.md documenting all test cases and results using the format in docs/qa/qa-artifact-format.md
- Bug tickets — created as GitHub issues using the QA Bug Report template, or as files in
docs/qa/bugs/ for any failures found
Implementation Notes
- Approach: Manual QA across at least two browsers (Chrome + Firefox) and mobile responsive mode. Supplement by reading the existing unit tests in
src/__tests__/unit/reactions-routes.test.ts.
- Optimistic update verification: Use browser DevTools to throttle network (Slow 3G) so the optimistic update is visible before the API responds. Verify that the count changes instantly, then settles after the response.
- Rollback testing: Use DevTools to block specific API requests (e.g.,
PATCH /api/article-reactions) and verify the count reverts to the pre-mutation state with a toast error.
- Auth testing: Test both as a logged-in user and as a guest. Guest click should trigger the login modal, not an API call.
- Edge cases: Rapid sequential clicks (spam the like button), react while another user's reaction is still being created, tab away and come back during mutation.
Acceptance Criteria
- All critical flows (1–14 in Scope) have a corresponding test case in the report
- Each test case includes actual result and pass/fail status
- All failing test cases have an accompanying bug report
- Article and comment reactions are tested separately (not assumed to share behavior)
- Optimistic update behavior is explicitly tested (not just final state)
npm run build is not affected
Tasks
Setup
Test Execution — Article Reactions
Test Execution — Comment Reactions
Test Execution — Interaction Modes
Test Execution — Error Handling
Reporting
Summary
Perform end-to-end QA testing on the Reactions feature for both articles and comments, covering the full lifecycle: creating, reading, updating, and deleting reactions on both entity types. The goal is to verify that the optimistic update flow, popover interactions (hover, click, long-press), auth gating, and cache invalidation all behave correctly across desktop and mobile viewports.
Scope
API Routes
GET /api/article-reactions?articleId=— article reactions listPOST /api/article-reactions— create article reactionPATCH /api/article-reactions— update article reactionDELETE /api/article-reactions— delete article reactionGET /api/comment-reactions?commentId=— comment reactions listPOST /api/comment-reactions— create comment reactionPATCH /api/comment-reactions— update comment reactionDELETE /api/comment-reactions— delete comment reactionUI Components
ReactionPopover— core shared popover (hover, click, long-press)ArticleReactionPopover— article wrapper (article header + landing cards)CommentReactionPopover— comment wrapper (insideCommentItem)ArticleHeader,ArticleItem(landing),CommentItemCritical Flows
Deliverables
docs/qa/reactions-qa-report.mddocumenting all test cases and results using the format indocs/qa/qa-artifact-format.mddocs/qa/bugs/for any failures foundImplementation Notes
src/__tests__/unit/reactions-routes.test.ts.PATCH /api/article-reactions) and verify the count reverts to the pre-mutation state with a toast error.Acceptance Criteria
npm run buildis not affectedTasks
Setup
Test Execution — Article Reactions
Test Execution — Comment Reactions
Test Execution — Interaction Modes
Test Execution — Error Handling
Reporting
docs/qa/reactions-qa-report.mddocs/qa/bugs/files) for each failing case