import { renderToStaticMarkup } from "react-dom/server"; import { describe, expect, it } from "vitest"; import type { ComponentPackageStatus as ComponentPackageStatusDto } from "../../domain/types"; import { ComponentPackageStatus, ComponentPackageStatusLoading, ComponentPackageStatusUnavailable, isNumericVersionNewer, offlineUpdateDisabledReason, } from "./ComponentPackageStatus"; function packageStatus( overrides: Partial = {}, ): ComponentPackageStatusDto { return { componentId: "proxifyre", installedVersion: "2.2.1", bundledVersion: "2.2.1", availableOfflineVersion: "2.2.1", latestKnownVersion: null, lastCheckedAt: null, freshness: "never_checked", updateState: "unknown_offline", installSource: "bundled", offlinePackageSource: "bundled", canInstallOffline: true, offlineUnavailableReason: null, canDownload: false, ...overrides, }; } function renderStatus( status: ComponentPackageStatusDto, uacCancelled = false, updateBlockedReason: string | null = null, externalBusyReason: string | null = null, ) { return renderToStaticMarkup( undefined} onDownload={() => undefined} onUpdate={() => undefined} />, ); } function openingButtonTag(markup: string, label: string) { const labelIndex = markup.indexOf(label); const start = markup.lastIndexOf("", start) + 1); } describe("ComponentPackageStatus", () => { it("compares only numeric versions for offline update", () => { expect(isNumericVersionNewer("2.10.0", "2.9.9")).toBe(true); expect(isNumericVersionNewer("2.2.1", "2.2.1.0")).toBe(false); expect(isNumericVersionNewer("2.2.0", "2.2.1")).toBe(false); expect(isNumericVersionNewer("v2.3.0", "2.2.1")).toBe(false); }); it("enables offline update only for a newer verified local version", () => { const enabledStatus = packageStatus({ availableOfflineVersion: "2.3.0", offlinePackageSource: "cache", }); const enabledMarkup = renderStatus(enabledStatus); const disabledMarkup = renderStatus(packageStatus()); expect(offlineUpdateDisabledReason(enabledStatus)).toBeNull(); expect(openingButtonTag(enabledMarkup, "Обновить компонент")).not.toContain( "disabled", ); expect(enabledMarkup).toContain("повторно проверяется в сети"); expect(openingButtonTag(disabledMarkup, "Обновить компонент")).toContain( "disabled", ); }); it("does not offer the cache-only update action for a bundled package", () => { const markup = renderStatus( packageStatus({ updateState: "update_available", installedVersion: "2.2.1", availableOfflineVersion: "2.4.0", offlinePackageSource: "bundled", }), ); expect(markup).toContain("отдельно скачанного и проверенного пакета"); expect(markup).toContain("Встроенная версия новее"); expect(openingButtonTag(markup, "Обновить компонент")).toContain( "disabled", ); }); it("shows local truth without claiming an offline update", () => { const markup = renderStatus(packageStatus()); expect(markup).toContain("Только локальные данные"); expect(markup).toContain("это не означает, что компонент устарел"); expect(markup).toContain("Установлена"); expect(markup).toContain("Встроена"); expect(markup).toContain("Последняя известная"); expect(markup.match(/