@camphoric/camphoric-event-import-tools 2.0.0 → 2.2.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.
Files changed (43) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/CamphoricEventCreator.ts +210 -15
  3. package/README.md +59 -5
  4. package/dist/CamphoricEventCreator.d.ts +30 -4
  5. package/dist/CamphoricEventCreator.d.ts.map +1 -1
  6. package/dist/CamphoricEventCreator.js +163 -15
  7. package/dist/CamphoricEventCreator.js.map +1 -1
  8. package/dist/e2e.d.ts +17 -3
  9. package/dist/e2e.d.ts.map +1 -1
  10. package/dist/e2e.js +60 -7
  11. package/dist/e2e.js.map +1 -1
  12. package/dist/e2eAdmin.d.ts +59 -0
  13. package/dist/e2eAdmin.d.ts.map +1 -0
  14. package/dist/e2eAdmin.js +103 -0
  15. package/dist/e2eAdmin.js.map +1 -0
  16. package/dist/e2eImport.d.ts +1 -0
  17. package/dist/e2eImport.d.ts.map +1 -1
  18. package/dist/e2eImport.js +8 -4
  19. package/dist/e2eImport.js.map +1 -1
  20. package/dist/e2ePayPal.d.ts +34 -0
  21. package/dist/e2ePayPal.d.ts.map +1 -0
  22. package/dist/e2ePayPal.js +104 -0
  23. package/dist/e2ePayPal.js.map +1 -0
  24. package/dist/e2eRegistrationForm.d.ts +42 -0
  25. package/dist/e2eRegistrationForm.d.ts.map +1 -1
  26. package/dist/e2eRegistrationForm.js +99 -0
  27. package/dist/e2eRegistrationForm.js.map +1 -1
  28. package/dist/e2eServer.d.ts +2 -0
  29. package/dist/e2eServer.d.ts.map +1 -1
  30. package/dist/e2eServer.js +14 -1
  31. package/dist/e2eServer.js.map +1 -1
  32. package/dist/types.d.ts +21 -0
  33. package/dist/types.d.ts.map +1 -1
  34. package/e2e-compose.yml +38 -3
  35. package/e2e.ts +67 -9
  36. package/e2eAdmin.ts +174 -0
  37. package/e2eFakePayPal.py +112 -0
  38. package/e2eImport.ts +13 -2
  39. package/e2ePayPal.ts +129 -0
  40. package/e2eRegistrationForm.ts +108 -0
  41. package/e2eServer.ts +19 -1
  42. package/package.json +4 -1
  43. package/types.ts +21 -0
@@ -0,0 +1,103 @@
1
+ /**
2
+ * What an organizer does in the admin, for an event's e2e tests: invitations
3
+ * to register as a registration type, and the emails the server sent. It
4
+ * uses the admin API (as the admin client does), signed in as the admin the
5
+ * event was imported as, so tests don't drive the admin's own pages.
6
+ */
7
+ import { randomBytes } from 'node:crypto';
8
+ // The address in "Name <address>", or the whole of a bare one
9
+ const address = (recipient) => (/<([^>]*)>\s*$/.exec(recipient)?.[1] ?? recipient).trim().toLowerCase();
10
+ export class CamphoricAdmin {
11
+ url;
12
+ eventId;
13
+ token;
14
+ constructor(url, token, eventId) {
15
+ this.url = url.replace(/\/$/, '');
16
+ this.token = token;
17
+ this.eventId = eventId;
18
+ }
19
+ /**
20
+ * Creates an invitation to register as the registration type with this
21
+ * `name` (its name in the event's data, not its label), as the admin's
22
+ * "Invite a special registration" does. Open its form with
23
+ * `page.goto(invitation.registerUrl)`.
24
+ */
25
+ async invite(registrationType, options = {}) {
26
+ const types = await this.request('GET', `/api/registrationtypes/?event=${this.eventId}`);
27
+ const type = types.find(t => t.name === registrationType);
28
+ if (!type) {
29
+ const names = types.map(t => t.name).join(', ') || 'none';
30
+ throw new Error(`the event has no registration type named '${registrationType}' (it has: ${names})`);
31
+ }
32
+ const email = options.email ?? `e2e.invitee.${randomBytes(4).toString('hex')}@example.com`;
33
+ const invitation = await this.request('POST', '/api/invitations/', {
34
+ registration_type: type.id,
35
+ recipient_name: options.name ?? '',
36
+ recipient_email: email,
37
+ });
38
+ if (options.send)
39
+ await this.request('POST', `/api/invitations/${invitation.id}/send`);
40
+ const link = new URL(invitation.register_link, this.url);
41
+ return {
42
+ id: invitation.id,
43
+ code: invitation.invitation_code,
44
+ email,
45
+ registerUrl: `${link.pathname}${link.search}`,
46
+ };
47
+ }
48
+ /**
49
+ * The emails the server sent about the event (its outbox), newest first,
50
+ * with what each said. Email is recorded as the request that sends it ends,
51
+ * so after a registration it's there when the page has moved on; to wait
52
+ * for one: `await expect.poll(async () => (await admin.emails({ to })).length).toBe(1)`.
53
+ */
54
+ async emails(options = {}) {
55
+ const query = new URLSearchParams({ event: String(this.eventId) });
56
+ if (options.to)
57
+ query.set('q', address(options.to));
58
+ if (options.kind)
59
+ query.set('kind', options.kind);
60
+ const listed = [];
61
+ let next = `/api/emailmessages/?${query}`;
62
+ while (next) {
63
+ const page = await this.request('GET', next);
64
+ listed.push(...page.results);
65
+ // (Its path only: behind a proxy the server may name itself by another
66
+ // scheme or host, where the token wouldn't be sent)
67
+ next = page.next ? `${new URL(page.next).pathname}${new URL(page.next).search}` : null;
68
+ }
69
+ // (q matches part of the recipient or subject)
70
+ const wanted = options.to ? listed.filter(m => address(m.to) === address(options.to ?? '')) : listed;
71
+ const messages = await Promise.all(wanted.map(m => this.request('GET', `/api/emailmessages/${m.id}/`)));
72
+ return messages.map(m => ({
73
+ id: m.id,
74
+ kind: m.kind,
75
+ status: m.status,
76
+ to: m.to,
77
+ from: m.from_email,
78
+ replyTo: m.reply_to,
79
+ subject: m.subject,
80
+ text: m.text,
81
+ html: m.html,
82
+ lastError: m.last_error,
83
+ registration: m.registration,
84
+ invitation: m.invitation,
85
+ }));
86
+ }
87
+ async request(method, path, body) {
88
+ const url = new URL(path, this.url);
89
+ const response = await fetch(url, {
90
+ method,
91
+ headers: {
92
+ 'Authorization': `Token ${this.token}`,
93
+ ...(body === undefined ? {} : { 'Content-Type': 'application/json' }),
94
+ },
95
+ body: body === undefined ? undefined : JSON.stringify(body),
96
+ });
97
+ const text = await response.text();
98
+ if (!response.ok)
99
+ throw new Error(`${method} ${url.pathname} answered ${response.status}: ${text}`);
100
+ return (text ? JSON.parse(text) : undefined);
101
+ }
102
+ }
103
+ //# sourceMappingURL=e2eAdmin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2eAdmin.js","sourceRoot":"","sources":["../e2eAdmin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAqE1C,8DAA8D;AAC9D,MAAM,OAAO,GAAG,CAAC,SAAiB,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAEhH,MAAM,OAAO,cAAc;IAChB,GAAG,CAAS;IACZ,OAAO,CAAS;IACR,KAAK,CAAS;IAE/B,YAAY,GAAW,EAAE,KAAa,EAAE,OAAe;QACrD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,gBAAwB,EAAE,UAAyB,EAAE;QAChE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAC9B,KAAK,EAAE,iCAAiC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC;YAC1D,MAAM,IAAI,KAAK,CAAC,6CAA6C,gBAAgB,cAAc,KAAK,GAAG,CAAC,CAAC;QACvG,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,eAAe,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC;QAC3F,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CACnC,MAAM,EAAE,mBAAmB,EAAE;YAC3B,iBAAiB,EAAE,IAAI,CAAC,EAAE;YAC1B,cAAc,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;YAClC,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACL,IAAI,OAAO,CAAC,IAAI;YAAE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,oBAAoB,UAAU,CAAC,EAAE,OAAO,CAAC,CAAC;QACvF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACzD,OAAO;YACL,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,IAAI,EAAE,UAAU,CAAC,eAAe;YAChC,KAAK;YACL,WAAW,EAAE,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;SAC9C,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,UAAyB,EAAE;QACtC,MAAM,KAAK,GAAG,IAAI,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,OAAO,CAAC,EAAE;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,MAAM,GAAiC,EAAE,CAAC;QAChD,IAAI,IAAI,GAAkB,uBAAuB,KAAK,EAAE,CAAC;QACzD,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,GAAqC,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,uEAAuE;YACvE,oDAAoD;YACpD,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACzF,CAAC;QACD,+CAA+C;QAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACrG,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAe,KAAK,EAAE,sBAAsB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACxB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,UAAU;YAClB,OAAO,EAAE,CAAC,CAAC,QAAQ;YACnB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,UAAU,EAAE,CAAC,CAAC,UAAU;SACzB,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,KAAK,CAAC,OAAO,CAAc,MAAc,EAAE,IAAY,EAAE,IAAc;QAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM;YACN,OAAO,EAAE;gBACP,eAAe,EAAE,SAAS,IAAI,CAAC,KAAK,EAAE;gBACtC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;aACtE;YACD,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC5D,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC,QAAQ,aAAa,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC,CAAC;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAM,CAAC;IACpD,CAAC;CACF"}
@@ -10,6 +10,7 @@ export interface ImportForE2EOptions {
10
10
  password: string;
11
11
  withSampleRegistrations?: boolean;
12
12
  openRegistration?: boolean;
13
+ onlinePayment?: boolean;
13
14
  }
14
15
  /** Imports the event (and creates its organization), returning its id. */
15
16
  export declare function importForE2E(options: ImportForE2EOptions): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"e2eImport.d.ts","sourceRoot":"","sources":["../e2eImport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAElC,KAAK,EAAE,eAAe,CAAC;IAEvB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAEjB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAKlC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,0EAA0E;AAC1E,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiChF"}
1
+ {"version":3,"file":"e2eImport.d.ts","sourceRoot":"","sources":["../e2eImport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAElC,KAAK,EAAE,eAAe,CAAC;IAEvB,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,EAAE,CAAC;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAEjB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAKlC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAM3B,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,0EAA0E;AAC1E,wBAAsB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC,CAqChF"}
package/dist/e2eImport.js CHANGED
@@ -3,10 +3,11 @@
3
3
  */
4
4
  import { getAuthToken } from "./getAuthInfo.js";
5
5
  import CamphoricEventCreator from "./CamphoricEventCreator.js";
6
+ import { E2E_PAYPAL_CLIENT_ID } from "./e2ePayPal.js";
6
7
  import { Organizations, organizationLoader } from "./organizations.js";
7
8
  /** Imports the event (and creates its organization), returning its id. */
8
9
  export async function importForE2E(options) {
9
- const { event, validate, url, username, password, withSampleRegistrations = false, openRegistration = true, } = options;
10
+ const { event, validate, url, username, password, withSampleRegistrations = false, openRegistration = true, onlinePayment = false, } = options;
10
11
  // The fetcher logs in with these
11
12
  process.env.DJANGO_SUPERUSER_USERNAME = username;
12
13
  process.env.DJANGO_SUPERUSER_PASSWORD = password;
@@ -18,7 +19,10 @@ export async function importForE2E(options) {
18
19
  registration_start: new Date(Date.now() - day).toISOString(),
19
20
  registration_end: new Date(Date.now() + 365 * day).toISOString(),
20
21
  };
21
- const data = openRegistration ? { ...event.data, event: { ...event.data.event, ...window } } : event.data;
22
+ const payPal = { paypal_enabled: true, paypal_client_id: E2E_PAYPAL_CLIENT_ID };
23
+ // Set again afterwards too, like the window
24
+ const changes = { ...(openRegistration ? window : {}), ...(onlinePayment ? payPal : {}) };
25
+ const data = { ...event.data, event: { ...event.data.event, ...changes } };
22
26
  const token = await getAuthToken(url);
23
27
  const organization = await organizationLoader(token, url)(event.organization);
24
28
  const creator = new CamphoricEventCreator({
@@ -31,8 +35,8 @@ export async function importForE2E(options) {
31
35
  });
32
36
  await creator.create();
33
37
  const { id } = creator.savedEvent();
34
- if (openRegistration)
35
- await creator.fetch('PATCH', `/api/events/${id}/`, window);
38
+ if (Object.keys(changes).length)
39
+ await creator.fetch('PATCH', `/api/events/${id}/`, changes);
36
40
  return id;
37
41
  }
38
42
  //# sourceMappingURL=e2eImport.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"e2eImport.js","sourceRoot":"","sources":["../e2eImport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAoBvE,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,EACJ,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,GAAG,KAAK,EAAE,gBAAgB,GAAG,IAAI,GACnG,GAAG,OAAO,CAAC;IACZ,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,QAAQ,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,QAAQ,CAAC;IAEjD,wEAAwE;IACxE,oEAAoE;IACpE,sBAAsB;IACtB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG;QACb,kBAAkB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE;QAC5D,gBAAgB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE;KACjE,CAAC;IACF,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;IAE1G,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;QACxC,IAAI;QACJ,QAAQ;QACR,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,kBAAkB,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QAClF,aAAa,EAAE,IAAI,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC;QAChD,GAAG;KACJ,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACpC,IAAI,gBAAgB;QAAE,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IAEjF,OAAO,EAAE,CAAC;AACZ,CAAC"}
1
+ {"version":3,"file":"e2eImport.js","sourceRoot":"","sources":["../e2eImport.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,qBAAqB,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AA0BvE,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,MAAM,EACJ,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,GAAG,KAAK,EAAE,gBAAgB,GAAG,IAAI,EAClG,aAAa,GAAG,KAAK,GACtB,GAAG,OAAO,CAAC;IACZ,iCAAiC;IACjC,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,QAAQ,CAAC;IACjD,OAAO,CAAC,GAAG,CAAC,yBAAyB,GAAG,QAAQ,CAAC;IAEjD,wEAAwE;IACxE,oEAAoE;IACpE,sBAAsB;IACtB,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IAChC,MAAM,MAAM,GAAG;QACb,kBAAkB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE;QAC5D,gBAAgB,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,WAAW,EAAE;KACjE,CAAC;IACF,MAAM,MAAM,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,CAAC;IAChF,4CAA4C;IAC5C,MAAM,OAAO,GAAG,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1F,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,EAAE,EAAE,CAAC;IAE3E,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IAC9E,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC;QACxC,IAAI;QACJ,QAAQ;QACR,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,kBAAkB,EAAE,uBAAuB,CAAC,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC,SAAS;QAClF,aAAa,EAAE,IAAI,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC;QAChD,GAAG;KACJ,CAAC,CAAC;IACH,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IACpC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM;QAAE,MAAM,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAE7F,OAAO,EAAE,CAAC;AACZ,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * PayPal, faked for an event's e2e tests. The throwaway server's PayPal API is
3
+ * e2eFakePayPal.py, and the browser's PayPal script is FAKE_PAYPAL_SDK (the
4
+ * `test` fixture serves it in place of PayPal's), so the payment step's
5
+ * PayPal buttons work without a PayPal account and nothing is paid.
6
+ */
7
+ /** What the server asked PayPal for, as e2eFakePayPal.py recorded it. */
8
+ export interface PayPalOrder {
9
+ id: string;
10
+ amount: string;
11
+ currency: string;
12
+ body: Record<string, unknown>;
13
+ }
14
+ export declare const E2E_PAYPAL_CLIENT_ID = "camphoric-e2e-fake-paypal";
15
+ export declare const PAYPAL_SDK_URL: RegExp;
16
+ /** The fake PayPal API's record of the orders the server created. */
17
+ export declare class FakePayPal {
18
+ readonly url: string;
19
+ constructor(url: string);
20
+ /** Every order the server created, oldest first. */
21
+ orders(): Promise<PayPalOrder[]>;
22
+ /** The order with this id, as the server asked for it. */
23
+ order(id: string): Promise<PayPalOrder>;
24
+ private get;
25
+ }
26
+ /**
27
+ * PayPal's browser script, faked: `paypal.Buttons()` draws a "PayPal" and a
28
+ * "Debit or Credit Card" button, as the client's PayPal library expects. A
29
+ * click does what PayPal's does up to its popup: onClick, then createOrder
30
+ * (which asks the server for the order). The popup then stays "open": the
31
+ * payer never approves or cancels, so nothing is captured.
32
+ */
33
+ export declare const FAKE_PAYPAL_SDK = "(() => {\n const buttons = [['paypal', 'PayPal'], ['card', 'Debit or Credit Card']];\n window.paypal = {\n version: 'camphoric-e2e-fake',\n FUNDING: { PAYPAL: 'paypal', CARD: 'card' },\n Buttons(props) {\n let container = null;\n const elements = [];\n // Disabled (as the client does while it's busy) by the buttons' own\n // attribute, so a test's click waits until they're enabled\n const setDisabled = (disabled) => {\n for (const button of elements) button.disabled = disabled;\n return Promise.resolve();\n };\n const actions = { enable: () => setDisabled(false), disable: () => setDisabled(true) };\n const pay = async (fundingSource) => {\n const data = { fundingSource };\n const clickActions = { resolve: () => Promise.resolve(), reject: () => Promise.resolve() };\n if (props.onClick && (await props.onClick(data, clickActions)) === false) return;\n try {\n await props.createOrder(data, {});\n } catch (error) {\n if (props.onError) props.onError(error);\n }\n };\n return {\n isEligible: () => true,\n render(target) {\n container = typeof target === 'string' ? document.querySelector(target) : target;\n const box = document.createElement('div');\n box.setAttribute('data-camphoric-e2e-paypal', '');\n for (const [fundingSource, label] of buttons) {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = label;\n button.addEventListener('click', () => { pay(fundingSource); });\n elements.push(button);\n box.appendChild(button);\n }\n container.appendChild(box);\n if (props.onInit) props.onInit({}, actions);\n return Promise.resolve();\n },\n updateProps: () => Promise.resolve(),\n close() {\n if (container) container.replaceChildren();\n return Promise.resolve();\n },\n };\n },\n };\n})();\n";
34
+ //# sourceMappingURL=e2ePayPal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2ePayPal.d.ts","sourceRoot":"","sources":["../e2ePayPal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAE1B,EAAE,EAAE,MAAM,CAAC;IAGX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AASD,eAAO,MAAM,oBAAoB,8BAA8B,CAAC;AAGhE,eAAO,MAAM,cAAc,QAA2D,CAAC;AAEvF,qEAAqE;AACrE,qBAAa,UAAU;IACrB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;gBAET,GAAG,EAAE,MAAM;IAIvB,oDAAoD;IAC9C,MAAM,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAKtC,0DAA0D;IACpD,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;YAI/B,GAAG;CAOlB;AAYD;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,yjEAoD3B,CAAC"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * PayPal, faked for an event's e2e tests. The throwaway server's PayPal API is
3
+ * e2eFakePayPal.py, and the browser's PayPal script is FAKE_PAYPAL_SDK (the
4
+ * `test` fixture serves it in place of PayPal's), so the payment step's
5
+ * PayPal buttons work without a PayPal account and nothing is paid.
6
+ */
7
+ // The client id an event is imported with for online payment (e2eImport.ts):
8
+ // only the fakes accept it
9
+ export const E2E_PAYPAL_CLIENT_ID = 'camphoric-e2e-fake-paypal';
10
+ // PayPal's script, wherever the client loads it from
11
+ export const PAYPAL_SDK_URL = /^https:\/\/www\.(sandbox\.)?paypal\.com\/sdk\/js(\?|$)/;
12
+ /** The fake PayPal API's record of the orders the server created. */
13
+ export class FakePayPal {
14
+ url;
15
+ constructor(url) {
16
+ this.url = url.replace(/\/$/, '');
17
+ }
18
+ /** Every order the server created, oldest first. */
19
+ async orders() {
20
+ const recorded = await this.get('/e2e/orders');
21
+ return recorded.map(order);
22
+ }
23
+ /** The order with this id, as the server asked for it. */
24
+ async order(id) {
25
+ return order(await this.get(`/e2e/orders/${encodeURIComponent(id)}`));
26
+ }
27
+ async get(path) {
28
+ const response = await fetch(`${this.url}${path}`);
29
+ if (!response.ok) {
30
+ throw new Error(`the fake PayPal answered ${response.status} to ${path}: ${await response.text()}`);
31
+ }
32
+ return response.json();
33
+ }
34
+ }
35
+ function order(recorded) {
36
+ const amount = recorded.body.purchase_units?.[0]?.amount;
37
+ return {
38
+ id: recorded.id,
39
+ amount: amount?.value ?? '',
40
+ currency: amount?.currency_code ?? '',
41
+ body: recorded.body,
42
+ };
43
+ }
44
+ /**
45
+ * PayPal's browser script, faked: `paypal.Buttons()` draws a "PayPal" and a
46
+ * "Debit or Credit Card" button, as the client's PayPal library expects. A
47
+ * click does what PayPal's does up to its popup: onClick, then createOrder
48
+ * (which asks the server for the order). The popup then stays "open": the
49
+ * payer never approves or cancels, so nothing is captured.
50
+ */
51
+ export const FAKE_PAYPAL_SDK = `(() => {
52
+ const buttons = [['paypal', 'PayPal'], ['card', 'Debit or Credit Card']];
53
+ window.paypal = {
54
+ version: 'camphoric-e2e-fake',
55
+ FUNDING: { PAYPAL: 'paypal', CARD: 'card' },
56
+ Buttons(props) {
57
+ let container = null;
58
+ const elements = [];
59
+ // Disabled (as the client does while it's busy) by the buttons' own
60
+ // attribute, so a test's click waits until they're enabled
61
+ const setDisabled = (disabled) => {
62
+ for (const button of elements) button.disabled = disabled;
63
+ return Promise.resolve();
64
+ };
65
+ const actions = { enable: () => setDisabled(false), disable: () => setDisabled(true) };
66
+ const pay = async (fundingSource) => {
67
+ const data = { fundingSource };
68
+ const clickActions = { resolve: () => Promise.resolve(), reject: () => Promise.resolve() };
69
+ if (props.onClick && (await props.onClick(data, clickActions)) === false) return;
70
+ try {
71
+ await props.createOrder(data, {});
72
+ } catch (error) {
73
+ if (props.onError) props.onError(error);
74
+ }
75
+ };
76
+ return {
77
+ isEligible: () => true,
78
+ render(target) {
79
+ container = typeof target === 'string' ? document.querySelector(target) : target;
80
+ const box = document.createElement('div');
81
+ box.setAttribute('data-camphoric-e2e-paypal', '');
82
+ for (const [fundingSource, label] of buttons) {
83
+ const button = document.createElement('button');
84
+ button.type = 'button';
85
+ button.textContent = label;
86
+ button.addEventListener('click', () => { pay(fundingSource); });
87
+ elements.push(button);
88
+ box.appendChild(button);
89
+ }
90
+ container.appendChild(box);
91
+ if (props.onInit) props.onInit({}, actions);
92
+ return Promise.resolve();
93
+ },
94
+ updateProps: () => Promise.resolve(),
95
+ close() {
96
+ if (container) container.replaceChildren();
97
+ return Promise.resolve();
98
+ },
99
+ };
100
+ },
101
+ };
102
+ })();
103
+ `;
104
+ //# sourceMappingURL=e2ePayPal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"e2ePayPal.js","sourceRoot":"","sources":["../e2ePayPal.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,6EAA6E;AAC7E,2BAA2B;AAC3B,MAAM,CAAC,MAAM,oBAAoB,GAAG,2BAA2B,CAAC;AAEhE,qDAAqD;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,wDAAwD,CAAC;AAEvF,qEAAqE;AACrE,MAAM,OAAO,UAAU;IACZ,GAAG,CAAS;IAErB,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAoB,CAAC;QAClE,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,0DAA0D;IAC1D,KAAK,CAAC,KAAK,CAAC,EAAU;QACpB,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,eAAe,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAkB,CAAC,CAAC;IACzF,CAAC;IAEO,KAAK,CAAC,GAAG,CAAC,IAAY;QAC5B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,4BAA4B,QAAQ,CAAC,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CACF;AAED,SAAS,KAAK,CAAC,QAAuB;IACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IACzD,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,EAAE;QAC3B,QAAQ,EAAE,MAAM,EAAE,aAAa,IAAI,EAAE;QACrC,IAAI,EAAE,QAAQ,CAAC,IAA+B;KAC/C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoD9B,CAAC"}
@@ -22,6 +22,27 @@ export declare class FormSection {
22
22
  check(label: string | RegExp): Promise<void>;
23
23
  /** A message shown with the questions, such as a validation error. */
24
24
  message(text: string | RegExp): Locator;
25
+ /**
26
+ * A list question (an array of objects in the event's schema, such as a
27
+ * camper's parking passes), by its title: its items, and adding and
28
+ * removing them. A camper's list is the camper's: `camper(n).list(title)`
29
+ * (on the whole form, every camper's list has that title).
30
+ */
31
+ list(title: string): ListQuestion;
32
+ }
33
+ /** A list question's items, each with questions of its own (FormSection.list). */
34
+ export declare class ListQuestion {
35
+ readonly page: Page;
36
+ readonly root: Locator;
37
+ constructor(page: Page, root: Locator);
38
+ /** Its items, in order: count them with `expect(list.items()).toHaveCount(n)`. */
39
+ items(): Locator;
40
+ /** The nth item's questions (from 1). */
41
+ item(n: number): FormSection;
42
+ /** Adds an item (its "Add …" button), returning its questions. */
43
+ add(): Promise<FormSection>;
44
+ /** Removes the nth item (from 1), with its × button. */
45
+ remove(n: number): Promise<void>;
25
46
  }
26
47
  /** One camper's questions, under its "1st Camper", "2nd Camper", … heading. */
27
48
  export declare class CamperSection extends FormSection {
@@ -55,6 +76,11 @@ export declare class RegistrationForm extends FormSection {
55
76
  camper(n: number): CamperSection;
56
77
  /** Adds another camper, returning its questions. */
57
78
  addCamper(): Promise<CamperSection>;
79
+ /**
80
+ * Removes the nth camper (from 1), with the Remove button by its heading;
81
+ * the campers after it move up (the 3rd becomes the 2nd).
82
+ */
83
+ removeCamper(n: number): Promise<void>;
58
84
  /** Waits until the price ticker shows this total (in dollars). */
59
85
  expectTotal(amount: number): Promise<void>;
60
86
  /** The total the price ticker shows now, in dollars (see expectTotal). */
@@ -67,5 +93,21 @@ export declare class RegistrationForm extends FormSection {
67
93
  choosePaymentOption(title: string): Promise<void>;
68
94
  /** On the payment step: pays by check, completing the registration. */
69
95
  payByCheck(): Promise<void>;
96
+ /**
97
+ * On the payment step: what the chosen payment option costs, in dollars,
98
+ * as it shows it: by check (the default), or online, which adds the
99
+ * event's e-payment handling (shown only when the event takes payments
100
+ * online: import it with `onlinePayment`).
101
+ */
102
+ paymentTotal(how?: 'check' | 'online'): Promise<number>;
103
+ /**
104
+ * On the payment step of an event imported with `onlinePayment`: presses
105
+ * a PayPal button ('PayPal', or 'Card' for "Debit or Credit Card"), which
106
+ * completes the registration and has the server create its PayPal order,
107
+ * and returns the order's id. The fake PayPal's window then stays open: the
108
+ * payer never approves, so nothing is paid. Read what the order asked for
109
+ * with the `payPal` fixture's `order(id)`.
110
+ */
111
+ startOnlinePayment(button?: 'PayPal' | 'Card'): Promise<string>;
70
112
  }
71
113
  //# sourceMappingURL=e2eRegistrationForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"e2eRegistrationForm.d.ts","sourceRoot":"","sources":["../e2eRegistrationForm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA0CnE,6EAA6E;AAC7E,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO;IAKrC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAItC,gEAAgE;IAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,sEAAsE;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,2EAA2E;IACrE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,sEAAsE;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;CAGxC;AAED,+EAA+E;AAC/E,qBAAa,aAAc,SAAQ,WAAW;IAC5C;;;;;OAKG;IACG,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQ5D;;;;;;;;;;OAUG;IACH,aAAa,IAAI,OAAO;IAKxB,OAAO,CAAC,eAAe;CAGxB;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;IAKvC,+DAA+D;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,8EAA8E;IAC9E,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa;IAKhC,oDAAoD;IAC9C,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAMzC,kEAAkE;IAC5D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,0EAA0E;IACpE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B,wEAAwE;IAClE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,qDAAqD;IAC/C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,kEAAkE;IAC5D,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,uEAAuE;IACjE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CAGlC"}
1
+ {"version":3,"file":"e2eRegistrationForm.d.ts","sourceRoot":"","sources":["../e2eRegistrationForm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,KAAK,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAC;AA0CnE,6EAA6E;AAC7E,qBAAa,WAAW;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO;IAKrC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAItC,gEAAgE;IAC1D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,sEAAsE;IAChE,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,2EAA2E;IACrE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIlD,sEAAsE;IACtE,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO;IAIvC;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY;CAMlC;AAED,kFAAkF;AAClF,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;gBAEX,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO;IAKrC,kFAAkF;IAClF,KAAK,IAAI,OAAO;IAIhB,yCAAyC;IACzC,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW;IAI5B,kEAAkE;IAC5D,GAAG,IAAI,OAAO,CAAC,WAAW,CAAC;IAOjC,wDAAwD;IAClD,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMvC;AAED,+EAA+E;AAC/E,qBAAa,aAAc,SAAQ,WAAW;IAC5C;;;;;OAKG;IACG,aAAa,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAQ5D;;;;;;;;;;OAUG;IACH,aAAa,IAAI,OAAO;IAKxB,OAAO,CAAC,eAAe;CAGxB;AAED,qBAAa,gBAAiB,SAAQ,WAAW;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM;IAKvC,+DAA+D;IACzD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B,8EAA8E;IAC9E,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,aAAa;IAKhC,oDAAoD;IAC9C,SAAS,IAAI,OAAO,CAAC,aAAa,CAAC;IAMzC;;;OAGG;IACG,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ5C,kEAAkE;IAC5D,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,0EAA0E;IACpE,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IAO9B,wEAAwE;IAClE,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7B,qDAAqD;IAC/C,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxC,kEAAkE;IAC5D,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvD,uEAAuE;IACjE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;;OAKG;IACG,YAAY,CAAC,GAAG,GAAE,OAAO,GAAG,QAAkB,GAAG,OAAO,CAAC,MAAM,CAAC;IAQtE;;;;;;;OAOG;IACG,kBAAkB,CAAC,MAAM,GAAE,QAAQ,GAAG,MAAiB,GAAG,OAAO,CAAC,MAAM,CAAC;CAuBhF"}
@@ -73,6 +73,49 @@ export class FormSection {
73
73
  message(text) {
74
74
  return this.root.getByText(text);
75
75
  }
76
+ /**
77
+ * A list question (an array of objects in the event's schema, such as a
78
+ * camper's parking passes), by its title: its items, and adding and
79
+ * removing them. A camper's list is the camper's: `camper(n).list(title)`
80
+ * (on the whole form, every camper's list has that title).
81
+ */
82
+ list(title) {
83
+ // The list's own title (its heading, a child of the list's box), not
84
+ // that of a list inside one of its items
85
+ const heading = this.page.locator(':scope > h3').filter({ hasText: new RegExp(`^${escapeRegExp(title)}$`) });
86
+ return new ListQuestion(this.page, this.root.locator('.rjsf-field-array').filter({ has: heading }));
87
+ }
88
+ }
89
+ /** A list question's items, each with questions of its own (FormSection.list). */
90
+ export class ListQuestion {
91
+ page;
92
+ root;
93
+ constructor(page, root) {
94
+ this.page = page;
95
+ this.root = root;
96
+ }
97
+ /** Its items, in order: count them with `expect(list.items()).toHaveCount(n)`. */
98
+ items() {
99
+ return this.root.locator(':scope > .rjsf-array-item-list > .rjsf-array-item');
100
+ }
101
+ /** The nth item's questions (from 1). */
102
+ item(n) {
103
+ return new FormSection(this.page, this.items().nth(n - 1));
104
+ }
105
+ /** Adds an item (its "Add …" button), returning its questions. */
106
+ async add() {
107
+ const count = await this.items().count();
108
+ await this.root.locator(':scope > * > .rjsf-array-item-add').click();
109
+ await expect(this.items()).toHaveCount(count + 1);
110
+ return this.item(count + 1);
111
+ }
112
+ /** Removes the nth item (from 1), with its × button. */
113
+ async remove(n) {
114
+ const count = await this.items().count();
115
+ await this.items().nth(n - 1).locator(':scope > .rjsf-array-item-toolbar')
116
+ .getByRole('button', { name: 'Remove', exact: true }).click();
117
+ await expect(this.items()).toHaveCount(count - 1);
118
+ }
76
119
  }
77
120
  /** One camper's questions, under its "1st Camper", "2nd Camper", … heading. */
78
121
  export class CamperSection extends FormSection {
@@ -135,6 +178,17 @@ export class RegistrationForm extends FormSection {
135
178
  await this.page.getByRole('button', { name: `Add a ${ordinal(count + 1)} Camper` }).click();
136
179
  return this.camper(count + 1);
137
180
  }
181
+ /**
182
+ * Removes the nth camper (from 1), with the Remove button by its heading;
183
+ * the campers after it move up (the 3rd becomes the 2nd).
184
+ */
185
+ async removeCamper(n) {
186
+ const count = await this.page.locator('.camphoric-camper').count();
187
+ // (The heading's row, not the Remove buttons of the camper's lists)
188
+ await this.camper(n).root.locator(':scope > .mantine-Group-root')
189
+ .getByRole('button', { name: 'Remove', exact: true }).click();
190
+ await expect(this.page.locator('.camphoric-camper')).toHaveCount(count - 1);
191
+ }
138
192
  /** Waits until the price ticker shows this total (in dollars). */
139
193
  async expectTotal(amount) {
140
194
  await expect(this.page.getByText(/^Total: /)).toHaveText(`Total: ${money(amount)}`);
@@ -163,5 +217,50 @@ export class RegistrationForm extends FormSection {
163
217
  async payByCheck() {
164
218
  await this.page.getByRole('button', { name: /by check$/ }).click();
165
219
  }
220
+ /**
221
+ * On the payment step: what the chosen payment option costs, in dollars,
222
+ * as it shows it: by check (the default), or online, which adds the
223
+ * event's e-payment handling (shown only when the event takes payments
224
+ * online: import it with `onlinePayment`).
225
+ */
226
+ async paymentTotal(how = 'check') {
227
+ const due = this.page.getByRole('table', { name: 'Amount due now' });
228
+ const row = due.getByRole('row').filter({ hasText: how === 'check' ? /^By check/ : /^Online/ });
229
+ const amount = row.getByRole('cell').last();
230
+ await expect(amount).toBeVisible();
231
+ return Number(((await amount.textContent()) ?? '').replace(/[^0-9.-]/g, ''));
232
+ }
233
+ /**
234
+ * On the payment step of an event imported with `onlinePayment`: presses
235
+ * a PayPal button ('PayPal', or 'Card' for "Debit or Credit Card"), which
236
+ * completes the registration and has the server create its PayPal order,
237
+ * and returns the order's id. The fake PayPal's window then stays open: the
238
+ * payer never approves, so nothing is paid. Read what the order asked for
239
+ * with the `payPal` fixture's `order(id)`.
240
+ */
241
+ async startOnlinePayment(button = 'PayPal') {
242
+ const name = button === 'Card' ? 'Debit or Credit Card' : 'PayPal';
243
+ const created = this.page.waitForResponse((response) => {
244
+ const request = response.request();
245
+ // (With an invitation, the form posts with its code in the query)
246
+ if (request.method() !== 'POST' || new URL(response.url()).pathname !== `/api/events/${this.eventId}/register`) {
247
+ return false;
248
+ }
249
+ try {
250
+ return request.postDataJSON()?.step === 'paypal-order';
251
+ }
252
+ catch {
253
+ return false;
254
+ }
255
+ });
256
+ await this.page.locator('[data-camphoric-e2e-paypal]')
257
+ .getByRole('button', { name, exact: true }).click();
258
+ const response = await created;
259
+ const body = await response.json();
260
+ if (!response.ok() || !body.orderID) {
261
+ throw new Error(`the server didn't create a PayPal order (${response.status()}): ${body.detail ?? JSON.stringify(body)}`);
262
+ }
263
+ return body.orderID;
264
+ }
166
265
  }
167
266
  //# sourceMappingURL=e2eRegistrationForm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"e2eRegistrationForm.js","sourceRoot":"","sources":["../e2eRegistrationForm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAA2B,MAAM,kBAAkB,CAAC;AAEnE,yEAAyE;AACzE,4BAA4B;AAC5B,SAAS,OAAO,CAAC,CAAS;IACxB,MAAM,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC;IACrB,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC/C,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC/C,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC/C,OAAO,GAAG,CAAC,IAAI,CAAC;AAClB,CAAC;AAED,kEAAkE;AAClE,MAAM,KAAK,GAAG,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;AAEzG,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AAEnF,uEAAuE;AACvE,MAAM,QAAQ,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AAErF,2EAA2E;AAC3E,KAAK,UAAU,IAAI,CAAC,IAAU,EAAE,QAAiB;IAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACvB,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE;QAAE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IACpD,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,2EAA2E;AAC3E,6EAA6E;AAC7E,2EAA2E;AAC3E,YAAY;AACZ,KAAK,UAAU,IAAI,CAAC,IAAU,EAAE,QAAiB,EAAE,MAAc;IAC/D,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,eAAe,EAAE,CAAC;IACjE,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACtE,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,6EAA6E;AAC7E,MAAM,OAAO,WAAW;IACb,IAAI,CAAO;IACX,IAAI,CAAU;IAEvB,YAAY,IAAU,EAAE,IAAa;QACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,KAAsB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnF,CAAC;IAED,gEAAgE;IAChE,KAAK,CAAC,IAAI,CAAC,KAAsB,EAAE,KAAa;QAC9C,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,sEAAsE;IACtE,KAAK,CAAC,MAAM,CAAC,KAAsB,EAAE,MAAc;QACjD,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,2EAA2E;IAC3E,KAAK,CAAC,KAAK,CAAC,KAAsB;QAChC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;IAClC,CAAC;IAED,sEAAsE;IACtE,OAAO,CAAC,IAAqB;QAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED,+EAA+E;AAC/E,MAAM,OAAO,aAAc,SAAQ,WAAW;IAC5C;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,GAAG,KAAe;QACpC,MAAM,OAAO,GAAe,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;OAUG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,qDAAqD,CAAC,CAAC;IAClF,CAAC;IAED,iDAAiD;IACzC,eAAe,CAAC,KAAa;QACnC,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,WAAW;IACtC,OAAO,CAAS;IAEzB,YAAY,IAAU,EAAE,OAAe;QACrC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,+DAA+D;IAC/D,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,OAAO,WAAW,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAC;QAC7D,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACjD,IAAI,MAAM,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;QAC/G,CAAC;QACD,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,8EAA8E;IAC9E,MAAM,CAAC,CAAS;QACd,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9F,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC;IAED,oDAAoD;IACpD,KAAK,CAAC,SAAS;QACb,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QACnE,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QAC5F,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,0EAA0E;IAC1E,KAAK,CAAC,KAAK;QACT,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QAC/C,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAChD,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,wEAAwE;IACxE,KAAK,CAAC,MAAM;QACV,0EAA0E;QAC1E,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC5F,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,iBAAiB;QACrB,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC;IAC5F,CAAC;IAED,kEAAkE;IAClE,KAAK,CAAC,mBAAmB,CAAC,KAAa;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,IAAI,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC/F,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IACrE,CAAC;CACF"}
1
+ {"version":3,"file":"e2eRegistrationForm.js","sourceRoot":"","sources":["../e2eRegistrationForm.ts"],"names":[],"mappings":"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"}
@@ -6,10 +6,12 @@ export interface CamphoricServer {
6
6
  url: string;
7
7
  username: string;
8
8
  password: string;
9
+ payPalUrl?: string;
9
10
  stop: () => Promise<void>;
10
11
  }
11
12
  export interface CamphoricServerOptions {
12
13
  image?: string;
14
+ fakePayPal?: boolean;
13
15
  }
14
16
  /**
15
17
  * Start a throwaway Camphoric, ready for requests. To use an existing server
@@ -1 +1 @@
1
- {"version":3,"file":"e2eServer.d.ts","sourceRoot":"","sources":["../e2eServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAEjB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IAIrC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAwBD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,eAAe,CAAC,CAqDpG"}
1
+ {"version":3,"file":"e2eServer.d.ts","sourceRoot":"","sources":["../e2eServer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IAEZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IAGjB,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,sBAAsB;IAIrC,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAwBD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,eAAe,CAAC,CAiEpG"}
package/dist/e2eServer.js CHANGED
@@ -48,6 +48,10 @@ export async function camphoricServer(options = {}) {
48
48
  return { url: existing.replace(/\/$/, ''), username, password, stop: async () => { } };
49
49
  }
50
50
  const port = await freePort();
51
+ let payPalPort = await freePort();
52
+ while (payPalPort === port)
53
+ payPalPort = await freePort();
54
+ const fakePayPal = options.fakePayPal ?? false;
51
55
  const username = 'e2e-admin';
52
56
  const password = randomBytes(12).toString('hex');
53
57
  const project = `camphoric-e2e-${randomBytes(4).toString('hex')}`;
@@ -57,6 +61,9 @@ export async function camphoricServer(options = {}) {
57
61
  CAMPHORIC_E2E_IMAGE: local ?? `ghcr.io/camphoric/camphoric:${process.env.CAMPHORIC_IMAGE_TAG ?? 'latest'}`,
58
62
  CAMPHORIC_E2E_PULL_POLICY: local ? 'missing' : 'always',
59
63
  CAMPHORIC_E2E_PORT: String(port),
64
+ CAMPHORIC_E2E_PAYPAL_PORT: String(payPalPort),
65
+ // (for every compose command, so `down` removes the fake PayPal too)
66
+ COMPOSE_PROFILES: fakePayPal ? 'paypal' : '',
60
67
  CAMPHORIC_E2E_USERNAME: username,
61
68
  CAMPHORIC_E2E_PASSWORD: password,
62
69
  };
@@ -88,6 +95,12 @@ export async function camphoricServer(options = {}) {
88
95
  process.off('SIGINT', interrupted);
89
96
  process.off('SIGTERM', interrupted);
90
97
  }
91
- return { url: `http://localhost:${port}`, username, password, stop };
98
+ return {
99
+ url: `http://localhost:${port}`,
100
+ username,
101
+ password,
102
+ payPalUrl: fakePayPal ? `http://127.0.0.1:${payPalPort}` : undefined,
103
+ stop,
104
+ };
92
105
  }
93
106
  //# sourceMappingURL=e2eServer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"e2eServer.js","sourceRoot":"","sources":["../e2eServer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"e2eServer.js","sourceRoot":"","sources":["../e2eServer.ts"],"names":[],"mappings":"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"}