Skip to content

Commit f14fd6c

Browse files
authored
Merge pull request #257 from aliansoftwareteam/fix/gantt-reload-render
fix(gantt): render on direct reload + Sprint 2-5 QA test cases
2 parents ae1caaa + cd6b4cc commit f14fd6c

11 files changed

Lines changed: 285 additions & 0 deletions

File tree

.claude/test-cases/CsvImporter.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# CSV Importer — Test Cases
2+
3+
**Location:** Project board toolbar → `...` (More) → Import CSV · **Last updated:** 2026-06-18
4+
5+
> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky
6+
7+
---
8+
9+
## Import Flow
10+
11+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
12+
|---------|------------------------------------|-------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|---------------|--------|
13+
| 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 | ||
14+
| 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 | ||
15+
| 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 | ||
16+
| 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 | ||
17+
| 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) | ||
18+
| CSV_006 | XLSX upload | An `.xlsx` file with the same columns | 1. Upload the .xlsx and import | Parses and imports the same as CSV | ||
19+
| 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 | ||
20+
| 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 | ||
21+
22+
---
23+
24+
**Total:** 8 test cases · **All status:** ⏳ Pending
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Cumulative Flow Diagram — Test Cases
2+
3+
**Location:** Project → `+ View` → Reports → Cumulative Flow · **Last updated:** 2026-06-18
4+
5+
> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky
6+
7+
---
8+
9+
## Chart Rendering
10+
11+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
12+
|---------|-------------------------------|---------------------------------------------|---------------------------------------------|--------------------------------------------------------------------------------------------------|---------------|--------|
13+
| 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 | ||
14+
| 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 | ||
15+
| CFD_003 | Empty state handled | A project with no tasks | 1. Open Reports → Cumulative Flow | Renders an empty/zero state — no crash | ||
16+
17+
---
18+
19+
**Total:** 3 test cases · **All status:** ⏳ Pending

.claude/test-cases/GanttView.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Gantt / Timeline View — Test Cases
2+
3+
**Location:** Project → `+ View` → Gantt · **Last updated:** 2026-06-18
4+
5+
> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky
6+
>
7+
> **Setup:** run `cd frontend && npm install` once (adds `dhtmlx-gantt`); add the **Gantt** view to the project via `+ View`.
8+
9+
---
10+
11+
## Rendering & Scheduling
12+
13+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
14+
|---------|-----------------------------|-------------------------------------------|----------------------------------------------------------------|----------------------------------------------------------------------------|---------------|--------|
15+
| GNT_001 | Add the Gantt view | dhtmlx-gantt installed; project open | 1. `+ View` → Gantt → Add | Gantt tab appears and opens | ||
16+
| 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 | ||
17+
| 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 | ||
18+
| GNT_004 | Resize duration | A scheduled task | 1. Drag a bar's edge | Due date changes and persists | ||
19+
| GNT_005 | Zoom presets | Gantt open | 1. Switch Day / Week / Month | Timeline scale changes accordingly | ||
20+
| 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 | ||
21+
| GNT_007 | Milestones shown | Project with milestones | 1. Open the Gantt | Milestones render as read-only diamond markers | ||
22+
23+
---
24+
25+
## Dependencies, Sync & Permissions
26+
27+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
28+
|---------|--------------------------------|---------------------------------------------|-------------------------------------------------------------|--------------------------------------------------------------------------|---------------|--------|
29+
| 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 | ||
30+
| 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 | ||
31+
| 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 | ||
32+
33+
---
34+
35+
## Regression (fixes)
36+
37+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
38+
|---------|-----------------------------------------|------------------------------------|-----------------------------------------------------------------------|------------------------------------------------------------------|---------------|--------|
39+
| 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) | ||
40+
| 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) | ||
41+
42+
---
43+
44+
**Total:** 12 test cases · **All status:** ⏳ Pending

.claude/test-cases/Integrations.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# Integrations (Slack & Discord) — Test Cases
2+
3+
**Location:** Settings → Integrations → Add a webhook · **Last updated:** 2026-06-18
4+
5+
> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky
6+
7+
---
8+
9+
## Setup & Connection — Slack
10+
11+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
12+
|----------|--------------------------------------------|---------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------|---------------|--------|
13+
| 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 | ||
14+
| 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) | ||
15+
| 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 | ||
16+
| INTG_004 | Slack message on status change | INTG_002 done | 1. Change a task's status | Slack shows "Status changed" with `old → new` | ||
17+
18+
---
19+
20+
## Setup & Connection — Discord
21+
22+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
23+
|----------|---------------------------------------------|------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------|---------------|--------|
24+
| 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 | ||
25+
| 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 | ||
26+
| 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) | ||
27+
28+
---
29+
30+
## Events, Filtering & Delivery
31+
32+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
33+
|----------|--------------------------------|--------------------------------------------|------------------------------------------------------------------------|------------------------------------------------------------------|---------------|--------|
34+
| 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 | ||
35+
| 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 | ||
36+
| INTG_010 | Delivery logs | A webhook that has fired | 1. Open the webhook's delivery logs | Each delivery shows status code, duration, attempt count | ||
37+
| 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 | ||
38+
| 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 | ||
39+
40+
---
41+
42+
**Total:** 12 test cases · **All status:** ⏳ Pending

.claude/test-cases/Mentions.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# @Mentions in Comments — Test Cases
2+
3+
**Location:** Task detail → Comments · **Last updated:** 2026-06-18
4+
5+
> **Status legend:** ⏳ Pending · ✅ Pass · ❌ Fail · ⚠️ Blocked · 🔄 Flaky
6+
7+
---
8+
9+
## Mention & Notify
10+
11+
| ID | Title | Precondition | Steps | Expected Result | Actual Result | Status |
12+
|---------|--------------------------------|---------------------------------------|----------------------------------------------------------------------------------|--------------------------------------------------------------------------------|---------------|--------|
13+
| 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) | ||
14+
| MNT_002 | Notification links back | MNT_001 done | 1. As the mentioned user, open the notification | It links back to the task / comment | ||
15+
| MNT_003 | Multiple mentions | Project with ≥2 other members | 1. Mention two users in one comment 2. Post | Each mentioned user is notified | ||
16+
| MNT_004 | No mention → no mention notice || 1. Post a comment with no `@` mention | No mention notification is sent | ||
17+
18+
---
19+
20+
**Total:** 4 test cases · **All status:** ⏳ Pending

0 commit comments

Comments
 (0)