源码快照 @ 2026-09-02 (source-only, 剔除非源码素材)
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
import { describe, expect, test } from "bun:test";
|
||||
|
||||
import {
|
||||
canRetryCloudProviderRow,
|
||||
resolveCloudProviderRowStatus,
|
||||
type CloudProviderRowStateInput,
|
||||
} from "../src/react-app/domains/settings/pages/cloud-providers-view";
|
||||
|
||||
const ready: CloudProviderRowStateInput = {
|
||||
imported: true,
|
||||
outOfSync: false,
|
||||
allowed: true,
|
||||
importsUnavailable: false,
|
||||
needsCredential: false,
|
||||
needsServer: false,
|
||||
syncError: null,
|
||||
};
|
||||
|
||||
describe("Cloud provider status-only rows", () => {
|
||||
test("shows connected and syncing states from the import baseline", () => {
|
||||
expect(resolveCloudProviderRowStatus(ready)).toBe("connected");
|
||||
expect(resolveCloudProviderRowStatus({ ...ready, imported: false })).toBe("syncing");
|
||||
expect(resolveCloudProviderRowStatus({ ...ready, outOfSync: true })).toBe("syncing");
|
||||
});
|
||||
|
||||
test("never claims Connected while the server still owes an engine reload", () => {
|
||||
// Truthfulness gate for #3671's UI layer: the provider is materialized
|
||||
// (listed by /cloud-provider-sync/status) but its models are not served
|
||||
// until the pending reload lands, so the row must stay in progress.
|
||||
expect(resolveCloudProviderRowStatus({ ...ready, reloadPending: true })).toBe("syncing");
|
||||
expect(resolveCloudProviderRowStatus({ ...ready, reloadPending: false })).toBe("connected");
|
||||
});
|
||||
|
||||
test("surfaces a server-side skip as the credential attention state instead of endless Syncing", () => {
|
||||
const skipped = resolveCloudProviderRowStatus({
|
||||
...ready,
|
||||
imported: false,
|
||||
skippedByServer: true,
|
||||
});
|
||||
expect(skipped).toBe("needs_credential");
|
||||
expect(canRetryCloudProviderRow(skipped)).toBe(false);
|
||||
});
|
||||
|
||||
test("shows policy and workspace gates without retrying", () => {
|
||||
const blocked = resolveCloudProviderRowStatus({ ...ready, allowed: false });
|
||||
const unavailable = resolveCloudProviderRowStatus({ ...ready, importsUnavailable: true });
|
||||
expect(blocked).toBe("blocked");
|
||||
expect(unavailable).toBe("unavailable");
|
||||
expect(canRetryCloudProviderRow(blocked)).toBe(false);
|
||||
expect(canRetryCloudProviderRow(unavailable)).toBe(false);
|
||||
});
|
||||
|
||||
test("renders credential, server, and generic sync errors with retry only for generic errors", () => {
|
||||
const needsCredential = resolveCloudProviderRowStatus({
|
||||
...ready,
|
||||
needsCredential: true,
|
||||
});
|
||||
const needsServer = resolveCloudProviderRowStatus({
|
||||
...ready,
|
||||
needsServer: true,
|
||||
});
|
||||
const error = resolveCloudProviderRowStatus({
|
||||
...ready,
|
||||
syncError: { kind: "error", message: "Network failed" },
|
||||
});
|
||||
expect(needsCredential).toBe("needs_credential");
|
||||
expect(needsServer).toBe("needs_server");
|
||||
expect(error).toBe("error");
|
||||
expect(canRetryCloudProviderRow(needsCredential)).toBe(false);
|
||||
expect(canRetryCloudProviderRow(needsServer)).toBe(false);
|
||||
expect(canRetryCloudProviderRow(error)).toBe(true);
|
||||
});
|
||||
|
||||
test("keeps conflict terminal without a retry action", () => {
|
||||
const conflict = resolveCloudProviderRowStatus({
|
||||
...ready,
|
||||
imported: false,
|
||||
syncError: { kind: "conflict", message: "openwork already exists" },
|
||||
});
|
||||
expect(conflict).toBe("conflict");
|
||||
expect(canRetryCloudProviderRow(conflict)).toBe(false);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user