Skip to content

Time Tracking Tests

Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-001Start timerNo timer currently running1. Navigate to /business/apps/timetracking. 2. Optionally select a project and customer. 3. Enter a description. 4. Submit start-timer action.Timer starts. started: true returned. Timer state shows as running on page reload.P0
TT-002Start timer with project and customerProjects and customers exist1. Select a project from dropdown. 2. Select a customer. 3. Add description “Working on feature X”. 4. Start timer.Timer starts with project_id, customer_id, and description associated.P0
TT-003Pause timerTimer is running1. Submit pause-timer action.Timer pauses. paused: true returned. Elapsed time freezes.P0
TT-004Resume timerTimer is paused1. Submit resume-timer action.Timer resumes. resumed: true returned. Elapsed time continues from where it paused.P0
TT-005Stop timerTimer is running or paused1. Submit stop-timer action.Timer stops. stopped: true returned. A time entry is created from the timer session. Entry appears in today’s entries.P0
TT-006Discard timerTimer is running or paused1. Submit discard-timer action.Timer is discarded. discarded: true returned. No time entry is created.P1
TT-007Start timer while another is runningTimer is already running1. Submit start-timer action.Returns 500 with error message (cannot start a second timer). Existing timer is not affected.P1
TT-008Unauthenticated timer actionNot signed in1. Submit any timer action without auth.Returns 401.P0
Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-010Dashboard loads all dataUser has entries and active timer1. Navigate to /business/apps/timetracking.Page displays: current timer state, today’s entries, weekly summary, projects list, customers list, and manual entry form.P0
TT-011Weekly summary uses correct week startSettings have week_start set to Monday (1)1. Navigate to dashboard.Weekly summary aggregates entries starting from Monday of the current week.P1
TT-012Dashboard empty stateNew user, no data1. Navigate to dashboard.All sections show empty/default state. No errors. Timer shows as inactive.P1
Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-015Create manual entryNone1. Fill entry form (date, duration_minutes, project, description). 2. Submit create-entry action.Entry created. Success message “Entry added!” displayed.P0
TT-016Create entry with default dateNone1. Submit create-entry without specifying a date.Entry is created with today’s date as default.P1
TT-017Create entry with invalid dataNone1. Submit create-entry with negative duration or missing required fields.Returns 400 with form validation errors.P1

Entries (/business/apps/timetracking/entries)

Section titled “Entries (/business/apps/timetracking/entries)”
Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-020List all entriesUser has time entries1. Navigate to /business/apps/timetracking/entries.All entries displayed with date, duration, project, customer, description, and invoiced status.P0
TT-021Filter by projectEntries across multiple projects1. Select a project from the filter dropdown.Only entries for that project are shown. URL updates with ?project={id}.P1
TT-022Filter by customerEntries across multiple customers1. Select a customer filter.Only entries for that customer are shown.P1
TT-023Filter by date rangeEntries across date range1. Set from and to date filters.Only entries within the date range are shown.P1
TT-024Filter by invoiced statusEntries with mixed invoiced status1. Set ?invoiced=true or ?invoiced=false.Only entries matching the invoiced flag are shown.P2
TT-025Search entriesUser has entries1. Enter search term.Matching entries are displayed.P1
TT-026Create entry from entries pageNone1. Fill entry form on entries page. 2. Submit create-entry.Entry created. Default hourly rate pre-filled from settings.P1
TT-027Delete entryEntry exists1. Submit delete-entry action with entry id.Entry deleted. deleted: true returned. Entry removed from list.P0
TT-028Combined filtersDiverse entry data1. Apply project, customer, date range, and search simultaneously.Results reflect all applied filters.P2

Projects (/business/apps/timetracking/projects)

Section titled “Projects (/business/apps/timetracking/projects)”
Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-030List projectsUser has projects1. Navigate to /business/apps/timetracking/projects.All projects displayed (including inactive). Customer associations shown.P0
TT-031Create projectNone1. Fill project form (name, customer, hourly rate, color, billable flag). 2. Submit create action.Project created. Success message “Project created!” displayed.P0
TT-032Create project with defaultsNone1. Submit create with only name provided.Project created with default color #6366f1, hourly_rate 0, is_billable true.P1
TT-033Create project with validation errorsNone1. Submit create with empty name.Returns 400 with validation errors.P1
TT-034Update projectProject exists1. Submit update action with modified name, customer, rate, billable, active, and color fields.Project updated. updated: true returned.P1
TT-035Toggle project active statusProject exists1. Submit update with is_active=false.Project marked inactive.P1
TT-036Delete projectProject exists with no entries1. Submit delete action with project id.Project deleted. deleted: true returned.P1
TT-037Delete project with entriesProject has associated time entries1. Submit delete action.Returns 500 with error (or cascades, depending on business rules). Verify expected behavior.P2

Reports (/business/apps/timetracking/reports)

Section titled “Reports (/business/apps/timetracking/reports)”
Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-040Load reports with default filtersUser has entries in the last 30 days1. Navigate to /business/apps/timetracking/reports.Report data loaded for last 30 days, grouped by customer. Unbilled summary displayed.P0
TT-041Group by projectUser has entries1. Set ?group_by=project.Report data is grouped by project.P1
TT-042Group by dayUser has entries1. Set ?group_by=day.Report data is grouped by date.P1
TT-043Custom date rangeUser has entries1. Set from and to parameters.Report reflects only entries in the specified date range.P1
TT-044Generate invoice from unbilled timeUser has unbilled entries for a customer1. Submit generate-invoice action with customer_id.Invoice is created in the invoicing app. User is redirected to /business/apps/invoicing/invoices/{invoice_id}. Entries are marked as invoiced.P0
TT-045Generate invoice without customerNone1. Submit generate-invoice without customer_id.Returns 400 “Customer is required”.P1
TT-046Generate invoice with no unbilled timeCustomer has no unbilled entries1. Submit generate-invoice with a customer who has zero unbilled entries.Returns 500 with appropriate error message.P1
TT-047Unbilled summary accuracyMix of billed and unbilled entries1. Load reports page.Unbilled summary reflects only non-invoiced entries grouped by customer.P1

Settings (/business/apps/timetracking/settings)

Section titled “Settings (/business/apps/timetracking/settings)”
Test IDDescriptionPreconditionsStepsExpected ResultPriority
TT-050Load settingsSettings exist1. Navigate to /business/apps/timetracking/settings.Form pre-populated with current default_hourly_rate, rounding_increment, and week_start.P0
TT-051Update settingsNone1. Modify hourly rate, rounding, and week start day. 2. Submit update-settings action.Settings saved. Success message “Settings saved!” displayed.P0
TT-052Update settings with invalid dataNone1. Submit update-settings with invalid hourly rate (e.g., negative).Returns 400 with validation errors.P1
TT-053Settings load error graceful fallbackSettings service throws error1. Simulate settings load failure.Page loads with null settings and empty form. No crash.P2