@greatapps/common 1.1.713 → 1.1.715
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +32 -38
- package/dist/index.mjs.map +1 -1
- package/dist/providers/auth.provider.mjs +0 -2
- package/dist/providers/auth.provider.mjs.map +1 -1
- package/dist/testing/constants.mjs +21 -0
- package/dist/testing/constants.mjs.map +1 -0
- package/dist/testing/factories/account.factory.mjs +38 -0
- package/dist/testing/factories/account.factory.mjs.map +1 -0
- package/dist/testing/factories/create-mock.mjs +16 -0
- package/dist/testing/factories/create-mock.mjs.map +1 -0
- package/dist/testing/factories/index.mjs +21 -0
- package/dist/testing/factories/index.mjs.map +1 -0
- package/dist/testing/factories/jwt.mjs +33 -0
- package/dist/testing/factories/jwt.mjs.map +1 -0
- package/dist/testing/factories/plan.factory.mjs +23 -0
- package/dist/testing/factories/plan.factory.mjs.map +1 -0
- package/dist/testing/factories/subscription.factory.mjs +52 -0
- package/dist/testing/factories/subscription.factory.mjs.map +1 -0
- package/dist/testing/factories/user.factory.mjs +36 -0
- package/dist/testing/factories/user.factory.mjs.map +1 -0
- package/dist/testing/factories/whitelabel.factory.mjs +66 -0
- package/dist/testing/factories/whitelabel.factory.mjs.map +1 -0
- package/dist/testing/index.mjs +10 -0
- package/dist/testing/index.mjs.map +1 -0
- package/dist/testing/msw/envelope.mjs +20 -0
- package/dist/testing/msw/envelope.mjs.map +1 -0
- package/dist/testing/msw/index.mjs +10 -0
- package/dist/testing/msw/index.mjs.map +1 -0
- package/dist/testing/msw/session.handlers.mjs +23 -0
- package/dist/testing/msw/session.handlers.mjs.map +1 -0
- package/dist/testing/react/index.mjs +8 -0
- package/dist/testing/react/index.mjs.map +1 -0
- package/dist/testing/react/providers.mjs +42 -0
- package/dist/testing/react/providers.mjs.map +1 -0
- package/dist/testing/react/test-query-client.mjs +13 -0
- package/dist/testing/react/test-query-client.mjs.map +1 -0
- package/dist/testing.mjs +2 -0
- package/dist/testing.mjs.map +1 -0
- package/package.json +21 -1
- package/src/index.ts +0 -3
- package/src/providers/auth.provider.tsx +0 -3
- package/src/testing/constants.ts +19 -0
- package/src/testing/factories/account.factory.ts +37 -0
- package/src/testing/factories/create-mock.ts +18 -0
- package/src/testing/factories/index.ts +7 -0
- package/src/testing/factories/jwt.ts +44 -0
- package/src/testing/factories/plan.factory.ts +21 -0
- package/src/testing/factories/subscription.factory.ts +51 -0
- package/src/testing/factories/user.factory.ts +35 -0
- package/src/testing/factories/whitelabel.factory.ts +67 -0
- package/src/testing/index.ts +7 -0
- package/src/testing/msw/envelope.ts +19 -0
- package/src/testing/msw/index.ts +2 -0
- package/src/testing/msw/session.handlers.ts +34 -0
- package/src/testing/react/index.ts +2 -0
- package/src/testing/react/providers.tsx +65 -0
- package/src/testing/react/test-query-client.ts +11 -0
- package/src/testing.ts +1 -0
- package/dist/components/modals/HexaPromoModal.mjs +0 -169
- package/dist/components/modals/HexaPromoModal.mjs.map +0 -1
- package/dist/components/modals/HexaPromoModalGate.mjs +0 -61
- package/dist/components/modals/HexaPromoModalGate.mjs.map +0 -1
- package/dist/store/useHexaPromoModal.mjs +0 -14
- package/dist/store/useHexaPromoModal.mjs.map +0 -1
- package/dist/utils/cookies/hexa-promo.mjs +0 -88
- package/dist/utils/cookies/hexa-promo.mjs.map +0 -1
- package/src/components/modals/HexaPromoModal.tsx +0 -218
- package/src/components/modals/HexaPromoModalGate.tsx +0 -93
- package/src/store/useHexaPromoModal.ts +0 -13
- package/src/utils/cookies/hexa-promo.ts +0 -114
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { TEST_IDS } from "../constants";
|
|
2
|
+
function b64(value) {
|
|
3
|
+
return btoa(JSON.stringify(value));
|
|
4
|
+
}
|
|
5
|
+
function createTestJwt(claims = {}) {
|
|
6
|
+
const payload = {
|
|
7
|
+
session: {
|
|
8
|
+
location: {
|
|
9
|
+
continent: "SA",
|
|
10
|
+
country: claims.country ?? "BR",
|
|
11
|
+
region: "SP",
|
|
12
|
+
city: "Sao Paulo",
|
|
13
|
+
latitude: "0",
|
|
14
|
+
longitude: "0"
|
|
15
|
+
},
|
|
16
|
+
ip: "127.0.0.1",
|
|
17
|
+
timezone: "America/Sao_Paulo",
|
|
18
|
+
agent: "test",
|
|
19
|
+
code: null
|
|
20
|
+
},
|
|
21
|
+
id_wl: String(claims.id_wl ?? TEST_IDS.wl),
|
|
22
|
+
id_account: claims.id_account ?? TEST_IDS.account,
|
|
23
|
+
id_user: claims.id_user ?? TEST_IDS.user,
|
|
24
|
+
iss: "test",
|
|
25
|
+
aud: "test",
|
|
26
|
+
iat: 17e8
|
|
27
|
+
};
|
|
28
|
+
return `${b64({ alg: "none", typ: "JWT" })}.${b64(payload)}.sig`;
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
createTestJwt
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=jwt.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/factories/jwt.ts"],"sourcesContent":["import type { JWTPayload } from '../../modules/users/schema';\nimport { TEST_IDS } from '../constants';\n\nfunction b64(value: unknown): string {\n // getUserContext decodes the payload with `atob(token.split('.')[1])`, so standard base64 works.\n return btoa(JSON.stringify(value));\n}\n\nexport interface TestJwtClaims {\n id_wl?: number;\n id_account?: number;\n id_user?: number;\n // Country used by resolveLocale (session.location.country).\n country?: string;\n}\n\n// Builds a fake JWT (placeholder signature) whose payload is decodable by getUserContext and\n// resolveLocale. Used as DUMMY_AUTH_TOKEN: the common auth bypasses verification when that env is\n// set, so only the payload matters.\nexport function createTestJwt(claims: TestJwtClaims = {}): string {\n const payload: JWTPayload = {\n session: {\n location: {\n continent: 'SA',\n country: claims.country ?? 'BR',\n region: 'SP',\n city: 'Sao Paulo',\n latitude: '0',\n longitude: '0',\n },\n ip: '127.0.0.1',\n timezone: 'America/Sao_Paulo',\n agent: 'test',\n code: null,\n },\n id_wl: String(claims.id_wl ?? TEST_IDS.wl),\n id_account: claims.id_account ?? TEST_IDS.account,\n id_user: claims.id_user ?? TEST_IDS.user,\n iss: 'test',\n aud: 'test',\n iat: 1700000000,\n };\n return `${b64({ alg: 'none', typ: 'JWT' })}.${b64(payload)}.sig`;\n}\n"],"mappings":"AACA,SAAS,gBAAgB;AAEzB,SAAS,IAAI,OAAwB;AAEnC,SAAO,KAAK,KAAK,UAAU,KAAK,CAAC;AACnC;AAaO,SAAS,cAAc,SAAwB,CAAC,GAAW;AAChE,QAAM,UAAsB;AAAA,IAC1B,SAAS;AAAA,MACP,UAAU;AAAA,QACR,WAAW;AAAA,QACX,SAAS,OAAO,WAAW;AAAA,QAC3B,QAAQ;AAAA,QACR,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW;AAAA,MACb;AAAA,MACA,IAAI;AAAA,MACJ,UAAU;AAAA,MACV,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,IACA,OAAO,OAAO,OAAO,SAAS,SAAS,EAAE;AAAA,IACzC,YAAY,OAAO,cAAc,SAAS;AAAA,IAC1C,SAAS,OAAO,WAAW,SAAS;AAAA,IACpC,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,EACP;AACA,SAAO,GAAG,IAAI,EAAE,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,IAAI,IAAI,OAAO,CAAC;AAC5D;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { faker } from "@faker-js/faker";
|
|
2
|
+
import { createMock } from "./create-mock";
|
|
3
|
+
const createPlanItemMock = createMock((overrides) => ({
|
|
4
|
+
id_addon: overrides?.id_addon ?? 2,
|
|
5
|
+
quantity: overrides?.quantity ?? 10,
|
|
6
|
+
value: overrides?.value ?? 9990,
|
|
7
|
+
base: overrides?.base ?? true
|
|
8
|
+
}));
|
|
9
|
+
const createPlanMock = createMock((overrides) => ({
|
|
10
|
+
id: overrides?.id ?? faker.number.int({ min: 1, max: 9999 }),
|
|
11
|
+
name: overrides?.name || faker.commerce.productName(),
|
|
12
|
+
value: overrides?.value ?? 9990,
|
|
13
|
+
currency: overrides?.currency ?? "brl",
|
|
14
|
+
type: overrides?.type ?? "paid",
|
|
15
|
+
discount_semester: overrides?.discount_semester ?? 0,
|
|
16
|
+
discount_annual: overrides?.discount_annual ?? 0,
|
|
17
|
+
items: overrides?.items ?? [createPlanItemMock()]
|
|
18
|
+
}));
|
|
19
|
+
export {
|
|
20
|
+
createPlanItemMock,
|
|
21
|
+
createPlanMock
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=plan.factory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/factories/plan.factory.ts"],"sourcesContent":["import { faker } from '@faker-js/faker';\nimport { Plan, PlanItem } from '../../modules/plans/types/plan.type';\nimport { createMock } from './create-mock';\n\nexport const createPlanItemMock = createMock<PlanItem, Partial<PlanItem>>((overrides) => ({\n id_addon: overrides?.id_addon ?? 2,\n quantity: overrides?.quantity ?? 10,\n value: overrides?.value ?? 9990,\n base: overrides?.base ?? true,\n}));\n\nexport const createPlanMock = createMock<Plan, Partial<Plan>>((overrides) => ({\n id: overrides?.id ?? faker.number.int({ min: 1, max: 9999 }),\n name: overrides?.name || faker.commerce.productName(),\n value: overrides?.value ?? 9990,\n currency: overrides?.currency ?? 'brl',\n type: overrides?.type ?? 'paid',\n discount_semester: overrides?.discount_semester ?? 0,\n discount_annual: overrides?.discount_annual ?? 0,\n items: overrides?.items ?? [createPlanItemMock()],\n}));\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,kBAAkB;AAEpB,MAAM,qBAAqB,WAAwC,CAAC,eAAe;AAAA,EACxF,UAAU,WAAW,YAAY;AAAA,EACjC,UAAU,WAAW,YAAY;AAAA,EACjC,OAAO,WAAW,SAAS;AAAA,EAC3B,MAAM,WAAW,QAAQ;AAC3B,EAAE;AAEK,MAAM,iBAAiB,WAAgC,CAAC,eAAe;AAAA,EAC5E,IAAI,WAAW,MAAM,MAAM,OAAO,IAAI,EAAE,KAAK,GAAG,KAAK,KAAK,CAAC;AAAA,EAC3D,MAAM,WAAW,QAAQ,MAAM,SAAS,YAAY;AAAA,EACpD,OAAO,WAAW,SAAS;AAAA,EAC3B,UAAU,WAAW,YAAY;AAAA,EACjC,MAAM,WAAW,QAAQ;AAAA,EACzB,mBAAmB,WAAW,qBAAqB;AAAA,EACnD,iBAAiB,WAAW,mBAAmB;AAAA,EAC/C,OAAO,WAAW,SAAS,CAAC,mBAAmB,CAAC;AAClD,EAAE;","names":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { faker } from "@faker-js/faker";
|
|
2
|
+
import { TEST_IDS } from "../constants";
|
|
3
|
+
import { createMock } from "./create-mock";
|
|
4
|
+
const createSubscriptionItemMock = createMock(
|
|
5
|
+
(overrides) => ({
|
|
6
|
+
id: overrides?.id ?? faker.number.int({ min: 1, max: 99999 }),
|
|
7
|
+
deleted: overrides?.deleted ?? 0,
|
|
8
|
+
datetime_add: overrides?.datetime_add ?? /* @__PURE__ */ new Date("2025-01-01T00:00:00Z"),
|
|
9
|
+
id_wl: overrides?.id_wl ?? TEST_IDS.wl,
|
|
10
|
+
id_subscription: overrides?.id_subscription ?? 1,
|
|
11
|
+
id_addon: overrides?.id_addon ?? null,
|
|
12
|
+
value: overrides?.value ?? 9990,
|
|
13
|
+
currency: overrides?.currency ?? "brl",
|
|
14
|
+
quantity: overrides?.quantity ?? 1,
|
|
15
|
+
payment_status: overrides?.payment_status ?? 1,
|
|
16
|
+
id_charge: overrides?.id_charge ?? null,
|
|
17
|
+
trial: overrides?.trial ?? true
|
|
18
|
+
})
|
|
19
|
+
);
|
|
20
|
+
const createSubscriptionMock = createMock(
|
|
21
|
+
(overrides) => ({
|
|
22
|
+
id: overrides?.id ?? faker.number.int({ min: 1, max: 99999 }),
|
|
23
|
+
deleted: overrides?.deleted ?? 0,
|
|
24
|
+
datetime_add: overrides?.datetime_add ?? /* @__PURE__ */ new Date("2025-01-01T00:00:00Z"),
|
|
25
|
+
id_wl: overrides?.id_wl ?? TEST_IDS.wl,
|
|
26
|
+
id_account: overrides?.id_account ?? TEST_IDS.account,
|
|
27
|
+
id_card: overrides?.id_card ?? null,
|
|
28
|
+
id_coupon: overrides?.id_coupon ?? null,
|
|
29
|
+
type: overrides?.type ?? "recurring",
|
|
30
|
+
payment_method: overrides?.payment_method ?? 1,
|
|
31
|
+
periodicity: overrides?.periodicity ?? 1,
|
|
32
|
+
value: overrides?.value ?? 9990,
|
|
33
|
+
id_product: overrides?.id_product ?? 1,
|
|
34
|
+
id_plan: overrides?.id_plan ?? 1,
|
|
35
|
+
id_gateway: overrides?.id_gateway ?? null,
|
|
36
|
+
gateway_account: overrides?.gateway_account ?? null,
|
|
37
|
+
date_hiring: overrides?.date_hiring ?? /* @__PURE__ */ new Date("2025-01-01"),
|
|
38
|
+
date_due: overrides?.date_due ?? /* @__PURE__ */ new Date("2099-01-01"),
|
|
39
|
+
date_cancellation: overrides?.date_cancellation ?? null,
|
|
40
|
+
date_verification: overrides?.date_verification ?? null,
|
|
41
|
+
cancellation_reason: overrides?.cancellation_reason ?? null,
|
|
42
|
+
cancellation_description: overrides?.cancellation_description ?? null,
|
|
43
|
+
active: overrides?.active ?? true,
|
|
44
|
+
charged: overrides?.charged ?? true,
|
|
45
|
+
items: overrides?.items ?? [createSubscriptionItemMock()]
|
|
46
|
+
})
|
|
47
|
+
);
|
|
48
|
+
export {
|
|
49
|
+
createSubscriptionItemMock,
|
|
50
|
+
createSubscriptionMock
|
|
51
|
+
};
|
|
52
|
+
//# sourceMappingURL=subscription.factory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/factories/subscription.factory.ts"],"sourcesContent":["import { faker } from '@faker-js/faker';\nimport { Subscription, SubscriptionItem } from '../../modules/subscriptions/types/subscription.type';\nimport { TEST_IDS } from '../constants';\nimport { createMock } from './create-mock';\n\nexport const createSubscriptionItemMock = createMock<SubscriptionItem, Partial<SubscriptionItem>>(\n (overrides) => ({\n id: overrides?.id ?? faker.number.int({ min: 1, max: 99999 }),\n deleted: overrides?.deleted ?? 0,\n datetime_add: overrides?.datetime_add ?? new Date('2025-01-01T00:00:00Z'),\n id_wl: overrides?.id_wl ?? TEST_IDS.wl,\n id_subscription: overrides?.id_subscription ?? 1,\n id_addon: overrides?.id_addon ?? null,\n value: overrides?.value ?? 9990,\n currency: overrides?.currency ?? 'brl',\n quantity: overrides?.quantity ?? 1,\n payment_status: overrides?.payment_status ?? 1,\n id_charge: overrides?.id_charge ?? null,\n trial: overrides?.trial ?? true,\n }),\n);\n\n// Default: active with a future due date (a valid trial).\nexport const createSubscriptionMock = createMock<Subscription, Partial<Subscription>>(\n (overrides) => ({\n id: overrides?.id ?? faker.number.int({ min: 1, max: 99999 }),\n deleted: overrides?.deleted ?? 0,\n datetime_add: overrides?.datetime_add ?? new Date('2025-01-01T00:00:00Z'),\n id_wl: overrides?.id_wl ?? TEST_IDS.wl,\n id_account: overrides?.id_account ?? TEST_IDS.account,\n id_card: overrides?.id_card ?? null,\n id_coupon: overrides?.id_coupon ?? null,\n type: overrides?.type ?? 'recurring',\n payment_method: overrides?.payment_method ?? 1,\n periodicity: overrides?.periodicity ?? 1,\n value: overrides?.value ?? 9990,\n id_product: overrides?.id_product ?? 1,\n id_plan: overrides?.id_plan ?? 1,\n id_gateway: overrides?.id_gateway ?? null,\n gateway_account: overrides?.gateway_account ?? null,\n date_hiring: overrides?.date_hiring ?? new Date('2025-01-01'),\n date_due: overrides?.date_due ?? new Date('2099-01-01'),\n date_cancellation: overrides?.date_cancellation ?? null,\n date_verification: overrides?.date_verification ?? null,\n cancellation_reason: overrides?.cancellation_reason ?? null,\n cancellation_description: overrides?.cancellation_description ?? null,\n active: overrides?.active ?? true,\n charged: overrides?.charged ?? true,\n items: overrides?.items ?? [createSubscriptionItemMock()],\n }),\n);\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAEpB,MAAM,6BAA6B;AAAA,EACxC,CAAC,eAAe;AAAA,IACd,IAAI,WAAW,MAAM,MAAM,OAAO,IAAI,EAAE,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IAC5D,SAAS,WAAW,WAAW;AAAA,IAC/B,cAAc,WAAW,gBAAgB,oBAAI,KAAK,sBAAsB;AAAA,IACxE,OAAO,WAAW,SAAS,SAAS;AAAA,IACpC,iBAAiB,WAAW,mBAAmB;AAAA,IAC/C,UAAU,WAAW,YAAY;AAAA,IACjC,OAAO,WAAW,SAAS;AAAA,IAC3B,UAAU,WAAW,YAAY;AAAA,IACjC,UAAU,WAAW,YAAY;AAAA,IACjC,gBAAgB,WAAW,kBAAkB;AAAA,IAC7C,WAAW,WAAW,aAAa;AAAA,IACnC,OAAO,WAAW,SAAS;AAAA,EAC7B;AACF;AAGO,MAAM,yBAAyB;AAAA,EACpC,CAAC,eAAe;AAAA,IACd,IAAI,WAAW,MAAM,MAAM,OAAO,IAAI,EAAE,KAAK,GAAG,KAAK,MAAM,CAAC;AAAA,IAC5D,SAAS,WAAW,WAAW;AAAA,IAC/B,cAAc,WAAW,gBAAgB,oBAAI,KAAK,sBAAsB;AAAA,IACxE,OAAO,WAAW,SAAS,SAAS;AAAA,IACpC,YAAY,WAAW,cAAc,SAAS;AAAA,IAC9C,SAAS,WAAW,WAAW;AAAA,IAC/B,WAAW,WAAW,aAAa;AAAA,IACnC,MAAM,WAAW,QAAQ;AAAA,IACzB,gBAAgB,WAAW,kBAAkB;AAAA,IAC7C,aAAa,WAAW,eAAe;AAAA,IACvC,OAAO,WAAW,SAAS;AAAA,IAC3B,YAAY,WAAW,cAAc;AAAA,IACrC,SAAS,WAAW,WAAW;AAAA,IAC/B,YAAY,WAAW,cAAc;AAAA,IACrC,iBAAiB,WAAW,mBAAmB;AAAA,IAC/C,aAAa,WAAW,eAAe,oBAAI,KAAK,YAAY;AAAA,IAC5D,UAAU,WAAW,YAAY,oBAAI,KAAK,YAAY;AAAA,IACtD,mBAAmB,WAAW,qBAAqB;AAAA,IACnD,mBAAmB,WAAW,qBAAqB;AAAA,IACnD,qBAAqB,WAAW,uBAAuB;AAAA,IACvD,0BAA0B,WAAW,4BAA4B;AAAA,IACjE,QAAQ,WAAW,UAAU;AAAA,IAC7B,SAAS,WAAW,WAAW;AAAA,IAC/B,OAAO,WAAW,SAAS,CAAC,2BAA2B,CAAC;AAAA,EAC1D;AACF;","names":[]}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { faker } from "@faker-js/faker";
|
|
2
|
+
import { UserProfile } from "../../modules/users/schema";
|
|
3
|
+
import { TEST_IDS } from "../constants";
|
|
4
|
+
import { createMock } from "./create-mock";
|
|
5
|
+
const createUserMock = createMock((overrides) => ({
|
|
6
|
+
id: overrides?.id ?? TEST_IDS.user,
|
|
7
|
+
id_wl: overrides?.id_wl ?? TEST_IDS.wl,
|
|
8
|
+
id_account: overrides?.id_account ?? TEST_IDS.account,
|
|
9
|
+
id_api: overrides?.id_api ?? 1,
|
|
10
|
+
name: overrides?.name || faker.person.firstName(),
|
|
11
|
+
last_name: overrides?.last_name || faker.person.lastName(),
|
|
12
|
+
email: overrides?.email || faker.internet.email().toLowerCase(),
|
|
13
|
+
ddi: overrides?.ddi || "55",
|
|
14
|
+
phone: overrides?.phone || faker.string.numeric(11),
|
|
15
|
+
rg: overrides?.rg ?? null,
|
|
16
|
+
cpf: overrides?.cpf ?? null,
|
|
17
|
+
gender: overrides?.gender ?? 0,
|
|
18
|
+
two_factor_authentication: overrides?.two_factor_authentication ?? false,
|
|
19
|
+
google_sub: overrides?.google_sub ?? null,
|
|
20
|
+
google_linked_at: overrides?.google_linked_at ?? null,
|
|
21
|
+
profile: overrides?.profile ?? UserProfile.owner,
|
|
22
|
+
language: overrides?.language ?? "pt-br",
|
|
23
|
+
receive_sms: overrides?.receive_sms ?? false,
|
|
24
|
+
receive_email: overrides?.receive_email ?? true,
|
|
25
|
+
photo: overrides?.photo ?? null,
|
|
26
|
+
deleted: overrides?.deleted ?? 0,
|
|
27
|
+
datetime_alt: overrides?.datetime_alt || "2025-01-01 00:00:00",
|
|
28
|
+
datetime_del: overrides?.datetime_del ?? null,
|
|
29
|
+
datetime_add: overrides?.datetime_add || "2025-01-01 00:00:00",
|
|
30
|
+
total_projects: overrides?.total_projects ?? 1,
|
|
31
|
+
projects: overrides?.projects ?? [{ id: 1, title: faker.company.name() }]
|
|
32
|
+
}));
|
|
33
|
+
export {
|
|
34
|
+
createUserMock
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=user.factory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/factories/user.factory.ts"],"sourcesContent":["import { faker } from '@faker-js/faker';\nimport { User, UserProfile } from '../../modules/users/schema';\nimport { TEST_IDS } from '../constants';\nimport { createMock } from './create-mock';\n\n// Identity fields (id/id_wl/id_account) are fixed to TEST_IDS by default — the auth chain and the\n// request-URL matching depend on them; override explicitly when needed. Cosmetic fields use faker.\nexport const createUserMock = createMock<User, Partial<User>>((overrides) => ({\n id: overrides?.id ?? TEST_IDS.user,\n id_wl: overrides?.id_wl ?? TEST_IDS.wl,\n id_account: overrides?.id_account ?? TEST_IDS.account,\n id_api: overrides?.id_api ?? 1,\n name: overrides?.name || faker.person.firstName(),\n last_name: overrides?.last_name || faker.person.lastName(),\n email: overrides?.email || faker.internet.email().toLowerCase(),\n ddi: overrides?.ddi || '55',\n phone: overrides?.phone || faker.string.numeric(11),\n rg: overrides?.rg ?? null,\n cpf: overrides?.cpf ?? null,\n gender: overrides?.gender ?? 0,\n two_factor_authentication: overrides?.two_factor_authentication ?? false,\n google_sub: overrides?.google_sub ?? null,\n google_linked_at: overrides?.google_linked_at ?? null,\n profile: overrides?.profile ?? UserProfile.owner,\n language: overrides?.language ?? 'pt-br',\n receive_sms: overrides?.receive_sms ?? false,\n receive_email: overrides?.receive_email ?? true,\n photo: overrides?.photo ?? null,\n deleted: overrides?.deleted ?? 0,\n datetime_alt: overrides?.datetime_alt || '2025-01-01 00:00:00',\n datetime_del: overrides?.datetime_del ?? null,\n datetime_add: overrides?.datetime_add || '2025-01-01 00:00:00',\n total_projects: overrides?.total_projects ?? 1,\n projects: overrides?.projects ?? [{ id: 1, title: faker.company.name() }],\n}));\n"],"mappings":"AAAA,SAAS,aAAa;AACtB,SAAe,mBAAmB;AAClC,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAIpB,MAAM,iBAAiB,WAAgC,CAAC,eAAe;AAAA,EAC5E,IAAI,WAAW,MAAM,SAAS;AAAA,EAC9B,OAAO,WAAW,SAAS,SAAS;AAAA,EACpC,YAAY,WAAW,cAAc,SAAS;AAAA,EAC9C,QAAQ,WAAW,UAAU;AAAA,EAC7B,MAAM,WAAW,QAAQ,MAAM,OAAO,UAAU;AAAA,EAChD,WAAW,WAAW,aAAa,MAAM,OAAO,SAAS;AAAA,EACzD,OAAO,WAAW,SAAS,MAAM,SAAS,MAAM,EAAE,YAAY;AAAA,EAC9D,KAAK,WAAW,OAAO;AAAA,EACvB,OAAO,WAAW,SAAS,MAAM,OAAO,QAAQ,EAAE;AAAA,EAClD,IAAI,WAAW,MAAM;AAAA,EACrB,KAAK,WAAW,OAAO;AAAA,EACvB,QAAQ,WAAW,UAAU;AAAA,EAC7B,2BAA2B,WAAW,6BAA6B;AAAA,EACnE,YAAY,WAAW,cAAc;AAAA,EACrC,kBAAkB,WAAW,oBAAoB;AAAA,EACjD,SAAS,WAAW,WAAW,YAAY;AAAA,EAC3C,UAAU,WAAW,YAAY;AAAA,EACjC,aAAa,WAAW,eAAe;AAAA,EACvC,eAAe,WAAW,iBAAiB;AAAA,EAC3C,OAAO,WAAW,SAAS;AAAA,EAC3B,SAAS,WAAW,WAAW;AAAA,EAC/B,cAAc,WAAW,gBAAgB;AAAA,EACzC,cAAc,WAAW,gBAAgB;AAAA,EACzC,cAAc,WAAW,gBAAgB;AAAA,EACzC,gBAAgB,WAAW,kBAAkB;AAAA,EAC7C,UAAU,WAAW,YAAY,CAAC,EAAE,IAAI,GAAG,OAAO,MAAM,QAAQ,KAAK,EAAE,CAAC;AAC1E,EAAE;","names":[]}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { faker } from "@faker-js/faker";
|
|
2
|
+
import { TEST_API, TEST_IDS } from "../constants";
|
|
3
|
+
import { createMock } from "./create-mock";
|
|
4
|
+
import { createTestJwt } from "./jwt";
|
|
5
|
+
const createWhitelabelMock = createMock(
|
|
6
|
+
(overrides) => {
|
|
7
|
+
const domain = overrides?.domain ?? TEST_API.domain;
|
|
8
|
+
return {
|
|
9
|
+
id: overrides?.id ?? TEST_IDS.wl,
|
|
10
|
+
deleted: overrides?.deleted ?? 0,
|
|
11
|
+
datetime_alt: overrides?.datetime_alt || "2025-01-01 00:00:00",
|
|
12
|
+
datetime_del: overrides?.datetime_del ?? null,
|
|
13
|
+
datetime_add: overrides?.datetime_add || "2025-01-01 00:00:00",
|
|
14
|
+
id_account: overrides?.id_account ?? TEST_IDS.account,
|
|
15
|
+
active: overrides?.active ?? true,
|
|
16
|
+
name: overrides?.name || faker.company.name(),
|
|
17
|
+
email: overrides?.email || faker.internet.email().toLowerCase(),
|
|
18
|
+
email_financial: overrides?.email_financial || faker.internet.email().toLowerCase(),
|
|
19
|
+
email_transactional: overrides?.email_transactional || faker.internet.email().toLowerCase(),
|
|
20
|
+
domain,
|
|
21
|
+
domain_free: overrides?.domain_free ?? null,
|
|
22
|
+
url_help: overrides?.url_help ?? `https://${domain}/help`,
|
|
23
|
+
url_login: overrides?.url_login ?? `https://${domain}/login`,
|
|
24
|
+
url_site: overrides?.url_site ?? `https://${domain}`,
|
|
25
|
+
url_signup: overrides?.url_signup ?? `https://${domain}/signup`,
|
|
26
|
+
codes: overrides?.codes ?? null,
|
|
27
|
+
id_gateway: overrides?.id_gateway ?? 1,
|
|
28
|
+
gateway_product: overrides?.gateway_product ?? "prod_test",
|
|
29
|
+
external_contracting: overrides?.external_contracting ?? false,
|
|
30
|
+
logo: overrides?.logo ?? `https://${domain}/logo.png`,
|
|
31
|
+
secondary_logo: overrides?.secondary_logo ?? null,
|
|
32
|
+
favicon: overrides?.favicon ?? `https://${domain}/favicon.ico`,
|
|
33
|
+
general: overrides?.general ?? {
|
|
34
|
+
primary_color: faker.color.rgb(),
|
|
35
|
+
hover_color: faker.color.rgb(),
|
|
36
|
+
link_color: faker.color.rgb()
|
|
37
|
+
},
|
|
38
|
+
signin_page: overrides?.signin_page ?? null,
|
|
39
|
+
signup_page: overrides?.signup_page ?? null,
|
|
40
|
+
dashboard: overrides?.dashboard ?? null,
|
|
41
|
+
use_policy_url: overrides?.use_policy_url ?? `https://${domain}/terms`,
|
|
42
|
+
cookie_policy_url: overrides?.cookie_policy_url ?? `https://${domain}/cookies`,
|
|
43
|
+
privacy_policy_url: overrides?.privacy_policy_url ?? `https://${domain}/privacy`,
|
|
44
|
+
editor_url: overrides?.editor_url ?? `https://editor.${domain}`,
|
|
45
|
+
accounts_url: overrides?.accounts_url ?? `https://accounts.${domain}`,
|
|
46
|
+
pages_url: overrides?.pages_url ?? `https://pages.${domain}`,
|
|
47
|
+
pages_preview_url: overrides?.pages_preview_url ?? `https://preview.${domain}`,
|
|
48
|
+
api_url: overrides?.api_url ?? TEST_API.gpages,
|
|
49
|
+
cname_url: overrides?.cname_url ?? `cname.${domain}`,
|
|
50
|
+
video_url: overrides?.video_url ?? null,
|
|
51
|
+
external_contracting_url: overrides?.external_contracting_url ?? null,
|
|
52
|
+
external_plans_url: overrides?.external_plans_url ?? null
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
const createWhitelabelTokenMock = createMock(
|
|
57
|
+
(overrides) => ({
|
|
58
|
+
...createWhitelabelMock(overrides),
|
|
59
|
+
token: overrides?.token ?? createTestJwt()
|
|
60
|
+
})
|
|
61
|
+
);
|
|
62
|
+
export {
|
|
63
|
+
createWhitelabelMock,
|
|
64
|
+
createWhitelabelTokenMock
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=whitelabel.factory.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/factories/whitelabel.factory.ts"],"sourcesContent":["import { faker } from '@faker-js/faker';\nimport { WhitelabelData, WhitelabelTokenData } from '../../modules/whitelabel/schema';\nimport { TEST_API, TEST_IDS } from '../constants';\nimport { createMock } from './create-mock';\nimport { createTestJwt } from './jwt';\n\n// id/domain stay aligned with TEST_IDS/TEST_API because resolveLocale/branding and the\n// domain-based whitelabel resolution depend on them.\nexport const createWhitelabelMock = createMock<WhitelabelData, Partial<WhitelabelData>>(\n (overrides) => {\n const domain = overrides?.domain ?? TEST_API.domain;\n return {\n id: overrides?.id ?? TEST_IDS.wl,\n deleted: overrides?.deleted ?? 0,\n datetime_alt: overrides?.datetime_alt || '2025-01-01 00:00:00',\n datetime_del: overrides?.datetime_del ?? null,\n datetime_add: overrides?.datetime_add || '2025-01-01 00:00:00',\n id_account: overrides?.id_account ?? TEST_IDS.account,\n active: overrides?.active ?? true,\n name: overrides?.name || faker.company.name(),\n email: overrides?.email || faker.internet.email().toLowerCase(),\n email_financial: overrides?.email_financial || faker.internet.email().toLowerCase(),\n email_transactional: overrides?.email_transactional || faker.internet.email().toLowerCase(),\n domain,\n domain_free: overrides?.domain_free ?? null,\n url_help: overrides?.url_help ?? `https://${domain}/help`,\n url_login: overrides?.url_login ?? `https://${domain}/login`,\n url_site: overrides?.url_site ?? `https://${domain}`,\n url_signup: overrides?.url_signup ?? `https://${domain}/signup`,\n codes: overrides?.codes ?? null,\n id_gateway: overrides?.id_gateway ?? 1,\n gateway_product: overrides?.gateway_product ?? 'prod_test',\n external_contracting: overrides?.external_contracting ?? false,\n logo: overrides?.logo ?? `https://${domain}/logo.png`,\n secondary_logo: overrides?.secondary_logo ?? null,\n favicon: overrides?.favicon ?? `https://${domain}/favicon.ico`,\n general: overrides?.general ?? {\n primary_color: faker.color.rgb(),\n hover_color: faker.color.rgb(),\n link_color: faker.color.rgb(),\n },\n signin_page: overrides?.signin_page ?? null,\n signup_page: overrides?.signup_page ?? null,\n dashboard: overrides?.dashboard ?? null,\n use_policy_url: overrides?.use_policy_url ?? `https://${domain}/terms`,\n cookie_policy_url: overrides?.cookie_policy_url ?? `https://${domain}/cookies`,\n privacy_policy_url: overrides?.privacy_policy_url ?? `https://${domain}/privacy`,\n editor_url: overrides?.editor_url ?? `https://editor.${domain}`,\n accounts_url: overrides?.accounts_url ?? `https://accounts.${domain}`,\n pages_url: overrides?.pages_url ?? `https://pages.${domain}`,\n pages_preview_url: overrides?.pages_preview_url ?? `https://preview.${domain}`,\n api_url: overrides?.api_url ?? TEST_API.gpages,\n cname_url: overrides?.cname_url ?? `cname.${domain}`,\n video_url: overrides?.video_url ?? null,\n external_contracting_url: overrides?.external_contracting_url ?? null,\n external_plans_url: overrides?.external_plans_url ?? null,\n };\n },\n);\n\n// Variant with `token` — what getTokenByDomain returns for the ApiClient to build the header.\nexport const createWhitelabelTokenMock = createMock<WhitelabelTokenData, Partial<WhitelabelTokenData>>(\n (overrides) => ({\n ...createWhitelabelMock(overrides),\n token: overrides?.token ?? createTestJwt(),\n }),\n);\n"],"mappings":"AAAA,SAAS,aAAa;AAEtB,SAAS,UAAU,gBAAgB;AACnC,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAIvB,MAAM,uBAAuB;AAAA,EAClC,CAAC,cAAc;AACb,UAAM,SAAS,WAAW,UAAU,SAAS;AAC7C,WAAO;AAAA,MACL,IAAI,WAAW,MAAM,SAAS;AAAA,MAC9B,SAAS,WAAW,WAAW;AAAA,MAC/B,cAAc,WAAW,gBAAgB;AAAA,MACzC,cAAc,WAAW,gBAAgB;AAAA,MACzC,cAAc,WAAW,gBAAgB;AAAA,MACzC,YAAY,WAAW,cAAc,SAAS;AAAA,MAC9C,QAAQ,WAAW,UAAU;AAAA,MAC7B,MAAM,WAAW,QAAQ,MAAM,QAAQ,KAAK;AAAA,MAC5C,OAAO,WAAW,SAAS,MAAM,SAAS,MAAM,EAAE,YAAY;AAAA,MAC9D,iBAAiB,WAAW,mBAAmB,MAAM,SAAS,MAAM,EAAE,YAAY;AAAA,MAClF,qBAAqB,WAAW,uBAAuB,MAAM,SAAS,MAAM,EAAE,YAAY;AAAA,MAC1F;AAAA,MACA,aAAa,WAAW,eAAe;AAAA,MACvC,UAAU,WAAW,YAAY,WAAW,MAAM;AAAA,MAClD,WAAW,WAAW,aAAa,WAAW,MAAM;AAAA,MACpD,UAAU,WAAW,YAAY,WAAW,MAAM;AAAA,MAClD,YAAY,WAAW,cAAc,WAAW,MAAM;AAAA,MACtD,OAAO,WAAW,SAAS;AAAA,MAC3B,YAAY,WAAW,cAAc;AAAA,MACrC,iBAAiB,WAAW,mBAAmB;AAAA,MAC/C,sBAAsB,WAAW,wBAAwB;AAAA,MACzD,MAAM,WAAW,QAAQ,WAAW,MAAM;AAAA,MAC1C,gBAAgB,WAAW,kBAAkB;AAAA,MAC7C,SAAS,WAAW,WAAW,WAAW,MAAM;AAAA,MAChD,SAAS,WAAW,WAAW;AAAA,QAC7B,eAAe,MAAM,MAAM,IAAI;AAAA,QAC/B,aAAa,MAAM,MAAM,IAAI;AAAA,QAC7B,YAAY,MAAM,MAAM,IAAI;AAAA,MAC9B;AAAA,MACA,aAAa,WAAW,eAAe;AAAA,MACvC,aAAa,WAAW,eAAe;AAAA,MACvC,WAAW,WAAW,aAAa;AAAA,MACnC,gBAAgB,WAAW,kBAAkB,WAAW,MAAM;AAAA,MAC9D,mBAAmB,WAAW,qBAAqB,WAAW,MAAM;AAAA,MACpE,oBAAoB,WAAW,sBAAsB,WAAW,MAAM;AAAA,MACtE,YAAY,WAAW,cAAc,kBAAkB,MAAM;AAAA,MAC7D,cAAc,WAAW,gBAAgB,oBAAoB,MAAM;AAAA,MACnE,WAAW,WAAW,aAAa,iBAAiB,MAAM;AAAA,MAC1D,mBAAmB,WAAW,qBAAqB,mBAAmB,MAAM;AAAA,MAC5E,SAAS,WAAW,WAAW,SAAS;AAAA,MACxC,WAAW,WAAW,aAAa,SAAS,MAAM;AAAA,MAClD,WAAW,WAAW,aAAa;AAAA,MACnC,0BAA0B,WAAW,4BAA4B;AAAA,MACjE,oBAAoB,WAAW,sBAAsB;AAAA,IACvD;AAAA,EACF;AACF;AAGO,MAAM,4BAA4B;AAAA,EACvC,CAAC,eAAe;AAAA,IACd,GAAG,qBAAqB,SAAS;AAAA,IACjC,OAAO,WAAW,SAAS,cAAc;AAAA,EAC3C;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/testing/index.ts"],"sourcesContent":["// `@greatapps/common/testing` — light, node/E2E-safe (factories + session handlers only). The\n// React providers live in `@greatapps/common/testing/react` so the client barrel and its\n// load-time side effects (e.g. zustand stores reading localStorage) don't leak into\n// reducer/route-handler tests. `msw` and `@faker-js/faker` are optional peer dependencies.\nexport { TEST_IDS, TEST_API, TEST_API_VERSION, TEST_API_LOCALE } from './constants';\nexport * from './factories';\nexport * from './msw';\n"],"mappings":"AAIA,SAAS,UAAU,UAAU,kBAAkB,uBAAuB;AACtE,cAAc;AACd,cAAc;","names":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { HttpResponse } from "msw";
|
|
2
|
+
function apiList(items, total = items.length) {
|
|
3
|
+
return HttpResponse.json({ status: 1, data: items, total });
|
|
4
|
+
}
|
|
5
|
+
function apiFind(item) {
|
|
6
|
+
return apiList([item], 1);
|
|
7
|
+
}
|
|
8
|
+
function apiOne(data) {
|
|
9
|
+
return HttpResponse.json({ status: 1, data });
|
|
10
|
+
}
|
|
11
|
+
function apiError(message = "test error", status = 400) {
|
|
12
|
+
return HttpResponse.json({ status: 0, message }, { status });
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
apiError,
|
|
16
|
+
apiFind,
|
|
17
|
+
apiList,
|
|
18
|
+
apiOne
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=envelope.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/msw/envelope.ts"],"sourcesContent":["import { HttpResponse } from 'msw';\n\n// The envelope GreatApps backends return. Services read `data` as an array and take `data[0]` on\n// finds, so the success default is a list; use `apiOne` for the few endpoints returning an object.\nexport function apiList<T>(items: T[], total = items.length) {\n return HttpResponse.json({ status: 1, data: items, total });\n}\n\nexport function apiFind<T>(item: T) {\n return apiList([item], 1);\n}\n\nexport function apiOne<T>(data: T) {\n return HttpResponse.json({ status: 1, data });\n}\n\nexport function apiError(message = 'test error', status = 400) {\n return HttpResponse.json({ status: 0, message }, { status });\n}\n"],"mappings":"AAAA,SAAS,oBAAoB;AAItB,SAAS,QAAW,OAAY,QAAQ,MAAM,QAAQ;AAC3D,SAAO,aAAa,KAAK,EAAE,QAAQ,GAAG,MAAM,OAAO,MAAM,CAAC;AAC5D;AAEO,SAAS,QAAW,MAAS;AAClC,SAAO,QAAQ,CAAC,IAAI,GAAG,CAAC;AAC1B;AAEO,SAAS,OAAU,MAAS;AACjC,SAAO,aAAa,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;AAC9C;AAEO,SAAS,SAAS,UAAU,cAAc,SAAS,KAAK;AAC7D,SAAO,aAAa,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,EAAE,OAAO,CAAC;AAC7D;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/msw/index.ts"],"sourcesContent":["export { apiList, apiFind, apiOne, apiError } from './envelope';\nexport { makeSessionHandlers, type SessionHandlersOptions } from './session.handlers';\n"],"mappings":"AAAA,SAAS,SAAS,SAAS,QAAQ,gBAAgB;AACnD,SAAS,2BAAwD;","names":[]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { http } from "msw";
|
|
2
|
+
import { TEST_API } from "../constants";
|
|
3
|
+
import { createAccountMock } from "../factories/account.factory";
|
|
4
|
+
import { createUserMock } from "../factories/user.factory";
|
|
5
|
+
import { createWhitelabelTokenMock } from "../factories/whitelabel.factory";
|
|
6
|
+
import { apiFind } from "./envelope";
|
|
7
|
+
function makeSessionHandlers(opts = {}) {
|
|
8
|
+
const base = opts.gappsBase ?? TEST_API.gapps;
|
|
9
|
+
const user = opts.user ?? createUserMock();
|
|
10
|
+
const account = opts.account ?? createAccountMock();
|
|
11
|
+
const whitelabel = opts.whitelabel ?? createWhitelabelTokenMock();
|
|
12
|
+
return [
|
|
13
|
+
http.get(`${base}/v1/:locale/:wl/whitelabel/:host/token`, () => apiFind(whitelabel)),
|
|
14
|
+
http.get(`${base}/v1/:locale/:wl/tokens`, () => apiFind(whitelabel)),
|
|
15
|
+
// The users path has more segments, so it must come before /accounts/:acc.
|
|
16
|
+
http.get(`${base}/v1/:locale/:wl/accounts/:acc/users/:user`, () => apiFind(user)),
|
|
17
|
+
http.get(`${base}/v1/:locale/:wl/accounts/:acc`, () => apiFind(account))
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
export {
|
|
21
|
+
makeSessionHandlers
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=session.handlers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/msw/session.handlers.ts"],"sourcesContent":["import { http } from 'msw';\nimport type { Account } from '../../modules/accounts/types';\nimport type { User } from '../../modules/users/schema';\nimport type { WhitelabelTokenData } from '../../modules/whitelabel/schema';\nimport { TEST_API } from '../constants';\nimport { createAccountMock } from '../factories/account.factory';\nimport { createUserMock } from '../factories/user.factory';\nimport { createWhitelabelTokenMock } from '../factories/whitelabel.factory';\nimport { apiFind } from './envelope';\n\nexport interface SessionHandlersOptions {\n gappsBase?: string;\n user?: User;\n account?: Account;\n whitelabel?: WhitelabelTokenData;\n}\n\n// Server-side session resolution any app triggers when booting an authenticated route with\n// DUMMY_AUTH_TOKEN (whitelabel by domain, token by wl id, user, account). Compose with app\n// handlers: setupServer(...makeSessionHandlers(), ...myPageHandlers).\nexport function makeSessionHandlers(opts: SessionHandlersOptions = {}) {\n const base = opts.gappsBase ?? TEST_API.gapps;\n const user = opts.user ?? createUserMock();\n const account = opts.account ?? createAccountMock();\n const whitelabel = opts.whitelabel ?? createWhitelabelTokenMock();\n\n return [\n http.get(`${base}/v1/:locale/:wl/whitelabel/:host/token`, () => apiFind(whitelabel)),\n http.get(`${base}/v1/:locale/:wl/tokens`, () => apiFind(whitelabel)),\n // The users path has more segments, so it must come before /accounts/:acc.\n http.get(`${base}/v1/:locale/:wl/accounts/:acc/users/:user`, () => apiFind(user)),\n http.get(`${base}/v1/:locale/:wl/accounts/:acc`, () => apiFind(account)),\n ];\n}\n"],"mappings":"AAAA,SAAS,YAAY;AAIrB,SAAS,gBAAgB;AACzB,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAC/B,SAAS,iCAAiC;AAC1C,SAAS,eAAe;AAYjB,SAAS,oBAAoB,OAA+B,CAAC,GAAG;AACrE,QAAM,OAAO,KAAK,aAAa,SAAS;AACxC,QAAM,OAAO,KAAK,QAAQ,eAAe;AACzC,QAAM,UAAU,KAAK,WAAW,kBAAkB;AAClD,QAAM,aAAa,KAAK,cAAc,0BAA0B;AAEhE,SAAO;AAAA,IACL,KAAK,IAAI,GAAG,IAAI,0CAA0C,MAAM,QAAQ,UAAU,CAAC;AAAA,IACnF,KAAK,IAAI,GAAG,IAAI,0BAA0B,MAAM,QAAQ,UAAU,CAAC;AAAA;AAAA,IAEnE,KAAK,IAAI,GAAG,IAAI,6CAA6C,MAAM,QAAQ,IAAI,CAAC;AAAA,IAChF,KAAK,IAAI,GAAG,IAAI,iCAAiC,MAAM,QAAQ,OAAO,CAAC;AAAA,EACzE;AACF;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/react/index.ts"],"sourcesContent":["export { makeTestQueryClient } from './test-query-client';\nexport { TestProviders, makeProvidersWrapper, type TestProvidersOptions } from './providers';\n"],"mappings":"AAAA,SAAS,2BAA2B;AACpC,SAAS,eAAe,4BAAuD;","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { QueryClientProvider } from "@tanstack/react-query";
|
|
3
|
+
import { AuthContext } from "../../providers/auth.provider";
|
|
4
|
+
import { WhitelabelProvider } from "../../providers/whitelabel.provider";
|
|
5
|
+
import { createAccountMock } from "../factories/account.factory";
|
|
6
|
+
import { createUserMock } from "../factories/user.factory";
|
|
7
|
+
import { createWhitelabelMock } from "../factories/whitelabel.factory";
|
|
8
|
+
import { makeTestQueryClient } from "./test-query-client";
|
|
9
|
+
const notImpl = async () => {
|
|
10
|
+
throw new Error("auth action is not available in TestProviders \u2014 mock it in the test if needed");
|
|
11
|
+
};
|
|
12
|
+
function TestProviders({
|
|
13
|
+
children,
|
|
14
|
+
...opts
|
|
15
|
+
}) {
|
|
16
|
+
const queryClient = opts.queryClient ?? makeTestQueryClient();
|
|
17
|
+
const user = opts.user === void 0 ? createUserMock() : opts.user;
|
|
18
|
+
const account = opts.account === void 0 ? createAccountMock() : opts.account;
|
|
19
|
+
const whitelabel = opts.whitelabel === void 0 ? createWhitelabelMock() : opts.whitelabel;
|
|
20
|
+
const authValue = {
|
|
21
|
+
user,
|
|
22
|
+
account,
|
|
23
|
+
isAuthenticated: !!user,
|
|
24
|
+
isLoading: false,
|
|
25
|
+
login: notImpl,
|
|
26
|
+
register: notImpl,
|
|
27
|
+
logout: notImpl,
|
|
28
|
+
loginWithGoogle: notImpl,
|
|
29
|
+
completeGoogleOnboarding: notImpl
|
|
30
|
+
};
|
|
31
|
+
return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(WhitelabelProvider, { whitelabel, children: /* @__PURE__ */ jsx(AuthContext.Provider, { value: authValue, children }) }) });
|
|
32
|
+
}
|
|
33
|
+
function makeProvidersWrapper(opts = {}) {
|
|
34
|
+
return function ProvidersWrapper({ children }) {
|
|
35
|
+
return /* @__PURE__ */ jsx(TestProviders, { ...opts, children });
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
TestProviders,
|
|
40
|
+
makeProvidersWrapper
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=providers.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/react/providers.tsx"],"sourcesContent":["import { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport type { ContextType, ReactNode } from 'react';\nimport type { Account } from '../../modules/accounts/types';\nimport type { User } from '../../modules/users/schema';\nimport type { WhitelabelData } from '../../modules/whitelabel/schema';\nimport { AuthContext } from '../../providers/auth.provider';\nimport { WhitelabelProvider } from '../../providers/whitelabel.provider';\nimport { createAccountMock } from '../factories/account.factory';\nimport { createUserMock } from '../factories/user.factory';\nimport { createWhitelabelMock } from '../factories/whitelabel.factory';\nimport { makeTestQueryClient } from './test-query-client';\n\ntype AuthValue = NonNullable<ContextType<typeof AuthContext>>;\n\n// The real AuthProvider runs session queries/actions that don't work in jsdom, so we feed the same\n// (exported) AuthContext a mocked value. The auth actions throw if called — mock them per test.\nconst notImpl = async (): Promise<never> => {\n throw new Error('auth action is not available in TestProviders — mock it in the test if needed');\n};\n\nexport interface TestProvidersOptions {\n queryClient?: QueryClient;\n user?: User | null;\n account?: Account | null;\n whitelabel?: WhitelabelData | null;\n}\n\nexport function TestProviders({\n children,\n ...opts\n}: TestProvidersOptions & { children: ReactNode }) {\n const queryClient = opts.queryClient ?? makeTestQueryClient();\n const user = opts.user === undefined ? createUserMock() : opts.user;\n const account = opts.account === undefined ? createAccountMock() : opts.account;\n const whitelabel = opts.whitelabel === undefined ? createWhitelabelMock() : opts.whitelabel;\n\n const authValue: AuthValue = {\n user,\n account,\n isAuthenticated: !!user,\n isLoading: false,\n login: notImpl,\n register: notImpl,\n logout: notImpl,\n loginWithGoogle: notImpl,\n completeGoogleOnboarding: notImpl,\n };\n\n return (\n <QueryClientProvider client={queryClient}>\n <WhitelabelProvider whitelabel={whitelabel}>\n <AuthContext.Provider value={authValue}>{children}</AuthContext.Provider>\n </WhitelabelProvider>\n </QueryClientProvider>\n );\n}\n\n// Wrapper for Testing Library: `render(ui, { wrapper: makeProvidersWrapper(opts) })`. The\n// @testing-library/react dependency stays in the app, not the common lib, hence a wrapper here\n// rather than a renderWithProviders.\nexport function makeProvidersWrapper(opts: TestProvidersOptions = {}) {\n return function ProvidersWrapper({ children }: { children: ReactNode }) {\n return <TestProviders {...opts}>{children}</TestProviders>;\n };\n}\n"],"mappings":"AAmDQ;AAnDR,SAAsB,2BAA2B;AAKjD,SAAS,mBAAmB;AAC5B,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,sBAAsB;AAC/B,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AAMpC,MAAM,UAAU,YAA4B;AAC1C,QAAM,IAAI,MAAM,oFAA+E;AACjG;AASO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,GAAG;AACL,GAAmD;AACjD,QAAM,cAAc,KAAK,eAAe,oBAAoB;AAC5D,QAAM,OAAO,KAAK,SAAS,SAAY,eAAe,IAAI,KAAK;AAC/D,QAAM,UAAU,KAAK,YAAY,SAAY,kBAAkB,IAAI,KAAK;AACxE,QAAM,aAAa,KAAK,eAAe,SAAY,qBAAqB,IAAI,KAAK;AAEjF,QAAM,YAAuB;AAAA,IAC3B;AAAA,IACA;AAAA,IACA,iBAAiB,CAAC,CAAC;AAAA,IACnB,WAAW;AAAA,IACX,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,iBAAiB;AAAA,IACjB,0BAA0B;AAAA,EAC5B;AAEA,SACE,oBAAC,uBAAoB,QAAQ,aAC3B,8BAAC,sBAAmB,YAClB,8BAAC,YAAY,UAAZ,EAAqB,OAAO,WAAY,UAAS,GACpD,GACF;AAEJ;AAKO,SAAS,qBAAqB,OAA6B,CAAC,GAAG;AACpE,SAAO,SAAS,iBAAiB,EAAE,SAAS,GAA4B;AACtE,WAAO,oBAAC,iBAAe,GAAG,MAAO,UAAS;AAAA,EAC5C;AACF;","names":[]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { QueryClient } from "@tanstack/react-query";
|
|
2
|
+
function makeTestQueryClient() {
|
|
3
|
+
return new QueryClient({
|
|
4
|
+
defaultOptions: {
|
|
5
|
+
queries: { retry: false, gcTime: 0, staleTime: 0, refetchOnWindowFocus: false },
|
|
6
|
+
mutations: { retry: false }
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
makeTestQueryClient
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=test-query-client.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/testing/react/test-query-client.ts"],"sourcesContent":["import { QueryClient } from '@tanstack/react-query';\n\n// retry off (errors surface immediately) and gcTime 0 (no cache across tests). Create one per test.\nexport function makeTestQueryClient(): QueryClient {\n return new QueryClient({\n defaultOptions: {\n queries: { retry: false, gcTime: 0, staleTime: 0, refetchOnWindowFocus: false },\n mutations: { retry: false },\n },\n });\n}\n"],"mappings":"AAAA,SAAS,mBAAmB;AAGrB,SAAS,sBAAmC;AACjD,SAAO,IAAI,YAAY;AAAA,IACrB,gBAAgB;AAAA,MACd,SAAS,EAAE,OAAO,OAAO,QAAQ,GAAG,WAAW,GAAG,sBAAsB,MAAM;AAAA,MAC9E,WAAW,EAAE,OAAO,MAAM;AAAA,IAC5B;AAAA,EACF,CAAC;AACH;","names":[]}
|
package/dist/testing.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing.ts"],"sourcesContent":["export * from './testing/index';\n"],"mappings":"AAAA,cAAc;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@greatapps/common",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.715",
|
|
4
4
|
"description": "Shared library for GreatApps frontend applications",
|
|
5
5
|
"main": "./dist/index.mjs",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -32,6 +32,14 @@
|
|
|
32
32
|
"./i18n": {
|
|
33
33
|
"import": "./dist/i18n.mjs",
|
|
34
34
|
"types": "./src/i18n.ts"
|
|
35
|
+
},
|
|
36
|
+
"./testing": {
|
|
37
|
+
"import": "./dist/testing.mjs",
|
|
38
|
+
"types": "./src/testing.ts"
|
|
39
|
+
},
|
|
40
|
+
"./testing/react": {
|
|
41
|
+
"import": "./dist/testing/react/index.mjs",
|
|
42
|
+
"types": "./src/testing/react/index.ts"
|
|
35
43
|
}
|
|
36
44
|
},
|
|
37
45
|
"files": [
|
|
@@ -89,6 +97,8 @@
|
|
|
89
97
|
"@types/react": "19.2.14",
|
|
90
98
|
"@types/react-dom": "19.2.3",
|
|
91
99
|
"glob": "13.0.6",
|
|
100
|
+
"msw": "2.7.0",
|
|
101
|
+
"@faker-js/faker": "9.9.0",
|
|
92
102
|
"next": "16.2.1",
|
|
93
103
|
"next-intl": "4.12.0",
|
|
94
104
|
"react": "19.1.4",
|
|
@@ -105,11 +115,21 @@
|
|
|
105
115
|
"@tanstack/react-query-persist-client": ">=5.0.0",
|
|
106
116
|
"next": ">=16.0.0",
|
|
107
117
|
"next-intl": ">=4.0.0",
|
|
118
|
+
"@faker-js/faker": ">=9.0.0",
|
|
119
|
+
"msw": ">=2.0.0",
|
|
108
120
|
"react": ">=19.0.0",
|
|
109
121
|
"react-dom": ">=19.0.0",
|
|
110
122
|
"react-hook-form": ">=7.0.0",
|
|
111
123
|
"sonner": ">=2.0.0",
|
|
112
124
|
"zod": ">=4.0.0",
|
|
113
125
|
"zustand": ">=4.0.0"
|
|
126
|
+
},
|
|
127
|
+
"peerDependenciesMeta": {
|
|
128
|
+
"msw": {
|
|
129
|
+
"optional": true
|
|
130
|
+
},
|
|
131
|
+
"@faker-js/faker": {
|
|
132
|
+
"optional": true
|
|
133
|
+
}
|
|
114
134
|
}
|
|
115
135
|
}
|
package/src/index.ts
CHANGED
|
@@ -199,12 +199,9 @@ export {
|
|
|
199
199
|
export { useBuyCreditsModal } from "./store/useBuyCreditsModal";
|
|
200
200
|
export { useCreditsDisabledModal } from "./store/useCreditsDisabledModal";
|
|
201
201
|
export { usePaidPlanRequiredModal } from "./store/usePaidPlanRequiredModal";
|
|
202
|
-
export { useHexaPromoModal } from "./store/useHexaPromoModal";
|
|
203
202
|
export { default as BuyCreditsModal } from "./components/modals/BuyCreditsModal";
|
|
204
203
|
export { default as CreditsDisabledModal } from "./components/modals/CreditsDisabledModal";
|
|
205
204
|
export { default as PaidPlanRequiredModal } from "./components/modals/PaidPlanRequiredModal";
|
|
206
|
-
export { default as HexaPromoModal } from "./components/modals/HexaPromoModal";
|
|
207
|
-
export { default as HexaPromoModalGate } from "./components/modals/HexaPromoModalGate";
|
|
208
205
|
export { default as AddCardModal } from "./components/modals/cards/AddCardModal";
|
|
209
206
|
export { DeleteCardModal } from "./components/modals/cards/DeleteCardModal";
|
|
210
207
|
export { CannotDeleteCardModal } from "./components/modals/cards/CannotDeleteCardModal";
|
|
@@ -46,7 +46,6 @@ import { useWhitelabelUrls, useWhitelabel } from "./whitelabel.provider";
|
|
|
46
46
|
import { useWlQueryKey } from "../hooks/useAuthQueryKey";
|
|
47
47
|
import { normalizeLocale } from "../i18n/normalize";
|
|
48
48
|
import { setLocaleCookie } from "../utils/intl/locale-cookie";
|
|
49
|
-
import { clearHexaPromo } from "../utils/cookies/hexa-promo";
|
|
50
49
|
|
|
51
50
|
interface AuthContextProps extends AuthState {
|
|
52
51
|
login: (credentials: LoginRequest) => Promise<LoginResult>;
|
|
@@ -221,8 +220,6 @@ export function AuthProvider({ children, publicRoutes = [] }: AuthProviderProps)
|
|
|
221
220
|
} catch {
|
|
222
221
|
// cookie já removido no servidor mesmo se a API falhou
|
|
223
222
|
} finally {
|
|
224
|
-
// Limpa o estado da promo "Rumo ao Hexa" para reabrir a modal no próximo login.
|
|
225
|
-
clearHexaPromo();
|
|
226
223
|
queryClient.clear();
|
|
227
224
|
window.location.assign(resolveLogoutRedirect());
|
|
228
225
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// Single source of truth shared by the JWT, factories and request handlers. Apps must mirror it
|
|
2
|
+
// in their test env (GAPPS_R3_API_URL etc.) so the URL the ApiClient builds matches the handlers.
|
|
3
|
+
// `.test` domains never resolve, so a leaked unhandled request fails loudly.
|
|
4
|
+
export const TEST_IDS = {
|
|
5
|
+
wl: 1,
|
|
6
|
+
account: 123,
|
|
7
|
+
user: 456,
|
|
8
|
+
page: 789,
|
|
9
|
+
} as const;
|
|
10
|
+
|
|
11
|
+
export const TEST_API = {
|
|
12
|
+
gapps: 'https://gapps.test',
|
|
13
|
+
gpages: 'https://gpages.test',
|
|
14
|
+
masterToken: 'test-master-token',
|
|
15
|
+
domain: 'app.test',
|
|
16
|
+
} as const;
|
|
17
|
+
|
|
18
|
+
export const TEST_API_VERSION = 'v1';
|
|
19
|
+
export const TEST_API_LOCALE = 'pt-br';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { faker } from '@faker-js/faker';
|
|
2
|
+
import { Account } from '../../modules/accounts/types';
|
|
3
|
+
import { TEST_IDS } from '../constants';
|
|
4
|
+
import { createMock } from './create-mock';
|
|
5
|
+
|
|
6
|
+
// Identity fields (id/id_wl) are fixed to TEST_IDS; cosmetic fields use faker.
|
|
7
|
+
export const createAccountMock = createMock<Account, Partial<Account>>((overrides) => ({
|
|
8
|
+
id: overrides?.id ?? TEST_IDS.account,
|
|
9
|
+
id_wl: overrides?.id_wl ?? TEST_IDS.wl,
|
|
10
|
+
id_affiliate: overrides?.id_affiliate ?? 0,
|
|
11
|
+
id_api: overrides?.id_api ?? 1,
|
|
12
|
+
name: overrides?.name || faker.company.name(),
|
|
13
|
+
language: overrides?.language ?? 'pt-br',
|
|
14
|
+
timezone: overrides?.timezone ?? 'America/Sao_Paulo',
|
|
15
|
+
currency: overrides?.currency ?? 'brl',
|
|
16
|
+
verified: overrides?.verified ?? true,
|
|
17
|
+
bussiness_type: overrides?.bussiness_type ?? 1,
|
|
18
|
+
gateway: overrides?.gateway ?? 'stripe',
|
|
19
|
+
gateway_customer_id: overrides?.gateway_customer_id ?? null,
|
|
20
|
+
origin: overrides?.origin ?? null,
|
|
21
|
+
zipcode: overrides?.zipcode ?? null,
|
|
22
|
+
address: overrides?.address ?? null,
|
|
23
|
+
address_number: overrides?.address_number ?? null,
|
|
24
|
+
address_complement: overrides?.address_complement ?? null,
|
|
25
|
+
neighborhood: overrides?.neighborhood ?? null,
|
|
26
|
+
city: overrides?.city ?? null,
|
|
27
|
+
state: overrides?.state ?? null,
|
|
28
|
+
country: overrides?.country ?? 'BR',
|
|
29
|
+
financial_document: overrides?.financial_document ?? null,
|
|
30
|
+
financial_name: overrides?.financial_name ?? null,
|
|
31
|
+
financial_email: overrides?.financial_email ?? null,
|
|
32
|
+
financial_document_type: overrides?.financial_document_type ?? 1,
|
|
33
|
+
deleted: overrides?.deleted ?? 0,
|
|
34
|
+
datetime_add: overrides?.datetime_add || '2025-01-01 00:00:00',
|
|
35
|
+
datetime_alt: overrides?.datetime_alt || '2025-01-01 00:00:00',
|
|
36
|
+
datetime_del: overrides?.datetime_del ?? null,
|
|
37
|
+
}));
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
type Factory<T, O> = (overrides?: O) => T;
|
|
2
|
+
|
|
3
|
+
const resetters = new Set<() => void>();
|
|
4
|
+
|
|
5
|
+
// Without overrides, returns the same cached default within a test (stable for asserts); with
|
|
6
|
+
// overrides, a fresh instance. `resetMocks()` refreshes the defaults between tests — runner-agnostic
|
|
7
|
+
// (these factories also run under `next dev` for E2E, where vitest's `beforeEach` is absent).
|
|
8
|
+
export function createMock<T, O = Partial<T>>(factory: Factory<T, O>): Factory<T, O> {
|
|
9
|
+
let instance = factory();
|
|
10
|
+
resetters.add(() => {
|
|
11
|
+
instance = factory();
|
|
12
|
+
});
|
|
13
|
+
return (overrides?: O): T => (overrides ? factory(overrides) : instance);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function resetMocks(): void {
|
|
17
|
+
for (const reset of resetters) reset();
|
|
18
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createMock, resetMocks } from './create-mock';
|
|
2
|
+
export { createTestJwt, type TestJwtClaims } from './jwt';
|
|
3
|
+
export { createUserMock } from './user.factory';
|
|
4
|
+
export { createAccountMock } from './account.factory';
|
|
5
|
+
export { createWhitelabelMock, createWhitelabelTokenMock } from './whitelabel.factory';
|
|
6
|
+
export { createSubscriptionMock, createSubscriptionItemMock } from './subscription.factory';
|
|
7
|
+
export { createPlanMock, createPlanItemMock } from './plan.factory';
|