Files
Brain/command-center/ui/TESTING.md
ParzivalTD 06661525f8 Deploy: TekDek Command Center (2026-04-13)
- Complete Node.js + PostgreSQL application
- 10 REST API endpoints (CRUD for projects/tasks)
- Responsive HTML/CSS/JavaScript UI
- Production-ready code (95%+ test coverage)
- Deployed to /publish/web1/public/command-center/
- Server running on port 3000

Pipeline: Daedalus (arch) → Talos (code) → Icarus (UI) → Hephaestus (deploy)
Total time: 30 minutes
Token efficiency: ~783k tokens (~$6.65)

Documentation: DEPLOYMENT-POSTMORTEM-2026-04-13.md
2026-04-13 12:50:40 -04:00

12 KiB

TekDek Command Center - Testing Guide

For: QA and Developers
Version: 1.0.0
Scope: Frontend UI Testing


Quick Test (5 Minutes)

# 1. Start backend API
cd ../
npm run dev

# 2. Open UI (new terminal)
cd ui/
python3 -m http.server 8000

# 3. Open browser
open http://localhost:8000

# 4. Run basic workflow
# - Create a project
# - Create a task
# - Drag task to different column
# - Edit task
# - Delete task

Manual Testing Workflow

1. Projects List View

Test: Create and display projects

[ ] Load page → Projects list displays
[ ] Click filter → Filters work (Active, Paused, Archived)
[ ] No projects → Shows "Create Your First Project" button
[ ] Grid responsive → Desktop (3 cols) → Tablet (2 cols) → Mobile (1 col)
[ ] Click project → Navigates to detail view
[ ] Hover effects → Card raises on hover

2. Create Project

Test: New project form

[ ] Click "New Project" → Modal opens
[ ] Form validates → Name required
[ ] Fill form → All fields accept input
[ ] Color picker → Shows color preview
[ ] Icon selector → All icons display
[ ] Submit → Project created, list updates
[ ] Duplicate names → Allowed (API allows it)
[ ] Cancel → Modal closes without saving
[ ] Close (X) → Modal closes without saving

3. Project Detail View

Test: Kanban board and navigation

[ ] Back button → Returns to project list
[ ] Header info → Shows title, description, stats
[ ] Stats update → Task count, Done, Overdue correct
[ ] 4 columns → Backlog, In Progress, Blocked, Done
[ ] Task count → Shows number of tasks per column
[ ] Empty column → Displays gracefully
[ ] Filter by status → Kanban updates

4. Create Task

Test: New task form

[ ] Click "Add Task" → Modal opens
[ ] Title required → Form validates
[ ] Title accepts text → Input works
[ ] Description optional → Can be empty
[ ] Status dropdown → All 4 options available
[ ] Due date picker → Calendar shows
[ ] Fill form → All fields accept input
[ ] Submit → Task created in correct column
[ ] Default status → Backlog if not specified
[ ] Close → Modal closes without saving

5. Kanban Board - Drag and Drop

Test: Task reordering

[ ] Drag task → Visual feedback (opacity change)
[ ] Drop in same column → Position updates
[ ] Drop in different column → Status changes
[ ] Reorder tasks → Tasks renumber correctly
[ ] Drag from backlog to done → Status becomes "Done"
[ ] Overdue task → Shows in red (if before today)
[ ] Due soon (3 days) → Shows in yellow
[ ] Multiple tasks → Can drag any of them
[ ] Animation smooth → No jank or delays

6. Edit Task

Test: Task editing

[ ] Click task card → Edit modal opens
[ ] Form prefilled → Current values show
[ ] Edit title → Updates on submit
[ ] Edit description → Updates on submit
[ ] Change status → Task moves to new column
[ ] Change due date → Updates display
[ ] Delete button → Shows in form
[ ] Save changes → Task updates
[ ] Cancel → Modal closes without saving

7. Delete Task

Test: Task deletion

[ ] Click "Delete Task" → Confirmation shows
[ ] Confirm → Task removed from board
[ ] Cancel → Task remains
[ ] After delete → Board refreshes
[ ] Stats update → Task count decreases

8. Error Handling

Test: Network and validation errors

[ ] Stop backend → Connection status shows red
[ ] Create project (no backend) → Error message shows
[ ] Invalid data → API returns error, user sees message
[ ] Network timeout → User-friendly error shown
[ ] Toast disappears → After 4 seconds
[ ] Multiple errors → Each shown in own toast

9. Responsive Design

Test: Mobile and tablet

[ ] Desktop (1920px) → Full layout
[ ] Tablet (768px) → Sidebar becomes top nav
[ ] Mobile (375px) → Single column layout
[ ] Touch drag → Works on mobile (if supported)
[ ] Buttons → Large enough to tap (44px minimum)
[ ] Forms → Full width on mobile
[ ] Modals → Scale to screen size
[ ] Overflow → Scrolls properly on small screens
[ ] No horizontal scroll → Fits viewport

10. Performance

Test: Speed and responsiveness

[ ] Page load → Under 2 seconds
[ ] Project list load → Under 500ms from API
[ ] Create project → Under 1 second
[ ] Drag task → Immediate visual feedback
[ ] Modal open → Instant (no animation lag)
[ ] Filter → Instant (< 100ms)
[ ] No console errors → F12 → Console tab
[ ] No warnings → DevTools clean

11. Browser Compatibility

Test: Different browsers

Chrome:
[ ] All features work
[ ] No console errors
[ ] Drag/drop works

Firefox:
[ ] All features work
[ ] No console errors
[ ] Drag/drop works

Safari (macOS/iOS):
[ ] All features work
[ ] No console errors
[ ] Touch drag works

Edge:
[ ] All features work
[ ] No console errors
[ ] Drag/drop works

12. Accessibility

Test: Keyboard and screen readers

[ ] Tab navigation → Can tab through all buttons
[ ] Enter key → Activates focused button
[ ] Escape key → Closes modals
[ ] Focus visible → All buttons show focus state
[ ] Color contrast → Text readable (WCAG AA)
[ ] Form labels → All inputs have labels
[ ] Error messages → Clear and helpful

Automated Testing Script

Save as test.html to run UI tests:

<!DOCTYPE html>
<html>
<head>
    <title>TekDek UI Tests</title>
    <style>
        body { font-family: monospace; }
        .pass { color: green; }
        .fail { color: red; }
    </style>
</head>
<body>
    <h1>TekDek Command Center - UI Tests</h1>
    <div id="results"></div>

    <script>
        const tests = [
            {
                name: "API client exists",
                test: () => typeof api !== 'undefined'
            },
            {
                name: "UI controller exists",
                test: () => typeof ui !== 'undefined'
            },
            {
                name: "DOM elements cached",
                test: () => ui.projectsList !== null
            },
            {
                name: "Projects list view exists",
                test: () => document.getElementById('projects-list-view') !== null
            },
            {
                name: "Project detail view exists",
                test: () => document.getElementById('project-detail-view') !== null
            },
            {
                name: "New project modal exists",
                test: () => document.getElementById('modal-new-project') !== null
            },
            {
                name: "New task modal exists",
                test: () => document.getElementById('modal-new-task') !== null
            },
            {
                name: "Edit task modal exists",
                test: () => document.getElementById('modal-edit-task') !== null
            },
            {
                name: "Event listeners attached",
                test: () => ui.btnNewProject.onclick !== null
            },
            {
                name: "CSS variables defined",
                test: () => getComputedStyle(document.documentElement)
                    .getPropertyValue('--color-primary').trim() !== ''
            }
        ];

        let passed = 0, failed = 0;
        const results = document.getElementById('results');

        tests.forEach(test => {
            try {
                if (test.test()) {
                    results.innerHTML += `<p class="pass">✓ ${test.name}</p>`;
                    passed++;
                } else {
                    results.innerHTML += `<p class="fail">✗ ${test.name}</p>`;
                    failed++;
                }
            } catch (e) {
                results.innerHTML += `<p class="fail">✗ ${test.name}: ${e.message}</p>`;
                failed++;
            }
        });

        results.innerHTML += `<h2>${passed} passed, ${failed} failed</h2>`;
    </script>

    <!-- Include UI files after body -->
    <script src="api.js"></script>
    <script src="ui.js"></script>
    <script src="app.js"></script>
</body>
</html>

API Integration Tests

Test Data

Use seed data from backend:

# List seeded projects
curl http://localhost:3000/api/v1/projects

# Should return projects with tasks

Test Endpoints

// Test GET projects
async function testGetProjects() {
    const projects = await api.getProjects();
    console.assert(Array.isArray(projects), 'Projects should be array');
    console.assert(projects.length > 0, 'Should have projects');
}

// Test POST project
async function testCreateProject() {
    const project = await api.createProject({
        name: 'Test Project',
        description: 'Test',
        color_hex: '#3498db'
    });
    console.assert(project.id > 0, 'Should have ID');
}

// Test drag-drop (reorder)
async function testTaskReorder() {
    const projectId = 1;
    const tasks = await api.getTasks(projectId);
    if (tasks.length > 1) {
        const reordered = [tasks[1].id, tasks[0].id];
        const result = await api.reorderTasks(projectId, reordered);
        console.assert(result.updated_count === 2, 'Should reorder 2 tasks');
    }
}

// Run tests
await testGetProjects();
await testCreateProject();
await testTaskReorder();
console.log('All tests passed!');

Performance Testing

Lighthouse

# Install Lighthouse
npm install -g lighthouse

# Run audit
lighthouse http://localhost:8000 --view

# Check scores:
# Performance: 90+
# Accessibility: 90+
# Best Practices: 90+
# SEO: 90+

Network Performance

In DevTools Network tab:

Expected times:
- Initial load: < 2s
- Project list: < 500ms
- Task list: < 200ms
- Create project: < 500ms
- Drag task: < 100ms (visual feedback immediate)

Memory Usage

In DevTools Memory tab:

Expected:
- Initial: ~5-10 MB
- After loading projects: ~15-20 MB
- After operations: No growth (no memory leaks)

Edge Cases

Test Unusual Scenarios

// Empty project (no tasks)
[ ] Load project with 0 tasks  Kanban shows 4 empty columns

// Many tasks (100+)
[ ] Load project with 100+ tasks  Board renders smoothly

// Long names
[ ] Project name 255 chars  Displays without breaking layout
[ ] Task description very long  Text wraps correctly

// Special characters
[ ] Project name with emoji  Renders correctly
[ ] Task with special chars (<>&")  Escaped properly

// Concurrent operations
[ ] Create task while another is loading  Queue handled correctly
[ ] Drag while API call pending  Optimistic update

// Network issues
[ ] Slow network (3G)  UI remains responsive
[ ] Intermittent failures  Retry logic works
[ ] Offline  Shows connection status

User Acceptance Testing (UAT) Checklist

Get feedback from real users:

Project Management:
[ ] Easy to create projects
[ ] Project colors meaningful
[ ] Stats are helpful
[ ] Can find projects quickly

Task Management:
[ ] Easy to create tasks
[ ] Drag-drop intuitive
[ ] Status changes work
[ ] Due dates are clear

Overall:
[ ] Design is clean
[ ] No confusing elements
[ ] Responsive on mobile
[ ] Fast enough for daily use

Issue Reporting Template

When you find a bug:

## Title
[Clear description of issue]

## Steps to Reproduce
1. Step 1
2. Step 2
3. Step 3

## Expected
[What should happen]

## Actual
[What actually happens]

## Browser
[Chrome 120 / Firefox 121 / etc.]

## System
[macOS 14 / Windows 11 / etc.]

## Screenshots
[If applicable]

## Console Errors
[Any JavaScript errors]

Regression Testing

Before each release:

# Run full manual workflow
[ ] Create project
[ ] Create task
[ ] Edit task
[ ] Drag task
[ ] Delete task
[ ] Check all statuses
[ ] Check mobile view
[ ] Check filters
[ ] Check modals
[ ] Check toast messages

Load Testing

Test with many projects/tasks:

// Create 50 projects
for (let i = 0; i < 50; i++) {
    await api.createProject({
        name: `Test Project ${i}`,
        color_hex: `#${Math.random().toString(16).slice(2, 8)}`
    });
}

// Time project list load
console.time('List 50 projects');
const projects = await api.getProjects();
console.timeEnd('List 50 projects');

// Should be < 1 second

Sign-Off

Before going to production:

  • All manual tests passed
  • All edge cases tested
  • No console errors
  • Lighthouse score 90+
  • Mobile tested (iOS and Android)
  • Browser compatibility verified
  • Performance acceptable
  • UAT approved by users

Ready for Production

Questions? See README.md or DEPLOYMENT.md