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.
180 lines
5.2 KiB
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();
|
|
});
|
|
});
|