@12-apps/payments-e2e 1.2.0 → 1.4.0

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/README.md CHANGED
@@ -84,7 +84,8 @@ files do not change either way.
84
84
  `pix-only` · `card` · `both-methods` · `hosted` · `awaiting` · `settles` ·
85
85
  `declined` · `unresolved` · `unavailable` · `no-provider` ·
86
86
  `no-provider-remedy` · `payments-off` · `two-mintable` · `redirect-head` ·
87
- `screen-on-page` · `screen-handoff` · `screen-undeclared` · `screen-unknown`
87
+ `google-pay` · `apple-pay` · `apple-pay-unsupported` · `screen-on-page` ·
88
+ `screen-handoff` · `screen-undeclared` · `screen-unknown`
88
89
 
89
90
  Adding a member is a breaking change for hosts, deliberately: a scenario needing
90
91
  a store nobody can build is a scenario that silently never runs.
@@ -102,6 +103,47 @@ does not rescue them either; it skips `node_modules` by design.
102
103
  Shipping source here would produce a package that type-checks, publishes,
103
104
  installs, and then throws on your first test run.
104
105
 
106
+ ## The platform-operations journeys (opt-in)
107
+
108
+ The buyer journeys above run in any app that mounts the checkout. A second,
109
+ **separate** set covers the app that operates the PLATFORM — the
110
+ Connect-application consult screen and the platform homologação
111
+ (`ConnectApplicationPanel` / `PlatformHomologacao` from
112
+ `@12-apps/payments-frontend`). Most checkout consumers have no such surface,
113
+ so these ship behind their own port and glob triple: nothing about them lands
114
+ in `paymentsFeatures` or `paymentsSteps`, and a host that never lists them is
115
+ untouched.
116
+
117
+ ```ts
118
+ // tests/e2e/steps/platform-world.ts — inside your super-admin steps glob
119
+ import { definePaymentsPlatformWorld } from '@12-apps/payments-e2e';
120
+
121
+ definePaymentsPlatformWorld({
122
+ openConnectApplication: async (page, shape) => { /* sign in + route */ },
123
+ openHomologacao: async (page, shape) => { /* sign in + produce the shape */ },
124
+ });
125
+ ```
126
+
127
+ ```ts
128
+ import {
129
+ paymentsPlatformFeatures,
130
+ paymentsPlatformFeaturesRoot,
131
+ paymentsPlatformSteps,
132
+ } from '@12-apps/payments-e2e';
133
+
134
+ defineBddConfig({
135
+ features: [paymentsPlatformFeatures],
136
+ featuresRoot: paymentsPlatformFeaturesRoot,
137
+ steps: [paymentsPlatformSteps, 'tests/e2e/steps/**/*.ts'],
138
+ outputDir: '.features-gen/platform',
139
+ });
140
+ ```
141
+
142
+ The same three silent failures apply verbatim — use the exported globs, set
143
+ `featuresRoot`, assert your scenario count. And `openHomologacao` must
144
+ PRODUCE its shape, not just navigate: one scenario records an outcome, so a
145
+ later `unrequested` opening has to clear it again.
146
+
105
147
  ## Writing your own specs in the same vocabulary
106
148
 
107
149
  The buyer gestures are exported too, so hand-written specs beside the journeys
package/dist/globs.d.ts CHANGED
@@ -40,4 +40,30 @@ export declare const paymentsFeaturesRoot: string;
40
40
  * in every worker.
41
41
  */
42
42
  export declare const paymentsSteps: string;
43
+ /**
44
+ * The PLATFORM-OPERATIONS journeys (FUT-479 / FUT-483, packaged by FUT-573),
45
+ * as a SEPARATE opt-in glob triple.
46
+ *
47
+ * Separate on purpose, twice over. The buyer journeys above run in any app
48
+ * that mounts the checkout; these run in the app that operates the PLATFORM
49
+ * (typically a super-admin SPA), and most checkout consumers have none.
50
+ * Folding them into `paymentsFeatures` would hand every existing host
51
+ * scenarios whose steps it never registered — bddgen fails on the undefined
52
+ * steps — and folding the steps into `paymentsSteps` would hand it orphan
53
+ * definitions instead, which is what a strict bdd gate fails on. A host that
54
+ * wants these lists all three, next to `definePaymentsPlatformWorld`:
55
+ *
56
+ * ```ts
57
+ * defineBddConfig({
58
+ * features: [paymentsPlatformFeatures],
59
+ * featuresRoot: paymentsPlatformFeaturesRoot,
60
+ * steps: [paymentsPlatformSteps, 'tests/e2e/steps/**\/*.ts'],
61
+ * });
62
+ * ```
63
+ */
64
+ export declare const paymentsPlatformFeatures: string;
65
+ /** Same trap as {@link paymentsFeaturesRoot} — unset, the specs land under a path Playwright ignores. */
66
+ export declare const paymentsPlatformFeaturesRoot: string;
67
+ /** Compiled for Node, like {@link paymentsSteps} and for the same reason. */
68
+ export declare const paymentsPlatformSteps: string;
43
69
  //# sourceMappingURL=globs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"globs.d.ts","sourceRoot":"","sources":["../src/globs.ts"],"names":[],"mappings":"AA8BA,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,EAAE,MAAqD,CAAC;AAErF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAwC,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,aAAa,EAAE,MAAkD,CAAC"}
1
+ {"version":3,"file":"globs.d.ts","sourceRoot":"","sources":["../src/globs.ts"],"names":[],"mappings":"AA8BA,sEAAsE;AACtE,eAAO,MAAM,gBAAgB,EAAE,MAAqD,CAAC;AAErF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAwC,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,aAAa,EAAE,MAAkD,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,wBAAwB,EAAE,MAGtC,CAAC;AAEF,yGAAyG;AACzG,eAAO,MAAM,4BAA4B,EAAE,MAAiD,CAAC;AAE7F,6EAA6E;AAC7E,eAAO,MAAM,qBAAqB,EAAE,MAA2D,CAAC"}
package/dist/globs.js CHANGED
@@ -67,4 +67,30 @@ export const paymentsFeaturesRoot = join(packageRoot(), 'features');
67
67
  * in every worker.
68
68
  */
69
69
  export const paymentsSteps = join(packageRoot(), 'dist/steps/**/*.js');
70
+ /**
71
+ * The PLATFORM-OPERATIONS journeys (FUT-479 / FUT-483, packaged by FUT-573),
72
+ * as a SEPARATE opt-in glob triple.
73
+ *
74
+ * Separate on purpose, twice over. The buyer journeys above run in any app
75
+ * that mounts the checkout; these run in the app that operates the PLATFORM
76
+ * (typically a super-admin SPA), and most checkout consumers have none.
77
+ * Folding them into `paymentsFeatures` would hand every existing host
78
+ * scenarios whose steps it never registered — bddgen fails on the undefined
79
+ * steps — and folding the steps into `paymentsSteps` would hand it orphan
80
+ * definitions instead, which is what a strict bdd gate fails on. A host that
81
+ * wants these lists all three, next to `definePaymentsPlatformWorld`:
82
+ *
83
+ * ```ts
84
+ * defineBddConfig({
85
+ * features: [paymentsPlatformFeatures],
86
+ * featuresRoot: paymentsPlatformFeaturesRoot,
87
+ * steps: [paymentsPlatformSteps, 'tests/e2e/steps/**\/*.ts'],
88
+ * });
89
+ * ```
90
+ */
91
+ export const paymentsPlatformFeatures = join(packageRoot(), 'features-platform/**/*.feature');
92
+ /** Same trap as {@link paymentsFeaturesRoot} — unset, the specs land under a path Playwright ignores. */
93
+ export const paymentsPlatformFeaturesRoot = join(packageRoot(), 'features-platform');
94
+ /** Compiled for Node, like {@link paymentsSteps} and for the same reason. */
95
+ export const paymentsPlatformSteps = join(packageRoot(), 'dist/steps-platform/**/*.js');
70
96
  //# sourceMappingURL=globs.js.map
package/dist/globs.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"globs.js","sourceRoot":"","sources":["../src/globs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAErF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"globs.js","sourceRoot":"","sources":["../src/globs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C;;;;;;;;;;;;;;GAcG;AACH,MAAM,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,SAAS,WAAW;IAClB,OAAO,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,sEAAsE;AACtE,MAAM,CAAC,MAAM,gBAAgB,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAErF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,aAAa,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,oBAAoB,CAAC,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAW,IAAI,CAClD,WAAW,EAAE,EACb,gCAAgC,CACjC,CAAC;AAEF,yGAAyG;AACzG,MAAM,CAAC,MAAM,4BAA4B,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,mBAAmB,CAAC,CAAC;AAE7F,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAW,IAAI,CAAC,WAAW,EAAE,EAAE,6BAA6B,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -33,6 +33,15 @@
33
33
  */
34
34
  export { definePaymentsWorld, paymentsWorld, type PaymentsFixtures, type PaymentsStore, type PaymentsWireProbe, type PaymentsWorld, } from './world.js';
35
35
  export { paymentsFeatures, paymentsFeaturesRoot, paymentsSteps } from './globs.js';
36
+ /**
37
+ * The PLATFORM-OPERATIONS journeys (FUT-479 / FUT-483, packaged by FUT-573):
38
+ * the Connect-application consult and the platform homologação, for the app
39
+ * that operates the platform. A separate OPT-IN port and glob triple — see
40
+ * `platform-world.ts` for why folding them into `PaymentsWorld` would have
41
+ * broken every checkout-only consumer.
42
+ */
43
+ export { definePaymentsPlatformWorld, paymentsPlatformWorld, type ConnectApplicationShape, type PaymentsPlatformWorld, type PlatformHomologacaoShape, } from './platform-world.js';
44
+ export { paymentsPlatformFeatures, paymentsPlatformFeaturesRoot, paymentsPlatformSteps, } from './globs.js';
36
45
  /**
37
46
  * The buyer gestures the packaged steps are built from, exported so a host can
38
47
  * write its OWN specs in the same vocabulary. Every one drives a test id the
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;GAIG;AACH,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,GACV,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;GAMG;AACH,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,EACrB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,GACV,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -33,6 +33,15 @@
33
33
  */
34
34
  export { definePaymentsWorld, paymentsWorld, } from './world.js';
35
35
  export { paymentsFeatures, paymentsFeaturesRoot, paymentsSteps } from './globs.js';
36
+ /**
37
+ * The PLATFORM-OPERATIONS journeys (FUT-479 / FUT-483, packaged by FUT-573):
38
+ * the Connect-application consult and the platform homologação, for the app
39
+ * that operates the platform. A separate OPT-IN port and glob triple — see
40
+ * `platform-world.ts` for why folding them into `PaymentsWorld` would have
41
+ * broken every checkout-only consumer.
42
+ */
43
+ export { definePaymentsPlatformWorld, paymentsPlatformWorld, } from './platform-world.js';
44
+ export { paymentsPlatformFeatures, paymentsPlatformFeaturesRoot, paymentsPlatformSteps, } from './globs.js';
36
45
  /**
37
46
  * The buyer gestures the packaged steps are built from, exported so a host can
38
47
  * write its OWN specs in the same vocabulary. Every one drives a test id the
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EACL,mBAAmB,EACnB,aAAa,GAKd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;GAIG;AACH,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,GACV,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,EACL,mBAAmB,EACnB,aAAa,GAKd,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEnF;;;;;;GAMG;AACH,OAAO,EACL,2BAA2B,EAC3B,qBAAqB,GAItB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAEpB;;;;GAIG;AACH,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,OAAO,EACP,QAAQ,EACR,OAAO,EACP,YAAY,EACZ,SAAS,GACV,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,78 @@
1
+ import type { Page } from '@playwright/test';
2
+ /**
3
+ * The port a HOST implements to run the packaged PLATFORM-OPERATIONS journeys
4
+ * (FUT-479 / FUT-483, packaged by FUT-573) — the Connect-application consult
5
+ * screen and the platform homologação.
6
+ *
7
+ * A SEPARATE port from {@link import('./world.js').PaymentsWorld}, on purpose.
8
+ * The buyer journeys are for any app that mounts the checkout; these are for
9
+ * the app that operates the PLATFORM (typically a super-admin SPA), and most
10
+ * consumers of the checkout have no such surface. Folding these into
11
+ * `PaymentsWorld` would have broken every existing host on the next version
12
+ * bump; a second opt-in port breaks nobody. The features live under their own
13
+ * globs (`paymentsPlatformFeatures` / `paymentsPlatformSteps`) for the same
14
+ * reason — a host that never lists them never compiles them.
15
+ *
16
+ * Every assertion in the journeys reads a test id the payments package's own
17
+ * platform components render (`connect-env-SANDBOX`, `homologacao-status-chip`,
18
+ * …), so they hold in any app that mounts `ConnectApplicationPanel` /
19
+ * `PlatformHomologacao` from `@12-apps/payments-frontend`.
20
+ */
21
+ /**
22
+ * The SHAPE of the deployment a Connect-application scenario is set in.
23
+ *
24
+ * `unconfigured` — no OAuth application credentials for either environment,
25
+ * which is what a fresh e2e stack honestly is. The consult then renders both
26
+ * cards in their "nenhuma aplicação configurada" state with no network call —
27
+ * the screen's baseline value, reachable without stubbing PagBank.
28
+ *
29
+ * Adding a member is a breaking change for hosts, deliberately — same
30
+ * argument as `PaymentsStore`: a shape nobody can build is a scenario that
31
+ * silently never runs.
32
+ */
33
+ export type ConnectApplicationShape = 'unconfigured';
34
+ /**
35
+ * The SHAPE of the platform a homologação scenario is set in.
36
+ *
37
+ * `unrequested` — no outcome recorded for the provider AND no platform
38
+ * SANDBOX token stored, which again is what a fresh e2e stack is: the screen
39
+ * shows the honest "não solicitada", the outcome form performs the first real
40
+ * write, and the anexo generator refuses with its reason instead of calling
41
+ * the provider.
42
+ *
43
+ * PRODUCING the shape is the host's job, not just navigating to the screen:
44
+ * one scenario records an outcome, so a later `unrequested` opening must
45
+ * clear it again (the same way `PaymentsWorld.open` seeds a store).
46
+ */
47
+ export type PlatformHomologacaoShape = 'unrequested';
48
+ /** Everything a host supplies to run the packaged platform journeys. */
49
+ export interface PaymentsPlatformWorld {
50
+ /**
51
+ * Put a signed-in PLATFORM OPERATOR on the Connect-application screen of a
52
+ * deployment of this shape. Auth is the host's own business — these
53
+ * journeys never see a login form.
54
+ */
55
+ openConnectApplication(page: Page, shape: ConnectApplicationShape): Promise<void>;
56
+ /**
57
+ * Put a signed-in platform operator on the homologação screen of a platform
58
+ * of this shape. The host must wire the screen so a recorded outcome
59
+ * refreshes the `record` the component renders — the journey asserts the
60
+ * status chip flips without a reload.
61
+ */
62
+ openHomologacao(page: Page, shape: PlatformHomologacaoShape): Promise<void>;
63
+ }
64
+ /**
65
+ * Install the host's implementation. Call this from a module inside the
66
+ * host's OWN steps glob — playwright-bdd imports every step file before any
67
+ * scenario runs, so a top-level call there is registered in time, in every
68
+ * worker. Independent of `definePaymentsWorld`: a host may implement either
69
+ * port, or both.
70
+ */
71
+ export declare function definePaymentsPlatformWorld(world: PaymentsPlatformWorld): void;
72
+ /**
73
+ * The installed world. Throws rather than degrading, for the same reason as
74
+ * `paymentsWorld()`: a journey against a half-configured world fails deep
75
+ * inside a step, several layers from the actual cause.
76
+ */
77
+ export declare function paymentsPlatformWorld(): PaymentsPlatformWorld;
78
+ //# sourceMappingURL=platform-world.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-world.d.ts","sourceRoot":"","sources":["../src/platform-world.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAE7C;;;;;;;;;;;;;;;;;;GAkBG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,uBAAuB,GAAG,cAAc,CAAC;AAErD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,wBAAwB,GAAG,aAAa,CAAC;AAErD,wEAAwE;AACxE,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,sBAAsB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF;;;;;OAKG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7E;AAID;;;;;;GAMG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAE9E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,IAAI,qBAAqB,CAQ7D"}
@@ -0,0 +1,24 @@
1
+ let installed = null;
2
+ /**
3
+ * Install the host's implementation. Call this from a module inside the
4
+ * host's OWN steps glob — playwright-bdd imports every step file before any
5
+ * scenario runs, so a top-level call there is registered in time, in every
6
+ * worker. Independent of `definePaymentsWorld`: a host may implement either
7
+ * port, or both.
8
+ */
9
+ export function definePaymentsPlatformWorld(world) {
10
+ installed = world;
11
+ }
12
+ /**
13
+ * The installed world. Throws rather than degrading, for the same reason as
14
+ * `paymentsWorld()`: a journey against a half-configured world fails deep
15
+ * inside a step, several layers from the actual cause.
16
+ */
17
+ export function paymentsPlatformWorld() {
18
+ if (!installed) {
19
+ throw new Error('No PaymentsPlatformWorld installed. Call definePaymentsPlatformWorld(...) from a ' +
20
+ "module inside this app's bdd `steps` glob — see @12-apps/payments-e2e's README.");
21
+ }
22
+ return installed;
23
+ }
24
+ //# sourceMappingURL=platform-world.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform-world.js","sourceRoot":"","sources":["../src/platform-world.ts"],"names":[],"mappings":"AAoEA,IAAI,SAAS,GAAiC,IAAI,CAAC;AAEnD;;;;;;GAMG;AACH,MAAM,UAAU,2BAA2B,CAAC,KAA4B;IACtE,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,mFAAmF;YACjF,iFAAiF,CACpF,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=carteira.steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carteira.steps.d.ts","sourceRoot":"","sources":["../../src/steps/carteira.steps.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ import { expect } from '@playwright/test';
2
+ import { paymentsWorld } from '../world.js';
3
+ import { Given, Then, When } from './fixtures.js';
4
+ /**
5
+ * PAYING WITH A DIGITAL WALLET (FUT-471) — the CARD pane's fast lane.
6
+ *
7
+ * The wallet is not a fourth method: the buyer still walks Dados and still
8
+ * lands on the CARD pane; what changes is that the instrument comes from the
9
+ * wallet sheet instead of typed digits. So these steps sit beside the buyer's
10
+ * card gestures, and the Givens name store shapes exactly like `loja.steps.ts`.
11
+ *
12
+ * The button element itself is rendered by the wallet's own script (brand
13
+ * rules), inside the package's `google-pay-button` container — a host
14
+ * satisfies the store shape by installing a `google.payments.api` stub before
15
+ * the checkout loads, which the shipped button picks up without a network
16
+ * request.
17
+ */
18
+ Given('a compradora abre o checkout de uma loja com Google Pay', async ({ page }) => {
19
+ await paymentsWorld().open(page, 'google-pay');
20
+ });
21
+ Given('a compradora abre o checkout de uma loja com Apple Pay', async ({ page }) => {
22
+ await paymentsWorld().open(page, 'apple-pay');
23
+ });
24
+ /** The SAME store shape, on a device without Apple Pay (any non-Safari). */
25
+ Given('a compradora abre o checkout da loja com Apple Pay num aparelho sem Apple Pay', async ({ page }) => {
26
+ await paymentsWorld().open(page, 'apple-pay-unsupported');
27
+ });
28
+ When('ela paga com o Google Pay', async ({ page }) => {
29
+ await page.getByTestId('google-pay-button').click();
30
+ });
31
+ When('ela paga com o Apple Pay', async ({ page }) => {
32
+ await page.getByTestId('apple-pay-button').click();
33
+ });
34
+ Then('ela vê o botão do Google Pay', async ({ page }) => {
35
+ await expect(page.getByTestId('google-pay-button')).toBeVisible();
36
+ });
37
+ Then('nenhum botão do Google Pay é mostrado', async ({ page }) => {
38
+ await expect(page.getByTestId('google-pay-button')).toHaveCount(0);
39
+ });
40
+ Then('ela vê o botão do Apple Pay', async ({ page }) => {
41
+ await expect(page.getByTestId('apple-pay-button')).toBeVisible();
42
+ });
43
+ Then('nenhum botão do Apple Pay é mostrado', async ({ page }) => {
44
+ await expect(page.getByTestId('apple-pay-button')).toHaveCount(0);
45
+ });
46
+ Then('a cobrança enviada ao provedor carrega a carteira do Google', async ({ page }) => {
47
+ // What the PROVIDER received, not what the client recorded sending: hosts
48
+ // tag a provider-charge line with `wallet:<TYPE>` when the charge's card
49
+ // block carried a wallet instrument, the same way the card line carries
50
+ // `tok:`. This is the line that fails if the mount stops reading the flat
51
+ // wallet body — the sheet then produced a token the charge never carried.
52
+ await expect(paymentsWorld().wire.providerCharges(page)).toContainText('wallet:GOOGLE_PAY');
53
+ });
54
+ Then('a cobrança enviada ao provedor carrega a carteira da Apple', async ({ page }) => {
55
+ await expect(paymentsWorld().wire.providerCharges(page)).toContainText('wallet:APPLE_PAY');
56
+ });
57
+ //# sourceMappingURL=carteira.steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"carteira.steps.js","sourceRoot":"","sources":["../../src/steps/carteira.steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plataforma.steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plataforma.steps.d.ts","sourceRoot":"","sources":["../../src/steps-platform/plataforma.steps.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { expect } from '@playwright/test';
2
+ import { paymentsPlatformWorld } from '../platform-world.js';
3
+ import { Given, Then, When } from '../steps/fixtures.js';
4
+ /**
5
+ * THE PLATFORM OPERATOR'S STEPS (FUT-479 / FUT-483, packaged by FUT-573).
6
+ *
7
+ * A separate file tree from `../steps/` on purpose: these register step
8
+ * definitions for the PLATFORM journeys, which a host opts into with the
9
+ * `paymentsPlatformSteps` glob. Compiling them into the buyer steps' glob
10
+ * would hand every checkout-only consumer a set of orphan definitions — and
11
+ * an orphan definition is exactly what a strict bdd gate fails on.
12
+ *
13
+ * Every Then reads a test id the payments package's own platform components
14
+ * render, so the assertions mean the same thing in any host that mounts
15
+ * `ConnectApplicationPanel` / `PlatformHomologacao`.
16
+ */
17
+ // ---------------------------------------------------------------------------
18
+ // The Connect application (FUT-479)
19
+ // ---------------------------------------------------------------------------
20
+ Given('a operadora abre a aplicação Connect de uma instalação sem aplicação registrada', async ({ page }) => {
21
+ await paymentsPlatformWorld().openConnectApplication(page, 'unconfigured');
22
+ });
23
+ Then('ela vê o callback desta instalação', async ({ page }) => {
24
+ const callback = page.getByTestId('connect-expected-redirect');
25
+ await expect(callback).toBeVisible();
26
+ // The exact URL is the host's own; what the journey pins is that SOMETHING
27
+ // is spelled out for the operator to compare against.
28
+ await expect(callback).not.toHaveText('');
29
+ });
30
+ Then('cada ambiente aparece em seu próprio cartão', async ({ page }) => {
31
+ await expect(page.getByTestId('connect-env-SANDBOX')).toBeVisible();
32
+ await expect(page.getByTestId('connect-env-PRODUCTION')).toBeVisible();
33
+ });
34
+ Then('os dois ambientes se declaram sem aplicação configurada', async ({ page }) => {
35
+ await expect(page.getByTestId('connect-env-SANDBOX')).toContainText('Nenhuma aplicação configurada neste ambiente.');
36
+ await expect(page.getByTestId('connect-env-PRODUCTION')).toContainText('Nenhuma aplicação configurada neste ambiente.');
37
+ });
38
+ // ---------------------------------------------------------------------------
39
+ // The homologação (FUT-483)
40
+ // ---------------------------------------------------------------------------
41
+ Given('a operadora abre a homologação de uma plataforma que nunca a solicitou', async ({ page }) => {
42
+ await paymentsPlatformWorld().openHomologacao(page, 'unrequested');
43
+ });
44
+ Then('a situação é {string}', async ({ page }, label) => {
45
+ await expect(page.getByTestId('homologacao-status-chip')).toHaveText(label);
46
+ });
47
+ Then('o formulário oficial está a um clique', async ({ page }) => {
48
+ const link = page.getByTestId('homologacao-form-link');
49
+ await expect(link).toBeVisible();
50
+ await expect(link).toHaveAttribute('href', /pipefy/);
51
+ });
52
+ Then('as respostas prontas nomeiam a API de Pedidos e a API Connect', async ({ page }) => {
53
+ const services = page.getByTestId('homologacao-services');
54
+ await expect(services).toContainText('API de Pedidos e Pagamentos (Order)');
55
+ await expect(services).toContainText('API Connect');
56
+ });
57
+ When('ela registra o protocolo da solicitação', async ({ page }) => {
58
+ await page.getByTestId('homologacao-protocol').fill('PIPE-journey-001');
59
+ await page.getByTestId('homologacao-save').click();
60
+ });
61
+ Then('o registro é confirmado', async ({ page }) => {
62
+ await expect(page.getByTestId('homologacao-save-ok')).toBeVisible();
63
+ });
64
+ /**
65
+ * The chip flipping WITHOUT a reload is the point: the host's save must
66
+ * refresh the `record` the component renders — the wiring the port's
67
+ * docstring demands.
68
+ */
69
+ Then('a situação passa a ser {string}', async ({ page }, label) => {
70
+ await expect(page.getByTestId('homologacao-status-chip')).toHaveText(label);
71
+ });
72
+ When('ela tenta gerar o anexo de evidências', async ({ page }) => {
73
+ await page.getByTestId('homologacao-anexo-button').click();
74
+ });
75
+ Then('ela vê o motivo pelo qual o anexo não saiu', async ({ page }) => {
76
+ await expect(page.getByTestId('homologacao-anexo-error')).not.toBeEmpty();
77
+ });
78
+ //# sourceMappingURL=plataforma.steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plataforma.steps.js","sourceRoot":"","sources":["../../src/steps-platform/plataforma.steps.ts"],"names":[],"mappings":"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"}
package/dist/world.d.ts CHANGED
@@ -55,6 +55,27 @@ export type PaymentsStore =
55
55
  | 'two-mintable'
56
56
  /** A hand-off provider at the head, a minting one behind it. */
57
57
  | 'redirect-head'
58
+ /**
59
+ * A store whose chain head declares Google Pay (FUT-471): the wallet
60
+ * capability, the PAYMENT_GATEWAY parameters, a merchant id — and a page
61
+ * where `google.payments.api` answers, which the host provides by
62
+ * installing a stub of it before the checkout loads (the shipped button
63
+ * uses an installed global without touching the network).
64
+ */
65
+ | 'google-pay'
66
+ /**
67
+ * A store whose chain head declares Apple Pay (FUT-472), opened on a device
68
+ * that HAS it: the host provides a page where `window.ApplePaySession`
69
+ * exists and `canMakePayments()` answers true (a stub, outside Safari),
70
+ * plus a merchant-validation port that answers a session.
71
+ */
72
+ | 'apple-pay'
73
+ /**
74
+ * The SAME Apple Pay store on a device WITHOUT Apple Pay (every non-Safari
75
+ * browser): no `ApplePaySession` global. The scenario this hosts is the
76
+ * fallback rule — no button, and the card form stays the way to pay.
77
+ */
78
+ | 'apple-pay-unsupported'
58
79
  /** Declares the on-page screen (FUT-596). */
59
80
  | 'screen-on-page'
60
81
  /** Declares the hand-off screen (FUT-596). */
@@ -1 +1 @@
1
- {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"world.d.ts","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"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"}
package/dist/world.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"world.js","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"AAiIA,IAAI,SAAS,GAAyB,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,0EAA0E;YACxE,0EAA0E,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"world.js","sourceRoot":"","sources":["../src/world.ts"],"names":[],"mappings":"AAsJA,IAAI,SAAS,GAAyB,IAAI,CAAC;AAE3C;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAoB;IACtD,SAAS,GAAG,KAAK,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,0EAA0E;YACxE,0EAA0E,CAC7E,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,25 @@
1
+ @journey @apple-pay
2
+ Feature: Comprando com Apple Pay
3
+
4
+ O provedor processa Apple Pay só para Visa e Mastercard, então a folha da
5
+ Apple oferece só essas bandeiras — um cartão que seria recusado nunca chega
6
+ a ser oferecido. E a carteira é um atalho, nunca o único caminho: num
7
+ aparelho sem Apple Pay o botão simplesmente não existe e o formulário de
8
+ cartão continua fazendo a venda.
9
+
10
+ Scenario: A compra inteira acontece pela carteira
11
+ Given a compradora abre o checkout de uma loja com Apple Pay
12
+ When ela informa o CPF e segue para o pagamento
13
+ Then ela vê o botão do Apple Pay
14
+ And ela vê o formulário de cartão
15
+ When ela paga com o Apple Pay
16
+ Then o pagamento é confirmado
17
+ And a cobrança enviada ao provedor carrega a carteira da Apple
18
+
19
+ Scenario: Sem Apple Pay no aparelho, o cartão continua fazendo a venda
20
+ Given a compradora abre o checkout da loja com Apple Pay num aparelho sem Apple Pay
21
+ When ela informa o CPF e segue para o pagamento
22
+ Then nenhum botão do Apple Pay é mostrado
23
+ And ela vê o formulário de cartão
24
+ When ela paga com um cartão novo
25
+ Then o pagamento é confirmado
@@ -0,0 +1,23 @@
1
+ @journey @google-pay
2
+ Feature: Comprando com Google Pay
3
+
4
+ A carteira não é um quarto meio de pagamento: é outro jeito de produzir o
5
+ cartão. O botão só existe quando a loja declarou a carteira E o aparelho
6
+ disse que consegue pagar — um botão que leva a compradora até a folha do
7
+ Google para depois recusar a cobrança é pior do que nenhum botão. O
8
+ formulário de cartão continua na tela como alternativa o tempo todo.
9
+
10
+ Scenario: A compra inteira acontece pela carteira
11
+ Given a compradora abre o checkout de uma loja com Google Pay
12
+ When ela informa o CPF e segue para o pagamento
13
+ Then ela vê o botão do Google Pay
14
+ And ela vê o formulário de cartão
15
+ When ela paga com o Google Pay
16
+ Then o pagamento é confirmado
17
+ And a cobrança enviada ao provedor carrega a carteira do Google
18
+
19
+ Scenario: Uma loja sem carteira nunca mostra o botão
20
+ Given a compradora abre o checkout da loja de cartão
21
+ When ela informa o CPF e segue para o pagamento
22
+ Then nenhum botão do Google Pay é mostrado
23
+ And ela vê o formulário de cartão
@@ -0,0 +1,23 @@
1
+ @journey @plataforma
2
+ Feature: A aplicação que as lojas autorizam
3
+
4
+ A aplicação OAuth da plataforma — o que cada loja autoriza ao conectar a
5
+ própria conta PagBank — foi registrada à mão, e por muito tempo nada no
6
+ produto sabia dizer o que estava registrado, em qual ambiente, nem com qual
7
+ redirect_uri. O PagBank compara a redirect_uri byte a byte na troca do
8
+ token, então um cadastro diferente do callback desta instalação é uma falha
9
+ de OAuth silenciosa — e diagnosticar isso uma vez já custou tempo de gente.
10
+
11
+ Esta tela é a consulta feita permanente. Sandbox e produção são aplicações
12
+ SEPARADAS, com credenciais separadas, então cada ambiente responde por si; e
13
+ a tela existe justamente para os momentos em que algo está quebrado, então
14
+ uma instalação sem nada configurado também precisa se explicar.
15
+
16
+ Scenario: O callback que precisa estar registrado aparece por inteiro
17
+ Given a operadora abre a aplicação Connect de uma instalação sem aplicação registrada
18
+ Then ela vê o callback desta instalação
19
+ And cada ambiente aparece em seu próprio cartão
20
+
21
+ Scenario: Um ambiente sem aplicação diz isso com todas as letras
22
+ Given a operadora abre a aplicação Connect de uma instalação sem aplicação registrada
23
+ Then os dois ambientes se declaram sem aplicação configurada
@@ -0,0 +1,31 @@
1
+ @journey @plataforma
2
+ Feature: A homologação é da plataforma
3
+
4
+ Somos o integrador direto: a homologação do PagBank é da PLATAFORMA, uma
5
+ única vez — as lojas são usuárias da plataforma e estão isentas. Sem ela,
6
+ cobranças em produção respondem 403 ACCESS_DENIED mesmo com credenciais
7
+ válidas, então "a plataforma está homologada?" é uma pergunta que vale
8
+ dinheiro e não pode depender da memória de alguém.
9
+
10
+ A tela carrega as três metades: a situação registrada (a AUSÊNCIA do
11
+ registro é o quarto estado honesto, "não solicitada" — exibido, nunca
12
+ oferecido), as respostas prontas do formulário oficial, e o gerador do
13
+ anexo de evidências, que roda com as credenciais de sandbox da própria
14
+ plataforma e recusa com o motivo quando não pode rodar.
15
+
16
+ Scenario: As respostas prontas nomeiam os dois serviços integrados
17
+ Given a operadora abre a homologação de uma plataforma que nunca a solicitou
18
+ Then a situação é "Não solicitada"
19
+ And o formulário oficial está a um clique
20
+ And as respostas prontas nomeiam a API de Pedidos e a API Connect
21
+
22
+ Scenario: Registrar a solicitação muda a situação sem recarregar
23
+ Given a operadora abre a homologação de uma plataforma que nunca a solicitou
24
+ When ela registra o protocolo da solicitação
25
+ Then o registro é confirmado
26
+ And a situação passa a ser "Solicitada"
27
+
28
+ Scenario: Sem token de sandbox, o anexo recusa com o motivo
29
+ Given a operadora abre a homologação de uma plataforma que nunca a solicitou
30
+ When ela tenta gerar o anexo de evidências
31
+ Then ela vê o motivo pelo qual o anexo não saiu
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@12-apps/payments-e2e",
3
- "version": "1.2.0",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "description": "The payments buyer journeys, as Gherkin a host runs against its own app",
6
6
  "repository": {
@@ -11,6 +11,7 @@
11
11
  "files": [
12
12
  "dist",
13
13
  "features",
14
+ "features-platform",
14
15
  "*.md"
15
16
  ],
16
17
  "exports": {
@@ -32,8 +33,8 @@
32
33
  "playwright-bdd": ">=8.0.0"
33
34
  },
34
35
  "devDependencies": {
35
- "@12-apps/eslint-config": "^1.18.0",
36
- "@12-apps/typescript-config": "^1.18.0",
36
+ "@12-apps/eslint-config": "^1.20.0",
37
+ "@12-apps/typescript-config": "^1.20.0",
37
38
  "@playwright/test": "^1.56.1",
38
39
  "playwright-bdd": "^8.4.1",
39
40
  "typescript": "5.9.2"