Improve autofill status feedback
This commit is contained in:
+106
@@ -2563,6 +2563,112 @@ func TestUIStatusToastExpiresAfterTimeout(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIAutofillStatusSurfaceUsesPendingApproval(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
u := newUIWithModel("desktop", vault.Model{})
|
||||
u.state.Approvals = &mainStubApprovalManager{
|
||||
pending: []apiapproval.Request{
|
||||
{
|
||||
ID: "approval-1",
|
||||
TokenName: "Browser Extension",
|
||||
ClientName: "Firefox",
|
||||
Operation: apitokens.OperationCopyPassword,
|
||||
Resource: apitokens.Resource{Kind: apitokens.ResourceEntry, EntryID: "entry-1"},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
got := u.autofillStatusSurface()
|
||||
if got.Kind != autofillStatusAwaitingApproval {
|
||||
t.Fatalf("autofillStatusSurface().Kind = %q, want %q", got.Kind, autofillStatusAwaitingApproval)
|
||||
}
|
||||
if got.Title != "Autofill approval needed" {
|
||||
t.Fatalf("autofillStatusSurface().Title = %q, want %q", got.Title, "Autofill approval needed")
|
||||
}
|
||||
if !strings.Contains(got.Message, "Firefox (Browser Extension)") {
|
||||
t.Fatalf("autofillStatusSurface().Message = %q, want requester details", got.Message)
|
||||
}
|
||||
if got.Detail != "Entry entry-1" {
|
||||
t.Fatalf("autofillStatusSurface().Detail = %q, want %q", got.Detail, "Entry entry-1")
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIAutofillStatusSurfaceUsesAuditEventsForFoundAmbiguousAndBlocked(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
now := time.Date(2026, time.March, 31, 12, 0, 0, 0, time.UTC)
|
||||
u := newUIWithModel("desktop", vault.Model{})
|
||||
u.now = func() time.Time { return now }
|
||||
u.auditLog = apiaudit.New(10)
|
||||
|
||||
u.auditLog.Record(apiaudit.Event{
|
||||
Type: apiaudit.EventAutofillFound,
|
||||
At: now,
|
||||
TokenName: "Browser Extension",
|
||||
Message: "Vault Console is ready to fill.",
|
||||
Resource: apitokens.Resource{Kind: apitokens.ResourceEntry, EntryID: "vault-console"},
|
||||
})
|
||||
if got := u.autofillStatusSurface(); got.Kind != autofillStatusFound || got.Title != "Autofill match ready" {
|
||||
t.Fatalf("autofillStatusSurface(found) = %#v, want found status", got)
|
||||
}
|
||||
|
||||
u.auditLog = apiaudit.New(10)
|
||||
u.auditLog.Record(apiaudit.Event{
|
||||
Type: apiaudit.EventAutofillAmbiguous,
|
||||
At: now,
|
||||
TokenName: "Browser Extension",
|
||||
Message: "Multiple entries match example.com.",
|
||||
})
|
||||
if got := u.autofillStatusSurface(); got.Kind != autofillStatusAmbiguous || got.Title != "Autofill needs a narrower match" {
|
||||
t.Fatalf("autofillStatusSurface(ambiguous) = %#v, want ambiguous status", got)
|
||||
}
|
||||
|
||||
u.auditLog = apiaudit.New(10)
|
||||
u.auditLog.Record(apiaudit.Event{
|
||||
Type: apiaudit.EventApprovalDenied,
|
||||
At: now,
|
||||
TokenName: "Browser Extension",
|
||||
ClientName: "Firefox",
|
||||
Operation: apitokens.OperationCopyPassword,
|
||||
Resource: apitokens.Resource{Kind: apitokens.ResourceEntry, EntryID: "vault-console"},
|
||||
})
|
||||
if got := u.autofillStatusSurface(); got.Kind != autofillStatusBlocked || got.Title != "Autofill was not allowed" {
|
||||
t.Fatalf("autofillStatusSurface(blocked) = %#v, want blocked status", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIAutofillStatusSurfaceIgnoresExpiredAndNonAutofillAuditEvents(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
now := time.Date(2026, time.March, 31, 12, 0, 0, 0, time.UTC)
|
||||
u := newUIWithModel("desktop", vault.Model{})
|
||||
u.now = func() time.Time { return now }
|
||||
u.auditLog = apiaudit.New(10)
|
||||
|
||||
u.auditLog.Record(apiaudit.Event{
|
||||
Type: apiaudit.EventAutofillFound,
|
||||
At: now.Add(-autofillStatusTTL - time.Second),
|
||||
TokenName: "Browser Extension",
|
||||
Message: "stale event",
|
||||
})
|
||||
if got := u.autofillStatusSurface(); got.Kind != autofillStatusNone {
|
||||
t.Fatalf("autofillStatusSurface(stale) = %#v, want none", got)
|
||||
}
|
||||
|
||||
u.auditLog = apiaudit.New(10)
|
||||
u.auditLog.Record(apiaudit.Event{
|
||||
Type: apiaudit.EventApprovalAllowed,
|
||||
At: now,
|
||||
TokenName: "CLI",
|
||||
Operation: apitokens.OperationListEntries,
|
||||
Message: "not autofill",
|
||||
})
|
||||
if got := u.autofillStatusSurface(); got.Kind != autofillStatusNone {
|
||||
t.Fatalf("autofillStatusSurface(non-autofill) = %#v, want none", got)
|
||||
}
|
||||
}
|
||||
|
||||
func TestUIRunActionNormalizesRemoteSaveConflictsForDisplay(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user