What We’re Testing
Since QuickZTNA uses the Machines page (/machines) as its primary topology view (the /topology route redirects here), the “zoom and filter” equivalent is the set of filter controls rendered above the machine table in MachinesPage (src/pages/MachinesPage.tsx).
The page renders four filter controls:
-
Search box — filters by machine name (case-insensitive substring) or tailnet IP (substring). Implemented as
m.name.toLowerCase().includes(search.toLowerCase()) || String(m.tailnet_ip || "").includes(search). -
Status filter (Select dropdown) — values:
all,online,offline,pending,quarantined. Maps to thestatusfield on each machine. -
OS filter (Select dropdown) — values:
all,linux,macos,windows,ios,android. Maps to theosfield. -
Tag filter (Select dropdown) — dynamically populated from all unique tags across all machines in the org. Only shown when at least one machine has a tag. Maps to the
tagsarray field.
All four filters are combined with AND logic in the filtered array computation. The resulting filtered array is then split into pendingMachines (status = pending) and activeMachines (all other statuses).
URL state is used only for the active tab (tab query parameter). Filter state is local React state — filters reset on page reload.
The machine count shown in the subtitle (“N devices in your network”) always reflects the unfiltered machines array, not the filtered count.
Your Test Setup
| Machine | Role |
|---|---|
| ⊞ Win-A | Admin browser — filter interaction, API testing |
Prerequisite: Win-A, Win-B (Windows), and Linux-C (Linux) are all registered. At least Win-A is online. Win-B and/or Linux-C may be offline for some sub-tests.
ST1 — Search Filter Narrows Visible Machines by Name
What it verifies: Typing in the search box filters the table in real-time, showing only machines whose name or tailnet IP contains the search string.
Steps:
-
On ⊞ Win-A , open
https://login.quickztna.com/machines. -
Confirm all 3 machines are visible in the table (Win-A, Win-B, Linux-C).
-
In the search box (left of the filter row, with a magnifying glass icon), type “Win”.
Expected: Only Win-A and Win-B rows are visible. Linux-C row disappears.
- Clear the search and type “Linux”.
Expected: Only Linux-C row is visible. Win-A and Win-B rows disappear.
- Type a partial tailnet IP, e.g., “100.64”.
Expected: All 3 machines appear (all have 100.64.x.x tailnet IPs).
- Type a highly specific IP suffix that matches only one machine (e.g., the last octet of Linux-C’s IP).
Expected: Only Linux-C is shown.
- Type a string that matches nothing (e.g., “zzzznotamachine”).
Expected: Table shows 0 rows in the active machines section. No error is shown; the empty state text “No machines found. Register your first device to get started.” appears.
- Clear the search box.
Expected: All 3 machines reappear immediately.
Pass: Search filter correctly narrows rows by name and tailnet IP. Empty search restores all rows. Non-matching search shows empty state.
ST2 — Status Filter Shows Only Machines of Selected Status
What it verifies: The status dropdown filters machines by their status field, isolating online, offline, pending, or quarantined machines.
Steps:
-
On ⊞ Win-A , ensure at least one machine is
online(Win-A itself) and at least one isoffline(e.g., Win-B withztna down). -
Open the Status dropdown (second filter control, labelled “All Status”).
-
Select “Online”.
Expected: Only machines with status = "online" appear. Win-A row is visible. Win-B row disappears (if Win-B is offline).
- Select “Offline”.
Expected: Only machines with status = "offline" appear. Win-A row disappears. Win-B row is visible (if offline).
- Select “All Status” to restore the full list.
Expected: All 3 machines are visible again.
- Verify the API returns the expected counts for each status:
TOKEN="YOUR_ADMIN_TOKEN"
ORG_ID="YOUR_ORG_ID"
curl -s "https://login.quickztna.com/api/db/machines?org_id=$ORG_ID&select=name,status" \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
Count the machines per status in the API response and verify the filter matches.
Pass: Status filter correctly isolates machines by status. Switching back to “All Status” restores the full list.
ST3 — OS Filter Isolates Windows and Linux Machines
What it verifies: The OS filter narrows the topology view to machines of a specific operating system, useful for OS-specific policy reviews.
Steps:
-
On ⊞ Win-A , with all machines visible, open the OS dropdown (third filter control, labelled “All OS”).
-
Select “Windows”.
Expected: Only Win-A and Win-B rows are visible (both os = "windows"). Linux-C row disappears.
- Select “Linux”.
Expected: Only Linux-C row is visible (os = "linux"). Win-A and Win-B rows disappear.
- Select “macOS”.
Expected: 0 rows visible (no macOS machines in the test setup). Empty state text appears.
- Select “All OS” to restore.
Expected: All 3 machines visible.
- Verify OS values via API:
curl -s "https://login.quickztna.com/api/db/machines?org_id=$ORG_ID&select=name,os" \
-H "Authorization: Bearer $TOKEN" | python3 -m json.tool
Expected: Win-A and Win-B have "os": "windows", Linux-C has "os": "linux".
Pass: OS filter correctly partitions the topology by operating system. Non-existent OS selection shows empty state without error.
ST4 — Tag Filter Shows Only Tagged Machines
What it verifies: After assigning tags to machines, the tag filter dropdown appears and correctly narrows the table to machines bearing the selected tag.
Steps:
- On ⊞ Win-A , assign a tag to Linux-C via the API:
LINUX_C_ID="LINUX_C_MACHINE_ID"
curl -s -X PATCH "https://login.quickztna.com/api/db/machines?org_id=$ORG_ID&id=eq.$LINUX_C_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tags\": [\"prod\", \"linux-server\"]}" | python3 -m json.tool
Expected: Response with "success": true.
- Reload
https://login.quickztna.com/machines.
Expected: A fourth filter dropdown labelled “All Tags” is now visible (the tag filter only renders when allTags.length > 0). The Linux-C row shows “prod” and “linux-server” tag badges under its name.
- Open the Tag dropdown and select “prod”.
Expected: Only Linux-C row is visible (it is the only machine with the “prod” tag). Win-A and Win-B rows disappear.
- Select “linux-server” from the tag dropdown.
Expected: Only Linux-C row visible.
- Select “All Tags” to restore the full list.
Expected: All 3 machines visible.
- Combine tag filter with OS filter: select OS “Linux” AND Tag “prod”.
Expected: Only Linux-C is visible (it is both Linux and has “prod” tag).
- Cleanup — remove tags from Linux-C:
curl -s -X PATCH "https://login.quickztna.com/api/db/machines?org_id=$ORG_ID&id=eq.$LINUX_C_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d "{\"tags\": []}" | python3 -m json.tool
Pass: Tag filter appears after tags are added. Single-tag filter correctly isolates tagged machines. Combined OS + tag filter applies AND logic. Cleanup removes tags.
ST5 — Combined Filters and Tab Navigation Scope the Topology View
What it verifies: Multiple filters apply simultaneously with AND logic. Switching between tabs (All Machines, Subnets, Setup, DNS) does not reset filter state, and the tab state is persisted in the URL.
Steps:
-
On ⊞ Win-A , open
https://login.quickztna.com/machines. -
Set the Status filter to “Online” and OS filter to “Windows” simultaneously.
Expected: Only machines that are BOTH online AND os = "windows" are shown. For the standard test setup with Win-A online and Win-B offline, only Win-A should appear.
- Also type “Win” in the search box.
Expected: All three filters are active simultaneously. Only machines matching all three conditions are shown.
-
Note the current URL — it should be
https://login.quickztna.com/machines(no tab query param, since “machines” is the default tab). -
Click the “Subnets” tab.
Expected: URL updates to https://login.quickztna.com/machines?tab=subnets. The Subnet Routes content loads in a Suspense boundary. The filter controls are not shown on this tab (the filter row is inside the “machines” TabsContent).
- Click the “DNS” tab.
Expected: URL updates to https://login.quickztna.com/machines?tab=dns. DNS records management loads.
- Click the “All Machines” tab to return to the machine table.
Expected: The filter state (Status = Online, OS = Windows, search = “Win”) is preserved from before — filter state is local React state and persists across tab switches within the same page session.
- Reload the page.
Expected: All filters reset to defaults (Status = All, OS = All, search empty). Only the tab (tab=machines) is not persisted in URL; it resets to the default “machines” tab.
Pass: Multiple filters apply with AND logic. Tab switching preserves filter state within a session. Page reload resets filter state (filters are not URL-persisted).
Fail / Common issues:
- Tag filter dropdown not appearing after adding tags — reload the page. The
allTagslist is derived from the fetched machine data; it updates on the next fetch. - Combined filters show unexpected results — each filter condition must ALL be true for a row to appear. If a machine appears unexpectedly, check its status, OS, and tag fields via the API.
Summary
| Sub-test | What it proves | Pass condition |
|---|---|---|
| ST1 | Search filter narrows by name and IP | Name/IP substring match; empty search restores all; no-match shows empty state |
| ST2 | Status filter isolates by machine status | Online, offline, pending, quarantined correctly filtered; “All” restores full list |
| ST3 | OS filter partitions by operating system | Windows shows Win-A + Win-B; Linux shows Linux-C; non-existent OS shows empty |
| ST4 | Tag filter shows only tagged machines | Tag dropdown appears after tagging; single and combined tag/OS filters work |
| ST5 | Combined filters apply AND logic; tabs preserve state | All three filters simultaneously applied; tab switch preserves filter state; reload resets filters |