diff --git a/src/features/packets/PacketTableRow.tsx b/src/features/packets/PacketTableRow.tsx
index 68b3212..5433e94 100644
--- a/src/features/packets/PacketTableRow.tsx
+++ b/src/features/packets/PacketTableRow.tsx
@@ -54,10 +54,10 @@ export function PacketTableRow({ packet, expanded, isFresh, onToggle }: PacketTa
×{packet.observationCount}
- {observer ? (observer.displayName ?? observer.id.slice(0, 8)) : —}
+ {observer ? (observer.displayName ?? observer.id.slice(0, 8)) : n/a}
- {observer?.iata ?? —}
+ {observer?.iata ?? n/a}
diff --git a/tests/features/packets/PacketTableRow.test.tsx b/tests/features/packets/PacketTableRow.test.tsx
index 3e55fb2..7a5e7c4 100644
--- a/tests/features/packets/PacketTableRow.test.tsx
+++ b/tests/features/packets/PacketTableRow.test.tsx
@@ -1,5 +1,5 @@
import { describe, it, expect, vi } from "vitest";
-import { render, screen, fireEvent } from "@testing-library/react";
+import { render, screen, fireEvent, within } from "@testing-library/react";
import { PacketTableRow } from "../../../src/features/packets/PacketTableRow";
import type { PacketSummary } from "../../../src/types/api";
@@ -25,7 +25,13 @@ describe("PacketTableRow", () => {
it("renders line 2 even when there is no path data, so row height is constant", () => {
render( {}} />);
- expect(screen.getByText("n/a")).toBeInTheDocument();
+ expect(screen.getAllByText("n/a")).toHaveLength(3);
+ });
+
+ it("falls back to n/a in the observer and IATA cells when there is no observer", () => {
+ render( {}} />);
+ const line1 = within(screen.getByRole("button"));
+ expect(line1.getAllByText("n/a")).toHaveLength(2);
});
it("falls back to the observer id when there is no display name", () => {