diff --git a/gui/src/pages/config/sections/ModelsSection.test.tsx b/gui/src/pages/config/sections/ModelsSection.test.tsx new file mode 100644 index 00000000000..bcac6f2c474 --- /dev/null +++ b/gui/src/pages/config/sections/ModelsSection.test.tsx @@ -0,0 +1,73 @@ +import { act, fireEvent, render, screen } from "@testing-library/react"; +import { Provider } from "react-redux"; +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { AuthProvider } from "../../../context/Auth"; +import { IdeMessengerContext } from "../../../context/IdeMessenger"; +import { MockIdeMessenger } from "../../../context/MockIdeMessenger"; +import { createMockStore } from "../../../util/test/mockStore"; +import { ModelsSection } from "./ModelsSection"; + +describe("ModelsSection", () => { + const renderComponent = async (mockMessenger?: MockIdeMessenger) => { + const { mockIdeMessenger, ...store } = createMockStore({}, mockMessenger); + + const result = await act(async () => + render( + + + + + + + , + ), + ); + + return { ...result, mockIdeMessenger }; + }; + + beforeEach(() => { + vi.clearAllMocks(); + }); + + it("renders current docs links for chat, autocomplete, and edit", async () => { + await renderComponent(); + + const learnMoreLinks = screen.getAllByRole("link", { name: "Learn more" }); + const hrefs = learnMoreLinks.map((link) => link.getAttribute("href")); + + expect(hrefs).toEqual([ + "https://docs.continue.dev/ide-extensions/chat/quick-start", + "https://docs.continue.dev/ide-extensions/autocomplete/quick-start", + "https://docs.continue.dev/ide-extensions/edit/quick-start", + ]); + }); + + it("opens current setup docs URLs when setup buttons are clicked", async () => { + const { mockIdeMessenger } = await renderComponent(new MockIdeMessenger()); + const postSpy = vi.spyOn(mockIdeMessenger, "post"); + + fireEvent.click(screen.getByRole("button", { name: "Setup Chat model" })); + fireEvent.click( + screen.getByRole("button", { name: "Setup Autocomplete model" }), + ); + fireEvent.click(screen.getByRole("button", { name: "Setup Edit model" })); + + expect(postSpy).toHaveBeenCalledTimes(3); + expect(postSpy).toHaveBeenNthCalledWith( + 1, + "openUrl", + "https://docs.continue.dev/ide-extensions/chat/model-setup", + ); + expect(postSpy).toHaveBeenNthCalledWith( + 2, + "openUrl", + "https://docs.continue.dev/ide-extensions/autocomplete/model-setup", + ); + expect(postSpy).toHaveBeenNthCalledWith( + 3, + "openUrl", + "https://docs.continue.dev/ide-extensions/edit/model-setup", + ); + }); +}); diff --git a/gui/src/pages/config/sections/ModelsSection.tsx b/gui/src/pages/config/sections/ModelsSection.tsx index 316f463a88a..1c29c555be9 100644 --- a/gui/src/pages/config/sections/ModelsSection.tsx +++ b/gui/src/pages/config/sections/ModelsSection.tsx @@ -83,7 +83,7 @@ export function ModelsSection() { Used in Chat, Plan, Agent mode ( handleRoleUpdate("chat", model)} onConfigure={handleConfigureModel} - setupURL="https://docs.continue.dev/chat/model-setup" + setupURL="https://docs.continue.dev/ide-extensions/chat/model-setup" /> @@ -109,7 +109,7 @@ export function ModelsSection() { Used in inline code completions as you type ( handleRoleUpdate("autocomplete", model)} onConfigure={handleConfigureModel} - setupURL="https://docs.continue.dev/autocomplete/model-setup" + setupURL="https://docs.continue.dev/ide-extensions/autocomplete/model-setup" /> {/* Jetbrains has a model selector inline */} @@ -142,7 +142,7 @@ export function ModelsSection() { Used to transform a selected section of code ( handleRoleUpdate("edit", model)} onConfigure={handleConfigureModel} - setupURL="https://docs.continue.dev/edit/model-setup" + setupURL="https://docs.continue.dev/ide-extensions/edit/model-setup" /> )}