184 lines
5.3 KiB
TypeScript
184 lines
5.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { buildInspectorReadabilitySummary } from "./inspector-readability";
|
|
|
|
describe("inspector readability summary", () => {
|
|
it("guides the operator when no key is selected", () => {
|
|
expect(
|
|
buildInspectorReadabilitySummary({
|
|
databaseLabel: "db4",
|
|
runtimeMode: "live",
|
|
selectedKey: null,
|
|
record: null,
|
|
isLoading: false,
|
|
isEditable: false,
|
|
ttlWriteSupported: false,
|
|
}),
|
|
).toEqual(
|
|
expect.objectContaining({
|
|
status: "awaiting selection",
|
|
surfaceTitle: "No key selected",
|
|
actionTitle: "Next step",
|
|
facts: expect.arrayContaining([
|
|
{ label: "Scope", value: "db4" },
|
|
{ label: "Type", value: "unknown" },
|
|
]),
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("describes editable live strings with explicit write semantics", () => {
|
|
expect(
|
|
buildInspectorReadabilitySummary({
|
|
databaseLabel: "db0",
|
|
runtimeMode: "live",
|
|
selectedKey: {
|
|
name: "cache:homepage",
|
|
type: "string",
|
|
ttl: "48s",
|
|
},
|
|
record: {
|
|
metadata: {
|
|
key_type: "string",
|
|
ttl: { kind: "expires_in_millis", value: 48_000 },
|
|
},
|
|
data: {
|
|
kind: "string",
|
|
value: { kind: "string", value: "payload" },
|
|
},
|
|
},
|
|
isLoading: false,
|
|
isEditable: true,
|
|
ttlWriteSupported: true,
|
|
}),
|
|
).toEqual({
|
|
status: "editable string",
|
|
surfaceTitle: "String value",
|
|
surfaceDescription:
|
|
"The full live string payload is loaded in the inspector. Saving replaces the entire string value and preserves the active TTL boundary.",
|
|
actionTitle: "Operator path",
|
|
actionDescription:
|
|
"Review the full payload, make bounded edits, and use Save string value when you are ready to replace the current value.",
|
|
facts: [
|
|
{ label: "Scope", value: "db0" },
|
|
{ label: "Type", value: "string" },
|
|
{ label: "TTL state", value: "48s" },
|
|
{ label: "Value shape", value: "string payload" },
|
|
{ label: "Write path", value: "replace full string" },
|
|
{ label: "TTL control", value: "available" },
|
|
],
|
|
});
|
|
});
|
|
|
|
it("describes structured live values as readable inspection-only surfaces", () => {
|
|
expect(
|
|
buildInspectorReadabilitySummary({
|
|
databaseLabel: "db0",
|
|
runtimeMode: "live",
|
|
selectedKey: {
|
|
name: "session:42",
|
|
type: "hash",
|
|
ttl: "13m",
|
|
},
|
|
record: {
|
|
metadata: {
|
|
key_type: "hash",
|
|
ttl: { kind: "expires_in_millis", value: 780_000 },
|
|
},
|
|
data: {
|
|
kind: "hash",
|
|
entries: [
|
|
{
|
|
field: { kind: "string", value: "region" },
|
|
value: { kind: "string", value: "eu-west-1" },
|
|
},
|
|
{
|
|
field: { kind: "string", value: "role" },
|
|
value: { kind: "string", value: "editor" },
|
|
},
|
|
],
|
|
},
|
|
},
|
|
isLoading: false,
|
|
isEditable: false,
|
|
ttlWriteSupported: true,
|
|
}),
|
|
).toEqual(
|
|
expect.objectContaining({
|
|
status: "structured read only",
|
|
surfaceTitle: "Hash fields",
|
|
facts: [
|
|
{ label: "Scope", value: "db0" },
|
|
{ label: "Type", value: "hash" },
|
|
{ label: "TTL state", value: "13m" },
|
|
{ label: "Value shape", value: "2 fields" },
|
|
{ label: "Write path", value: "inspection only" },
|
|
{ label: "TTL control", value: "available" },
|
|
],
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("keeps demo mode explicit so shell review is not confused with live evidence", () => {
|
|
expect(
|
|
buildInspectorReadabilitySummary({
|
|
databaseLabel: "db0",
|
|
runtimeMode: "demo",
|
|
selectedKey: {
|
|
name: "cache:homepage",
|
|
type: "string",
|
|
ttl: "48s",
|
|
},
|
|
record: null,
|
|
isLoading: false,
|
|
isEditable: true,
|
|
ttlWriteSupported: true,
|
|
}),
|
|
).toEqual(
|
|
expect.objectContaining({
|
|
status: "demo editable",
|
|
surfaceTitle: "String value",
|
|
facts: expect.arrayContaining([
|
|
{ label: "Write path", value: "session-local string save" },
|
|
{ label: "TTL control", value: "available" },
|
|
]),
|
|
}),
|
|
);
|
|
});
|
|
|
|
it("makes stale browse-to-read gaps explicit when the key disappears", () => {
|
|
expect(
|
|
buildInspectorReadabilitySummary({
|
|
databaseLabel: "db2",
|
|
runtimeMode: "live",
|
|
selectedKey: {
|
|
name: "jobs:failed",
|
|
type: "list",
|
|
ttl: "persistent",
|
|
},
|
|
record: {
|
|
metadata: {
|
|
key_type: "list",
|
|
ttl: { kind: "missing" },
|
|
},
|
|
data: {
|
|
kind: "missing",
|
|
},
|
|
},
|
|
isLoading: false,
|
|
isEditable: false,
|
|
ttlWriteSupported: false,
|
|
}),
|
|
).toEqual(
|
|
expect.objectContaining({
|
|
status: "missing key",
|
|
surfaceTitle: "Key disappeared after browse",
|
|
facts: expect.arrayContaining([
|
|
{ label: "Scope", value: "db2" },
|
|
{ label: "TTL state", value: "missing" },
|
|
{ label: "Write path", value: "not available" },
|
|
]),
|
|
}),
|
|
);
|
|
});
|
|
});
|