Ticketer — QA Pack #1: Ordering System Reliability

Test Cases + Execution Log (MySQL DB Verification)

Index — Test Case Summary

Click to view summary table

Legend: P1 = highest risk / core reliability, P2 = secondary risk / edge cases

TC Priority Area What it validates Result Evidence
TC-00 P1 DB Setup Board + List IDs captured; list positions valid PASS TC-00-UI.mp4, TC-00-Q1.png, TC-00-Q2.png, TC-00-Q7.png, TC-00-Q9.png
TC-01 P1 Ticket reorder Bottom → top reorder works + DB matches PASS TC-01-UI.mp4, TC-01-Q4.png, TC-01-Q11.png, TC-01-Q5.png
TC-02 P1 Ticket reorder Top → bottom reorder works + DB matches PASS TC-02-UI.mp4, TC-02-Q4.png, TC-02-Q5.png
TC-03 P1 Ticket reorder Adjacent swap works + DB matches PASS TC-03-UI.mp4, TC-03-Q4.png, TC-03-Q5.png
TC-04 P1 Ticket reorder Middle insertion shifts positions cleanly (no gaps/dupes) PASS TC-04-UI.mp4, TC-04-Q4.png, TC-04-Q12.png, TC-04-Q5.png
TC-05 P1 Ticket move lists Todo → Doing (top), source/target resequenced correctly PASS TC-05-UI.mp4, TC-05-Q11.png, TC-05-Q4-for-todo.png, TC-05-Q4-for-doing.png, TC-05-Q5.png
TC-06 P1 Ticket move lists Doing → Done into empty list behaves correctly PASS TC-06-UI.mp4, TC-06-Q11.png, TC-06-Q4.png, TC-06-Q10.png, TC-06-Q5.png
TC-07 P1 Ticket move lists Insert into middle of target list preserves order PASS TC-07-UI.mp4, TC-07-Q11.png, TC-07-Q4.png, TC-07-Q5.png
TC-08 P1 Ticket move lists Move same ticket back/forth doesn’t duplicate or corrupt PASS TC-08-UI.mp4, TC-08-Q11.png, TC-08-Q5.png
TC-09 P1 Ticket move lists Move last ticket out → list becomes empty cleanly PASS TC-09-UI.mp4, TC-09-Q4.png, TC-09-Q10.png, TC-09-Q5.png
TC-10 P1 Persistence Ticket reorder persists after refresh (DB before/after) PASS TC-10-UI.mp4, TC-10-Q4-before-refresh.png, TC-10-Q4-after-refresh.png
TC-11 P1 Persistence Cross-list move persists after refresh PASS TC-11-UI.mp4, TC-11-Q11-before-refresh.png, TC-11-Q11-after-refresh.png
TC-12 P1 Persistence Board state persists after logout/login PASS TC-12-UI.mp4, TC-12-Q6-before-logout.png, TC-12-Q6-after-login.png
TC-13 P1 Persistence State persists after navigating away/back PASS TC-13-UI.mp4, TC-13-Q11.png
TC-14 P1 List reorder Lists reorder left/right + DB order valid PASS TC-14-UI.mp4, TC-14-Q2.png, TC-14-Q7.png, TC-14-Q9.png
TC-15 P1 List reorder + refresh List reorder persists after refresh (limitation noted) PASS TC-15-UI.mp4, TC-15-Q2-before-refresh.png, TC-15-Q2-after-refresh.png
TC-16 P1 Regression Ticket drag/drop still works after list reorder PASS TC-16-UI.mp4, TC-16-Q11.png, TC-16-Q5.png
TC-17 P1 Negative / stress Rapid same-list dragging doesn’t create gaps/dupes/invalids PASS TC-17-UI.mp4, TC-17-Q4.png, TC-17-Q5.png, TC-17-Q8.png, TC-17-Q12.png
TC-18 P1 Negative / stress Rapid cross-list moves remain stable after refresh PASS TC-18-UI.mp4, TC-18-Q11.png
TC-19 P2 Multi-tab conflict Two tabs conflicting reorders should preserve one intent (fails) FAIL TC-19-UI.mp4, TC-19-Q4.png, TC-19-Q5.png
TC-20 P2 Negative / invalid drop Invalid drop zones don’t change DB state PASS TC-20-UI.mp4, TC-20-Q11.png

Key finding: TC-19 failed — multi-tab conflicting reorders converge to a fallback ordering that preserves data integrity but discards user reorder intent.

Test Cases + DB Verification Evidence (Executed)

Test Data Setup (Baseline)

Create a dedicated board in the staging environment:

  • Board name: QA Pack #1 — Ordering
  • Lists: Todo, Doing, Done

Create tickets in each list:

  • Todo: Task 01 … Task 10 (10 tickets)
  • Doing: Task 11 … Task 15 (5 tickets)
  • Done: none

Evidence & File Naming Conventions

Each test case includes:

  • UI video: TC-XX-UI.mp4

DB evidence screenshots use:

  • TC-XX-Q#.png (e.g. TC-01-Q4.png)
  • If the same query is run multiple times in one TC, add a suffix:
  • Example: TC-05-Q4-for-todo.png, TC-05-Q4-for-doing.png
  • Example: TC-10-Q4-before-refresh.png, TC-10-Q4-after-refresh.png

Execution Notes

Click to read

Evidence approach used

  • Where a pre-action DB snapshot is not present, the intended pre-state is demonstrated via UI recording, and the persistent post-state is verified via DB queries.
  • Pre-action DB snapshots were captured for higher-risk persistence checks (refresh/logout). For lower-risk navigation checks, UI evidence was used for pre-state confirmation and DB evidence for post-state confirmation.

Limitation: This approach does not fully rule out a pre-existing UI/DB mismatch prior to the disruptive action. For higher assurance, a pre-action DB snapshot should be captured for every test case in future QA packs.

Baseline reset between test cases

Each test case begins from a known baseline board state. After completing a test, the board was manually reset before running the next case by reshuffling the tickets and lists to their default states. Where a test requires a different precondition, the required setup is performed and captured in evidence.

Note: This reset method is manual and may introduce setup mistakes (e.g., tickets added to the wrong list, missing tickets, incorrect ordering). Therefore, each test includes a pre-check to confirm the baseline state before executing steps; if the baseline does not match, the test must be marked Blocked until corrected. 

All tests are recorded end-to-end so setup and outcomes can be independently re-verified. A future improvement is to replace manual seeding with an automated reset/seed mechanism (e.g., script).

Pre-Setup / One-Time DB Identifiers

TC-00 — Capture Board + List IDs (one-time setup)

Priority: P1
Purpose: Collect identifiers and perform initial DB validation.

Steps

  1. Run Q1 to get BoardId for board name “QA Pack #1 — Ordering”
  2. Copy returned BoardId into subsequent queries
  3. Run Q2 using BoardId to get List IDs for Todo, Doing, Done
  4. Run DB checks:
    Q7 (list position duplicates within the board — expect 0 rows)
    Q9 (invalid list positions < 0 — expect 0 rows)

Expected

  • Q1 returns a single matching BoardId. If multiple rows match, select the correct BoardId and note the reason.
  • Q2 returns 3 lists with sensible Position values
  • Q7 returns 0 rows
  • Q9 returns 0 rows

Result

PASS

Evidence

  • UI video : TC-00-UI.mp4
  • DB:
  • TC-00-Q1.png
  • TC-00-Q2.png
  • TC-00-Q7.png
  • TC-00-Q9.png
mysql> SELECT Id AS BoardId FROM Boards WHERE Name = 'QA Pack #1 – Ordering';
+--------------------------------------+
| BoardId                              |
+--------------------------------------+
| 9c1838be-30d3-4d28-abba-3fde3510fcaa |
+--------------------------------------+
1 row in set (0.00 sec)
TC-00-Q1
mysql> SELECT Id AS ListId, Name AS ListName, BoardId, Position as ListPosition FROM Lists WHERE BoardId =
'9c1838be-30d3-4d28-abba-3fde3510fcaa' ORDER BY Position ASC;
+--------------------------------------+----------+--------------------------------------+--------------+
| ListId                               | ListName | BoardId                              | ListPosition |
+--------------------------------------+----------+--------------------------------------+--------------+
| ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | 9c1838be-30d3-4d28-abba-3fde3510fcaa |            1 |
| 79098857-921c-4cea-b81d-02f63014576d | Doing    | 9c1838be-30d3-4d28-abba-3fde3510fcaa |            2 |
| 867a8a79-1af9-434d-921f-10b90bb21909 | Done     | 9c1838be-30d3-4d28-abba-3fde3510fcaa |            3 |
+--------------------------------------+----------+--------------------------------------+--------------+
3 rows in set (0.00 sec)
TC-00-Q2
mysql> SELECT BoardId, Position AS ListPosition, COUNT(*) AS Cnt FROM Lists WHERE BoardId
= '9c1838be-30d3-4d28-abba-3fde3510fcaa' GROUP BY BoardId, Position HAVING COUNT(*) > 1;
Empty set (0.00 sec)
TC-00-Q7
mysql> SELECT * FROM Lists WHERE BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa'
Empty set (0.00 sec)
TC-00-Q9

Notes

  • UX observation: username display changed from “signed in as testuser” to “signed in as user” after re-login due to session expiry. Account remained the same.

Limitations

  • Did not test to identity differing display behavior across different machines/browsers.

Ticket Reorder Within a List

TC-01 — Reorder ticket within a list: bottom → top

Priority: P1
Purpose: Validate that a bottom-to-top reorder updates UI order and persisted DB ordering without duplicates or corruption.

Steps

  1. Open board “QA Pack #1 — Ordering”
  2. In List Todo, drag Task 10 to the top (above Task 01)

Expected

  • UI shows Task 10 first in List Todo
  • No duplicate/ghost tickets appear

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (To verify Todo ordering after moving Task 10 to the top)
  • Q11 Get all details of Ticket Task 10 (To confirm Task 10’s persisted list + position details after reorder)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-01-UI.mp4
  • DB:
  • TC-01-Q4.png
  • TC-01-Q11.png
  • TC-01-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position
AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      |             4 |              1 |
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      |             1 |              2 |
| 57bb1a23-6930-409c-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      |             4 |              3 |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      |             3 |              4 |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      |             6 |              5 |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      |             1 |              6 |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      |             4 |              7 |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      |             3 |              8 |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      |             6 |              9 |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      |             1 |             10 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
10 rows in set (0.00 sec)
TC-01-Q4
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '835947c6-d67b-464c-991c-ee59a7afc462';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-01-Q11
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id
= t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.00 sec)
TC-01-Q5

TC-02 — Reorder ticket within a list: top → bottom

Priority: P1
Purpose: Validate that a top-to-bottom reorder updates UI order and persisted DB ordering without duplicates.

Steps

  1. Drag Task 01 to the bottom of List Todo

Expected

  • Task 01 is last in List Todo

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (To verify Todo ordering after moving Task 01 to the bottom)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-02-UI.mp4
  • DB:
  • TC-02-Q4.png
  • TC-02-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      |             4 |              1 |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      |             3 |              2 |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      |             6 |              3 |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      |             1 |              4 |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      |             4 |              5 |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      |             3 |              6 |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      |             6 |              7 |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      |             1 |              8 |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      |             4 |              9 |
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      |             1 |             10 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
10 rows in set (0.00 sec)
TC-02-Q4
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.00 sec)
TC-02-Q5

TC-03 — Adjacent ticket swap within a list

Priority: P1
Purpose: Validate that swapping adjacent tickets updates ordering cleanly without position duplication.

Steps

  1. Move Task 03 just above Task 02 in List Todo

Expected

  • Task 03 appears immediately above Task 02

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (To verify the adjacent swap is reflected in persisted ordering)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-03-UI.mp4
  • DB:
  • TC-03-Q4.png
  • TC-03-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS
TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      |             1 |              1 |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      |             3 |              2 |
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      |             4 |              3 |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      |             6 |              4 |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      |             1 |              5 |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      |             4 |              6 |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      |             3 |              7 |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      |             6 |              8 |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      |             1 |              9 |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      |             4 |             10 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
10 rows in set (0.00 sec)
TC-03-Q4
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id
 = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.01 sec)
TC-03-Q5

TC-04 — Middle ticket insertion within a list

Priority: P1
Purpose: Validate that inserting a ticket into the middle shifts surrounding tickets correctly and preserves contiguous ordering (no gaps).

Steps

  1. Drag Task 09 to sit between Task 04 and Task 05

Expected

  • Ticket Task 09 inserts correctly between Task 04 and Task 05
  • Tickets surrounding Task 09 shift correctly

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (To verify persisted ordering after middle insertion)
  • Q12 Check for ordering gaps inside each list (should be 0 rows)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-04-UI.mp4
  • DB:
  • TC-04-Q4.png
  • TC-04-Q12.png
  • TC-04-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS
TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      |             1 |              1 |
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      |             4 |              2 |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      |             3 |              3 |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      |             6 |              4 |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      |             1 |              5 |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      |             1 |              6 |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      |             4 |              7 |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      |             3 |              8 |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      |             6 |              9 |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      |             4 |             10 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
10 rows in set (0.00 sec)
TC-04-Q4
mysql> SELECT * FROM ( SELECT t.ListId, t.Name AS ListName, t.Id AS TicketId, t.Name AS TicketName, t.Position, LAG(
t.Position) OVER (PARTITION BY t.ListId ORDER BY t.Position) AS PrevPos FROM Tickets t JOIN Lists l ON l.Id = t.List
Id WHERE l.BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa' ) x WHERE x.PrevPos IS NOT NULL AND x.Position - x.PrevP
os <> 1 ORDER BY x.ListName, x.Position;
Empty set (0.01 sec)
TC-04-Q12
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id
 = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.01 sec)
TC-04-Q5

Ticket Move Between Lists

TC-05 — Move ticket from Todo → Doing (to top)

Priority: P1
Purpose: Validate cross-list move updates ticket list membership and ordering in both source and target lists without duplicates.

Steps

  1. Drag Task 04 from List Todo → top of Doing

Expected

  • Ticket Task 04 disappears from Todo
  • Ticket Task 04 appears at top of Doing

DB Checks

  • Q11 Get all details of Ticket Task 04 (To confirm Task 04’s persisted ListName is Doing after move)
  • Q4 Get Tickets from List Todo (ordered) (To verify source list ordering updates after removal)
  • Q4 Get Tickets from List Doing (ordered) (To verify target list ordering updates after insertion at top)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-05-UI.mp4
  • DB:
  • TC-05-Q11.png
  • TC-05-Q4-for-todo.png
  • TC-05-Q4-for-doing.png
  • TC-05-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '21c71648-9cbe-4210-ac53-640d0e59728d';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | 79098857-921c-4cea-b81d-02f63014576d | Doing    |             1  |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-05-Q11
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS
TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      |             1 |              1 |
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      |             4 |              2 |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      |             3 |              3 |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      |             1 |              4 |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      |             4 |              5 |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      |             3 |              6 |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      |             6 |              7 |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      |             1 |              8 |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      |             4 |              9 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
9 rows in set (0.00 sec)
TC-05-Q4-for-todo
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS
TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = '79098857-921c-4cea-b81d-02f63014576d' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 04      |             6 |              1 |
| d767f7b4-f6af-4b4a-9a07-fbd11f15882a | Task 11    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 11      |             3 |              2 |
| 88086d9c-e285-4e90-b2ab-08e4d0956407 | Task 12    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 12      |             6 |              3 |
| af524d91-cecd-4785-970f-917a24024338 | Task 13    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 13      |             1 |              4 |
| dc156d0e-1fc3-43d8-9438-1a91db6abc3c | Task 14    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 14      |             4 |              5 |
| 5d33c315-5b2a-4986-a355-663503e1b9a9 | Task 15    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 15      |             3 |              6 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
6 rows in set (0.00 sec)
TC-05-Q4-for-doing
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id
= t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.00 sec)
TC-05-Q5

TC-06 — Move ticket from Doing → Done (empty list)

Priority: P1
Purpose: Validate moving into an empty list creates correct single-ticket state and list counts update correctly.

Steps

  1. Drag Task 11 from Doing Done (Done is empty to begin with)

Expected

  • List Done now contains exactly 1 ticket

DB Checks

  • Q11 Get all details of Ticket Task 11 (To confirm Task 11’s persisted ListName is Done after move)
  • Q4 Get Tickets from List Done (ordered) (To confirm Done contains exactly one ticket)
  • Q10 Get Ticket counts per list (To verify Done count increased to 1)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-06-UI.mp4
  • DB:
  • TC-06-Q11.png
  • TC-06-Q4.png
  • TC-06-Q10.png
  • TC-06-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = 'd767f7b4-f6af-4b4a-9a07-fbd11f15882a';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| d767f7b4-f6af-4b4a-9a07-fbd11f15882a | Task 11    | 867a8a79-1af9-434d-921f-10b90bb21909 | Done     |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-06-Q11.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS
TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = '867a8a79-1af9-434d-921f-10b90bb21909' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| d767f7b4-f6af-4b4a-9a07-fbd11f15882a | Task 11    | 867a8a79-1af9-434d-921f-10b90bb21909 | Done     | Test desc 11      |             3 |              1 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
1 row in set (0.00 sec)
TC-06-Q4.png
mysql> SELECT l.Name AS ListName, l.Id  AS ListId, COUNT(t.Id) AS TicketCount FROM
Lists l LEFT JOIN Tickets t  ON t.ListId = l.Id WHERE l.BoardId = '9c1838be-30d3-4d28
-abba-3fde3510fcaa' GROUP BY l.Id, l.Name ORDER BY l.Position ASC;
+----------+--------------------------------------+-------------+
| ListName | ListId                               | TicketCount |
+----------+--------------------------------------+-------------+
| Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |          10 |
| Doing    | 79098857-921c-4cea-b81d-02f63014576d |           4 |
| Done     | 867a8a79-1af9-434d-921f-10b90bb21909 |           1 |
+----------+--------------------------------------+-------------+
3 rows in set (0.00 sec)
TC-06-Q10.png
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON
  l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.P
  osition;
Empty set (0.00 sec)
TC-06-Q5.png

TC-07 — Move ticket into middle of target list

Priority: P1
Purpose: Validate cross-list insertion into a specific middle position preserves intended target ordering.

Steps

  1. Drag Task 05 from List Todo Doing between Task 11 and Task 12

Expected

  • Ticket Task 05 inserts in List Doing at the drop position

DB Checks

  • Q11 Get all details of Ticket Task 05 (To confirm Task 05’s persisted ListName is Doing after move)
  • Q4 Get Tickets from List Doing (ordered) (To verify target ordering reflects the middle insertion)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-07-UI.mp4
  • DB:
  • TC-07-Q11.png
  • TC-07-Q4.png
  • TC-07-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | 79098857-921c-4cea-b81d-02f63014576d | Doing    |              2 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-07-Q11.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS
TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = '79098857-921c-4cea-b81d-02f63014576d' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| d767f7b4-f6af-4b4a-9a07-fbd11f15882a | Task 11    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 11      |             3 |              1 |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 05      |             1 |              2 |
| 88086d9c-e285-4e90-b2ab-08e4d0956407 | Task 12    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 12      |             6 |              3 |
| af524d91-cecd-4785-970f-917a24024338 | Task 13    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 13      |             1 |              4 |
| dc156d0e-1fc3-43d8-9438-1a91db6abc3c | Task 14    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 14      |             4 |              5 |
| 5d33c315-5b2a-4986-a355-663503e1b9a9 | Task 15    | 79098857-921c-4cea-b81d-02f63014576d | Doing    | Test desc 15      |             3 |              6 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
6 rows in set (0.00 sec)
TC-07-Q4.png
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id
 = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.00 sec)
TC-07-Q5.png

TC-08 — Move ticket back and forth between lists (state stability)

Priority: P1
Purpose: Validate rapid cross-list moves do not create duplicates/ghost state and final persisted list membership is correct.

Steps

  1. Move Task 06 from List Todo Doing
  2. Immediately move Task 06 from List Doing Todo

Expected

  • Ticket ends in Todo once (no duplicates/ghost state)

DB Checks

  • Q11 Get all details of Ticket Task 06 (To confirm Task 06’s final persisted ListName is Todo)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-08-UI.mp4
  • DB:
  • TC-08-Q11.png
  • TC-08-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '1e55fe8c-ff62-427b-939c-5bb1154cc54d';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     |              6 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-08-Q11
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON
l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.00 sec)
TC-08-Q5

TC-09 — Move last ticket out of a list

Priority: P1
Purpose: Validate removing the only ticket from a list leaves it empty and list counts reflect 0.

Preconditions

  1. List Done contains exactly 1 ticket (Task 11)

Steps

  1. Move Ticket Task 11 from List Done Todo

Expected

  • List Done becomes empty

DB Checks

  • Q4 Get Tickets from List Done (ordered) (To confirm Done returns 0 rows / is empty after the move)
  • Q10 Get Ticket counts per list (To verify List Done TicketCount = 0)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-09-UI.mp4
  • DB:
  • TC-09-Q4.png
  • TC-09-Q10.png
  • TC-09-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.
ColorId AS TicketColorId, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = '86
7a8a79-1af9-434d-921f-10b90bb21909' ORDER BY t.Position ASC;
Empty set (0.00 sec)
TC-09-Q4
mysql> SELECT l.Name AS ListName, l.Id AS ListId, COUNT(t.Id) AS TicketCount FROM Lists
l LEFT JOIN Tickets t ON t.ListId = l.Id WHERE l.BoardId = '9c1838be-30d3-4d28-abba-3fde35
10fcaa' GROUP BY l.Id, l.Name ORDER BY l.Position ASC;
+----------+--------------------------------------+-------------+
| ListName | ListId                               | TicketCount |
+----------+--------------------------------------+-------------+
| Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |          11 |
| Doing    | 79098857-921c-4cea-b81d-02f63014576d |           4 |
| Done     | 867a8a79-1af9-434d-921f-10b90bb21909 |           0 |
+----------+--------------------------------------+-------------+
3 rows in set (0.00 sec)
TC-09-Q10
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON
l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.P
osition;
Empty set (0.00 sec)
TC-09-Q5

Persistence and Refresh

TC-10 — Ticket reorder persists after refresh

Priority: P1
Purpose: Validate that reordering persists across browser refresh and DB ordering remains identical before vs after.

Steps

  1. Reorder Todo to an obvious order (Task 01 between Task 04 and Task 05)
  2. Run Q4 for Todo and save as “Before Refresh”
  3. Refresh the page
  4. Run Q4 for Todo again as “After Refresh”

Expected

  • UI order unchanged after refresh
  • DB ordering matches before refresh

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (Before refresh: capture baseline persisted ordering)
  • Q4 Get Tickets from List Todo (ordered) (After refresh: confirm persisted ordering is unchanged)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-10-UI.mp4
  • DB:
  • TC-10-Q4-before-refresh.png
  • TC-10-Q4-after-refresh.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      | 4             | 1              |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      | 3             | 2              |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      | 6             | 3              |
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      | 1             | 4              |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      | 1             | 5              |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      | 4             | 6              |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      | 3             | 7              |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      | 6             | 8              |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      | 1             | 9              |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      | 4             | 10             |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
10 rows in set (0.00 sec)
TC-10-Q4-before-refresh
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      | 4             | 1              |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      | 3             | 2              |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      | 6             | 3              |
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      | 1             | 4              |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      | 1             | 5              |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      | 4             | 6              |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      | 3             | 7              |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      | 6             | 8              |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      | 1             | 9              |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      | 4             | 10             |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
10 rows in set (0.00 sec)
TC-10-Q4-after-refresh

TC-11 — Cross-list move persists after refresh

Priority: P1
Purpose: Validate that moving a ticket to a different list persists across refresh (list membership remains correct).

Steps

  1. Move Task 07 Todo → Done
  2. Run Q11 for Task 07 (“Before Refresh”)
  3. Refresh
  4. Run Q11 again (“After Refresh”)

Expected

  • Task 07 is still in List Done after refresh

DB Checks

  • Q11 Get all details of Ticket Task 07 (Before refresh: capture persisted list membership)
  • Q11 Get all details of Ticket Task 07 (After refresh: confirm list membership is unchanged)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-11-UI.mp4
  • DB:
  • TC-11-Q11-before-refresh.png
  • TC-11-Q11-after-refresh.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '8ca32dc0-639d-4368-a3a6-2ddefd015683';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | 867a8a79-1af9-434d-921f-10b90bb21909 | Done     |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-11-Q11-before-refresh
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '8ca32dc0-639d-4368-a3a6-2ddefd015683';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | 867a8a79-1af9-434d-921f-10b90bb21909 | Done     |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-11-Q11-after-refresh

TC-12— Board persistence after logout/login

Priority: P1
Purpose: Validate persistence across a full auth session reset (logout/login) using a board snapshot comparison.

Steps

  1. Perform a reorder : Move Task 01 between Task 02 and Task 03 in List Todo
  2. Perform a move : Move Task 11 from List Doing Done)
  3. Run Q6 (“Before Logout”)
  4. Log out
  5. Log back in
  6. Open board
  7. Run Q6 (“After Login”)

Expected

  • Board UI order matches snapshot; persistence holds

DB Checks

  • Q6 Get board snapshot: show lists + tickets together in the exact UI order (Before logout: capture full board ordering state)
  • Q6 Get board snapshot: show lists + tickets together in the exact UI order (After login: confirm snapshot matches persisted state)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-12-UI.mp4
  • DB:
  • TC-12-Q6-before-logout.png
  • TC-12-Q6-after-login.png
mysql> SELECT l.Position AS ListPosition, l.Name AS ListName, l.Id AS ListId, t.Position AS TicketPosition, t.Name AS TicketName, t.Id AS TicketId
    FROM Lists l
    LEFT JOIN Tickets t ON t.ListId = l.Id
    WHERE l.BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa'
    ORDER BY l.Position ASC, t.Position ASC;

+--------------+----------+--------------------------------------+----------------+------------+--------------------------------------+
| ListPosition | ListName | ListId                               | TicketPosition | TicketName | TicketId                             |
+--------------+----------+--------------------------------------+----------------+------------+--------------------------------------+
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              1 | Task 02    | 57bb1a23-6930-409d-a8de-286540303ae6 |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              2 | Task 01    | eea9e634-c870-4021-8f55-fd1434cbf07c |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              3 | Task 03    | f34ef92b-8fef-4fbe-a8a4-d5f04f59084b |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              4 | Task 04    | 21c71648-9cbe-4210-ac53-640d0e59728d |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              5 | Task 05    | 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              6 | Task 06    | 1e55fe8c-ff62-427b-939c-5bb1154cc54d |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              7 | Task 07    | 8ca32dc0-639d-4368-a3a6-2ddefd015683 |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              8 | Task 08    | 72a1c1fa-0370-4de1-a31b-78d2eb0f023f |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              9 | Task 09    | 4bc93741-e8dd-4268-a450-39301407d69e |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |             10 | Task 10    | 835947c6-d67b-464c-991c-ee59a7afc462 |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              1 | Task 12    | 8808d69c-e285-4e90-b2ab-08e4d0956407 |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              2 | Task 13    | af524d91-cced-4785-970f-917a24024338 |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              3 | Task 14    | dc156d0e-1fc3-43d8-9438-1a91db6abc3c |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              4 | Task 15    | 5d33c315-5b2a-4986-a355-663503e1b9a9 |
|            3 | Done     | 867a8a79-1af9-434d-921f-10b90bb21909 |              1 | Task 11    | d767f7b4-f6af-4b4a-9a07-fbd11f15882a |
+--------------+----------+--------------------------------------+----------------+------------+--------------------------------------+

15 rows in set (0.01 sec)
TC-12-Q6-before-logout
mysql> SELECT l.Position AS ListPosition, l.Name AS ListName, l.Id AS ListId, t.Position AS TicketPosition, t.Name AS TicketName, t.Id AS TicketId
    FROM Lists l
    LEFT JOIN Tickets t ON t.ListId = l.Id
    WHERE l.BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa'
    ORDER BY l.Position ASC, t.Position ASC;

+--------------+----------+--------------------------------------+----------------+------------+--------------------------------------+
| ListPosition | ListName | ListId                               | TicketPosition | TicketName | TicketId                             |
+--------------+----------+--------------------------------------+----------------+------------+--------------------------------------+
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              1 | Task 02    | 57bb1a23-6930-409d-a8de-286540303ae6 |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              2 | Task 01    | eea9e634-c870-4021-8f55-fd1434cbf07c |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              3 | Task 03    | f34ef92b-8fef-4fbe-a8a4-d5f04f59084b |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              4 | Task 04    | 21c71648-9cbe-4210-ac53-640d0e59728d |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              5 | Task 05    | 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              6 | Task 06    | 1e55fe8c-ff62-427b-939c-5bb1154cc54d |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              7 | Task 07    | 8ca32dc0-639d-4368-a3a6-2ddefd015683 |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              8 | Task 08    | 72a1c1fa-0370-4de1-a31b-78d2eb0f023f |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |              9 | Task 09    | 4bc93741-e8dd-4268-a450-39301407d69e |
|            1 | Todo     | ea8d4849-6010-41de-9b84-5e864d5337ff |             10 | Task 10    | 835947c6-d67b-464c-991c-ee59a7afc462 |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              1 | Task 12    | 8808d69c-e285-4e90-b2ab-08e4d0956407 |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              2 | Task 13    | af524d91-cced-4785-970f-917a24024338 |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              3 | Task 14    | dc156d0e-1fc3-43d8-9438-1a91db6abc3c |
|            2 | Doing    | 79098857-921c-4cea-b81d-02f63014576d |              4 | Task 15    | 5d33c315-5b2a-4986-a355-663503e1b9a9 |
|            3 | Done     | 867a8a79-1af9-434d-921f-10b90bb21909 |              1 | Task 11    | d767f7b4-f6af-4b4a-9a07-fbd11f15882a |
+--------------+----------+--------------------------------------+----------------+------------+--------------------------------------+

15 rows in set (0.01 sec)
TC-12-Q6-after-login

TC-13 — Persistence after navigating away and back

Priority: P1
Purpose: Validate persistence across in-app navigation (change board/page and return) without relying on refresh.

Steps

  1. Move Task 01 from List Todo → List Done
  2. Navigate to another board and then return

Expected

  • Change persists after navigation

DB Checks

  • Q11 Get all details of Ticket Task 01 (To confirm Task 01 remains in the target list after navigating away and returning)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-13-UI.mp4
  • DB:
  • TC-13-Q11.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = 'eea9e634-c870-4021-8f55-fd1434cbf07c';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-13-Q11

Limitations

  • This case captured post-navigation verification only. It validates persistence, but does not include a pre-navigation DB snapshot like TC-10/11/12.
  • Potential future improvement: run Q11 before navigation as baseline.

List Reordering

TC-14 — Reorder lists

Priority: P1
Purpose: Validate list reordering updates list positions correctly and preserves list ordering integrity (no duplicates/invalid positions).

Steps

  1. Drag List Done to far left (before Todo)

Expected

  • List order updates in UI

DB Checks

  • Q2 Get Lists from a board (ordered) (To verify persisted list ordering after moving Done to the far left)
  • Q7 Check for list position duplicates within the board (should be 0 rows)
  • Q9 Check for invalid positions for Lists (should be 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-14-UI.mp4
  • DB:
  • TC-14-Q2.png
  • TC-14-Q7.png
  • TC-14-Q9.png
mysql> SELECT Id AS ListId, Name AS ListName, BoardId, Position as ListPosition FROM Lists WHERE BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa' ORDER BY Position ASC;
+--------------------------------------+----------+--------------------------------------+--------------+
| ListId                               | ListName | BoardId                              | ListPosition |
+--------------------------------------+----------+--------------------------------------+--------------+
| ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | 9c1838be-30d3-4d28-abba-3fde3510fcaa |            1 |
| 79098857-921c-4cea-b81d-02f63014576d | Doing    | 9c1838be-30d3-4d28-abba-3fde3510fcaa |            2 |
| 867a8a79-1af9-434d-921f-10b90bb21909 | Done     | 9c1838be-30d3-4d28-abba-3fde3510fcaa |            3 |
+--------------------------------------+----------+--------------------------------------+--------------+
3 rows in set (0.00 sec)
TC-14-Q2-lists-ordered-by-position
mysql> SELECT BoardId, Position AS ListPosition, COUNT(*) AS Cnt FROM Lists WHERE BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa' GROUP BY BoardId, Position HAVING COUNT(*) > 1;
Empty set (0.00 sec)
TC-14-Q7-duplicate-list-positions-check
mysql> SELECT * FROM Lists WHERE BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa' AND Position < 0;
Empty set (0.00 sec)
TC-14-Q9-negative-list-positions-check

Notes (UX)

  • List drop zone preview length appears fixed and can look longer/shorter than the actual dragged list depending on ticket count.

TC-15— Reorder lists multiple times + refresh

Priority: P1
Purpose: Validate list reordering remains stable across multiple moves and refresh (final ordering persists).

Steps

  1. Move list Todo right, then left again
  2. Run Q2 (“Before Refresh”)
  3. Refresh
  4. Run Q2 (“After Refresh”)

Expected

  • Final list order persists after refresh

DB Checks

  • Q2 Get Lists from a board (ordered) (Before refresh: capture persisted list ordering after moves)
  • Q2 Get Lists from a board (ordered) (After refresh: confirm ordering is unchanged)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-15-UI.mp4
  • DB:
  • TC-15-Q2-before-refresh.png
  • TC-15-Q2-after-refresh.png
mysql> SELECT Id AS ListId, Name AS ListName, BoardId, Position as ListPosition FROM Lists WHERE BoardId =
'9c1838be-30d3-4d28-abba-3fde3510fcaa' ORDER BY Position ASC;

+--------------------------------------+----------+--------------------------------------+--------------+
| ListId                               | ListName | BoardId                              | ListPosition |
+--------------------------------------+----------+--------------------------------------+--------------+
| ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | 9c1838be-30d3-4d28-abba-3fde3510fcaa | 1            |
| 79098857-921c-4cea-b81d-02f63014576d | Doing    | 9c1838be-30d3-4d28-abba-3fde3510fcaa | 2            |
| 867a8a79-1af9-434d-921f-10b90bb21909 | Done     | 9c1838be-30d3-4d28-abba-3fde3510fcaa | 3            |
+--------------------------------------+----------+--------------------------------------+--------------+
3 rows in set (0.00 sec)
TC-15-Q2-before-refresh
mysql> SELECT Id AS ListId, Name AS ListName, BoardId, Position as ListPosition FROM Lists WHERE BoardId =
'9c1838be-30d3-4d28-abba-3fde3510fcaa' ORDER BY Position ASC;

+--------------------------------------+----------+--------------------------------------+--------------+
| ListId                               | ListName | BoardId                              | ListPosition |
+--------------------------------------+----------+--------------------------------------+--------------+
| ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | 9c1838be-30d3-4d28-abba-3fde3510fcaa | 1            |
| 79098857-921c-4cea-b81d-02f63014576d | Doing    | 9c1838be-30d3-4d28-abba-3fde3510fcaa | 2            |
| 867a8a79-1af9-434d-921f-10b90bb21909 | Done     | 9c1838be-30d3-4d28-abba-3fde3510fcaa | 3            |
+--------------------------------------+----------+--------------------------------------+--------------+
3 rows in set (0.00 sec)
TC-15-Q2-after-refresh

Limitations

  • Because Todo started and ended in the same position, this case confirms refresh stability for the ‘no net change’ scenario, but doesn’t demonstrate persistence of a different final order.
  • Potential future improvement: end in a different final list order before refresh.

TC-16— Move tickets after list reorder

Priority: P1
Purpose: Validate ticket drag/drop remains functional after list order changes (no regression from list reorder feature).

Steps

  1. Swap positions of Lists Todo and Done
  2. Move Task 12 from List Doing Todo

Expected

  • Ticket drag/drop still works after list reorder

DB Checks

  • Q11 Get all details of Ticket Task 12 (To confirm Task 12’s persisted ListName is Todo after move)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-16-UI.mp4
  • DB:
  • TC-16-Q11.png
  • TC-16-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = '88086d9c-e285-4e90-b2ab-08e4d0956407';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| 88086d9c-e285-4e90-b2ab-08e4d0956407 | Task 12    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | 1              |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-16-Q11
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets
t JOIN Lists l ON l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) >
1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.01 sec)
TC-16-Q5

“Try to Break It” High-Value Negatives

TC-17 — Rapid drag stress (same list) + integrity checks

Priority: P1
Purpose: Stress same-list reordering under rapid actions and validate integrity constraints (no duplicates, invalid positions, or gaps).

Steps

  1. For 30 seconds, drag random tickets around in List Todo quickly

Expected

  • No duplicates
  • No invalid positions
  • No gaps

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (To verify the final persisted ordering after rapid reorders)
  • Q5 Check for ticket position duplicates (should return 0 rows)
  • Q8 Check for invalid positions for Tickets (should be 0 rows)
  • Q12 Check for ordering gaps inside each list (should be 0 rows)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-17-UI.mp4
  • DB:
  • TC-17-Q4.png
  • TC-17-Q5.png
  • TC-17-Q8.png
  • TC-17-Q12.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+----------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId  | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+----------------+----------------+
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      | 6              | 1              |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      | 6              | 2              |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      | 1              | 3              |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      | 4              | 4              |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      | 3              | 5              |
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      | 4              | 6              |
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      | 1              | 7              |
| 5f171c0f-2e33-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      | 1              | 8              |
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      | 4              | 9              |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      | 3              | 10             |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+----------------+----------------+
10 rows in set (0.01 sec)
TC-17-Q4
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.00 sec)
TC-17-Q5
mysql> SELECT * FROM Tickets WHERE ListId IN (SELECT Id FROM Lists WHERE BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa') AND Position < 0;
Empty set (0.00 sec)
TC-17-Q8
mysql> SELECT * FROM ( SELECT t.ListId, l.Name AS ListName, t.Id AS TicketId, t.Name AS TicketName, t.Position, LAG(t.Position) OVER (PARTITION BY t.ListId ORDER BY t.Position) AS PrevPos FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE l.BoardId = '9c1838be-30d3-4d28-abba-3fde3510fcaa' ) x WHERE x.PrevPos IS NOT NULL AND x.Position - x.PrevPos <> 1 ORDER BY x.ListName, x.Position;
Empty set (0.00 sec)
TC-17-Q12

TC-18 — Rapid drag stress (cross-list) check

Priority: P1
Purpose: Stress cross-list moves repeatedly and confirm the ticket ends in exactly one list and persists after refresh.

Steps

  1. Rapidly move Ticket Task 01 across lists 10 times
  2. Refresh

Expected

  • Ticket ends up in exactly one list
  • Ticket stays in its final position after refresh

DB Checks

  • Q11 Get all details of Ticket Task 01 (To confirm final persisted list membership after stress moves + refresh)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-18-UI.mp4
  • DB:
  • TC-18-Q11.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = 'eea9e634-c870-4021-8f55-fd1434cbf07c';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | 79098857-921c-4cea-b81d-02f63014576d | Doing    |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-18-Q11

Notes

  • Ideally should include a pre-refresh DB check as baseline (not executed)

TC-19 — Multi-tab conflict check

Priority: P2
Purpose: Validate multi-tab conflict behavior when two clients reorder the same list without syncing, ensuring integrity holds and at least one reorder intent is preserved deterministically.

Preconditions

  1. Be logged in as the same authenticated user across both tabs
  2. Board “QA Pack #1 — Ordering” open in Tab A and Tab B

Steps

  1. In Tab A, reorder Task 01 from position 1 to after Task 10 (move Task 01 to bottom)
  2. Without refreshing Tab B, in Tab B reorder Task 10 from bottom to before Task 01 (move Task 10 to top)
  3. Refresh both tabs

Expected

  • Data integrity holds: final DB state is valid (no duplicates; no missing tickets)
  • Conflict rule holds: final persisted order must deterministically preserve the complete ordering intent of at least one submitted reorder (e.g. last-write-wins)
  • Must not converge to a third “hybrid reset” order that matches neither client outcome

DB Checks

  • Q4 Get Tickets from List Todo (ordered) (To verify the final persisted ordering in Todo after both conflicting reorders + refresh)
  • Q5 Check for ticket position duplicates (should return 0 rows)

Result

FAIL

Click to view evidence

Evidence

  • UI video : TC-19-UI.mp4
  • DB:
  • TC-19-Q4.png
  • TC-19-Q5.png
mysql> SELECT t.Id AS TicketId, t.Name AS TicketName, t.ListId, l.Name AS ListName, t.Description AS TicketDescription, t.ColorId AS TicketColorId, t.Position AS TicketPosition FROM Tickets t JOIN Lists l ON l.Id = t.ListId WHERE t.ListId = 'ea8d4849-6010-41de-9b84-5e864d5337ff' ORDER BY t.Position ASC;
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketDescription | TicketColorId | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+---------------+----------------+
| 835947c6-d67b-464c-991c-ee59a7afc462 | Task 10    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 10      |            4  |              1 |
| 57bb1a23-6930-409d-a8de-286540303ae6 | Task 02    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 02      |            4  |              2 |
| f34ef92b-8fef-4fbe-a8a4-d5f04f59084b | Task 03    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 03      |            3  |              3 |
| 21c71648-9cbe-4210-ac53-640d0e59728d | Task 04    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 04      |            6  |              4 |
| 5f171c0f-e233-4e7c-b7ac-b4872ca9c6df | Task 05    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 05      |            1  |              5 |
| 1e55fe8c-ff62-427b-939c-5bb1154cc54d | Task 06    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 06      |            4  |              6 |
| 8ca32dc0-639d-4368-a3a6-2ddefd015683 | Task 07    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 07      |            3  |              7 |
| 72a1c1fa-0370-4de1-a31b-78d2eb0f023f | Task 08    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 08      |            6  |              8 |
| 4bc93741-e8dd-4268-a450-39301407d69e | Task 09    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 09      |            1  |              9 |
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     | Test desc 01      |            1  |             10 |
+--------------------------------------+------------+--------------------------------------+----------+-------------------+--------------+-----------------+
10 rows in set (0.00 sec)
TC-19-Q4
mysql> SELECT l.BoardId, t.ListId, t.position AS TicketPosition, COUNT(*) AS Cnt FROM Tickets t JOIN Lists l ON l.Id = t.ListId GROUP BY l.boardId, t.ListId, t.Position HAVING COUNT(*) > 1 ORDER BY l.BoardId, t.ListId, t.Position;
Empty set (0.01 sec)
TC-19-Q5

Actual Result

After both conflicting reorders and refresh, both tabs converged to a third order that matches neither Tab A nor Tab B’s ordering outcome. Q5 returned 0 rows (no duplicates), confirming DB positional integrity, but reorder intent was not preserved.

Impact

Multi-tab usage can silently discard user-defined ordering and replace it with a fallback ordering, reducing trust in ordering reliability.

Notes / Analysis

System appears to apply a deterministic fallback when conflicting reorder operations happen. This maintains integrity but violates the expected conflict rule of preserving one committed reorder outcome.

TC-20 — Ticket drop onto invalid zones should not corrupt state

Priority: P2
Purpose: Validate invalid drop targets do not move/reorder tickets and do not mutate persisted ticket state.

Steps

  1. Attempt dropping ticket Task 01 on non-list areas (header / blank space)

Expected

  • Ticket snaps back / drop is prevented in non-list areas
  • No state change in DB

DB Checks

  • Q11 Get all details of Ticket Task 01 (To confirm persisted list + position remain unchanged after invalid drop attempt)

Result

PASS

Click to view evidence

Evidence

  • UI video : TC-20-UI.mp4
  • DB:
  • TC-20-Q11.png
mysql> SELECT t.Id AS TicketId, t.Name as TicketName, t.ListId, l.Name AS ListName, t.Position AS TicketPosition FROM Tick
ets t JOIN Lists l ON l.Id = t.ListId WHERE t.Id = 'eea9e634-c870-4021-8f55-fd1434cbf07c';
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| TicketId                             | TicketName | ListId                               | ListName | TicketPosition |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
| eea9e634-c870-4021-8f55-fd1434cbf07c | Task 01    | ea8d4849-6010-41de-9b84-5e864d5337ff | Todo     |              1 |
+--------------------------------------+------------+--------------------------------------+----------+----------------+
1 row in set (0.00 sec)
TC-20-Q11

Notes

  • Ideally should include a pre-refresh DB check as baseline (not executed)