You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chajia/__tests__/workers/rpa/place-commit-strategy.test.ts

180 lines
5.2 KiB

import { describe, expect, it, vi, beforeEach } from "vitest";
import type { Page } from "playwright";
import { AxelSelectionBridge } from "@/workers/rpa/axel-selection-bridge";
vi.mock("@/lib/rpa/env", () => ({
getRpaPlaceFixMode: vi.fn().mockReturnValue("auto"),
}));
vi.mock("@/workers/rpa/fix-place/recon-helpers", () => ({
loadReconVerdict: vi.fn().mockReturnValue({
googleMapsLoaded: false,
reactFiberKey: "not-found",
placeChangedTriggerOk: false,
verdict: "PLAN_B",
}),
}));
vi.mock("@/workers/rpa/mothership-styled-suggestion-click", () => ({
clickMothershipStyledSuggestion: vi.fn(),
reopenStyledSuggestionDropdown: vi.fn(),
waitForStyledSuggestionRows: vi.fn(),
}));
vi.mock("@/workers/rpa/fix-place/google-event-commit", () => ({
commitViaGooglePlaceEvent: vi.fn(),
}));
vi.mock("@/workers/rpa/fix-place/react-state-commit", () => ({
commitViaReactStateInjection: vi.fn(),
}));
vi.mock("@/workers/rpa/fix-place/browser-place-commit", () => ({
commitViaBrowserPlaceFetch: vi.fn(),
}));
vi.mock("@/workers/rpa/fix-place/cdp-pac-commit", () => ({
commitViaCdpDomClick: vi.fn(),
}));
vi.mock("@/workers/rpa/fix-place/direct-listener-commit", () => ({
commitViaDirectPlaceChangedListener: vi.fn(),
}));
vi.mock("@/workers/rpa/fix-place/place-diagnostic-probe", () => ({
isPlaceDiagEnabled: vi.fn().mockReturnValue(false),
setPlaceDiagMark: vi.fn(),
logPlaceDiagnostic: vi.fn(),
writePlaceDiagnosticArtifact: vi.fn(),
}));
import { commitPlaceWithStrategy } from "@/workers/rpa/fix-place/place-commit-strategy";
import { clickMothershipStyledSuggestion } from "@/workers/rpa/mothership-styled-suggestion-click";
import { commitViaBrowserPlaceFetch } from "@/workers/rpa/fix-place/browser-place-commit";
import { commitViaCdpDomClick } from "@/workers/rpa/fix-place/cdp-pac-commit";
import { commitViaDirectPlaceChangedListener } from "@/workers/rpa/fix-place/direct-listener-commit";
import { commitViaGooglePlaceEvent } from "@/workers/rpa/fix-place/google-event-commit";
import { commitViaReactStateInjection } from "@/workers/rpa/fix-place/react-state-commit";
describe("place-commit-strategy", () => {
const page = {} as Page;
let bridge: AxelSelectionBridge;
beforeEach(() => {
vi.clearAllMocks();
bridge = new AxelSelectionBridge();
bridge.recordPlaceCommit("ChIJ_test");
vi.spyOn(bridge, "waitForPlaceCommit").mockResolvedValue(true);
vi.spyOn(bridge, "hasSuccessfulPlaceNetworkRequest").mockReturnValue(true);
});
it("PLAN_B 时跳过 google-event 与 react-state", async () => {
vi.mocked(clickMothershipStyledSuggestion).mockResolvedValue({
clicked: false,
reason: "miss",
});
vi.mocked(commitViaCdpDomClick).mockResolvedValue({
ok: false,
method: "cdp-dom-click-failed",
});
vi.mocked(commitViaDirectPlaceChangedListener).mockResolvedValue({
ok: false,
method: "direct-listener-invoke-failed",
});
vi.mocked(commitViaBrowserPlaceFetch).mockResolvedValue({
ok: false,
method: "browser-place-fetch",
});
const result = await commitPlaceWithStrategy(
page,
bridge,
"ChIJ_test",
"123 Test St, Los Angeles, CA, USA",
"pickup",
undefined,
{
input: {} as never,
query: {
street: "123 Test St",
city: "Los Angeles",
state: "CA",
zip: "",
},
},
);
expect(result.ok).toBe(false);
expect(commitViaGooglePlaceEvent).not.toHaveBeenCalled();
expect(commitViaReactStateInjection).not.toHaveBeenCalled();
});
it("styled-click 成功且 place 200 时直接返回", async () => {
vi.mocked(clickMothershipStyledSuggestion).mockResolvedValue({
clicked: true,
method: "gold-exact-text",
matchedText: "123 Test St",
});
const result = await commitPlaceWithStrategy(
page,
bridge,
"ChIJ_test",
"123 Test St, Los Angeles, CA, USA",
"pickup",
undefined,
{
input: {} as never,
query: {
street: "123 Test St",
city: "Los Angeles",
state: "CA",
zip: "",
},
},
);
expect(result).toEqual({ ok: true, method: "gold-exact-text" });
});
it("cdp-click 成功且 place 200 时返回 cdp 方法", async () => {
vi.mocked(clickMothershipStyledSuggestion).mockResolvedValue({
clicked: false,
reason: "miss",
});
vi.mocked(commitViaCdpDomClick).mockResolvedValue({
ok: true,
method: "cdp-pac-item-0",
});
vi.mocked(commitViaDirectPlaceChangedListener).mockResolvedValue({
ok: false,
method: "direct-listener-no-network",
});
vi.mocked(commitViaBrowserPlaceFetch).mockResolvedValue({
ok: false,
method: "browser-place-fetch",
});
const result = await commitPlaceWithStrategy(
page,
bridge,
"ChIJ_test",
"123 Test St, Los Angeles, CA, USA",
"pickup",
undefined,
{
input: {} as never,
query: {
street: "123 Test St",
city: "Los Angeles",
state: "CA",
zip: "",
},
},
);
expect(result).toEqual({ ok: true, method: "cdp-pac-item-0" });
expect(commitViaDirectPlaceChangedListener).not.toHaveBeenCalled();
});
});