Technician — Test Cases
Manual acceptance test cases for the technician/field flows. See the Technician Quickstart for the user-facing instructions and Technician Permissions for the underlying gating.
These test cases assume two users:
- Tech — a user with the technician role (default permission bundle).
- Office — a user with the office/supervisor bundle.
Substitute your tenant defaults for phone country code, refrigerant types, and cylinder IDs.
TC-TECH-001 — Tech work order list is scoped to assigned jobs
Verifies: Find Your Assigned Work Orders, Technician Permissions
Preconditions:
- Logged in as Tech.
- At least one work order exists assigned to this tech and at least one assigned to a different tech.
Steps:
- Navigate to Work Orders.
Expected:
- The list shows only work orders where
technician_idequals the current user's ID. - No work order assigned to a different tech appears.
- No
unassignedwork order appears (sincetechnician_idis null on those).
TC-TECH-002 — Tech can filter the work order list by date and status
Verifies: Find Your Assigned Work Orders
Preconditions:
- Logged in as Tech.
- The tech has work orders due today (
pending), tomorrow (pending), and one inpaused.
Steps:
- Navigate to Work Orders.
- Pick today's date in the Due Date filter.
- Select Filter.
- Pick
pendingin the Status filter. - Select Filter.
Expected:
- After step 3, only the work order due today appears.
- After step 5, only the
pendingwork order due today appears (thepausedone is excluded). - Filters persist if the page is reloaded within the same session.
TC-TECH-003 — Tech sees Schedule on Home but not the dashboard charts
Verifies: Find Your Assigned Work Orders, Technician Permissions
Preconditions:
- Logged in as Tech (no
work_orders.supervise, noreports.view).
Steps:
- Navigate to Home.
Expected:
- The Schedule card renders and shows only the tech's own work orders.
- The dashboard charts and Upcoming Tasks sections do not render.
- Selecting a block in the schedule opens a modal with Open Work Order.
TC-TECH-004 — Tech is redirected to scoped work order list when scanning a QR while logged in
Verifies: Scan a Unit's QR Code in the Field, QR Codes
Preconditions:
- Logged in as Tech.
- A unit exists with a printed QR (URL
/u/<guid>). - The tech has at least one work order assigned to that unit.
Steps:
- Scan the QR with the device camera, or open the URL
/u/<guid>directly.
Expected:
- TuffOps redirects to Work Orders with the
unit_idfilter pre-applied. - The list shows the tech's work orders for that unit only.
- The public unit page (the customer-facing view) does not render.
TC-TECH-005 — Tech without a work order on the scanned unit sees an empty filtered list
Verifies: Scan a Unit's QR Code in the Field
Preconditions:
- Logged in as Tech.
- A unit exists with a printed QR.
- The tech has no work order assigned to that unit.
Steps:
- Open the URL
/u/<guid>.
Expected:
- TuffOps redirects to Work Orders with the
unit_idfilter pre-applied. - The list is empty.
- The empty-state message indicates no work orders match the filter.
TC-TECH-006 — Tech can pause a work order from ongoing
Verifies: Pause and Resume a Work Order, Work Order Lifecycle
Preconditions:
- Logged in as Tech.
- A work order is assigned to the tech and is in
ongoingstatus.
Steps:
- Open the work order.
- Select Pause Work Order in the Status card.
- If prompted, allow location access.
Expected:
- The page reloads.
- The Status badge is now
Paused(dark grey). - A new History entry shows
pausedwith the tech's user, the timestamp, and (if location was allowed) GPS coordinates. - An alert
Work order is now pausedappears in the alert feed for users watching it.
TC-TECH-007 — Tech can resume a paused work order with the Start Work Order button
Verifies: Pause and Resume a Work Order
Preconditions:
- Logged in as Tech.
- A work order is assigned to the tech and is in
pausedstatus.
Steps:
- Open the work order.
- Select Start Work Order in the Status card.
- If prompted, allow location access.
Expected:
- The page reloads.
- The Status badge is now
Ongoing(blue). - A new History entry shows
ongoingwith timestamp and (if allowed) GPS. - The button label is Start Work Order even though the action is "resume" — same transition.
TC-TECH-008 — Pause is hidden when the work order isn't ongoing
Verifies: Pause and Resume a Work Order
Preconditions:
- Logged in as Tech.
- The tech has work orders in
pending,paused, andwaiting_approval.
Steps:
- Open the
pendingwork order. - Open the
pausedwork order. - Open the
waiting_approvalwork order.
Expected:
- On
pending, only Start Work Order is visible — no Pause. - On
paused, only Start Work Order is visible — no Pause. - On
waiting_approval, neither Pause nor Start is visible to the tech.
TC-TECH-009 — Items, Files, and Notes cards are hidden until work order is started
Verifies: Work Orders from a Tech's Perspective, Update the Items on a Work Order
Preconditions:
- Logged in as Tech.
- A work order is assigned to the tech in
pendingstatus.
Steps:
- Open the work order.
- Note which sections render.
- Select Start Work Order in the Status card.
- Allow location if prompted.
- After the page reloads, note which sections render now.
Expected:
- In
pending, the Items, Files (photos), and Notes cards are not rendered at all. - In
ongoing, all three cards render below the main work order details. - The Add Item button is visible at the top-right of the Items card header.
TC-TECH-010 — Tech can add a non-refrigerant item to an ongoing work order
Verifies: Update the Items on a Work Order
Preconditions:
- Logged in as Tech.
- A work order is assigned to the tech in
ongoing. - The catalog includes a non-refrigerant service item, e.g.
Filter replacement.
Steps:
- Open the work order.
- Select Add Item at the top-right of the Items card.
- Search for
Filter replacement. - Select the item.
- Set quantity to
2. - Select Save at the bottom of the form.
Expected:
- A success flash message appears.
- The page reloads with the new item row in the Items card with quantity
2. - No refrigerant icon appears on the row (item isn't a regulated refrigerant).
- No charge event is created (verified by reviewing Charge Events as Office — empty entry for this work order).
TC-TECH-011 — Tech can edit an item's quantity and save
Verifies: Update the Items on a Work Order
Preconditions:
- Logged in as Tech.
- A work order is
ongoingwith at least one item already added.
Steps:
- Open the work order.
- Change the quantity on an existing item from
1to3. - Select Save.
Expected:
- Success flash message.
- The item now shows quantity
3after reload.
TC-TECH-012 — Tech can remove an item with no posted charge event
Verifies: Update the Items on a Work Order
Preconditions:
- Logged in as Tech.
- A work order is
ongoingwith a non-refrigerant item.
Steps:
- Open the work order.
- Select the trash icon at the right of the item row.
- Select Save.
Expected:
- The item is removed from the Items card after reload.
- A success flash message appears.
TC-TECH-013 — Tech does not see pricing columns on the items card
Verifies: Work Orders from a Tech's Perspective, Technician Permissions
Preconditions:
- Logged in as Tech (without
work_orders.pricing). - A work order is
ongoingwith at least one item with a non-zero price in the catalog.
Steps:
- Open the work order.
- Inspect the Items card.
Expected:
- Item names and quantities are visible.
- No
Unit Price,Subtotal, or any dollar-amount column is rendered. - The card header does not show a running total.
TC-TECH-014 — Tech can add a photo to an ongoing work order
Verifies: Add Photos and Notes to a Work Order
Preconditions:
- Logged in as Tech.
- A work order is
ongoing. - A test image file (under 50 MB, JPEG or PNG) is available.
Steps:
- Open the work order.
- In the Files card, select the upload control.
- Select the test image.
Expected:
- The photo uploads.
- A thumbnail appears in the Files card with the filename and a remove icon.
- Tapping the thumbnail opens a full-size lightbox.
TC-TECH-015 — Photo upload rejects files over 50 MB
Verifies: Add Photos and Notes to a Work Order
Preconditions:
- Logged in as Tech.
- A work order is
ongoing. - A test image file over 50 MB is available.
Steps:
- Open the work order.
- In the Files card, select the upload control.
- Select the over-50 MB file.
Expected:
- The upload fails with an error indicating the file is too large.
- No thumbnail is added to the Files card.
TC-TECH-016 — Tech can add a note up to 1000 characters
Verifies: Add Photos and Notes to a Work Order
Preconditions:
- Logged in as Tech.
- A work order is
ongoing.
Steps:
- Open the work order.
- In the Notes card, type 1000 characters into the note field.
- Select the save action for the note.
Expected:
- The note saves successfully.
- The note appears at the top of the notes list with the tech's name and timestamp.
- The character count display (if shown) reads
1000 / 1000.
TC-TECH-017 — Note over 1000 characters is rejected
Verifies: Add Photos and Notes to a Work Order
Preconditions:
- Logged in as Tech.
- A work order is
ongoing.
Steps:
- Open the work order.
- Try to enter 1001 characters into the note field.
- Select the save action.
Expected:
- Either the input prevents typing beyond 1000 characters, or the save fails with a validation error.
- No new note appears in the list.
TC-TECH-018 — Adding a refrigerant item without a cert posts the charge event in non-compliant state (Block mode)
Verifies: Record a Refrigerant Charge Event, Compliance Overrides
Preconditions:
- Logged in as Tech with no active EPA certification on file.
- The cert gating mode is set to
Blockin Settings → Compliance. - A work order is
ongoingon a unit that uses a regulated refrigerant.
Steps:
- Open the work order.
- Add Item -> select a regulated refrigerant (e.g.
R-410A). - Set quantity to
2. - Pick
top_offas the event type. - Pick the tech as the technician (cert dropdown is empty).
- Select Save.
Expected:
- The save succeeds (the row posts).
- A red banner appears explaining that cert gating fired (no active cert).
- A row appears in Charge Events for this work order, flagged as non-compliant in the audit log.
- A new row appears in
compliance_override_requestsqueued for an approver withcompliance.approve_override. - The work order's status widget shows the incomplete strict refrigerant count warning.
TC-TECH-019 — Adding a refrigerant item with valid cert in good standing posts a compliant charge event
Verifies: Record a Refrigerant Charge Event
Preconditions:
- Logged in as Tech with an active, unexpired EPA cert that covers the refrigerant.
- All gating modes (
cert,top_off,recovery_equipment) are set toBlockorWarn. - The unit has no open leak-repair episode.
- A work order is
ongoing.
Steps:
- Open the work order.
- Add Item -> select the regulated refrigerant.
- Set quantity, pick
top_offevent type, pick the tech, pick the cert. - Select Save.
Expected:
- The save succeeds with no banner.
- A new row appears in Charge Events for this work order, flagged compliant.
- The row's status chip on the form is green.
- No override request is created.
- The status widget does not show an incomplete strict refrigerant count.
TC-TECH-020 — Recovery event requires registered cylinder
Verifies: Record a Refrigerant Charge Event, Register Recovery Equipment
Preconditions:
- Logged in as Tech with active EPA cert.
- The recovery-equipment gating mode is
Block. - A work order is
ongoing. - The tech has access to at least one registered recovery cylinder, plus knowledge of an unregistered cylinder ID.
Steps:
- Open the work order.
- Add Item -> regulated refrigerant.
- Pick
removal_recoveryas event type. - Pick
to_cylinderas the destination kind. - In the cylinder dropdown, observe which IDs are listed.
- Pick a registered cylinder, set quantity, save.
Expected:
- Only registered cylinders appear in the dropdown.
- The unregistered cylinder cannot be picked.
- The save succeeds with the registered cylinder; charge event is compliant.
TC-TECH-021 — Top-off on unit with open leak-repair episode fires top-off gate (Block mode)
Verifies: Record a Refrigerant Charge Event, Compliance — Leak Repairs
Preconditions:
- Logged in as Tech with active EPA cert.
- Top-off gating mode is
Block. - A unit has an open leak-repair episode with no recorded repair start and no committed retire/retrofit plan.
- A work order is
ongoingon that unit.
Steps:
- Open the work order.
- Add Item -> regulated refrigerant.
- Pick
top_off, set quantity, pick cert, save.
Expected:
- The save succeeds (the row posts).
- A red banner appears explaining the top-off gate fired (open leak-repair episode).
- The new charge event row appears in Charge Events, flagged non-compliant.
- A new override request is queued for a supervisor.
TC-TECH-022 — Tech is blocked from approving their own override request (four-eyes)
Verifies: Compliance Overrides, Technician Permissions
Preconditions:
- An override request was created by the tech (TC-TECH-018 or TC-TECH-021).
- The tech has been temporarily granted
compliance.approve_overridefor this test.
Steps:
- As the tech, navigate to the override request page.
- Try to approve or reject.
Expected:
- The "Four-eyes blocked" alert is displayed.
- The Approve and Reject buttons are not actionable for this user.
- An attempt to POST the decision returns HTTP 403 or a validation error blocking the action.
TC-TECH-023 — Items, Files, and Notes are read-only after submit
Verifies: Work Orders from a Tech's Perspective, Submit a Work Order for Approval
Preconditions:
- Logged in as Tech.
- A work order is in
waiting_approvalafter the tech submitted it.
Steps:
- Open the work order.
- Try to add an item.
- Try to upload a photo.
- Try to add a note.
Expected:
- The Add Item button is not visible.
- The photo upload control is not visible.
- The note input is not visible.
- Existing items, photos, and notes render in read-only form.
TC-TECH-024 — Tech cannot open a work order assigned to a different tech
Verifies: Technician Permissions
Preconditions:
- Logged in as Tech.
- Another tech has a work order with a known ID.
Steps:
- Try to open the URL for the other tech's work order directly.
Expected:
- The response is HTTP 403 or a redirect to the work order index with an "access denied" flash.
- The work order edit form does not render.
TC-TECH-025 — Tech does not see Approve, Reject, or Mark as Billed buttons
Verifies: Technician Permissions, Work Order Lifecycle
Preconditions:
- Logged in as Tech.
- A work order assigned to the tech is in
waiting_approval.
Steps:
- Open the work order.
- Inspect the Status card buttons.
Expected:
- No Approve & Complete, Start Work Order (the supervisor's reject-back-to-ongoing path), or Mark as Billed buttons are visible.
- The compliance-/pricing-related supervisor controls are also not visible.
- Only navigation away (back to the list) is available.
TC-TECH-026 — GPS denied still allows status transition without coordinates
Verifies: Mobile and Field Context, Pause and Resume a Work Order
Preconditions:
- Logged in as Tech on a browser where the location permission is denied for the site.
- A work order is
ongoing.
Steps:
- Open the work order.
- Select Pause Work Order.
- When the prompt is denied (or already denied), wait for the transition to complete.
Expected:
- The status moves to
paused. - The new History entry has the timestamp and user, but no GPS coordinates.
- No error message blocks the user.
TC-TECH-027 — Compliance "View episode" link returns 403 for tech without compliance.view
Verifies: Technician Permissions, Work Orders from a Tech's Perspective
Preconditions:
- Logged in as Tech (no
compliance.view). - A work order is
ongoingand is linked to a leak-repair episode (the form shows a "Linked EPA leak-repair episode" pill).
Steps:
- Open the work order.
- Select the
View episodepill.
Expected:
- The response is HTTP 403.
- The leak-repair episode page does not render.
- The tech can use the back button to return to the work order without losing form state.
Smoke pass for technician flows
If you only have time for a 5-minute verification of the technician path before a release:
TC-TECH-001— list scoping works.TC-TECH-006— pause works with GPS.TC-TECH-009— pending-start gate hides cards.TC-TECH-010— add an item.TC-TECH-019— happy-path refrigerant charge event.
If those pass, the field flow is alive. Anything beyond is a deeper sweep.