Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions .claude/test-cases/CsvImporter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# CSV Importer — Test Cases

**Location:** Project board toolbar → `...` (More) → Import CSV · **Last updated:** 2026-06-18

> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky

---

## Import Flow

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|---------|------------------------------------|-------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|---------------|--------|
| CSV_001 | Import a valid CSV | A CSV with a header row (Task Name, Status, Priority, Due Date, Description); a sprint to import into | 1. Open `...` → Import CSV 2. Upload the file 3. Confirm the auto-detected column mapping 4. Pick the target sprint 5. Import | Success message with created count; tasks appear in the sprint with mapped name/status/priority/due | | ⏳ |
| CSV_002 | Manual column-mapping override | A CSV whose headers differ (e.g. "Summary" not "Task Name") | 1. Upload 2. Adjust the column-mapping dropdowns manually 3. Import | Import respects the manual mapping | | ⏳ |
| CSV_003 | Row missing a task name is skipped | A CSV where one row has no task name | 1. Import | That row is skipped; created count excludes it; import does not abort | | ⏳ |
| CSV_004 | Unknown status falls back | A CSV with a status not configured in the project | 1. Import | Task falls back to the project's first status | | ⏳ |
| CSV_005 | Priority mapping | A CSV with Highest / High / Medium / Low | 1. Import 2. Open the tasks | Priorities mapped (e.g. Highest→Urgent, High→High, Medium→Normal) | | ⏳ |
| CSV_006 | XLSX upload | An `.xlsx` file with the same columns | 1. Upload the .xlsx and import | Parses and imports the same as CSV | | ⏳ |
| CSV_007 | Import history | A completed import | 1. Re-open the import modal / import history | Job listed as source "csv" with total / processed / created counts | | ⏳ |
| CSV_008 | Invalid file handled | Import modal open | 1. Try an empty file 2. Try a non-CSV renamed to `.csv` | Readable error in both cases; nothing created; modal stays usable | | ⏳ |

---

**Total:** 8 test cases · **All status:** ⏳ Pending
19 changes: 19 additions & 0 deletions .claude/test-cases/CumulativeFlowDiagram.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Cumulative Flow Diagram — Test Cases

**Location:** Project → `+ View` → Reports → Cumulative Flow · **Last updated:** 2026-06-18

> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky

---

## Chart Rendering

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|---------|-------------------------------|---------------------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------|---------------|--------|
| CFD_001 | CFD renders | Reports view added; project with tasks across statuses | 1. Open Reports → Cumulative Flow | Stacked-area chart of task counts by status band (To do / In progress / On hold / Done) over ~30 days | | ⏳ |
| CFD_002 | Done band reflects completions | Some tasks completed over recent days | 1. Observe the "Done" band over time | The Done band grows on the dates tasks were completed | | ⏳ |
| CFD_003 | Empty state handled | A project with no tasks | 1. Open Reports → Cumulative Flow | Renders an empty/zero state — no crash | | ⏳ |

---

**Total:** 3 test cases · **All status:** ⏳ Pending
44 changes: 44 additions & 0 deletions .claude/test-cases/GanttView.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Gantt / Timeline View — Test Cases

**Location:** Project → `+ View` → Gantt · **Last updated:** 2026-06-18

> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky
>
> **Setup:** run `cd frontend && npm install` once (adds `dhtmlx-gantt`); add the **Gantt** view to the project via `+ View`.

---

## Rendering & Scheduling

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|---------|-----------------------------|-------------------------------------------|----------------------------------------------------------------|----------------------------------------------------------------------------|---------------|--------|
| GNT_001 | Add the Gantt view | dhtmlx-gantt installed; project open | 1. `+ View` → Gantt → Add | Gantt tab appears and opens | | ⏳ |
| GNT_002 | Bars render | Tasks with both a start and a due date | 1. Open the Gantt tab | Those tasks render as bars on the timeline | | ⏳ |
| GNT_003 | Drag to reschedule | A scheduled task | 1. Drag a bar to new dates 2. Reload + open List/Table | Start/due updated and persisted everywhere | | ⏳ |
| GNT_004 | Resize duration | A scheduled task | 1. Drag a bar's edge | Due date changes and persists | | ⏳ |
| GNT_005 | Zoom presets | Gantt open | 1. Switch Day / Week / Month | Timeline scale changes accordingly | | ⏳ |
| GNT_006 | Unscheduled tray → schedule | A task with no start/due dates | 1. In the Unscheduled tray click **Schedule** on the task | Task gets today→+1 day and appears as a bar | | ⏳ |
| GNT_007 | Milestones shown | Project with milestones | 1. Open the Gantt | Milestones render as read-only diamond markers | | ⏳ |

---

## Dependencies, Sync & Permissions

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|---------|--------------------------------|---------------------------------------------|-------------------------------------------------------------|--------------------------------------------------------------------------|---------------|--------|
| GNT_008 | Draw + delete a dependency | Two scheduled tasks | 1. Drag from one bar's edge to another 2. Then delete the link | A "blocks" relation is created (visible in the task's Linked Tasks — see TaskRelations) then removed | | ⏳ |
| GNT_009 | Live sync across sessions | Same project Gantt open in two browsers | 1. Drag a bar in window 1 | Window 2 updates within a couple of seconds without reload | | ⏳ |
| GNT_010 | Read-only without edit rights | User lacking task-edit permission | 1. Open the Gantt | Read-only (no drag / no link drawing); "View only" badge shown | | ⏳ |

---

## Regression (fixes)

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|---------|-----------------------------------------|------------------------------------|-----------------------------------------------------------------------|------------------------------------------------------------------|---------------|--------|
| GNT_011 | Reload with Gantt as the active view | Gantt tab is currently active | 1. Reload the page (do NOT visit another view first) | Bars render — Gantt loads the task store itself (no empty chart) | | ⏳ |
| GNT_012 | Repeated view switching doesn't crash | — | 1. Switch List → Table → Gantt and back several times | No error; Gantt re-renders cleanly each time (no "tasksStore" crash) | | ⏳ |

---

**Total:** 12 test cases · **All status:** ⏳ Pending
42 changes: 42 additions & 0 deletions .claude/test-cases/Integrations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Integrations (Slack & Discord) — Test Cases

**Location:** Settings → Integrations → Add a webhook · **Last updated:** 2026-06-18

> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky

---

## Setup & Connection — Slack

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|----------|--------------------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------|---------------|--------|
| INTG_001 | Create a Slack incoming webhook (3rd-party) | A Slack workspace you can administer | 1. Go to api.slack.com/apps → Create New App → From scratch → pick workspace 2. Features → Incoming Webhooks → toggle On 3. Add New Webhook to Workspace → choose channel → Allow 4. Copy the URL (`https://hooks.slack.com/services/…`) | A valid Slack incoming-webhook URL is obtained | | ⏳ |
| INTG_002 | Connect Slack in AlianHub | INTG_001 done | 1. Settings → Integrations → Add a webhook 2. Select the **Slack** tab 3. Enter a name, paste the webhook URL, tick events (e.g. Task created, Task updated) 4. Save | Webhook saved + listed; a one-time signing secret is shown (only once) | | ⏳ |
| INTG_003 | Slack message on task creation | Slack webhook configured (INTG_002) | 1. Create a task in any project | Slack channel shows "Task created": `TaskKey — TaskName` with assignees/priority/due, within ~2 s | | ⏳ |
| INTG_004 | Slack message on status change | INTG_002 done | 1. Change a task's status | Slack shows "Status changed" with `old → new` | | ⏳ |

---

## Setup & Connection — Discord

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|----------|---------------------------------------------|------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|---------------|--------|
| INTG_005 | Create a Discord channel webhook (3rd-party) | A Discord server/channel you can manage | 1. Discord: Server → target Channel → Edit Channel (gear) → Integrations → Webhooks → New Webhook 2. Name it, pick channel 3. Copy Webhook URL (`https://discord.com/api/webhooks/…`) | A valid Discord webhook URL is obtained | | ⏳ |
| INTG_006 | Connect Discord in AlianHub | INTG_005 done | 1. Settings → Integrations → Add a webhook 2. Select the **Discord** tab 3. Name + paste URL + select events 4. Save | Webhook saved + listed | | ⏳ |
| INTG_007 | Discord embed on task event | INTG_006 done | 1. Create or update a task | Discord channel receives an embed (title `TaskKey — TaskName`, headline, status/priority fields) | | ⏳ |

---

## Events, Filtering & Delivery

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|----------|--------------------------------|--------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------|---------------|--------|
| INTG_008 | Event filtering | A webhook subscribed only to "Task created" | 1. Update an existing task 2. Create a new task | Update → no message; create → message | | ⏳ |
| INTG_009 | Pause / disable a webhook | An active webhook | 1. Toggle the webhook Off 2. Create a task 3. Toggle On 4. Create a task | Off → no message; On → messages resume | | ⏳ |
| INTG_010 | Delivery logs | A webhook that has fired | 1. Open the webhook's delivery logs | Each delivery shows status code, duration, attempt count | | ⏳ |
| INTG_011 | Payload is HMAC-signed | A configured webhook + a request inspector | 1. Inspect a delivered request | Request carries an `X-AlianHub-Signature` (HMAC-SHA256) header | | ⏳ |
| INTG_012 | Invalid URL / no events rejected | Add-webhook form open | 1. Try a non-HTTPS / malformed URL 2. Try saving with zero events | Save rejected with a readable validation message | | ⏳ |

---

**Total:** 12 test cases · **All status:** ⏳ Pending
20 changes: 20 additions & 0 deletions .claude/test-cases/Mentions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# @Mentions in Comments — Test Cases

**Location:** Task detail → Comments · **Last updated:** 2026-06-18

> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky

---

## Mention & Notify

| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
|---------|--------------------------------|---------------------------------------|----------------------------------------------------------------------------------|--------------------------------------------------------------------------------|---------------|--------|
| MNT_001 | Mention a user in a comment | A task with other project members | 1. Open a task → Comments 2. Type `@` in the comment box 3. Pick a user from the suggestions 4. Post | Comment posts with the mention; the mentioned user gets a notification (bell + email) | | ⏳ |
| MNT_002 | Notification links back | MNT_001 done | 1. As the mentioned user, open the notification | It links back to the task / comment | | ⏳ |
| MNT_003 | Multiple mentions | Project with ≥2 other members | 1. Mention two users in one comment 2. Post | Each mentioned user is notified | | ⏳ |
| MNT_004 | No mention → no mention notice | — | 1. Post a comment with no `@` mention | No mention notification is sent | | ⏳ |

---

**Total:** 4 test cases · **All status:** ⏳ Pending
Loading
Loading