@futdevpro/fdp-e2e-helpers 1.15.9

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.
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.E2E_UserManagerService = void 0;
4
+ const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
5
+ const nts_dynamo_1 = require("@futdevpro/nts-dynamo");
6
+ const e2e_hard_delete_util_1 = require("../_collections/e2e-hard-delete.util");
7
+ const e2e_unique_generator_util_1 = require("../_collections/e2e-unique-generator.util");
8
+ /**
9
+ * E2E_UserManagerService — persistent + temporary user-ek kezelese az E2E
10
+ * teszt-ciklusban.
11
+ *
12
+ * Lift-and-shift a fdp-token-service `e2e/src/_shared/_services/e2e-user-manager.service.ts`-bol
13
+ * (BL-20260518-003). FONTOS valtozasok a token-service eredetijehez kepest:
14
+ * - `deleteTemporaryUser()` TODO-stub-jat valodi impl-be hoztuk: most az
15
+ * `E2E_HardDelete_Util.deleteAccount()`-ot hivja (BL-20260518-004 + BL-001 osszekoteshez).
16
+ * - `getPersistentUser()`-bol az `E2E_ConfigService`-fuggoseget kihagytuk —
17
+ * a config explicit `setPersistentUser()` setter-en at kerul be (decoupled
18
+ * a config-service-tol, amig BL-005 lift-up nem kerul be a csomagba).
19
+ *
20
+ * Pattern: singleton-service `extends DyNTS_SingletonService` — peerDep
21
+ * @futdevpro/nts-dynamo szukseges. Spec REQ-USER-001 + REQ-USER-002 user-lifecycle.
22
+ */
23
+ class E2E_UserManagerService extends nts_dynamo_1.DyNTS_SingletonService {
24
+ /**
25
+ * Singleton instance getter — peerDep-mentes elerheteloseg a consumer-eknek.
26
+ */
27
+ static getInstance() {
28
+ return E2E_UserManagerService.getSingletonInstance();
29
+ }
30
+ /**
31
+ * Private constructor — defense-in-depth a singleton-enforcement-hez.
32
+ * Pattern conform a token-service eredetijével + a többi E2E_*Service-szel
33
+ * (E2E_LoggerService, E2E_ConfigService).
34
+ */
35
+ constructor() {
36
+ super();
37
+ }
38
+ persistentUser = null;
39
+ temporaryUsers = [];
40
+ // Hard-delete cascade-hez szukseges config (a temporary-user-cleanup-flow)
41
+ authServiceUrl = null;
42
+ e2eKey = null;
43
+ /**
44
+ * Persistent user explicit setter — a config-service decoupling miatt nincs
45
+ * implicit config-loader, a consumer adja meg. BL-005 lift-up utan opcionalisan
46
+ * a config-service is hozhatja.
47
+ *
48
+ * @param user - Persistent user adatai (email, username, password, accountId?)
49
+ */
50
+ setPersistentUser(user) {
51
+ if (!user.isPersistent) {
52
+ throw new fsm_dynamo_1.DyFM_Error({
53
+ message: 'setPersistentUser: provided user has isPersistent=false',
54
+ errorCode: 'FDP-E2E-UMS-SPU-001',
55
+ issuerService: 'E2E_UserManagerService',
56
+ });
57
+ }
58
+ this.persistentUser = user;
59
+ fsm_dynamo_1.DyFM_Log.info(`[E2E_UserManager] Persistent user set: ${user.email}`);
60
+ }
61
+ /**
62
+ * Hard-delete cascade config beallitasa (a temporary-user-cleanup-hoz).
63
+ * A consumer cycle-elejen egyszer hivja, utana minden delete ezt hasznalja.
64
+ *
65
+ * @param config - authServiceUrl + e2eKey (X-E2E-Key header value)
66
+ */
67
+ setHardDeleteConfig(config) {
68
+ this.authServiceUrl = config.authServiceUrl;
69
+ this.e2eKey = config.e2eKey;
70
+ }
71
+ /**
72
+ * Persistent user lekerese (cache-elt).
73
+ *
74
+ * @returns Persistent user
75
+ * @throws DyFM_Error ha persistent user meg nincs setelve (setPersistentUser hivas hianyzik)
76
+ */
77
+ getPersistentUser() {
78
+ if (!this.persistentUser) {
79
+ throw new fsm_dynamo_1.DyFM_Error({
80
+ message: 'getPersistentUser: no persistent user set — call setPersistentUser() first',
81
+ errorCode: 'FDP-E2E-UMS-GPU-001',
82
+ issuerService: 'E2E_UserManagerService',
83
+ });
84
+ }
85
+ return this.persistentUser;
86
+ }
87
+ /**
88
+ * Temporary user letrehozasa egyedi email + username + password generatorral.
89
+ * A user az `temporaryUsers` listaba kerul cleanup-tracking-hez (cleanupAllTemporaryUsers).
90
+ *
91
+ * @param testContext - A teszt/scenario neve (pl. 'registration-flow', 'login-test')
92
+ * @param accountId - Opcionalis: ha mar letrehozott account, az ID it-t adjuk a hard-delete-hez
93
+ * @returns A letrehozott (tracking-ba felvett) temporary user
94
+ */
95
+ createTemporaryUser(testContext, accountId) {
96
+ const email = e2e_unique_generator_util_1.E2E_UniqueGenerator_Util.generateUniqueEmail('e2e-user', testContext);
97
+ const username = e2e_unique_generator_util_1.E2E_UniqueGenerator_Util.generateUniqueUsername('e2e-user', testContext);
98
+ const password = e2e_unique_generator_util_1.E2E_UniqueGenerator_Util.generateUniquePassword('e2e-pw');
99
+ const user = {
100
+ email: email,
101
+ username: username,
102
+ password: password,
103
+ accountId: accountId,
104
+ isPersistent: false,
105
+ createdAt: new Date(),
106
+ testContext: testContext,
107
+ };
108
+ this.temporaryUsers.push(user);
109
+ fsm_dynamo_1.DyFM_Log.info(`[E2E_UserManager] Temporary user created: ${user.email} (testContext=${testContext})`);
110
+ return user;
111
+ }
112
+ /**
113
+ * Temporary user torlese — hard-delete cascade-pel az auth-service-en at.
114
+ * A `setHardDeleteConfig()` hivasa szukseges elotte (kulonben dob).
115
+ *
116
+ * @param user - A torlendo user. Ha `isPersistent: true`, dob (NEM lehet persistentet torolni).
117
+ * @throws DyFM_Error ha (a) user persistent, (b) hard-delete config nincs setelve,
118
+ * (c) accountId nincs setelve, (d) cascade-delete HTTP hiba.
119
+ */
120
+ async deleteTemporaryUser(user) {
121
+ if (user.isPersistent) {
122
+ throw new fsm_dynamo_1.DyFM_Error({
123
+ message: 'Cannot delete persistent user',
124
+ errorCode: 'FDP-E2E-UMS-DTU-PERS',
125
+ issuerService: 'E2E_UserManagerService',
126
+ });
127
+ }
128
+ if (!this.authServiceUrl || !this.e2eKey) {
129
+ throw new fsm_dynamo_1.DyFM_Error({
130
+ message: 'deleteTemporaryUser: hard-delete config not set — call setHardDeleteConfig() first',
131
+ errorCode: 'FDP-E2E-UMS-DTU-NOCONFIG',
132
+ issuerService: 'E2E_UserManagerService',
133
+ });
134
+ }
135
+ if (!user.accountId) {
136
+ throw new fsm_dynamo_1.DyFM_Error({
137
+ message: `deleteTemporaryUser: user has no accountId set (email=${user.email}) — cannot cascade-delete`,
138
+ errorCode: 'FDP-E2E-UMS-DTU-NOID',
139
+ issuerService: 'E2E_UserManagerService',
140
+ });
141
+ }
142
+ await e2e_hard_delete_util_1.E2E_HardDelete_Util.deleteAccount({
143
+ authServiceUrl: this.authServiceUrl,
144
+ accountId: user.accountId,
145
+ e2eKey: this.e2eKey,
146
+ });
147
+ const index = this.temporaryUsers.findIndex((u) => u.email === user.email);
148
+ if (index !== -1) {
149
+ this.temporaryUsers.splice(index, 1);
150
+ }
151
+ fsm_dynamo_1.DyFM_Log.info(`[E2E_UserManager] Temporary user hard-deleted: ${user.email}`);
152
+ }
153
+ /**
154
+ * Osszes tracking-ba felvett temporary user hard-delete-cascade-pel torlese.
155
+ * Cycle-vegi cleanup — hibatkereles: egy user fail-e NEM blokkolja a tobbit
156
+ * (try/catch per-user + warn log).
157
+ */
158
+ async cleanupAllTemporaryUsers() {
159
+ const usersToCleanup = [...this.temporaryUsers];
160
+ fsm_dynamo_1.DyFM_Log.info(`[E2E_UserManager] Cleaning up ${usersToCleanup.length} temporary user(s)`);
161
+ let successCount = 0;
162
+ let failCount = 0;
163
+ for (const user of usersToCleanup) {
164
+ try {
165
+ await this.deleteTemporaryUser(user);
166
+ successCount++;
167
+ }
168
+ catch (error) {
169
+ failCount++;
170
+ fsm_dynamo_1.DyFM_Log.H_error(`[E2E_UserManager] Failed to delete temporary user ${user.email}: ${error.message}`);
171
+ }
172
+ }
173
+ fsm_dynamo_1.DyFM_Log.info(`[E2E_UserManager] Cleanup complete: ${successCount} success, ${failCount} fail`);
174
+ }
175
+ /**
176
+ * Tracking-list lekerese (read-only) — debug/inspection celokra.
177
+ */
178
+ getTemporaryUsers() {
179
+ return [...this.temporaryUsers];
180
+ }
181
+ }
182
+ exports.E2E_UserManagerService = E2E_UserManagerService;
183
+ //# sourceMappingURL=e2e-user-manager.service.js.map
@@ -0,0 +1,9 @@
1
+ export * from './_collections/e2e-hard-delete.util';
2
+ export * from './_collections/e2e-unique-generator.util';
3
+ export * from './_services/e2e-config.service';
4
+ export * from './_services/e2e-logger.service';
5
+ export * from './_services/e2e-user-manager.service';
6
+ export * from './_models/interfaces/e2e-hard-delete-options.interface';
7
+ export * from './_models/interfaces/e2e-test-config.interface';
8
+ export * from './_models/interfaces/e2e-user.interface';
9
+ //# sourceMappingURL=index.d.ts.map
package/build/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ // COLLECTIONS / UTILS
5
+ tslib_1.__exportStar(require("./_collections/e2e-hard-delete.util"), exports);
6
+ tslib_1.__exportStar(require("./_collections/e2e-unique-generator.util"), exports);
7
+ // SERVICES
8
+ tslib_1.__exportStar(require("./_services/e2e-config.service"), exports);
9
+ tslib_1.__exportStar(require("./_services/e2e-logger.service"), exports);
10
+ tslib_1.__exportStar(require("./_services/e2e-user-manager.service"), exports);
11
+ // INTERFACES
12
+ tslib_1.__exportStar(require("./_models/interfaces/e2e-hard-delete-options.interface"), exports);
13
+ tslib_1.__exportStar(require("./_models/interfaces/e2e-test-config.interface"), exports);
14
+ tslib_1.__exportStar(require("./_models/interfaces/e2e-user.interface"), exports);
15
+ //# sourceMappingURL=index.js.map
package/package.json ADDED
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "@futdevpro/fdp-e2e-helpers",
3
+ "version": "01.15.9",
4
+ "description": "Shared E2E test helpers for FDP-stack apps. First util: E2E_HardDelete_Util. Stateless utility-collection — NOT a framework.",
5
+ "DyBu_settings": {
6
+ "packageType": "shared-package",
7
+ "tgzFolderName": "fdp-e2e-helpers",
8
+ "systemName": "fdp-e2e"
9
+ },
10
+ "author": "Future Development Program Ltd.",
11
+ "license": "ISC",
12
+ "bugs": {
13
+ "url": "https://github.com/futdevpro/fdp-e2e-helpers/issues"
14
+ },
15
+ "homepage": "futdevpro.hu",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/futdevpro/fdp-e2e-helpers.git"
19
+ },
20
+ "keywords": [
21
+ "e2e",
22
+ "playwright",
23
+ "testing",
24
+ "fdp",
25
+ "futdevpro",
26
+ "hard-delete",
27
+ "user-management"
28
+ ],
29
+ "scripts": {
30
+ "prep": "npm i -g pnpm rimraf nodemon && pnpm i",
31
+ "preprep-setup-safechain-windows": "iex (iwr \"https://raw.githubusercontent.com/AikidoSec/safe-chain/main/install-scripts/install-safe-chain.ps1\" -UseBasicParsing)",
32
+ "preprep-setup-safechain-linux": "curl -fsSL https://raw.githubusercontent.com/AikidoSec/safe-chain/main/install-scripts/install-safe-chain.sh | sh",
33
+ "start": "npm run prep && nodemon",
34
+ "deploy": "npm run build",
35
+ "clean-deploy": "npm run clean && npm run build-all",
36
+ "build": "npm run build-base && jasmine && npm publish",
37
+ "build-tgz": "npm run build-base && jasmine && npm pack && move ./*.tgz ../tgz-collection/fdp-e2e-helpers",
38
+ "build-all": "npm run build-tgz && npm run build-base",
39
+ "build-base": "rimraf ./build && npx tsc",
40
+ "build-clean": "npm run clean && npm run build-base",
41
+ "build-n-test": "pnpm i && npm run build-tgz",
42
+ "clean": "rimraf ./build && rimraf package-lock.json && rimraf ./node_modules",
43
+ "test": "npm run build-base && jasmine",
44
+ "test-clean": "npm run build-clean && jasmine",
45
+ "start-clean": "npm run clean && npm run start",
46
+ "nodemon-run": "npm run build-tgz",
47
+ "lint": "eslint src --ext .ts",
48
+ "lint:fix": "eslint src --ext .ts --fix",
49
+ "validate:imports": "dynamo-validate-imports",
50
+ "validate:naming": "dynamo-validate-naming",
51
+ "prepare": "husky"
52
+ },
53
+ "main": "./build/index.js",
54
+ "module": "./build/index.js",
55
+ "types": "./build/index.d.ts",
56
+ "typings": "./build/index.d.ts",
57
+ "exports": {
58
+ ".": {
59
+ "default": "./build/index.js",
60
+ "module": "./build/index.js",
61
+ "types": "./build/index.d.ts",
62
+ "typings": "./build/index.d.ts"
63
+ }
64
+ },
65
+ "files": [
66
+ "build/**/*.js",
67
+ "build/**/*.d.ts",
68
+ "!build/**/*.spec.*",
69
+ "README.md",
70
+ "HOWTO.md"
71
+ ],
72
+ "peerDependencies": {
73
+ "@futdevpro/fsm-dynamo": ">=1.15.0",
74
+ "@futdevpro/nts-dynamo": ">=1.15.0"
75
+ },
76
+ "dependencies": {
77
+ "axios": "~1.8.1",
78
+ "dotenv": "^16.4.5",
79
+ "tslib": "^2.6.2"
80
+ },
81
+ "devDependencies": {
82
+ "@futdevpro/dynamo-eslint": "1.15.10",
83
+ "@futdevpro/fsm-dynamo": "1.15.13",
84
+ "@futdevpro/nts-dynamo": "1.15.31",
85
+ "@types/jasmine": "^5.1.5",
86
+ "@typescript-eslint/eslint-plugin": "^8.41.0",
87
+ "@typescript-eslint/parser": "^8.41.0",
88
+ "eslint": "^9.34.0",
89
+ "eslint-plugin-import": "^2.29.0",
90
+ "eslint-plugin-jsdoc": "^48.0.0",
91
+ "eslint-plugin-prettier": "^5.1.3",
92
+ "husky": "^9.1.7",
93
+ "jasmine": "5.10.0",
94
+ "jasmine-ts": "^0.4.0",
95
+ "prettier": "^3.3.0",
96
+ "typescript": "~5.5.4"
97
+ }
98
+ }