Some checks failed
CI / Lint, Unit & Integration Tests (push) Has been cancelled
Multi-pin pickup selection (study §3.4) — previously a standalone unused endpoint + TODO comments: - app/services/pickup-locations.server.ts: pure filterPickupLocationIds + I/O resolvePickupLocations (active + has a PICKUP slot template + ProductRule allowedLocationIds + inventory exclusion). - resolveAvailabilityRequest returns pickupLocations[] on method=PICKUP and defaults the active location to the first eligible pickup point. - apps.scheduling.locations.tsx refactored onto the shared resolver (was a second copy of the logic). - Storefront widget: pickup-location chooser (name + address, optional multi-pin Google map) when >1 eligible point and none block-configured; picking one re-requests availability for that location. New styles + widget.choose_pickup_location locale (en + fr). - Checkout extension Checkout.jsx: same chooser before the date list. - tests/unit/pickup-locations.test.ts (5 cases); suite 161 green. checkout-datetime follow-up fixes from the 808a3b7 review: - typescript devDep ^7.0.2 -> ^5.6.3 (there is no typescript@7 on npm). - Deleted dead shopify.d.ts (Preact-global shim, unused after the React rewrite) and dropped it from tsconfig include. Also stages the CLI-written `uid` lines in the checkout-datetime and payment-customization extension tomls. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
53 lines
1.8 KiB
TypeScript
53 lines
1.8 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { filterPickupLocationIds } from "../../app/services/pickup-locations.server";
|
|
|
|
const candidates = [{ id: "a" }, { id: "b" }, { id: "c" }, { id: "d" }];
|
|
|
|
describe("filterPickupLocationIds", () => {
|
|
it("keeps only candidates that both offer PICKUP slots and stock the cart, in candidate order", () => {
|
|
const result = filterPickupLocationIds({
|
|
candidates,
|
|
pickupTemplateLocationIds: new Set(["a", "b", "c"]),
|
|
stockedLocationIds: new Set(["b", "c", "d"]),
|
|
});
|
|
expect(result).toEqual(["b", "c"]);
|
|
});
|
|
|
|
it("drops a location with no PICKUP slot template even if it's in stock", () => {
|
|
const result = filterPickupLocationIds({
|
|
candidates,
|
|
pickupTemplateLocationIds: new Set(["a"]),
|
|
stockedLocationIds: new Set(["a", "b", "c", "d"]),
|
|
});
|
|
expect(result).toEqual(["a"]);
|
|
});
|
|
|
|
it("drops a pickup-capable location that stocks none of the cart", () => {
|
|
const result = filterPickupLocationIds({
|
|
candidates,
|
|
pickupTemplateLocationIds: new Set(["a", "b"]),
|
|
stockedLocationIds: new Set(["b"]),
|
|
});
|
|
expect(result).toEqual(["b"]);
|
|
});
|
|
|
|
it("returns [] when nothing qualifies", () => {
|
|
expect(
|
|
filterPickupLocationIds({
|
|
candidates,
|
|
pickupTemplateLocationIds: new Set(["a"]),
|
|
stockedLocationIds: new Set(["b"]),
|
|
}),
|
|
).toEqual([]);
|
|
});
|
|
|
|
it("preserves the candidate ordering (oldest-first) rather than set iteration order", () => {
|
|
const result = filterPickupLocationIds({
|
|
candidates: [{ id: "d" }, { id: "c" }, { id: "b" }, { id: "a" }],
|
|
pickupTemplateLocationIds: new Set(["a", "b", "c", "d"]),
|
|
stockedLocationIds: new Set(["a", "b", "c", "d"]),
|
|
});
|
|
expect(result).toEqual(["d", "c", "b", "a"]);
|
|
});
|
|
});
|