@open-mercato/core 0.4.5-develop-2e9903a57a → 0.4.5-develop-eeccf7adf4
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/package.json +2 -2
- package/dist/modules/auth/__integration__/TC-AUTH-001.spec.js +0 -9
- package/dist/modules/auth/__integration__/TC-AUTH-001.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-002.spec.js +0 -22
- package/dist/modules/auth/__integration__/TC-AUTH-002.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-003.spec.js +0 -21
- package/dist/modules/auth/__integration__/TC-AUTH-003.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-004.spec.js +0 -15
- package/dist/modules/auth/__integration__/TC-AUTH-004.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-005.spec.js +0 -11
- package/dist/modules/auth/__integration__/TC-AUTH-005.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-006.spec.js +0 -11
- package/dist/modules/auth/__integration__/TC-AUTH-006.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-007.spec.js +0 -14
- package/dist/modules/auth/__integration__/TC-AUTH-007.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-008.spec.js +0 -26
- package/dist/modules/auth/__integration__/TC-AUTH-008.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-009.spec.js +0 -16
- package/dist/modules/auth/__integration__/TC-AUTH-009.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-010.spec.js +0 -32
- package/dist/modules/auth/__integration__/TC-AUTH-010.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-011.spec.js +0 -26
- package/dist/modules/auth/__integration__/TC-AUTH-011.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-012.spec.js +0 -30
- package/dist/modules/auth/__integration__/TC-AUTH-012.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-013.spec.js +0 -41
- package/dist/modules/auth/__integration__/TC-AUTH-013.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-014.spec.js +0 -25
- package/dist/modules/auth/__integration__/TC-AUTH-014.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-015.spec.js +0 -20
- package/dist/modules/auth/__integration__/TC-AUTH-015.spec.js.map +0 -7
- package/dist/modules/auth/__integration__/TC-AUTH-016.spec.js +0 -76
- package/dist/modules/auth/__integration__/TC-AUTH-016.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-001.spec.js +0 -20
- package/dist/modules/catalog/__integration__/TC-CAT-001.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-002.spec.js +0 -12
- package/dist/modules/catalog/__integration__/TC-CAT-002.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-003.spec.js +0 -28
- package/dist/modules/catalog/__integration__/TC-CAT-003.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-004.spec.js +0 -33
- package/dist/modules/catalog/__integration__/TC-CAT-004.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-005.spec.js +0 -30
- package/dist/modules/catalog/__integration__/TC-CAT-005.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-006.spec.js +0 -31
- package/dist/modules/catalog/__integration__/TC-CAT-006.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-007.spec.js +0 -31
- package/dist/modules/catalog/__integration__/TC-CAT-007.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-008.spec.js +0 -65
- package/dist/modules/catalog/__integration__/TC-CAT-008.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-009.spec.js +0 -31
- package/dist/modules/catalog/__integration__/TC-CAT-009.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-010.spec.js +0 -28
- package/dist/modules/catalog/__integration__/TC-CAT-010.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-011.spec.js +0 -34
- package/dist/modules/catalog/__integration__/TC-CAT-011.spec.js.map +0 -7
- package/dist/modules/catalog/__integration__/TC-CAT-012.spec.js +0 -27
- package/dist/modules/catalog/__integration__/TC-CAT-012.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-001.spec.js +0 -44
- package/dist/modules/core/__integration__/admin/TC-ADMIN-001.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-002.spec.js +0 -53
- package/dist/modules/core/__integration__/admin/TC-ADMIN-002.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-003.spec.js +0 -26
- package/dist/modules/core/__integration__/admin/TC-ADMIN-003.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-004.spec.js +0 -47
- package/dist/modules/core/__integration__/admin/TC-ADMIN-004.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-005.spec.js +0 -33
- package/dist/modules/core/__integration__/admin/TC-ADMIN-005.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-006.spec.js +0 -30
- package/dist/modules/core/__integration__/admin/TC-ADMIN-006.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-007.spec.js +0 -36
- package/dist/modules/core/__integration__/admin/TC-ADMIN-007.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-008.spec.js +0 -113
- package/dist/modules/core/__integration__/admin/TC-ADMIN-008.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-009.spec.js +0 -25
- package/dist/modules/core/__integration__/admin/TC-ADMIN-009.spec.js.map +0 -7
- package/dist/modules/core/__integration__/admin/TC-ADMIN-010.spec.js +0 -35
- package/dist/modules/core/__integration__/admin/TC-ADMIN-010.spec.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/api.js +0 -64
- package/dist/modules/core/__integration__/helpers/api.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/auth.js +0 -98
- package/dist/modules/core/__integration__/helpers/auth.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/authUi.js +0 -31
- package/dist/modules/core/__integration__/helpers/authUi.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/catalogFixtures.js +0 -49
- package/dist/modules/core/__integration__/helpers/catalogFixtures.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/crmFixtures.js +0 -73
- package/dist/modules/core/__integration__/helpers/crmFixtures.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/salesFixtures.js +0 -63
- package/dist/modules/core/__integration__/helpers/salesFixtures.js.map +0 -7
- package/dist/modules/core/__integration__/helpers/salesUi.js +0 -464
- package/dist/modules/core/__integration__/helpers/salesUi.js.map +0 -7
- package/dist/modules/core/__integration__/integration/TC-INT-001.spec.js +0 -26
- package/dist/modules/core/__integration__/integration/TC-INT-001.spec.js.map +0 -7
- package/dist/modules/core/__integration__/integration/TC-INT-002.spec.js +0 -60
- package/dist/modules/core/__integration__/integration/TC-INT-002.spec.js.map +0 -7
- package/dist/modules/core/__integration__/integration/TC-INT-003.spec.js +0 -36
- package/dist/modules/core/__integration__/integration/TC-INT-003.spec.js.map +0 -7
- package/dist/modules/core/__integration__/integration/TC-INT-004.spec.js +0 -74
- package/dist/modules/core/__integration__/integration/TC-INT-004.spec.js.map +0 -7
- package/dist/modules/core/__integration__/integration/TC-INT-005.spec.js +0 -21
- package/dist/modules/core/__integration__/integration/TC-INT-005.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-001.spec.js +0 -32
- package/dist/modules/customers/__integration__/TC-CRM-001.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-002.spec.js +0 -35
- package/dist/modules/customers/__integration__/TC-CRM-002.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-003.spec.js +0 -40
- package/dist/modules/customers/__integration__/TC-CRM-003.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-004.spec.js +0 -40
- package/dist/modules/customers/__integration__/TC-CRM-004.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-005.spec.js +0 -37
- package/dist/modules/customers/__integration__/TC-CRM-005.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-006.spec.js +0 -42
- package/dist/modules/customers/__integration__/TC-CRM-006.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-007.spec.js +0 -44
- package/dist/modules/customers/__integration__/TC-CRM-007.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-008.spec.js +0 -50
- package/dist/modules/customers/__integration__/TC-CRM-008.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-009.spec.js +0 -33
- package/dist/modules/customers/__integration__/TC-CRM-009.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-010.spec.js +0 -39
- package/dist/modules/customers/__integration__/TC-CRM-010.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-011.spec.js +0 -37
- package/dist/modules/customers/__integration__/TC-CRM-011.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-012.spec.js +0 -38
- package/dist/modules/customers/__integration__/TC-CRM-012.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-013.spec.js +0 -43
- package/dist/modules/customers/__integration__/TC-CRM-013.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-014.spec.js +0 -23
- package/dist/modules/customers/__integration__/TC-CRM-014.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-015.spec.js +0 -63
- package/dist/modules/customers/__integration__/TC-CRM-015.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-016.spec.js +0 -46
- package/dist/modules/customers/__integration__/TC-CRM-016.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-017.spec.js +0 -29
- package/dist/modules/customers/__integration__/TC-CRM-017.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-018.spec.js +0 -52
- package/dist/modules/customers/__integration__/TC-CRM-018.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-019.spec.js +0 -37
- package/dist/modules/customers/__integration__/TC-CRM-019.spec.js.map +0 -7
- package/dist/modules/customers/__integration__/TC-CRM-020.spec.js +0 -65
- package/dist/modules/customers/__integration__/TC-CRM-020.spec.js.map +0 -7
- package/dist/modules/progress/__integration__/TC-PROG-001.spec.js +0 -51
- package/dist/modules/progress/__integration__/TC-PROG-001.spec.js.map +0 -7
- package/dist/modules/resources/__integration__/TC-INT-007.spec.js +0 -88
- package/dist/modules/resources/__integration__/TC-INT-007.spec.js.map +0 -7
- package/dist/modules/resources/__integration__/helpers/resourcesFixtures.js +0 -45
- package/dist/modules/resources/__integration__/helpers/resourcesFixtures.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-001.spec.js +0 -20
- package/dist/modules/sales/__integration__/TC-SALES-001.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-002.spec.js +0 -31
- package/dist/modules/sales/__integration__/TC-SALES-002.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-003.spec.js +0 -13
- package/dist/modules/sales/__integration__/TC-SALES-003.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-004.spec.js +0 -14
- package/dist/modules/sales/__integration__/TC-SALES-004.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-005.spec.js +0 -15
- package/dist/modules/sales/__integration__/TC-SALES-005.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-006.spec.js +0 -20
- package/dist/modules/sales/__integration__/TC-SALES-006.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-007.spec.js +0 -19
- package/dist/modules/sales/__integration__/TC-SALES-007.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-008.spec.js +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-008.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-009.spec.js +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-009.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-010.spec.js +0 -16
- package/dist/modules/sales/__integration__/TC-SALES-010.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-011.spec.js +0 -20
- package/dist/modules/sales/__integration__/TC-SALES-011.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-012.spec.js +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-012.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-013.spec.js +0 -66
- package/dist/modules/sales/__integration__/TC-SALES-013.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-014.spec.js +0 -13
- package/dist/modules/sales/__integration__/TC-SALES-014.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-015.spec.js +0 -13
- package/dist/modules/sales/__integration__/TC-SALES-015.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-016.spec.js +0 -13
- package/dist/modules/sales/__integration__/TC-SALES-016.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-017.spec.js +0 -44
- package/dist/modules/sales/__integration__/TC-SALES-017.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-018.spec.js +0 -18
- package/dist/modules/sales/__integration__/TC-SALES-018.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-019.spec.js +0 -16
- package/dist/modules/sales/__integration__/TC-SALES-019.spec.js.map +0 -7
- package/dist/modules/sales/__integration__/TC-SALES-020.spec.js +0 -75
- package/dist/modules/sales/__integration__/TC-SALES-020.spec.js.map +0 -7
- package/dist/modules/staff/__integration__/TC-INT-006.spec.js +0 -64
- package/dist/modules/staff/__integration__/TC-INT-006.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-001.spec.js +0 -48
- package/dist/modules/translations/__integration__/TC-TRANS-001.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-002.spec.js +0 -94
- package/dist/modules/translations/__integration__/TC-TRANS-002.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-003.spec.js +0 -61
- package/dist/modules/translations/__integration__/TC-TRANS-003.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-004.spec.js +0 -52
- package/dist/modules/translations/__integration__/TC-TRANS-004.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-005.spec.js +0 -106
- package/dist/modules/translations/__integration__/TC-TRANS-005.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-006.spec.js +0 -94
- package/dist/modules/translations/__integration__/TC-TRANS-006.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-007.spec.js +0 -62
- package/dist/modules/translations/__integration__/TC-TRANS-007.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/TC-TRANS-008.spec.js +0 -168
- package/dist/modules/translations/__integration__/TC-TRANS-008.spec.js.map +0 -7
- package/dist/modules/translations/__integration__/helpers/translationFixtures.js +0 -63
- package/dist/modules/translations/__integration__/helpers/translationFixtures.js.map +0 -7
- package/dist/modules/workflows/__integration__/TC-WF-001.spec.js +0 -73
- package/dist/modules/workflows/__integration__/TC-WF-001.spec.js.map +0 -7
- package/src/__tests__/module-decoupling.test.ts +0 -356
- package/src/modules/api_keys/api/__tests__/keys.route.test.ts +0 -244
- package/src/modules/attachments/api/__tests__/attachments.api.test.ts +0 -240
- package/src/modules/attachments/components/__tests__/AttachmentContentPreview.test.tsx +0 -45
- package/src/modules/attachments/data/__tests__/entities-ocr.test.ts +0 -15
- package/src/modules/attachments/lib/__tests__/ocr-config.test.ts +0 -27
- package/src/modules/attachments/lib/__tests__/textExtraction.test.ts +0 -64
- package/src/modules/audit_logs/api/__tests__/access.route.test.ts +0 -118
- package/src/modules/audit_logs/api/__tests__/redo.route.test.ts +0 -131
- package/src/modules/audit_logs/api/__tests__/undo.route.test.ts +0 -103
- package/src/modules/audit_logs/services/__tests__/actionLogService.test.ts +0 -26
- package/src/modules/auth/__integration__/TC-AUTH-001.spec.ts +0 -13
- package/src/modules/auth/__integration__/TC-AUTH-002.spec.ts +0 -30
- package/src/modules/auth/__integration__/TC-AUTH-003.spec.ts +0 -28
- package/src/modules/auth/__integration__/TC-AUTH-004.spec.ts +0 -21
- package/src/modules/auth/__integration__/TC-AUTH-005.spec.ts +0 -17
- package/src/modules/auth/__integration__/TC-AUTH-006.spec.ts +0 -17
- package/src/modules/auth/__integration__/TC-AUTH-007.spec.ts +0 -19
- package/src/modules/auth/__integration__/TC-AUTH-008.spec.ts +0 -31
- package/src/modules/auth/__integration__/TC-AUTH-009.spec.ts +0 -22
- package/src/modules/auth/__integration__/TC-AUTH-010.spec.ts +0 -39
- package/src/modules/auth/__integration__/TC-AUTH-011.spec.ts +0 -35
- package/src/modules/auth/__integration__/TC-AUTH-012.spec.ts +0 -36
- package/src/modules/auth/__integration__/TC-AUTH-013.spec.ts +0 -48
- package/src/modules/auth/__integration__/TC-AUTH-014.spec.ts +0 -31
- package/src/modules/auth/__integration__/TC-AUTH-015.spec.ts +0 -28
- package/src/modules/auth/__integration__/TC-AUTH-016.spec.ts +0 -109
- package/src/modules/auth/__tests__/cli-rotate-encryption.test.ts +0 -97
- package/src/modules/auth/__tests__/cli-setup-acl.test.ts +0 -148
- package/src/modules/auth/api/__tests__/feature-check.test.ts +0 -65
- package/src/modules/auth/api/__tests__/login.test.ts +0 -47
- package/src/modules/auth/commands/__tests__/roles.custom-fields.test.ts +0 -126
- package/src/modules/auth/commands/__tests__/users.custom-fields.test.ts +0 -147
- package/src/modules/auth/lib/__tests__/rateLimitCheck.test.ts +0 -224
- package/src/modules/auth/services/__tests__/authService.test.ts +0 -32
- package/src/modules/auth/services/__tests__/rbacService.test.ts +0 -814
- package/src/modules/business_rules/api/__tests__/execute.route.test.ts +0 -311
- package/src/modules/business_rules/api/__tests__/logs-detail.route.test.ts +0 -181
- package/src/modules/business_rules/api/__tests__/logs.route.test.ts +0 -261
- package/src/modules/business_rules/api/__tests__/rules-detail.route.test.ts +0 -115
- package/src/modules/business_rules/api/__tests__/rules.route.test.ts +0 -746
- package/src/modules/business_rules/api/__tests__/sets-detail.route.test.ts +0 -169
- package/src/modules/business_rules/api/__tests__/sets-members.route.test.ts +0 -367
- package/src/modules/business_rules/api/__tests__/sets.route.test.ts +0 -361
- package/src/modules/business_rules/api/__tests__/test-helpers.ts +0 -42
- package/src/modules/business_rules/components/utils/__tests__/formHelpers.test.ts +0 -69
- package/src/modules/business_rules/data/__tests__/validators.test.ts +0 -637
- package/src/modules/business_rules/lib/__tests__/action-executor.test.ts +0 -728
- package/src/modules/business_rules/lib/__tests__/expression-evaluator.test.ts +0 -592
- package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -805
- package/src/modules/business_rules/lib/__tests__/rule-evaluator.test.ts +0 -436
- package/src/modules/catalog/__integration__/TC-CAT-001.spec.ts +0 -32
- package/src/modules/catalog/__integration__/TC-CAT-002.spec.ts +0 -19
- package/src/modules/catalog/__integration__/TC-CAT-003.spec.ts +0 -39
- package/src/modules/catalog/__integration__/TC-CAT-004.spec.ts +0 -41
- package/src/modules/catalog/__integration__/TC-CAT-005.spec.ts +0 -37
- package/src/modules/catalog/__integration__/TC-CAT-006.spec.ts +0 -40
- package/src/modules/catalog/__integration__/TC-CAT-007.spec.ts +0 -37
- package/src/modules/catalog/__integration__/TC-CAT-008.spec.ts +0 -76
- package/src/modules/catalog/__integration__/TC-CAT-009.spec.ts +0 -39
- package/src/modules/catalog/__integration__/TC-CAT-010.spec.ts +0 -36
- package/src/modules/catalog/__integration__/TC-CAT-011.spec.ts +0 -44
- package/src/modules/catalog/__integration__/TC-CAT-012.spec.ts +0 -35
- package/src/modules/catalog/api/__tests__/offers.route.test.ts +0 -161
- package/src/modules/catalog/api/__tests__/prices.route.test.ts +0 -39
- package/src/modules/catalog/api/__tests__/products.route.test.ts +0 -91
- package/src/modules/catalog/api/__tests__/utils.test.ts +0 -36
- package/src/modules/catalog/api/__tests__/variants.route.test.ts +0 -44
- package/src/modules/catalog/backend/catalog/products/__tests__/ProductsDataTable.test.tsx +0 -172
- package/src/modules/catalog/commands/__tests__/products.delete.test.ts +0 -146
- package/src/modules/catalog/commands/__tests__/products.update.test.ts +0 -142
- package/src/modules/catalog/commands/__tests__/registration.test.ts +0 -54
- package/src/modules/catalog/commands/__tests__/shared.test.ts +0 -129
- package/src/modules/catalog/components/__tests__/catalogComponentsRender.test.tsx +0 -373
- package/src/modules/catalog/components/products/__tests__/ProductImageCell.test.tsx +0 -51
- package/src/modules/catalog/components/products/__tests__/productForm.test.ts +0 -32
- package/src/modules/catalog/lib/__tests__/pricing.test.ts +0 -150
- package/src/modules/catalog/services/__tests__/catalogPricingService.test.ts +0 -21
- package/src/modules/configs/components/__tests__/CachePanel.test.tsx +0 -134
- package/src/modules/configs/components/__tests__/SystemStatusPanel.test.tsx +0 -93
- package/src/modules/configs/lib/__tests__/system-status.test.ts +0 -55
- package/src/modules/configs/lib/__tests__/upgrade-actions.test.ts +0 -135
- package/src/modules/core/__integration__/admin/TC-ADMIN-001.spec.ts +0 -70
- package/src/modules/core/__integration__/admin/TC-ADMIN-002.spec.ts +0 -83
- package/src/modules/core/__integration__/admin/TC-ADMIN-003.spec.ts +0 -50
- package/src/modules/core/__integration__/admin/TC-ADMIN-004.spec.ts +0 -77
- package/src/modules/core/__integration__/admin/TC-ADMIN-005.spec.ts +0 -49
- package/src/modules/core/__integration__/admin/TC-ADMIN-006.spec.ts +0 -59
- package/src/modules/core/__integration__/admin/TC-ADMIN-007.spec.ts +0 -68
- package/src/modules/core/__integration__/admin/TC-ADMIN-008.spec.ts +0 -127
- package/src/modules/core/__integration__/admin/TC-ADMIN-009.spec.ts +0 -48
- package/src/modules/core/__integration__/admin/TC-ADMIN-010.spec.ts +0 -57
- package/src/modules/core/__integration__/helpers/api.ts +0 -84
- package/src/modules/core/__integration__/helpers/auth.ts +0 -110
- package/src/modules/core/__integration__/helpers/authUi.ts +0 -33
- package/src/modules/core/__integration__/helpers/catalogFixtures.ts +0 -73
- package/src/modules/core/__integration__/helpers/crmFixtures.ts +0 -101
- package/src/modules/core/__integration__/helpers/salesFixtures.ts +0 -89
- package/src/modules/core/__integration__/helpers/salesUi.ts +0 -528
- package/src/modules/core/__integration__/integration/TC-INT-001.spec.ts +0 -34
- package/src/modules/core/__integration__/integration/TC-INT-002.spec.ts +0 -74
- package/src/modules/core/__integration__/integration/TC-INT-003.spec.ts +0 -43
- package/src/modules/core/__integration__/integration/TC-INT-004.spec.ts +0 -82
- package/src/modules/core/__integration__/integration/TC-INT-005.spec.ts +0 -29
- package/src/modules/currencies/backend/exchange-rates/__tests__/formatDateTimeLocal.test.ts +0 -78
- package/src/modules/currencies/data/__tests__/validators.test.ts +0 -100
- package/src/modules/currencies/services/__tests__/exchangeRateService.test.ts +0 -666
- package/src/modules/currencies/services/__tests__/rateFetchingService.basic.test.ts +0 -398
- package/src/modules/currencies/services/__tests__/rateFetchingService.errors.test.ts +0 -296
- package/src/modules/currencies/services/__tests__/rateFetchingService.providers.test.ts +0 -350
- package/src/modules/currencies/services/__tests__/rateFetchingService.setup.ts +0 -188
- package/src/modules/customers/__integration__/TC-CRM-001.spec.ts +0 -42
- package/src/modules/customers/__integration__/TC-CRM-002.spec.ts +0 -47
- package/src/modules/customers/__integration__/TC-CRM-003.spec.ts +0 -55
- package/src/modules/customers/__integration__/TC-CRM-004.spec.ts +0 -57
- package/src/modules/customers/__integration__/TC-CRM-005.spec.ts +0 -50
- package/src/modules/customers/__integration__/TC-CRM-006.spec.ts +0 -60
- package/src/modules/customers/__integration__/TC-CRM-007.spec.ts +0 -57
- package/src/modules/customers/__integration__/TC-CRM-008.spec.ts +0 -62
- package/src/modules/customers/__integration__/TC-CRM-009.spec.ts +0 -46
- package/src/modules/customers/__integration__/TC-CRM-010.spec.ts +0 -49
- package/src/modules/customers/__integration__/TC-CRM-011.spec.ts +0 -47
- package/src/modules/customers/__integration__/TC-CRM-012.spec.ts +0 -49
- package/src/modules/customers/__integration__/TC-CRM-013.spec.ts +0 -61
- package/src/modules/customers/__integration__/TC-CRM-014.spec.ts +0 -31
- package/src/modules/customers/__integration__/TC-CRM-015.spec.ts +0 -89
- package/src/modules/customers/__integration__/TC-CRM-016.spec.ts +0 -55
- package/src/modules/customers/__integration__/TC-CRM-017.spec.ts +0 -37
- package/src/modules/customers/__integration__/TC-CRM-018.spec.ts +0 -62
- package/src/modules/customers/__integration__/TC-CRM-019.spec.ts +0 -44
- package/src/modules/customers/__integration__/TC-CRM-020.spec.ts +0 -73
- package/src/modules/customers/api/__tests__/utils.test.ts +0 -61
- package/src/modules/customers/api/dashboard/widgets/new-deals/__tests__/route.test.ts +0 -54
- package/src/modules/customers/commands/__tests__/shared.test.ts +0 -263
- package/src/modules/customers/commands/__tests__/undo.custom-fields.test.ts +0 -1184
- package/src/modules/customers/components/detail/__tests__/ActivityForm.validation.test.ts +0 -37
- package/src/modules/customers/components/detail/__tests__/DealForm.validation.test.ts +0 -45
- package/src/modules/customers/components/detail/__tests__/InlineEditors.test.tsx +0 -166
- package/src/modules/customers/components/detail/__tests__/TaskForm.submit.test.ts +0 -21
- package/src/modules/customers/components/detail/hooks/__tests__/useCustomerDictionary.test.ts +0 -97
- package/src/modules/customers/lib/__tests__/customFieldRouting.test.ts +0 -107
- package/src/modules/customers/utils/__tests__/addressFormat.test.ts +0 -105
- package/src/modules/customers/utils/__tests__/phoneDuplicates.test.ts +0 -98
- package/src/modules/dashboards/__tests__/widgets.test.ts +0 -70
- package/src/modules/dashboards/lib/__tests__/aggregations.test.ts +0 -328
- package/src/modules/dashboards/lib/__tests__/formatters.test.ts +0 -128
- package/src/modules/directory/backend/directory/organizations/__tests__/create-submit.test.ts +0 -46
- package/src/modules/directory/backend/directory/organizations/__tests__/edit-submit.test.ts +0 -49
- package/src/modules/directory/components/__tests__/OrganizationSelect.test.tsx +0 -71
- package/src/modules/directory/components/__tests__/TenantSelect.test.tsx +0 -75
- package/src/modules/entities/__tests__/cli-decrypt-database.test.ts +0 -534
- package/src/modules/entities/__tests__/cli-rotate-encryption.test.ts +0 -123
- package/src/modules/entities/api/__tests__/encryption.api.test.ts +0 -57
- package/src/modules/entities/api/__tests__/records.get.custom-entity.test.ts +0 -43
- package/src/modules/entities/api/__tests__/records.validation.test.ts +0 -53
- package/src/modules/entities/backend/entities/user/__tests__/create-entity-submit.test.ts +0 -47
- package/src/modules/entities/backend/entities/user/__tests__/records-submit.test.ts +0 -104
- package/src/modules/feature_toggles/commands/__tests__/global.test.ts +0 -325
- package/src/modules/feature_toggles/commands/__tests__/overrides.test.ts +0 -186
- package/src/modules/feature_toggles/lib/__tests__/feature-flag-check.test.ts +0 -365
- package/src/modules/feature_toggles/lib/__tests__/queries.test.ts +0 -130
- package/src/modules/inbox_ops/api/emails/[id]/reprocess/__tests__/route.test.ts +0 -194
- package/src/modules/inbox_ops/api/proposals/[id]/__tests__/route.test.ts +0 -124
- package/src/modules/inbox_ops/api/proposals/[id]/accept-all/__tests__/route.test.ts +0 -154
- package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/__tests__/route.test.ts +0 -200
- package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/accept/__tests__/route.test.ts +0 -261
- package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/reject/__tests__/route.test.ts +0 -201
- package/src/modules/inbox_ops/api/proposals/[id]/reject/__tests__/route.test.ts +0 -123
- package/src/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/__tests__/route.test.ts +0 -232
- package/src/modules/inbox_ops/api/proposals/[id]/translate/__tests__/route.test.ts +0 -173
- package/src/modules/inbox_ops/api/proposals/__tests__/route.test.ts +0 -185
- package/src/modules/inbox_ops/api/webhook/__tests__/inbound.test.ts +0 -317
- package/src/modules/inbox_ops/data/__tests__/validators.test.ts +0 -463
- package/src/modules/inbox_ops/lib/__tests__/catalogLookup.test.ts +0 -143
- package/src/modules/inbox_ops/lib/__tests__/contactMatcher.test.ts +0 -158
- package/src/modules/inbox_ops/lib/__tests__/emailParser.test.ts +0 -191
- package/src/modules/inbox_ops/lib/__tests__/executionEngine.test.ts +0 -1419
- package/src/modules/inbox_ops/lib/__tests__/extractionPrompt.test.ts +0 -151
- package/src/modules/inbox_ops/lib/__tests__/priceValidator.test.ts +0 -259
- package/src/modules/inbox_ops/lib/__tests__/translationProvider.test.ts +0 -99
- package/src/modules/inbox_ops/subscribers/__tests__/extractionWorker.test.ts +0 -803
- package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -285
- package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
- package/src/modules/notifications/__tests__/notificationService.test.ts +0 -248
- package/src/modules/planner/__tests__/availabilityMerge.test.ts +0 -99
- package/src/modules/planner/__tests__/plannerAvailabilityService.test.ts +0 -89
- package/src/modules/planner/data/__tests__/validators.test.ts +0 -78
- package/src/modules/progress/__integration__/TC-PROG-001.spec.ts +0 -67
- package/src/modules/progress/__tests__/progressService.test.ts +0 -377
- package/src/modules/query_index/__tests__/hybrid-engine.test.ts +0 -365
- package/src/modules/query_index/__tests__/indexer.test.ts +0 -175
- package/src/modules/resources/__integration__/TC-INT-007.spec.ts +0 -110
- package/src/modules/resources/__integration__/helpers/resourcesFixtures.ts +0 -50
- package/src/modules/resources/data/__tests__/validators.test.ts +0 -65
- package/src/modules/sales/__integration__/TC-SALES-001.spec.ts +0 -26
- package/src/modules/sales/__integration__/TC-SALES-002.spec.ts +0 -38
- package/src/modules/sales/__integration__/TC-SALES-003.spec.ts +0 -18
- package/src/modules/sales/__integration__/TC-SALES-004.spec.ts +0 -19
- package/src/modules/sales/__integration__/TC-SALES-005.spec.ts +0 -21
- package/src/modules/sales/__integration__/TC-SALES-006.spec.ts +0 -26
- package/src/modules/sales/__integration__/TC-SALES-007.spec.ts +0 -23
- package/src/modules/sales/__integration__/TC-SALES-008.spec.ts +0 -11
- package/src/modules/sales/__integration__/TC-SALES-009.spec.ts +0 -12
- package/src/modules/sales/__integration__/TC-SALES-010.spec.ts +0 -20
- package/src/modules/sales/__integration__/TC-SALES-011.spec.ts +0 -26
- package/src/modules/sales/__integration__/TC-SALES-012.spec.ts +0 -12
- package/src/modules/sales/__integration__/TC-SALES-013.spec.ts +0 -73
- package/src/modules/sales/__integration__/TC-SALES-014.spec.ts +0 -17
- package/src/modules/sales/__integration__/TC-SALES-015.spec.ts +0 -17
- package/src/modules/sales/__integration__/TC-SALES-016.spec.ts +0 -17
- package/src/modules/sales/__integration__/TC-SALES-017.spec.ts +0 -60
- package/src/modules/sales/__integration__/TC-SALES-018.spec.ts +0 -25
- package/src/modules/sales/__integration__/TC-SALES-019.spec.ts +0 -22
- package/src/modules/sales/__integration__/TC-SALES-020.spec.ts +0 -107
- package/src/modules/sales/api/__tests__/channels.route.test.ts +0 -50
- package/src/modules/sales/api/__tests__/document-history.test.ts +0 -146
- package/src/modules/sales/api/__tests__/documents.factory.test.ts +0 -98
- package/src/modules/sales/api/__tests__/documents.routes.test.ts +0 -149
- package/src/modules/sales/api/__tests__/quotes.acceptance.test.ts +0 -209
- package/src/modules/sales/api/__tests__/timeline.test.tsx +0 -165
- package/src/modules/sales/api/dashboard/widgets/new-orders/__tests__/route.test.ts +0 -112
- package/src/modules/sales/api/dashboard/widgets/new-quotes/__tests__/route.test.ts +0 -116
- package/src/modules/sales/commands/__tests__/documents.cache.test.ts +0 -126
- package/src/modules/sales/commands/__tests__/documents.undo.test.ts +0 -170
- package/src/modules/sales/commands/__tests__/registration.test.ts +0 -141
- package/src/modules/sales/components/__tests__/salesComponentsRender.test.tsx +0 -456
- package/src/modules/sales/lib/__tests__/calculations.test.ts +0 -210
- package/src/modules/sales/services/__tests__/salesCalculationService.test.ts +0 -181
- package/src/modules/sales/services/__tests__/taxCalculationService.test.ts +0 -79
- package/src/modules/sales/widgets/dashboard/new-orders/__tests__/config.test.ts +0 -47
- package/src/modules/sales/widgets/dashboard/new-quotes/__tests__/config.test.ts +0 -47
- package/src/modules/staff/__integration__/TC-INT-006.spec.ts +0 -71
- package/src/modules/staff/data/__tests__/validators.test.ts +0 -60
- package/src/modules/translations/__integration__/TC-TRANS-001.spec.ts +0 -57
- package/src/modules/translations/__integration__/TC-TRANS-002.spec.ts +0 -114
- package/src/modules/translations/__integration__/TC-TRANS-003.spec.ts +0 -71
- package/src/modules/translations/__integration__/TC-TRANS-004.spec.ts +0 -66
- package/src/modules/translations/__integration__/TC-TRANS-005.spec.ts +0 -135
- package/src/modules/translations/__integration__/TC-TRANS-006.spec.ts +0 -113
- package/src/modules/translations/__integration__/TC-TRANS-007.spec.ts +0 -80
- package/src/modules/translations/__integration__/TC-TRANS-008.spec.ts +0 -209
- package/src/modules/translations/__integration__/helpers/translationFixtures.ts +0 -95
- package/src/modules/translations/api/__tests__/locales.test.ts +0 -67
- package/src/modules/translations/data/__tests__/validators.test.ts +0 -143
- package/src/modules/translations/lib/__tests__/extract-record-id.test.ts +0 -75
- package/src/modules/translations/lib/__tests__/helpers.test.ts +0 -215
- package/src/modules/translations/lib/__tests__/locale.test.ts +0 -115
- package/src/modules/translations/lib/__tests__/resolve-field-list.test.ts +0 -176
- package/src/modules/translations/lib/__tests__/translatable-fields.test.ts +0 -79
- package/src/modules/translations/widgets/__tests__/injection-table.test.ts +0 -83
- package/src/modules/workflows/__integration__/TC-WF-001.spec.ts +0 -114
- package/src/modules/workflows/api/__tests__/definitions.route.test.ts +0 -762
- package/src/modules/workflows/api/__tests__/instances.route.test.ts +0 -869
- package/src/modules/workflows/data/__tests__/validators.test.ts +0 -707
- package/src/modules/workflows/lib/__tests__/activity-executor.test.ts +0 -1230
- package/src/modules/workflows/lib/__tests__/call-api.test.ts +0 -421
- package/src/modules/workflows/lib/__tests__/compensation.test.ts +0 -713
- package/src/modules/workflows/lib/__tests__/event-logger.test.ts +0 -615
- package/src/modules/workflows/lib/__tests__/integration.test.ts +0 -693
- package/src/modules/workflows/lib/__tests__/signals.test.ts +0 -566
- package/src/modules/workflows/lib/__tests__/step-handler.test.ts +0 -670
- package/src/modules/workflows/lib/__tests__/sub-workflow.test.ts +0 -934
- package/src/modules/workflows/lib/__tests__/transition-handler.test.ts +0 -925
- package/src/modules/workflows/lib/__tests__/workflow-executor.test.ts +0 -684
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
3
|
-
import { createProductFixture, deleteCatalogProductIfExists } from "@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures";
|
|
4
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
5
|
-
import { deleteTranslationIfExists, getLocales, setLocales } from "./helpers/translationFixtures.js";
|
|
6
|
-
const ENTITY_TYPE = "catalog:catalog_product";
|
|
7
|
-
async function fillCombobox(page, placeholder, value) {
|
|
8
|
-
const input = page.getByPlaceholder(placeholder);
|
|
9
|
-
await expect(input).toBeEnabled({ timeout: 1e4 });
|
|
10
|
-
await input.click();
|
|
11
|
-
await input.fill(value);
|
|
12
|
-
await input.press("Enter");
|
|
13
|
-
await input.press("Tab");
|
|
14
|
-
await page.waitForTimeout(300);
|
|
15
|
-
}
|
|
16
|
-
test.describe("TC-TRANS-005: Translation Manager Standalone", () => {
|
|
17
|
-
test("should select entity type and record, showing the field table", async ({ page, request }) => {
|
|
18
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
19
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
20
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
21
|
-
const productTitle = `QA TC-TRANS-005-1 ${Date.now()}`;
|
|
22
|
-
const sku = `QA-TRANS-005-1-${Date.now()}`;
|
|
23
|
-
let productId = null;
|
|
24
|
-
try {
|
|
25
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
26
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
27
|
-
await login(page, "superadmin");
|
|
28
|
-
await page.goto("/backend/config/translations");
|
|
29
|
-
await expect(page.getByRole("heading", { name: "Translations" })).toBeVisible();
|
|
30
|
-
await fillCombobox(page, "Select an entity", ENTITY_TYPE);
|
|
31
|
-
await fillCombobox(page, "Search records...", productId);
|
|
32
|
-
await expect(page.getByText("Base value")).toBeVisible();
|
|
33
|
-
} finally {
|
|
34
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
35
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
36
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
test("should enter and save a translation via standalone manager", async ({ page, request }) => {
|
|
41
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
42
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
43
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
44
|
-
const productTitle = `QA TC-TRANS-005-2 ${Date.now()}`;
|
|
45
|
-
const sku = `QA-TRANS-005-2-${Date.now()}`;
|
|
46
|
-
let productId = null;
|
|
47
|
-
try {
|
|
48
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
49
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
50
|
-
await login(page, "superadmin");
|
|
51
|
-
await page.goto("/backend/config/translations");
|
|
52
|
-
await fillCombobox(page, "Select an entity", ENTITY_TYPE);
|
|
53
|
-
await fillCombobox(page, "Search records...", productId);
|
|
54
|
-
const managerCard = page.locator(".bg-card").filter({
|
|
55
|
-
has: page.getByRole("button", { name: "Save translations" })
|
|
56
|
-
});
|
|
57
|
-
const deTab = managerCard.getByRole("button", { name: "DE" });
|
|
58
|
-
await deTab.click();
|
|
59
|
-
const titleInput = page.locator("table input").first();
|
|
60
|
-
await titleInput.fill("Deutscher Titel QA");
|
|
61
|
-
await page.getByRole("button", { name: "Save translations" }).click();
|
|
62
|
-
await expect(page.getByText("Translations saved").first()).toBeVisible();
|
|
63
|
-
const getResponse = await apiRequest(request, "GET", `/api/translations/${ENTITY_TYPE}/${productId}`, { token: saToken });
|
|
64
|
-
expect(getResponse.ok()).toBeTruthy();
|
|
65
|
-
const body = await getResponse.json();
|
|
66
|
-
expect(body.translations.de.title).toBe("Deutscher Titel QA");
|
|
67
|
-
} finally {
|
|
68
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
69
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
70
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
test("should persist translations after page reload", async ({ page, request }) => {
|
|
75
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
76
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
77
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
78
|
-
const productTitle = `QA TC-TRANS-005-3 ${Date.now()}`;
|
|
79
|
-
const sku = `QA-TRANS-005-3-${Date.now()}`;
|
|
80
|
-
let productId = null;
|
|
81
|
-
try {
|
|
82
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
83
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
84
|
-
await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
85
|
-
token: saToken,
|
|
86
|
-
data: { de: { title: "Persistenter Titel" } }
|
|
87
|
-
});
|
|
88
|
-
await login(page, "superadmin");
|
|
89
|
-
await page.goto("/backend/config/translations");
|
|
90
|
-
await fillCombobox(page, "Select an entity", ENTITY_TYPE);
|
|
91
|
-
await fillCombobox(page, "Search records...", productId);
|
|
92
|
-
const managerCard = page.locator(".bg-card").filter({
|
|
93
|
-
has: page.getByRole("button", { name: "Save translations" })
|
|
94
|
-
});
|
|
95
|
-
const deTab = managerCard.getByRole("button", { name: "DE" });
|
|
96
|
-
await deTab.click();
|
|
97
|
-
await expect(page.locator("table input").first()).toHaveValue("Persistenter Titel");
|
|
98
|
-
} finally {
|
|
99
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
100
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
101
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
//# sourceMappingURL=TC-TRANS-005.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/translations/__integration__/TC-TRANS-005.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures'\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth'\nimport { deleteTranslationIfExists, getLocales, setLocales } from './helpers/translationFixtures'\n\nconst ENTITY_TYPE = 'catalog:catalog_product'\n\n/**\n * Helper: set a value directly into a ComboboxInput using allowCustomValues.\n * Types the value and presses Enter to confirm \u2014 avoids flaky dropdown clicks\n * and search index lag for async suggestions.\n */\nasync function fillCombobox(page: import('@playwright/test').Page, placeholder: string, value: string) {\n const input = page.getByPlaceholder(placeholder)\n await expect(input).toBeEnabled({ timeout: 10_000 })\n await input.click()\n await input.fill(value)\n await input.press('Enter')\n // Move focus away so the ComboboxInput's onBlur handler fires and settles\n // (onBlur has a 200ms timeout that calls confirmSelection, which may reset hasUserEdited)\n await input.press('Tab')\n await page.waitForTimeout(300)\n}\n\n/**\n * TC-TRANS-005: Translation Manager Standalone\n * Covers selecting entity/record, entering translations, saving, and verifying persistence.\n */\ntest.describe('TC-TRANS-005: Translation Manager Standalone', () => {\n test('should select entity type and record, showing the field table', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const originalLocales = await getLocales(request, adminToken)\n const productTitle = `QA TC-TRANS-005-1 ${Date.now()}`\n const sku = `QA-TRANS-005-1-${Date.now()}`\n let productId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await login(page, 'superadmin')\n await page.goto('/backend/config/translations')\n await expect(page.getByRole('heading', { name: 'Translations' })).toBeVisible()\n\n await fillCombobox(page, 'Select an entity', ENTITY_TYPE)\n await fillCombobox(page, 'Search records...', productId!)\n\n await expect(page.getByText('Base value')).toBeVisible()\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n\n test('should enter and save a translation via standalone manager', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const originalLocales = await getLocales(request, adminToken)\n const productTitle = `QA TC-TRANS-005-2 ${Date.now()}`\n const sku = `QA-TRANS-005-2-${Date.now()}`\n let productId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await login(page, 'superadmin')\n await page.goto('/backend/config/translations')\n\n await fillCombobox(page, 'Select an entity', ENTITY_TYPE)\n await fillCombobox(page, 'Search records...', productId!)\n\n const managerCard = page.locator('.bg-card').filter({\n has: page.getByRole('button', { name: 'Save translations' }),\n })\n const deTab = managerCard.getByRole('button', { name: 'DE' })\n await deTab.click()\n\n const titleInput = page.locator('table input').first()\n await titleInput.fill('Deutscher Titel QA')\n\n await page.getByRole('button', { name: 'Save translations' }).click()\n await expect(page.getByText('Translations saved').first()).toBeVisible()\n\n const getResponse = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: saToken })\n expect(getResponse.ok()).toBeTruthy()\n const body = (await getResponse.json()) as { translations: Record<string, Record<string, string>> }\n expect(body.translations.de.title).toBe('Deutscher Titel QA')\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n\n test('should persist translations after page reload', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const originalLocales = await getLocales(request, adminToken)\n const productTitle = `QA TC-TRANS-005-3 ${Date.now()}`\n const sku = `QA-TRANS-005-3-${Date.now()}`\n let productId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: saToken,\n data: { de: { title: 'Persistenter Titel' } },\n })\n\n await login(page, 'superadmin')\n await page.goto('/backend/config/translations')\n\n await fillCombobox(page, 'Select an entity', ENTITY_TYPE)\n await fillCombobox(page, 'Search records...', productId!)\n\n const managerCard = page.locator('.bg-card').filter({\n has: page.getByRole('button', { name: 'Save translations' }),\n })\n const deTab = managerCard.getByRole('button', { name: 'DE' })\n await deTab.click()\n\n await expect(page.locator('table input').first()).toHaveValue('Persistenter Titel')\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
3
|
-
import { createProductFixture, deleteCatalogProductIfExists } from "@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures";
|
|
4
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
5
|
-
import { deleteTranslationIfExists, getLocales, setLocales } from "./helpers/translationFixtures.js";
|
|
6
|
-
const ENTITY_TYPE = "catalog:catalog_product";
|
|
7
|
-
test.describe("TC-TRANS-006: Embedded Widget on Product Detail", () => {
|
|
8
|
-
test.use({ actionTimeout: 3e4 });
|
|
9
|
-
test("should show translation widget on product edit page", async ({ page, request }) => {
|
|
10
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
11
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
12
|
-
const productTitle = `QA TC-TRANS-006-1 ${Date.now()}`;
|
|
13
|
-
const sku = `QA-TRANS-006-1-${Date.now()}`;
|
|
14
|
-
let productId = null;
|
|
15
|
-
try {
|
|
16
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
17
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
18
|
-
await login(page, "superadmin");
|
|
19
|
-
await page.goto(`/backend/catalog/products/${productId}`);
|
|
20
|
-
await expect(page.getByRole("link", { name: /Translation manager/ })).toBeVisible();
|
|
21
|
-
await expect(page.getByRole("button", { name: "Save translations" })).toBeVisible();
|
|
22
|
-
} finally {
|
|
23
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
24
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
});
|
|
28
|
-
test("should enter and save a translation in the embedded widget", async ({ page, request }) => {
|
|
29
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
30
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
31
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
32
|
-
const productTitle = `QA TC-TRANS-006-2 ${Date.now()}`;
|
|
33
|
-
const sku = `QA-TRANS-006-2-${Date.now()}`;
|
|
34
|
-
let productId = null;
|
|
35
|
-
try {
|
|
36
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
37
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
38
|
-
await login(page, "superadmin");
|
|
39
|
-
await page.goto(`/backend/catalog/products/${productId}`);
|
|
40
|
-
const widgetSection = page.locator("div").filter({
|
|
41
|
-
has: page.getByRole("link", { name: /Translation manager/ })
|
|
42
|
-
}).filter({
|
|
43
|
-
has: page.getByRole("button", { name: "Save translations" })
|
|
44
|
-
}).last();
|
|
45
|
-
await expect(widgetSection).toBeVisible();
|
|
46
|
-
const deTab = widgetSection.getByRole("button", { name: "DE" });
|
|
47
|
-
await deTab.click();
|
|
48
|
-
const translationInput = widgetSection.locator("table input").first();
|
|
49
|
-
await translationInput.fill("Widget Titel QA");
|
|
50
|
-
await widgetSection.getByRole("button", { name: "Save translations" }).click();
|
|
51
|
-
await expect(page.getByText("Translations saved").first()).toBeVisible();
|
|
52
|
-
} finally {
|
|
53
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
54
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
55
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
});
|
|
59
|
-
test("should verify widget-saved translation via API", async ({ page, request }) => {
|
|
60
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
61
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
62
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
63
|
-
const productTitle = `QA TC-TRANS-006-3 ${Date.now()}`;
|
|
64
|
-
const sku = `QA-TRANS-006-3-${Date.now()}`;
|
|
65
|
-
let productId = null;
|
|
66
|
-
try {
|
|
67
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
68
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
69
|
-
await login(page, "superadmin");
|
|
70
|
-
await page.goto(`/backend/catalog/products/${productId}`);
|
|
71
|
-
const widgetSection = page.locator("div").filter({
|
|
72
|
-
has: page.getByRole("link", { name: /Translation manager/ })
|
|
73
|
-
}).filter({
|
|
74
|
-
has: page.getByRole("button", { name: "Save translations" })
|
|
75
|
-
}).last();
|
|
76
|
-
const deTab = widgetSection.getByRole("button", { name: "DE" });
|
|
77
|
-
await deTab.click();
|
|
78
|
-
const translationInput = widgetSection.locator("table input").first();
|
|
79
|
-
await translationInput.fill("API Verifiziert QA");
|
|
80
|
-
await widgetSection.getByRole("button", { name: "Save translations" }).click();
|
|
81
|
-
await expect(page.getByText("Translations saved").first()).toBeVisible();
|
|
82
|
-
const getResponse = await apiRequest(request, "GET", `/api/translations/${ENTITY_TYPE}/${productId}`, { token: saToken });
|
|
83
|
-
expect(getResponse.ok()).toBeTruthy();
|
|
84
|
-
const body = await getResponse.json();
|
|
85
|
-
expect(body.translations.de.title).toBe("API Verifiziert QA");
|
|
86
|
-
} finally {
|
|
87
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
88
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
89
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
});
|
|
94
|
-
//# sourceMappingURL=TC-TRANS-006.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/translations/__integration__/TC-TRANS-006.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures'\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth'\nimport { deleteTranslationIfExists, getLocales, setLocales } from './helpers/translationFixtures'\n\nconst ENTITY_TYPE = 'catalog:catalog_product'\n\n/**\n * TC-TRANS-006: Embedded Widget on Product Detail\n * Covers the translation widget injected on the catalog product edit page.\n */\ntest.describe('TC-TRANS-006: Embedded Widget on Product Detail', () => {\n test.use({ actionTimeout: 30_000 })\n test('should show translation widget on product edit page', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const originalLocales = await getLocales(request, adminToken)\n const productTitle = `QA TC-TRANS-006-1 ${Date.now()}`\n const sku = `QA-TRANS-006-1-${Date.now()}`\n let productId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await login(page, 'superadmin')\n await page.goto(`/backend/catalog/products/${productId}`)\n\n await expect(page.getByRole('link', { name: /Translation manager/ })).toBeVisible()\n await expect(page.getByRole('button', { name: 'Save translations' })).toBeVisible()\n } finally {\n await deleteCatalogProductIfExists(request, adminToken, productId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n\n test('should enter and save a translation in the embedded widget', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const originalLocales = await getLocales(request, adminToken)\n const productTitle = `QA TC-TRANS-006-2 ${Date.now()}`\n const sku = `QA-TRANS-006-2-${Date.now()}`\n let productId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await login(page, 'superadmin')\n await page.goto(`/backend/catalog/products/${productId}`)\n\n const widgetSection = page.locator('div').filter({\n has: page.getByRole('link', { name: /Translation manager/ }),\n }).filter({\n has: page.getByRole('button', { name: 'Save translations' }),\n }).last()\n await expect(widgetSection).toBeVisible()\n\n const deTab = widgetSection.getByRole('button', { name: 'DE' })\n await deTab.click()\n\n const translationInput = widgetSection.locator('table input').first()\n await translationInput.fill('Widget Titel QA')\n\n await widgetSection.getByRole('button', { name: 'Save translations' }).click()\n await expect(page.getByText('Translations saved').first()).toBeVisible()\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n\n test('should verify widget-saved translation via API', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const originalLocales = await getLocales(request, adminToken)\n const productTitle = `QA TC-TRANS-006-3 ${Date.now()}`\n const sku = `QA-TRANS-006-3-${Date.now()}`\n let productId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await login(page, 'superadmin')\n await page.goto(`/backend/catalog/products/${productId}`)\n\n const widgetSection = page.locator('div').filter({\n has: page.getByRole('link', { name: /Translation manager/ }),\n }).filter({\n has: page.getByRole('button', { name: 'Save translations' }),\n }).last()\n const deTab = widgetSection.getByRole('button', { name: 'DE' })\n await deTab.click()\n\n const translationInput = widgetSection.locator('table input').first()\n await translationInput.fill('API Verifiziert QA')\n\n await widgetSection.getByRole('button', { name: 'Save translations' }).click()\n await expect(page.getByText('Translations saved').first()).toBeVisible()\n\n const getResponse = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: saToken })\n expect(getResponse.ok()).toBeTruthy()\n const body = (await getResponse.json()) as { translations: Record<string, Record<string, string>> }\n expect(body.translations.de.title).toBe('API Verifiziert QA')\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
3
|
-
import { createCategoryFixture, deleteCatalogCategoryIfExists } from "@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures";
|
|
4
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
5
|
-
import { deleteTranslationIfExists, getLocales, setLocales } from "./helpers/translationFixtures.js";
|
|
6
|
-
const ENTITY_TYPE = "catalog:catalog_product_category";
|
|
7
|
-
test.describe("TC-TRANS-007: Dynamic Widget Injection on Category Edit", () => {
|
|
8
|
-
test.use({ actionTimeout: 3e4 });
|
|
9
|
-
test("should show translation widget on category edit page", async ({ page, request }) => {
|
|
10
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
11
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
12
|
-
const categoryName = `QA TC-TRANS-007-1 ${Date.now()}`;
|
|
13
|
-
let categoryId = null;
|
|
14
|
-
try {
|
|
15
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
16
|
-
categoryId = await createCategoryFixture(request, adminToken, { name: categoryName });
|
|
17
|
-
await login(page, "superadmin");
|
|
18
|
-
await page.goto(`/backend/catalog/categories/${categoryId}/edit`);
|
|
19
|
-
await expect(page.getByRole("link", { name: /Translation manager/ })).toBeVisible();
|
|
20
|
-
await expect(page.getByRole("button", { name: "Save translations" })).toBeVisible();
|
|
21
|
-
} finally {
|
|
22
|
-
await deleteCatalogCategoryIfExists(request, adminToken, categoryId);
|
|
23
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
test("should save a translation via the category widget and verify via API", async ({ page, request }) => {
|
|
28
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
29
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
30
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
31
|
-
const categoryName = `QA TC-TRANS-007-2 ${Date.now()}`;
|
|
32
|
-
let categoryId = null;
|
|
33
|
-
try {
|
|
34
|
-
await setLocales(request, adminToken, [.../* @__PURE__ */ new Set([...originalLocales, "de"])]);
|
|
35
|
-
categoryId = await createCategoryFixture(request, adminToken, { name: categoryName });
|
|
36
|
-
await login(page, "superadmin");
|
|
37
|
-
await page.goto(`/backend/catalog/categories/${categoryId}/edit`);
|
|
38
|
-
const widgetSection = page.locator("div").filter({
|
|
39
|
-
has: page.getByRole("link", { name: /Translation manager/ })
|
|
40
|
-
}).filter({
|
|
41
|
-
has: page.getByRole("button", { name: "Save translations" })
|
|
42
|
-
}).last();
|
|
43
|
-
await expect(widgetSection).toBeVisible();
|
|
44
|
-
const deTab = widgetSection.getByRole("button", { name: "DE" });
|
|
45
|
-
await deTab.click();
|
|
46
|
-
const translationInput = widgetSection.locator("table input").first();
|
|
47
|
-
await translationInput.fill("Kategorie QA");
|
|
48
|
-
await widgetSection.getByRole("button", { name: "Save translations" }).click();
|
|
49
|
-
await expect(page.getByText("Translations saved").first()).toBeVisible();
|
|
50
|
-
const getResponse = await apiRequest(request, "GET", `/api/translations/${ENTITY_TYPE}/${categoryId}`, { token: saToken });
|
|
51
|
-
expect(getResponse.ok()).toBeTruthy();
|
|
52
|
-
const body = await getResponse.json();
|
|
53
|
-
expect(body.translations.de.name).toBe("Kategorie QA");
|
|
54
|
-
} finally {
|
|
55
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, categoryId);
|
|
56
|
-
await deleteCatalogCategoryIfExists(request, adminToken, categoryId);
|
|
57
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
});
|
|
62
|
-
//# sourceMappingURL=TC-TRANS-007.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/translations/__integration__/TC-TRANS-007.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'\nimport { createCategoryFixture, deleteCatalogCategoryIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures'\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth'\nimport { deleteTranslationIfExists, getLocales, setLocales } from './helpers/translationFixtures'\n\nconst ENTITY_TYPE = 'catalog:catalog_product_category'\n\n/**\n * TC-TRANS-007: Dynamic Widget Injection on Category Edit\n * Verifies that the Translation Manager widget auto-injects on entity types\n * beyond catalog products. Since injection-table.ts now dynamically generates\n * entries for ALL translatable entity types, this test confirms the mechanism\n * works for product categories (a second CrudForm-based entity).\n */\ntest.describe('TC-TRANS-007: Dynamic Widget Injection on Category Edit', () => {\n test.use({ actionTimeout: 30_000 })\n\n test('should show translation widget on category edit page', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const originalLocales = await getLocales(request, adminToken)\n const categoryName = `QA TC-TRANS-007-1 ${Date.now()}`\n let categoryId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n categoryId = await createCategoryFixture(request, adminToken, { name: categoryName })\n\n await login(page, 'superadmin')\n await page.goto(`/backend/catalog/categories/${categoryId}/edit`)\n\n await expect(page.getByRole('link', { name: /Translation manager/ })).toBeVisible()\n await expect(page.getByRole('button', { name: 'Save translations' })).toBeVisible()\n } finally {\n await deleteCatalogCategoryIfExists(request, adminToken, categoryId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n\n test('should save a translation via the category widget and verify via API', async ({ page, request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const originalLocales = await getLocales(request, adminToken)\n const categoryName = `QA TC-TRANS-007-2 ${Date.now()}`\n let categoryId: string | null = null\n\n try {\n await setLocales(request, adminToken, [...new Set([...originalLocales, 'de'])])\n categoryId = await createCategoryFixture(request, adminToken, { name: categoryName })\n\n await login(page, 'superadmin')\n await page.goto(`/backend/catalog/categories/${categoryId}/edit`)\n\n const widgetSection = page.locator('div').filter({\n has: page.getByRole('link', { name: /Translation manager/ }),\n }).filter({\n has: page.getByRole('button', { name: 'Save translations' }),\n }).last()\n await expect(widgetSection).toBeVisible()\n\n const deTab = widgetSection.getByRole('button', { name: 'DE' })\n await deTab.click()\n\n const translationInput = widgetSection.locator('table input').first()\n await translationInput.fill('Kategorie QA')\n\n await widgetSection.getByRole('button', { name: 'Save translations' }).click()\n await expect(page.getByText('Translations saved').first()).toBeVisible()\n\n const getResponse = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${categoryId}`, { token: saToken })\n expect(getResponse.ok()).toBeTruthy()\n const body = (await getResponse.json()) as { translations: Record<string, Record<string, string>> }\n expect(body.translations.de.name).toBe('Kategorie QA')\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, categoryId)\n await deleteCatalogCategoryIfExists(request, adminToken, categoryId)\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
3
|
-
import { createProductFixture, deleteCatalogProductIfExists } from "@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures";
|
|
4
|
-
import { deleteTranslationIfExists, ensureRoleFeatures, getLocales, restoreRoleFeatures, setLocales } from "./helpers/translationFixtures.js";
|
|
5
|
-
const ENTITY_TYPE = "catalog:catalog_product";
|
|
6
|
-
test.describe("TC-TRANS-008: RBAC Authorization per Role", () => {
|
|
7
|
-
let adminOriginalFeatures = [];
|
|
8
|
-
let employeeOriginalFeatures = [];
|
|
9
|
-
test.beforeAll(async ({ request }) => {
|
|
10
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
11
|
-
adminOriginalFeatures = await ensureRoleFeatures(request, saToken, "admin", ["translations.*"]);
|
|
12
|
-
employeeOriginalFeatures = await ensureRoleFeatures(request, saToken, "employee", ["translations.view", "translations.manage"]);
|
|
13
|
-
});
|
|
14
|
-
test.afterAll(async ({ request }) => {
|
|
15
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
16
|
-
await restoreRoleFeatures(request, saToken, "admin", adminOriginalFeatures).catch(() => {
|
|
17
|
-
});
|
|
18
|
-
await restoreRoleFeatures(request, saToken, "employee", employeeOriginalFeatures).catch(() => {
|
|
19
|
-
});
|
|
20
|
-
});
|
|
21
|
-
test("admin can GET translations (translations.view)", async ({ request }) => {
|
|
22
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
23
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
24
|
-
const productTitle = `QA TC-TRANS-008-admin-get ${Date.now()}`;
|
|
25
|
-
const sku = `QA-T008-AG-${Date.now()}`;
|
|
26
|
-
let productId = null;
|
|
27
|
-
try {
|
|
28
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
29
|
-
await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
30
|
-
token: saToken,
|
|
31
|
-
data: { de: { title: "Admin GET Test" } }
|
|
32
|
-
});
|
|
33
|
-
const response = await apiRequest(request, "GET", `/api/translations/${ENTITY_TYPE}/${productId}`, { token: adminToken });
|
|
34
|
-
expect(response.ok()).toBeTruthy();
|
|
35
|
-
} finally {
|
|
36
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
37
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
test("admin can PUT translations (translations.manage)", async ({ request }) => {
|
|
41
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
42
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
43
|
-
const productTitle = `QA TC-TRANS-008-admin-put ${Date.now()}`;
|
|
44
|
-
const sku = `QA-T008-AP-${Date.now()}`;
|
|
45
|
-
let productId = null;
|
|
46
|
-
try {
|
|
47
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
48
|
-
const response = await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
49
|
-
token: adminToken,
|
|
50
|
-
data: { de: { title: "Admin PUT Test" } }
|
|
51
|
-
});
|
|
52
|
-
expect(response.ok()).toBeTruthy();
|
|
53
|
-
} finally {
|
|
54
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
55
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
test("admin can DELETE translations (translations.manage)", async ({ request }) => {
|
|
59
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
60
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
61
|
-
const productTitle = `QA TC-TRANS-008-admin-del ${Date.now()}`;
|
|
62
|
-
const sku = `QA-T008-AD-${Date.now()}`;
|
|
63
|
-
let productId = null;
|
|
64
|
-
try {
|
|
65
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
66
|
-
await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
67
|
-
token: saToken,
|
|
68
|
-
data: { de: { title: "To delete" } }
|
|
69
|
-
});
|
|
70
|
-
const response = await apiRequest(request, "DELETE", `/api/translations/${ENTITY_TYPE}/${productId}`, { token: adminToken });
|
|
71
|
-
expect(response.status()).toBe(204);
|
|
72
|
-
} finally {
|
|
73
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
74
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
test("admin can PUT locales (translations.manage_locales)", async ({ request }) => {
|
|
78
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
79
|
-
const originalLocales = await getLocales(request, adminToken);
|
|
80
|
-
try {
|
|
81
|
-
const response = await apiRequest(request, "PUT", "/api/translations/locales", {
|
|
82
|
-
token: adminToken,
|
|
83
|
-
data: { locales: ["en", "de"] }
|
|
84
|
-
});
|
|
85
|
-
expect(response.ok()).toBeTruthy();
|
|
86
|
-
} finally {
|
|
87
|
-
await setLocales(request, adminToken, originalLocales).catch(() => {
|
|
88
|
-
});
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
test("employee can GET translations (translations.view)", async ({ request }) => {
|
|
92
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
93
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
94
|
-
const employeeToken = await getAuthToken(request, "employee");
|
|
95
|
-
const productTitle = `QA TC-TRANS-008-emp-get ${Date.now()}`;
|
|
96
|
-
const sku = `QA-T008-EG-${Date.now()}`;
|
|
97
|
-
let productId = null;
|
|
98
|
-
try {
|
|
99
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
100
|
-
await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
101
|
-
token: saToken,
|
|
102
|
-
data: { de: { title: "Employee GET Test" } }
|
|
103
|
-
});
|
|
104
|
-
const response = await apiRequest(request, "GET", `/api/translations/${ENTITY_TYPE}/${productId}`, { token: employeeToken });
|
|
105
|
-
expect(response.ok()).toBeTruthy();
|
|
106
|
-
const body = await response.json();
|
|
107
|
-
expect(body.translations.de.title).toBe("Employee GET Test");
|
|
108
|
-
} finally {
|
|
109
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
110
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
test("employee can GET locales (translations.view)", async ({ request }) => {
|
|
114
|
-
const employeeToken = await getAuthToken(request, "employee");
|
|
115
|
-
const response = await apiRequest(request, "GET", "/api/translations/locales", { token: employeeToken });
|
|
116
|
-
expect(response.ok()).toBeTruthy();
|
|
117
|
-
const body = await response.json();
|
|
118
|
-
expect(Array.isArray(body.locales)).toBeTruthy();
|
|
119
|
-
});
|
|
120
|
-
test("employee can PUT translations (translations.manage)", async ({ request }) => {
|
|
121
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
122
|
-
const employeeToken = await getAuthToken(request, "employee");
|
|
123
|
-
const productTitle = `QA TC-TRANS-008-emp-put ${Date.now()}`;
|
|
124
|
-
const sku = `QA-T008-EP-${Date.now()}`;
|
|
125
|
-
let productId = null;
|
|
126
|
-
try {
|
|
127
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
128
|
-
const response = await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
129
|
-
token: employeeToken,
|
|
130
|
-
data: { de: { title: "Employee PUT Test" } }
|
|
131
|
-
});
|
|
132
|
-
expect(response.ok()).toBeTruthy();
|
|
133
|
-
} finally {
|
|
134
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
135
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
136
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
137
|
-
}
|
|
138
|
-
});
|
|
139
|
-
test("employee can DELETE translations (translations.manage)", async ({ request }) => {
|
|
140
|
-
const adminToken = await getAuthToken(request, "admin");
|
|
141
|
-
const saToken = await getAuthToken(request, "superadmin");
|
|
142
|
-
const employeeToken = await getAuthToken(request, "employee");
|
|
143
|
-
const productTitle = `QA TC-TRANS-008-emp-del ${Date.now()}`;
|
|
144
|
-
const sku = `QA-T008-ED-${Date.now()}`;
|
|
145
|
-
let productId = null;
|
|
146
|
-
try {
|
|
147
|
-
productId = await createProductFixture(request, adminToken, { title: productTitle, sku });
|
|
148
|
-
await apiRequest(request, "PUT", `/api/translations/${ENTITY_TYPE}/${productId}`, {
|
|
149
|
-
token: saToken,
|
|
150
|
-
data: { de: { title: "Cannot delete" } }
|
|
151
|
-
});
|
|
152
|
-
const response = await apiRequest(request, "DELETE", `/api/translations/${ENTITY_TYPE}/${productId}`, { token: employeeToken });
|
|
153
|
-
expect(response.status()).toBe(204);
|
|
154
|
-
} finally {
|
|
155
|
-
await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId);
|
|
156
|
-
await deleteCatalogProductIfExists(request, adminToken, productId);
|
|
157
|
-
}
|
|
158
|
-
});
|
|
159
|
-
test("employee cannot PUT locales (403 \u2014 missing translations.manage_locales)", async ({ request }) => {
|
|
160
|
-
const employeeToken = await getAuthToken(request, "employee");
|
|
161
|
-
const response = await apiRequest(request, "PUT", "/api/translations/locales", {
|
|
162
|
-
token: employeeToken,
|
|
163
|
-
data: { locales: ["en", "de", "fr"] }
|
|
164
|
-
});
|
|
165
|
-
expect(response.status()).toBe(403);
|
|
166
|
-
});
|
|
167
|
-
});
|
|
168
|
-
//# sourceMappingURL=TC-TRANS-008.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/translations/__integration__/TC-TRANS-008.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test'\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures'\nimport { deleteTranslationIfExists, ensureRoleFeatures, getLocales, restoreRoleFeatures, setLocales } from './helpers/translationFixtures'\n\nconst ENTITY_TYPE = 'catalog:catalog_product'\n\n/**\n * TC-TRANS-008: RBAC Authorization per Role\n * Verifies that translation API endpoints enforce correct feature-based access\n * control for admin (translations.*) and employee (translations.view + translations.manage).\n *\n * Role matrix:\n * superadmin \u2014 all features (implicit)\n * admin \u2014 translations.* (all)\n * employee \u2014 translations.view + translations.manage (edit translations)\n */\ntest.describe('TC-TRANS-008: RBAC Authorization per Role', () => {\n let adminOriginalFeatures: string[] = []\n let employeeOriginalFeatures: string[] = []\n\n test.beforeAll(async ({ request }) => {\n const saToken = await getAuthToken(request, 'superadmin')\n adminOriginalFeatures = await ensureRoleFeatures(request, saToken, 'admin', ['translations.*'])\n employeeOriginalFeatures = await ensureRoleFeatures(request, saToken, 'employee', ['translations.view', 'translations.manage'])\n })\n\n test.afterAll(async ({ request }) => {\n const saToken = await getAuthToken(request, 'superadmin')\n await restoreRoleFeatures(request, saToken, 'admin', adminOriginalFeatures).catch(() => {})\n await restoreRoleFeatures(request, saToken, 'employee', employeeOriginalFeatures).catch(() => {})\n })\n\n // \u2500\u2500\u2500 Admin: full access \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n test('admin can GET translations (translations.view)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const productTitle = `QA TC-TRANS-008-admin-get ${Date.now()}`\n const sku = `QA-T008-AG-${Date.now()}`\n let productId: string | null = null\n\n try {\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: saToken,\n data: { de: { title: 'Admin GET Test' } },\n })\n\n const response = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: adminToken })\n expect(response.ok()).toBeTruthy()\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n }\n })\n\n test('admin can PUT translations (translations.manage)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const productTitle = `QA TC-TRANS-008-admin-put ${Date.now()}`\n const sku = `QA-T008-AP-${Date.now()}`\n let productId: string | null = null\n\n try {\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n const response = await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: adminToken,\n data: { de: { title: 'Admin PUT Test' } },\n })\n expect(response.ok()).toBeTruthy()\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n }\n })\n\n test('admin can DELETE translations (translations.manage)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const productTitle = `QA TC-TRANS-008-admin-del ${Date.now()}`\n const sku = `QA-T008-AD-${Date.now()}`\n let productId: string | null = null\n\n try {\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: saToken,\n data: { de: { title: 'To delete' } },\n })\n\n const response = await apiRequest(request, 'DELETE', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: adminToken })\n expect(response.status()).toBe(204)\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n }\n })\n\n test('admin can PUT locales (translations.manage_locales)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const originalLocales = await getLocales(request, adminToken)\n\n try {\n const response = await apiRequest(request, 'PUT', '/api/translations/locales', {\n token: adminToken,\n data: { locales: ['en', 'de'] },\n })\n expect(response.ok()).toBeTruthy()\n } finally {\n await setLocales(request, adminToken, originalLocales).catch(() => {})\n }\n })\n\n // \u2500\u2500\u2500 Employee: can edit translations, cannot manage locales \u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\n test('employee can GET translations (translations.view)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const employeeToken = await getAuthToken(request, 'employee')\n const productTitle = `QA TC-TRANS-008-emp-get ${Date.now()}`\n const sku = `QA-T008-EG-${Date.now()}`\n let productId: string | null = null\n\n try {\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: saToken,\n data: { de: { title: 'Employee GET Test' } },\n })\n\n const response = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: employeeToken })\n expect(response.ok()).toBeTruthy()\n const body = (await response.json()) as { translations: Record<string, Record<string, string>> }\n expect(body.translations.de.title).toBe('Employee GET Test')\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n }\n })\n\n test('employee can GET locales (translations.view)', async ({ request }) => {\n const employeeToken = await getAuthToken(request, 'employee')\n const response = await apiRequest(request, 'GET', '/api/translations/locales', { token: employeeToken })\n expect(response.ok()).toBeTruthy()\n const body = (await response.json()) as { locales: string[] }\n expect(Array.isArray(body.locales)).toBeTruthy()\n })\n\n test('employee can PUT translations (translations.manage)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const employeeToken = await getAuthToken(request, 'employee')\n const productTitle = `QA TC-TRANS-008-emp-put ${Date.now()}`\n const sku = `QA-T008-EP-${Date.now()}`\n let productId: string | null = null\n\n try {\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n const response = await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: employeeToken,\n data: { de: { title: 'Employee PUT Test' } },\n })\n expect(response.ok()).toBeTruthy()\n } finally {\n const saToken = await getAuthToken(request, 'superadmin')\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n }\n })\n\n test('employee can DELETE translations (translations.manage)', async ({ request }) => {\n const adminToken = await getAuthToken(request, 'admin')\n const saToken = await getAuthToken(request, 'superadmin')\n const employeeToken = await getAuthToken(request, 'employee')\n const productTitle = `QA TC-TRANS-008-emp-del ${Date.now()}`\n const sku = `QA-T008-ED-${Date.now()}`\n let productId: string | null = null\n\n try {\n productId = await createProductFixture(request, adminToken, { title: productTitle, sku })\n\n await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {\n token: saToken,\n data: { de: { title: 'Cannot delete' } },\n })\n\n const response = await apiRequest(request, 'DELETE', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: employeeToken })\n expect(response.status()).toBe(204)\n } finally {\n await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)\n await deleteCatalogProductIfExists(request, adminToken, productId)\n }\n })\n\n test('employee cannot PUT locales (403 \u2014 missing translations.manage_locales)', async ({ request }) => {\n const employeeToken = await getAuthToken(request, 'employee')\n\n const response = await apiRequest(request, 'PUT', '/api/translations/locales', {\n token: employeeToken,\n data: { locales: ['en', 'de', 'fr'] },\n })\n expect(response.status()).toBe(403)\n })\n})\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { apiRequest } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
2
|
-
async function getLocales(request, token) {
|
|
3
|
-
const response = await apiRequest(request, "GET", "/api/translations/locales", { token });
|
|
4
|
-
if (!response.ok()) return [];
|
|
5
|
-
const body = await response.json();
|
|
6
|
-
return body.locales ?? [];
|
|
7
|
-
}
|
|
8
|
-
async function setLocales(request, token, locales) {
|
|
9
|
-
await apiRequest(request, "PUT", "/api/translations/locales", { token, data: { locales } });
|
|
10
|
-
}
|
|
11
|
-
async function deleteTranslationIfExists(request, token, entityType, entityId) {
|
|
12
|
-
if (!token || !entityId) return;
|
|
13
|
-
try {
|
|
14
|
-
await apiRequest(request, "DELETE", `/api/translations/${entityType}/${entityId}`, { token });
|
|
15
|
-
} catch {
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
async function findRoleId(request, token, roleName) {
|
|
20
|
-
const response = await apiRequest(request, "GET", `/api/auth/roles?search=${encodeURIComponent(roleName)}&pageSize=50`, { token });
|
|
21
|
-
const body = await response.json();
|
|
22
|
-
const role = (body.items ?? []).find((r) => r.name === roleName);
|
|
23
|
-
if (!role) throw new Error(`Role "${roleName}" not found`);
|
|
24
|
-
return role.id;
|
|
25
|
-
}
|
|
26
|
-
async function getRoleAcl(request, token, roleId) {
|
|
27
|
-
const response = await apiRequest(request, "GET", `/api/auth/roles/acl?roleId=${roleId}`, { token });
|
|
28
|
-
const body = await response.json();
|
|
29
|
-
return {
|
|
30
|
-
features: Array.isArray(body.features) ? body.features : [],
|
|
31
|
-
isSuperAdmin: !!body.isSuperAdmin,
|
|
32
|
-
organizations: body.organizations ?? null
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
async function ensureRoleFeatures(request, token, roleName, requiredFeatures) {
|
|
36
|
-
const roleId = await findRoleId(request, token, roleName);
|
|
37
|
-
const acl = await getRoleAcl(request, token, roleId);
|
|
38
|
-
const original = [...acl.features];
|
|
39
|
-
const merged = Array.from(/* @__PURE__ */ new Set([...acl.features, ...requiredFeatures]));
|
|
40
|
-
if (merged.length !== acl.features.length) {
|
|
41
|
-
await apiRequest(request, "PUT", "/api/auth/roles/acl", {
|
|
42
|
-
token,
|
|
43
|
-
data: { roleId, features: merged, isSuperAdmin: acl.isSuperAdmin }
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
return original;
|
|
47
|
-
}
|
|
48
|
-
async function restoreRoleFeatures(request, token, roleName, features) {
|
|
49
|
-
const roleId = await findRoleId(request, token, roleName);
|
|
50
|
-
const acl = await getRoleAcl(request, token, roleId);
|
|
51
|
-
await apiRequest(request, "PUT", "/api/auth/roles/acl", {
|
|
52
|
-
token,
|
|
53
|
-
data: { roleId, features, isSuperAdmin: acl.isSuperAdmin }
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
export {
|
|
57
|
-
deleteTranslationIfExists,
|
|
58
|
-
ensureRoleFeatures,
|
|
59
|
-
getLocales,
|
|
60
|
-
restoreRoleFeatures,
|
|
61
|
-
setLocales
|
|
62
|
-
};
|
|
63
|
-
//# sourceMappingURL=translationFixtures.js.map
|