Skip to content

Commit ac5d042

Browse files
test: cover settings import timestamp cache reset behavior
Strengthen SettingsView regression coverage around settingsImportedAt. Verify that replaying the same import timestamp does not let the cache-busting effect overwrite an in-progress provider edit, and add the inverse case to prove a fresh import timestamp still refreshes cachedState from the latest extensionState apiConfiguration. Also assert that a fresh import clears the dirty state by disabling the Save button after pending edits are replaced by imported settings.
1 parent 26dea4e commit ac5d042

1 file changed

Lines changed: 56 additions & 1 deletion

File tree

webview-ui/src/components/settings/__tests__/SettingsView.change-detection.spec.tsx

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { render, screen, fireEvent, waitFor } from "@testing-library/react"
1+
import { act, render, screen, fireEvent, waitFor } from "@testing-library/react"
22
import { vi, describe, it, expect, beforeEach } from "vitest"
33
import { QueryClient, QueryClientProvider } from "@tanstack/react-query"
44
import React from "react"
@@ -449,6 +449,12 @@ describe("SettingsView - Change Detection Fix", () => {
449449
</QueryClientProvider>,
450450
)
451451

452+
// Let the import cache-busting effect run. With the old implementation,
453+
// this would reset cachedState back to the replayed Baseten config.
454+
await act(async () => {
455+
await new Promise((resolve) => setTimeout(resolve, 0))
456+
})
457+
452458
expect(screen.getByTestId("provider-value")).toHaveTextContent("deepseek")
453459

454460
mockPostMessage.mockClear()
@@ -462,4 +468,53 @@ describe("SettingsView - Change Detection Fix", () => {
462468
}),
463469
})
464470
})
471+
472+
it("resets cached provider state when a new import timestamp arrives", async () => {
473+
const onDone = vi.fn()
474+
let extensionState = createExtensionState({
475+
settingsImportedAt: 100,
476+
apiConfiguration: {
477+
apiProvider: "openai",
478+
apiModelId: "gpt-4.1",
479+
},
480+
})
481+
482+
;(useExtensionState as any).mockImplementation(() => extensionState)
483+
484+
const { rerender } = render(
485+
<QueryClientProvider client={queryClient}>
486+
<SettingsView onDone={onDone} />
487+
</QueryClientProvider>,
488+
)
489+
490+
await waitFor(() => {
491+
expect(screen.getByTestId("provider-value")).toHaveTextContent("openai")
492+
})
493+
494+
fireEvent.click(screen.getByTestId("set-provider-deepseek"))
495+
expect(screen.getByTestId("provider-value")).toHaveTextContent("deepseek")
496+
497+
extensionState = createExtensionState({
498+
settingsImportedAt: 101,
499+
apiConfiguration: {
500+
apiProvider: "baseten",
501+
apiModelId: "zai-org/GLM-4.6",
502+
basetenApiKey: "imported-baseten-key",
503+
},
504+
})
505+
506+
rerender(
507+
<QueryClientProvider client={queryClient}>
508+
<SettingsView onDone={onDone} />
509+
</QueryClientProvider>,
510+
)
511+
512+
await waitFor(() => {
513+
expect(screen.getByTestId("provider-value")).toHaveTextContent("baseten")
514+
})
515+
516+
await waitFor(() => {
517+
expect(screen.getByTestId("save-button")).toBeDisabled()
518+
})
519+
})
465520
})

0 commit comments

Comments
 (0)