144 lines
3.9 KiB
TypeScript
144 lines
3.9 KiB
TypeScript
/**
|
|||
|
|
* store-reconnect unit tests (node:test).
|
||
|
|
* Pure helpers for store cutover reconnect UX (StoreReconnectBanner / ProductSyncSummary).
|
||
|
|
*
|
||
|
|
* Run from apps/web:
|
||
|
|
* node --experimental-strip-types --test src/lib/store-reconnect.test.ts
|
||
|
|
*/
|
||
|
|
import assert from "node:assert/strict";
|
||
|
|
import { describe, it } from "node:test";
|
||
|
|
|
||
|
|
import {
|
||
|
|
STORE_RECONNECT_TARGETS,
|
||
|
|
STORE_RECONNECT_WIZARD_HREF,
|
||
|
|
needsStoreReconnect,
|
||
|
|
storeConnectorAction,
|
||
|
|
storeReconnectHref
|
||
|
|
} from "./store-reconnect.ts";
|
||
|
|
|
||
|
|
describe("STORE_RECONNECT_TARGETS", () => {
|
||
|
|
it("lists WooCommerce and Shopify with connection deep links", () => {
|
||
|
|
assert.deepEqual(
|
||
|
|
STORE_RECONNECT_TARGETS.map((t) => t.id),
|
||
|
|
["woocommerce", "shopify"]
|
||
|
|
);
|
||
|
|
const woo = STORE_RECONNECT_TARGETS.find((t) => t.id === "woocommerce");
|
||
|
|
const shopify = STORE_RECONNECT_TARGETS.find((t) => t.id === "shopify");
|
||
|
|
assert.ok(woo);
|
||
|
|
assert.ok(shopify);
|
||
|
|
assert.equal(woo.href, "/woocommerce?tab=connection#store-reconnect");
|
||
|
|
assert.equal(shopify.href, "/stores/shopify?tab=connection#store-reconnect");
|
||
|
|
assert.equal(woo.label, "WooCommerce");
|
||
|
|
assert.equal(shopify.label, "Shopify");
|
||
|
|
});
|
||
|
|
|
||
|
|
it("exposes guided wizard href", () => {
|
||
|
|
assert.equal(STORE_RECONNECT_WIZARD_HREF, "/stores/wizard");
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("needsStoreReconnect", () => {
|
||
|
|
it("returns false for missing or empty probes", () => {
|
||
|
|
assert.equal(needsStoreReconnect(null), false);
|
||
|
|
assert.equal(needsStoreReconnect(undefined), false);
|
||
|
|
assert.equal(needsStoreReconnect({}), false);
|
||
|
|
assert.equal(needsStoreReconnect({ configured: false }), false);
|
||
|
|
assert.equal(needsStoreReconnect({ store_url: " ", shop_domain: "" }), false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("returns false when credentials are present", () => {
|
||
|
|
assert.equal(
|
||
|
|
needsStoreReconnect({
|
||
|
|
configured: true,
|
||
|
|
has_credentials: true,
|
||
|
|
store_url: "https://shop.example"
|
||
|
|
}),
|
||
|
|
false
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
needsStoreReconnect({
|
||
|
|
has_credentials: true,
|
||
|
|
shop_domain: "example.myshopify.com"
|
||
|
|
}),
|
||
|
|
false
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("returns true when configured but secrets are missing", () => {
|
||
|
|
assert.equal(needsStoreReconnect({ configured: true }), true);
|
||
|
|
assert.equal(
|
||
|
|
needsStoreReconnect({ configured: true, has_credentials: false }),
|
||
|
|
true
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("returns true when store identity exists without credentials", () => {
|
||
|
|
assert.equal(
|
||
|
|
needsStoreReconnect({ store_url: "https://shop.example" }),
|
||
|
|
true
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
needsStoreReconnect({ shop_domain: "example.myshopify.com" }),
|
||
|
|
true
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
needsStoreReconnect({
|
||
|
|
store_url: " https://shop.example ",
|
||
|
|
has_credentials: false
|
||
|
|
}),
|
||
|
|
true
|
||
|
|
);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("storeReconnectHref", () => {
|
||
|
|
it("resolves known connector ids", () => {
|
||
|
|
assert.equal(
|
||
|
|
storeReconnectHref("woocommerce"),
|
||
|
|
"/woocommerce?tab=connection#store-reconnect"
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
storeReconnectHref("shopify"),
|
||
|
|
"/stores/shopify?tab=connection#store-reconnect"
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("falls back to /stores for unknown ids", () => {
|
||
|
|
assert.equal(
|
||
|
|
storeReconnectHref("unknown" as "woocommerce"),
|
||
|
|
"/stores"
|
||
|
|
);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe("storeConnectorAction", () => {
|
||
|
|
it("shows connect/reconnect only for company admins", () => {
|
||
|
|
assert.equal(
|
||
|
|
storeConnectorAction({ canAdmin: true, connected: false, needsReconnect: false }),
|
||
|
|
"connect"
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
storeConnectorAction({ canAdmin: true, connected: false, needsReconnect: true }),
|
||
|
|
"reconnect"
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
storeConnectorAction({ canAdmin: false, connected: false, needsReconnect: false }),
|
||
|
|
"view"
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
storeConnectorAction({ canAdmin: false, connected: false, needsReconnect: true }),
|
||
|
|
"view"
|
||
|
|
);
|
||
|
|
});
|
||
|
|
|
||
|
|
it("keeps open for connected stores regardless of role", () => {
|
||
|
|
assert.equal(
|
||
|
|
storeConnectorAction({ canAdmin: false, connected: true, needsReconnect: false }),
|
||
|
|
"open"
|
||
|
|
);
|
||
|
|
assert.equal(
|
||
|
|
storeConnectorAction({ canAdmin: true, connected: true, needsReconnect: false }),
|
||
|
|
"open"
|
||
|
|
);
|
||
|
|
});
|
||
|
|
});
|