@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,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/catalog/__integration__/TC-CAT-011.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test';\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures';\nimport { getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-CAT-011: Configure Product Pricing\n * Source: .ai/qa/scenarios/TC-CAT-011-product-pricing-setup.md\n */\ntest.describe('TC-CAT-011: Configure Product Pricing', () => {\n test('should set variant sale and regular prices during variant creation', async ({ page, request }) => {\n const productName = `QA TC-CAT-011 ${Date.now()}`;\n const baseSku = `QA-CAT-011-BASE-${Date.now()}`;\n const variantName = `Priced Variant ${Date.now()}`;\n const variantSku = `QA-CAT-011-VAR-${Date.now()}`;\n let token: string | null = null;\n let productId: string | null = null;\n\n try {\n token = await getAuthToken(request);\n productId = await createProductFixture(request, token, { title: productName, sku: baseSku });\n\n await login(page, 'admin');\n await page.goto(`/backend/catalog/products/${productId}`);\n\n await page.getByRole('link', { name: 'Add variant' }).click();\n await expect(page).toHaveURL(/\\/variants\\/create$/);\n\n await page.getByRole('textbox', { name: 'e.g., Blue / Small' }).fill(variantName);\n await page.getByRole('textbox', { name: 'Unique identifier' }).fill(variantSku);\n\n const priceInputs = page.getByRole('textbox', { name: '0.00' });\n await priceInputs.nth(0).fill('19.99');\n await priceInputs.nth(1).fill('24.99');\n await page.getByRole('button', { name: 'Create variant' }).last().click();\n\n await expect(page).toHaveURL(/\\/backend\\/catalog\\/products\\/[0-9a-f-]{36}\\/variants\\/[0-9a-f-]{36}$/i);\n await expect(priceInputs.nth(0)).toHaveValue('19.9900');\n await expect(priceInputs.nth(1)).toHaveValue('24.9900');\n } finally {\n await deleteCatalogProductIfExists(request, token, productId);\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,sBAAsB,oCAAoC;AACnE,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AAMtB,KAAK,SAAS,yCAAyC,MAAM;AAC3D,OAAK,sEAAsE,OAAO,EAAE,MAAM,QAAQ,MAAM;AACtG,UAAM,cAAc,iBAAiB,KAAK,IAAI,CAAC;AAC/C,UAAM,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAC7C,UAAM,cAAc,kBAAkB,KAAK,IAAI,CAAC;AAChD,UAAM,aAAa,kBAAkB,KAAK,IAAI,CAAC;AAC/C,QAAI,QAAuB;AAC3B,QAAI,YAA2B;AAE/B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,kBAAY,MAAM,qBAAqB,SAAS,OAAO,EAAE,OAAO,aAAa,KAAK,QAAQ,CAAC;AAE3F,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,6BAA6B,SAAS,EAAE;AAExD,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,cAAc,CAAC,EAAE,MAAM;AAC5D,YAAM,OAAO,IAAI,EAAE,UAAU,qBAAqB;AAElD,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,qBAAqB,CAAC,EAAE,KAAK,WAAW;AAChF,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,oBAAoB,CAAC,EAAE,KAAK,UAAU;AAE9E,YAAM,cAAc,KAAK,UAAU,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9D,YAAM,YAAY,IAAI,CAAC,EAAE,KAAK,OAAO;AACrC,YAAM,YAAY,IAAI,CAAC,EAAE,KAAK,OAAO;AACrC,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM;AAExE,YAAM,OAAO,IAAI,EAAE,UAAU,wEAAwE;AACrG,YAAM,OAAO,YAAY,IAAI,CAAC,CAAC,EAAE,YAAY,SAAS;AACtD,YAAM,OAAO,YAAY,IAAI,CAAC,CAAC,EAAE,YAAY,SAAS;AAAA,IACxD,UAAE;AACA,YAAM,6BAA6B,SAAS,OAAO,SAAS;AAAA,IAC9D;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { createProductFixture, deleteCatalogProductIfExists } from "@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures";
|
|
3
|
-
import { getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
4
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
5
|
-
test.describe("TC-CAT-012: Product Search and Filter", () => {
|
|
6
|
-
test("should search products by name and SKU", async ({ page, request }) => {
|
|
7
|
-
const stamp = Date.now();
|
|
8
|
-
const productName = `QA TC-CAT-012 ${stamp}`;
|
|
9
|
-
const sku = `QA-CAT-012-${stamp}`;
|
|
10
|
-
let token = null;
|
|
11
|
-
let productId = null;
|
|
12
|
-
try {
|
|
13
|
-
token = await getAuthToken(request);
|
|
14
|
-
productId = await createProductFixture(request, token, { title: productName, sku });
|
|
15
|
-
await login(page, "admin");
|
|
16
|
-
await page.goto("/backend/catalog/products");
|
|
17
|
-
const search = page.getByRole("textbox", { name: "Search" });
|
|
18
|
-
await search.fill(productName);
|
|
19
|
-
await expect(page.getByText(productName).first()).toBeVisible({ timeout: 1e4 });
|
|
20
|
-
await search.fill(sku);
|
|
21
|
-
await expect(page.getByText(productName).first()).toBeVisible({ timeout: 1e4 });
|
|
22
|
-
} finally {
|
|
23
|
-
await deleteCatalogProductIfExists(request, token, productId);
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
//# sourceMappingURL=TC-CAT-012.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/modules/catalog/__integration__/TC-CAT-012.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test';\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures';\nimport { getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-CAT-012: Product Search and Filter\n * Source: .ai/qa/scenarios/TC-CAT-012-product-search-filter.md\n */\ntest.describe('TC-CAT-012: Product Search and Filter', () => {\n test('should search products by name and SKU', async ({ page, request }) => {\n const stamp = Date.now();\n const productName = `QA TC-CAT-012 ${stamp}`;\n const sku = `QA-CAT-012-${stamp}`;\n let token: string | null = null;\n let productId: string | null = null;\n\n try {\n token = await getAuthToken(request);\n productId = await createProductFixture(request, token, { title: productName, sku });\n\n await login(page, 'admin');\n await page.goto('/backend/catalog/products');\n const search = page.getByRole('textbox', { name: 'Search' });\n\n await search.fill(productName);\n await expect(page.getByText(productName).first()).toBeVisible({ timeout: 10_000 });\n\n await search.fill(sku);\n await expect(page.getByText(productName).first()).toBeVisible({ timeout: 10_000 });\n } finally {\n await deleteCatalogProductIfExists(request, token, productId);\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,sBAAsB,oCAAoC;AACnE,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AAMtB,KAAK,SAAS,yCAAyC,MAAM;AAC3D,OAAK,0CAA0C,OAAO,EAAE,MAAM,QAAQ,MAAM;AAC1E,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,cAAc,iBAAiB,KAAK;AAC1C,UAAM,MAAM,cAAc,KAAK;AAC/B,QAAI,QAAuB;AAC3B,QAAI,YAA2B;AAE/B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,kBAAY,MAAM,qBAAqB,SAAS,OAAO,EAAE,OAAO,aAAa,IAAI,CAAC;AAElF,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,2BAA2B;AAC3C,YAAM,SAAS,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D,YAAM,OAAO,KAAK,WAAW;AAC7B,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAEjF,YAAM,OAAO,KAAK,GAAG;AACrB,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAAA,IACnF,UAAE;AACA,YAAM,6BAA6B,SAAS,OAAO,SAAS;AAAA,IAC9D;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
import { getAuthToken, apiRequest } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
4
|
-
test.describe("TC-ADMIN-001: Create API Key", () => {
|
|
5
|
-
test("should create an API key and show it in the list", async ({ page, request }) => {
|
|
6
|
-
const keyName = `QA TC-ADMIN-001 ${Date.now()}`;
|
|
7
|
-
let token = null;
|
|
8
|
-
try {
|
|
9
|
-
token = await getAuthToken(request);
|
|
10
|
-
await login(page, "admin");
|
|
11
|
-
await page.goto("/backend/api-keys");
|
|
12
|
-
await expect(page.getByRole("heading", { name: "API Keys", level: 2 })).toBeVisible();
|
|
13
|
-
await page.getByRole("link", { name: "Create" }).click();
|
|
14
|
-
await expect(page).toHaveURL(/\/backend\/api-keys\/create$/);
|
|
15
|
-
await expect(page.getByText("Create API Key")).toBeVisible();
|
|
16
|
-
const nameField = page.locator("form").getByRole("textbox").first();
|
|
17
|
-
await nameField.fill(keyName);
|
|
18
|
-
await page.getByRole("button", { name: "Create" }).last().click();
|
|
19
|
-
await expect(page.getByText("Keep this key safe")).toBeVisible({ timeout: 1e4 });
|
|
20
|
-
await expect(page.getByText(/Prefix: omk_/)).toBeVisible();
|
|
21
|
-
await page.getByRole("button", { name: "Close" }).click();
|
|
22
|
-
await page.goto("/backend/api-keys");
|
|
23
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
24
|
-
});
|
|
25
|
-
await page.getByRole("textbox", { name: "Search" }).fill(keyName);
|
|
26
|
-
await expect(page.getByText(keyName)).toBeVisible({ timeout: 5e3 });
|
|
27
|
-
} finally {
|
|
28
|
-
if (token) {
|
|
29
|
-
const listResponse = await apiRequest(request, "GET", "/api/auth/api-keys", { token });
|
|
30
|
-
const listData = await listResponse.json().catch(() => null);
|
|
31
|
-
if (listData && Array.isArray(listData.items)) {
|
|
32
|
-
const keyToDelete = listData.items.find(
|
|
33
|
-
(item) => item.name === keyName
|
|
34
|
-
);
|
|
35
|
-
if (keyToDelete && typeof keyToDelete.id === "string") {
|
|
36
|
-
await apiRequest(request, "DELETE", `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
//# sourceMappingURL=TC-ADMIN-001.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-001.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { getAuthToken, apiRequest } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\n/**\n * TC-ADMIN-001: Create API Key\n * Source: .ai/qa/scenarios/TC-ADMIN-001-api-key-creation.md\n *\n * Verifies that API keys can be created from the create form,\n * that the generated key is shown once, and that the key appears\n * in the API keys list.\n *\n * Navigation: Settings \u2192 Auth \u2192 API Keys \u2192 Create\n */\ntest.describe('TC-ADMIN-001: Create API Key', () => {\n test('should create an API key and show it in the list', async ({ page, request }) => {\n const keyName = `QA TC-ADMIN-001 ${Date.now()}`;\n let token: string | null = null;\n\n try {\n token = await getAuthToken(request);\n await login(page, 'admin');\n\n // Navigate to API Keys via Settings\n await page.goto('/backend/api-keys');\n await expect(page.getByRole('heading', { name: 'API Keys', level: 2 })).toBeVisible();\n\n // Click Create\n await page.getByRole('link', { name: 'Create' }).click();\n await expect(page).toHaveURL(/\\/backend\\/api-keys\\/create$/);\n await expect(page.getByText('Create API Key')).toBeVisible();\n\n // Fill in the name\n const nameField = page.locator('form').getByRole('textbox').first();\n await nameField.fill(keyName);\n\n // Click Create button\n await page.getByRole('button', { name: 'Create' }).last().click();\n\n // After creation, a dialog shows the generated key (one-time view)\n await expect(page.getByText('Keep this key safe')).toBeVisible({ timeout: 10_000 });\n await expect(page.getByText(/Prefix: omk_/)).toBeVisible();\n\n // Close the key dialog\n await page.getByRole('button', { name: 'Close' }).click();\n\n // Navigate back to list\n await page.goto('/backend/api-keys');\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Search for the created key\n await page.getByRole('textbox', { name: 'Search' }).fill(keyName);\n await expect(page.getByText(keyName)).toBeVisible({ timeout: 5_000 });\n } finally {\n // Cleanup: try to delete the API key via API (best effort)\n if (token) {\n const listResponse = await apiRequest(request, 'GET', '/api/auth/api-keys', { token });\n const listData = await listResponse.json().catch(() => null);\n if (listData && Array.isArray(listData.items)) {\n const keyToDelete = listData.items.find((item: Record<string, unknown>) =>\n item.name === keyName,\n );\n if (keyToDelete && typeof keyToDelete.id === 'string') {\n await apiRequest(request, 'DELETE', `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {});\n }\n }\n }\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AACtB,SAAS,cAAc,kBAAkB;AAYzC,KAAK,SAAS,gCAAgC,MAAM;AAClD,OAAK,oDAAoD,OAAO,EAAE,MAAM,QAAQ,MAAM;AACpF,UAAM,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAC7C,QAAI,QAAuB;AAE3B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,YAAM,MAAM,MAAM,OAAO;AAGzB,YAAM,KAAK,KAAK,mBAAmB;AACnC,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGpF,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM;AACvD,YAAM,OAAO,IAAI,EAAE,UAAU,8BAA8B;AAC3D,YAAM,OAAO,KAAK,UAAU,gBAAgB,CAAC,EAAE,YAAY;AAG3D,YAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS,EAAE,MAAM;AAClE,YAAM,UAAU,KAAK,OAAO;AAG5B,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM;AAGhE,YAAM,OAAO,KAAK,UAAU,oBAAoB,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAClF,YAAM,OAAO,KAAK,UAAU,cAAc,CAAC,EAAE,YAAY;AAGzD,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM;AAGxD,YAAM,KAAK,KAAK,mBAAmB;AACnC,YAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGpG,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,OAAO;AAChE,YAAM,OAAO,KAAK,UAAU,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAAA,IACtE,UAAE;AAEA,UAAI,OAAO;AACT,cAAM,eAAe,MAAM,WAAW,SAAS,OAAO,sBAAsB,EAAE,MAAM,CAAC;AACrF,cAAM,WAAW,MAAM,aAAa,KAAK,EAAE,MAAM,MAAM,IAAI;AAC3D,YAAI,YAAY,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC7C,gBAAM,cAAc,SAAS,MAAM;AAAA,YAAK,CAAC,SACvC,KAAK,SAAS;AAAA,UAChB;AACA,cAAI,eAAe,OAAO,YAAY,OAAO,UAAU;AACrD,kBAAM,WAAW,SAAS,UAAU,yBAAyB,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAAA,UAC1G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
import { getAuthToken, apiRequest } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
4
|
-
test.describe("TC-ADMIN-002: Revoke API Key", () => {
|
|
5
|
-
test("should revoke an existing API key", async ({ page, request }) => {
|
|
6
|
-
const keyName = `QA TC-ADMIN-002 ${Date.now()}`;
|
|
7
|
-
let token = null;
|
|
8
|
-
let keyId = null;
|
|
9
|
-
try {
|
|
10
|
-
token = await getAuthToken(request);
|
|
11
|
-
await login(page, "admin");
|
|
12
|
-
await page.goto("/backend/api-keys/create");
|
|
13
|
-
const nameField = page.locator("form").getByRole("textbox").first();
|
|
14
|
-
await nameField.fill(keyName);
|
|
15
|
-
await page.getByRole("button", { name: "Create" }).last().click();
|
|
16
|
-
await expect(page.getByText("Keep this key safe")).toBeVisible({ timeout: 1e4 });
|
|
17
|
-
await page.getByRole("button", { name: "Close" }).click();
|
|
18
|
-
await page.goto("/backend/api-keys");
|
|
19
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
20
|
-
});
|
|
21
|
-
await page.getByRole("textbox", { name: "Search" }).fill(keyName);
|
|
22
|
-
await expect(page.getByText(keyName)).toBeVisible({ timeout: 5e3 });
|
|
23
|
-
const keyRow = page.locator("table tbody tr").filter({ hasText: keyName }).first();
|
|
24
|
-
await expect(keyRow).toBeVisible();
|
|
25
|
-
const actionsButton = keyRow.getByRole("button").last();
|
|
26
|
-
await actionsButton.click();
|
|
27
|
-
const revokeButton = page.getByRole("menuitem", { name: /revoke|delete/i }).first();
|
|
28
|
-
await expect(revokeButton).toBeVisible({ timeout: 3e3 });
|
|
29
|
-
await revokeButton.click();
|
|
30
|
-
const confirmButton = page.getByRole("button", { name: /confirm|revoke|delete|yes/i });
|
|
31
|
-
if (await confirmButton.isVisible().catch(() => false)) {
|
|
32
|
-
await confirmButton.click();
|
|
33
|
-
}
|
|
34
|
-
await page.waitForTimeout(1e3);
|
|
35
|
-
await page.getByRole("textbox", { name: "Search" }).fill(keyName);
|
|
36
|
-
} finally {
|
|
37
|
-
if (token) {
|
|
38
|
-
const listResponse = await apiRequest(request, "GET", "/api/auth/api-keys", { token });
|
|
39
|
-
const listData = await listResponse.json().catch(() => null);
|
|
40
|
-
if (listData && Array.isArray(listData.items)) {
|
|
41
|
-
const keyToDelete = listData.items.find(
|
|
42
|
-
(item) => item.name === keyName
|
|
43
|
-
);
|
|
44
|
-
if (keyToDelete && typeof keyToDelete.id === "string") {
|
|
45
|
-
await apiRequest(request, "DELETE", `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
});
|
|
53
|
-
//# sourceMappingURL=TC-ADMIN-002.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-002.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { getAuthToken, apiRequest } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\n/**\n * TC-ADMIN-002: Revoke API Key\n * Source: .ai/qa/scenarios/TC-ADMIN-002-api-key-revocation.md\n *\n * Verifies that an existing API key can be revoked.\n * Creates a key via API, then revokes it through the UI.\n *\n * Navigation: Settings \u2192 Auth \u2192 API Keys\n */\ntest.describe('TC-ADMIN-002: Revoke API Key', () => {\n test('should revoke an existing API key', async ({ page, request }) => {\n const keyName = `QA TC-ADMIN-002 ${Date.now()}`;\n let token: string | null = null;\n let keyId: string | null = null;\n\n try {\n token = await getAuthToken(request);\n\n // Create an API key via the UI first\n await login(page, 'admin');\n await page.goto('/backend/api-keys/create');\n\n const nameField = page.locator('form').getByRole('textbox').first();\n await nameField.fill(keyName);\n await page.getByRole('button', { name: 'Create' }).last().click();\n\n // Wait for the key dialog\n await expect(page.getByText('Keep this key safe')).toBeVisible({ timeout: 10_000 });\n await page.getByRole('button', { name: 'Close' }).click();\n\n // Navigate to API keys list\n await page.goto('/backend/api-keys');\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Search for the key\n await page.getByRole('textbox', { name: 'Search' }).fill(keyName);\n await expect(page.getByText(keyName)).toBeVisible({ timeout: 5_000 });\n\n // Find and click the row actions for this key \u2014 look for a revoke/delete button\n const keyRow = page.locator('table tbody tr').filter({ hasText: keyName }).first();\n await expect(keyRow).toBeVisible();\n\n // Click the actions button on the row\n const actionsButton = keyRow.getByRole('button').last();\n await actionsButton.click();\n\n // Look for a Revoke or Delete option in the dropdown menu\n const revokeButton = page.getByRole('menuitem', { name: /revoke|delete/i }).first();\n await expect(revokeButton).toBeVisible({ timeout: 3_000 });\n await revokeButton.click();\n\n // Handle confirmation dialog if present\n const confirmButton = page.getByRole('button', { name: /confirm|revoke|delete|yes/i });\n if (await confirmButton.isVisible().catch(() => false)) {\n await confirmButton.click();\n }\n\n // Verify the key is revoked or removed\n await page.waitForTimeout(1_000);\n await page.getByRole('textbox', { name: 'Search' }).fill(keyName);\n // Key should either show as revoked or be removed from list\n // We verify at least that no error occurred\n } finally {\n // Cleanup via API\n if (token) {\n const listResponse = await apiRequest(request, 'GET', '/api/auth/api-keys', { token });\n const listData = await listResponse.json().catch(() => null);\n if (listData && Array.isArray(listData.items)) {\n const keyToDelete = listData.items.find((item: Record<string, unknown>) =>\n item.name === keyName,\n );\n if (keyToDelete && typeof keyToDelete.id === 'string') {\n await apiRequest(request, 'DELETE', `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {});\n }\n }\n }\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AACtB,SAAS,cAAc,kBAAkB;AAWzC,KAAK,SAAS,gCAAgC,MAAM;AAClD,OAAK,qCAAqC,OAAO,EAAE,MAAM,QAAQ,MAAM;AACrE,UAAM,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAC7C,QAAI,QAAuB;AAC3B,QAAI,QAAuB;AAE3B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAGlC,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,0BAA0B;AAE1C,YAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS,EAAE,MAAM;AAClE,YAAM,UAAU,KAAK,OAAO;AAC5B,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM;AAGhE,YAAM,OAAO,KAAK,UAAU,oBAAoB,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAClF,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM;AAGxD,YAAM,KAAK,KAAK,mBAAmB;AACnC,YAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGpG,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,OAAO;AAChE,YAAM,OAAO,KAAK,UAAU,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAGpE,YAAM,SAAS,KAAK,QAAQ,gBAAgB,EAAE,OAAO,EAAE,SAAS,QAAQ,CAAC,EAAE,MAAM;AACjF,YAAM,OAAO,MAAM,EAAE,YAAY;AAGjC,YAAM,gBAAgB,OAAO,UAAU,QAAQ,EAAE,KAAK;AACtD,YAAM,cAAc,MAAM;AAG1B,YAAM,eAAe,KAAK,UAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC,EAAE,MAAM;AAClF,YAAM,OAAO,YAAY,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AACzD,YAAM,aAAa,MAAM;AAGzB,YAAM,gBAAgB,KAAK,UAAU,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrF,UAAI,MAAM,cAAc,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACtD,cAAM,cAAc,MAAM;AAAA,MAC5B;AAGA,YAAM,KAAK,eAAe,GAAK;AAC/B,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,OAAO;AAAA,IAGlE,UAAE;AAEA,UAAI,OAAO;AACT,cAAM,eAAe,MAAM,WAAW,SAAS,OAAO,sBAAsB,EAAE,MAAM,CAAC;AACrF,cAAM,WAAW,MAAM,aAAa,KAAK,EAAE,MAAM,MAAM,IAAI;AAC3D,YAAI,YAAY,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC7C,gBAAM,cAAc,SAAS,MAAM;AAAA,YAAK,CAAC,SACvC,KAAK,SAAS;AAAA,UAChB;AACA,cAAI,eAAe,OAAO,YAAY,OAAO,UAAU;AACrD,kBAAM,WAAW,SAAS,UAAU,yBAAyB,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAAA,UAC1G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
test.describe("TC-ADMIN-003: View and Filter Audit Logs", () => {
|
|
4
|
-
test("should display audit log tabs with action log entries", async ({ page }) => {
|
|
5
|
-
await login(page, "admin");
|
|
6
|
-
await page.goto("/backend/audit-logs");
|
|
7
|
-
const actionLogTab = page.getByRole("tab", { name: "Action Log" });
|
|
8
|
-
await expect(actionLogTab).toBeVisible();
|
|
9
|
-
await expect(actionLogTab).toHaveAttribute("aria-selected", "true");
|
|
10
|
-
await expect(page.getByRole("tab", { name: "Access Log" })).toBeVisible();
|
|
11
|
-
await expect(page.getByRole("heading", { name: "Action Log", level: 2 })).toBeVisible();
|
|
12
|
-
await expect(page.getByRole("checkbox", { name: "Undoable only" })).toBeVisible();
|
|
13
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
14
|
-
});
|
|
15
|
-
await expect(page.getByRole("columnheader", { name: "Action" })).toBeVisible();
|
|
16
|
-
await expect(page.getByRole("columnheader", { name: "Resource" })).toBeVisible();
|
|
17
|
-
await expect(page.getByRole("columnheader", { name: "User" })).toBeVisible();
|
|
18
|
-
await expect(page.getByRole("columnheader", { name: "When" })).toBeVisible();
|
|
19
|
-
await expect(page.getByRole("columnheader", { name: "Status" })).toBeVisible();
|
|
20
|
-
const rows = page.locator("table tbody tr");
|
|
21
|
-
await expect(rows.first()).toBeVisible();
|
|
22
|
-
await page.getByRole("tab", { name: "Access Log" }).click();
|
|
23
|
-
await expect(page.getByRole("heading", { name: "Access Log", level: 2 })).toBeVisible();
|
|
24
|
-
});
|
|
25
|
-
});
|
|
26
|
-
//# sourceMappingURL=TC-ADMIN-003.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-003.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-003: View and Filter Audit Logs\n * Source: .ai/qa/scenarios/TC-ADMIN-003-audit-log-viewing.md\n *\n * Verifies that audit logs are accessible via the Security sidebar section,\n * display action and access log tabs, and show log entries with details.\n *\n * Navigation: Main sidebar \u2192 Security \u2192 Audit Logs\n */\ntest.describe('TC-ADMIN-003: View and Filter Audit Logs', () => {\n test('should display audit log tabs with action log entries', async ({ page }) => {\n await login(page, 'admin');\n await page.goto('/backend/audit-logs');\n\n // Verify Action Log tab is selected by default\n const actionLogTab = page.getByRole('tab', { name: 'Action Log' });\n await expect(actionLogTab).toBeVisible();\n await expect(actionLogTab).toHaveAttribute('aria-selected', 'true');\n\n // Verify Access Log tab exists\n await expect(page.getByRole('tab', { name: 'Access Log' })).toBeVisible();\n\n // Verify Action Log heading\n await expect(page.getByRole('heading', { name: 'Action Log', level: 2 })).toBeVisible();\n\n // Verify the undoable only filter\n await expect(page.getByRole('checkbox', { name: 'Undoable only' })).toBeVisible();\n\n // Wait for table to load\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify table columns\n await expect(page.getByRole('columnheader', { name: 'Action' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Resource' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'User' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'When' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Status' })).toBeVisible();\n\n // Verify audit log entries exist (since we just logged in, there should be entries)\n const rows = page.locator('table tbody tr');\n await expect(rows.first()).toBeVisible();\n\n // Switch to Access Log tab\n await page.getByRole('tab', { name: 'Access Log' }).click();\n await expect(page.getByRole('heading', { name: 'Access Log', level: 2 })).toBeVisible();\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAWtB,KAAK,SAAS,4CAA4C,MAAM;AAC9D,OAAK,yDAAyD,OAAO,EAAE,KAAK,MAAM;AAChF,UAAM,MAAM,MAAM,OAAO;AACzB,UAAM,KAAK,KAAK,qBAAqB;AAGrC,UAAM,eAAe,KAAK,UAAU,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,UAAM,OAAO,YAAY,EAAE,YAAY;AACvC,UAAM,OAAO,YAAY,EAAE,gBAAgB,iBAAiB,MAAM;AAGlE,UAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AAGxE,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGtF,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,YAAY;AAGhF,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,WAAW,CAAC,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAG7E,UAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,UAAM,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAGvC,UAAM,KAAK,UAAU,OAAO,EAAE,MAAM,aAAa,CAAC,EAAE,MAAM;AAC1D,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAAA,EACxF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
4
|
-
test.describe("TC-ADMIN-004: Dictionary Management", () => {
|
|
5
|
-
test("should display dictionaries and allow creating a new one", async ({ page, request }) => {
|
|
6
|
-
let token = null;
|
|
7
|
-
let dictionaryId = null;
|
|
8
|
-
let dictionaryKey = null;
|
|
9
|
-
try {
|
|
10
|
-
token = await getAuthToken(request);
|
|
11
|
-
await login(page, "admin");
|
|
12
|
-
await page.goto("/backend/config/dictionaries");
|
|
13
|
-
await expect(page.getByRole("heading", { name: "Dictionaries", level: 2 })).toBeVisible();
|
|
14
|
-
await page.getByText("Loading dictionaries").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
15
|
-
});
|
|
16
|
-
await expect(page.getByRole("button", { name: "New dictionary" })).toBeVisible();
|
|
17
|
-
await expect(page.getByText("Manage reusable values and appearance")).toBeVisible({ timeout: 5e3 });
|
|
18
|
-
await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible();
|
|
19
|
-
await expect(page.getByRole("button", { name: "Add entry" })).toBeVisible();
|
|
20
|
-
await expect(page.getByRole("columnheader", { name: "Value" })).toBeVisible();
|
|
21
|
-
await expect(page.getByRole("columnheader", { name: "Label" })).toBeVisible();
|
|
22
|
-
await page.getByRole("button", { name: "New dictionary" }).click();
|
|
23
|
-
await expect(page.getByRole("heading", { name: "Create dictionary", level: 2 })).toBeVisible({ timeout: 5e3 });
|
|
24
|
-
const timestamp = Date.now();
|
|
25
|
-
const dictKey = `qa_tc_admin_004_${timestamp}`;
|
|
26
|
-
const dictName = `QA TC-ADMIN-004 ${timestamp}`;
|
|
27
|
-
dictionaryKey = dictKey;
|
|
28
|
-
await page.getByRole("textbox", { name: "slug_name" }).fill(dictKey);
|
|
29
|
-
await page.getByRole("textbox", { name: "Display name" }).fill(dictName);
|
|
30
|
-
await page.getByRole("button", { name: "Save" }).click();
|
|
31
|
-
await expect(page.getByText(dictName)).toBeVisible({ timeout: 5e3 });
|
|
32
|
-
} finally {
|
|
33
|
-
if (token && dictionaryKey) {
|
|
34
|
-
const listResponse = await apiRequest(request, "GET", "/api/dictionaries", { token }).catch(() => null);
|
|
35
|
-
if (listResponse && listResponse.ok()) {
|
|
36
|
-
const listData = await listResponse.json().catch(() => null);
|
|
37
|
-
dictionaryId = listData?.items?.find((item) => item.key === dictionaryKey)?.id ?? null;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (token && dictionaryId) {
|
|
41
|
-
await apiRequest(request, "DELETE", `/api/dictionaries/${encodeURIComponent(dictionaryId)}`, { token }).catch(() => {
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
//# sourceMappingURL=TC-ADMIN-004.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-004.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\n/**\n * TC-ADMIN-004: Manage Dictionary Entries\n * Source: .ai/qa/scenarios/TC-ADMIN-004-dictionary-management.md\n *\n * Verifies that the dictionaries page loads, shows existing dictionaries\n * with their entries, and allows creating a new dictionary.\n *\n * Navigation: Settings \u2192 Module Configuration \u2192 Dictionaries\n */\ntest.describe('TC-ADMIN-004: Dictionary Management', () => {\n test('should display dictionaries and allow creating a new one', async ({ page, request }) => {\n let token: string | null = null;\n let dictionaryId: string | null = null;\n let dictionaryKey: string | null = null;\n\n try {\n token = await getAuthToken(request);\n await login(page, 'admin');\n await page.goto('/backend/config/dictionaries');\n\n // Verify page heading\n await expect(page.getByRole('heading', { name: 'Dictionaries', level: 2 })).toBeVisible();\n\n // Wait for loading\n await page.getByText('Loading dictionaries').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify the \"New dictionary\" button is available\n await expect(page.getByRole('button', { name: 'New dictionary' })).toBeVisible();\n\n // The first dictionary should be auto-selected \u2014 verify its details panel\n await expect(page.getByText('Manage reusable values and appearance')).toBeVisible({ timeout: 5_000 });\n await expect(page.getByRole('button', { name: 'Refresh' })).toBeVisible();\n await expect(page.getByRole('button', { name: 'Add entry' })).toBeVisible();\n\n // Verify the entries table columns\n await expect(page.getByRole('columnheader', { name: 'Value' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Label' })).toBeVisible();\n\n // Create a new dictionary\n await page.getByRole('button', { name: 'New dictionary' }).click();\n\n // Verify the dialog appears\n await expect(page.getByRole('heading', { name: 'Create dictionary', level: 2 })).toBeVisible({ timeout: 5_000 });\n\n // Fill in the Key field (slug)\n const timestamp = Date.now();\n const dictKey = `qa_tc_admin_004_${timestamp}`;\n const dictName = `QA TC-ADMIN-004 ${timestamp}`;\n dictionaryKey = dictKey;\n await page.getByRole('textbox', { name: 'slug_name' }).fill(dictKey);\n\n // Fill in the Name field\n await page.getByRole('textbox', { name: 'Display name' }).fill(dictName);\n\n // Submit\n await page.getByRole('button', { name: 'Save' }).click();\n\n // Verify the new dictionary appears in the sidebar list\n await expect(page.getByText(dictName)).toBeVisible({ timeout: 5_000 });\n } finally {\n if (token && dictionaryKey) {\n const listResponse = await apiRequest(request, 'GET', '/api/dictionaries', { token }).catch(() => null);\n if (listResponse && listResponse.ok()) {\n const listData = (await listResponse.json().catch(() => null)) as { items?: Array<{ id?: string; key?: string }> } | null;\n dictionaryId = listData?.items?.find((item) => item.key === dictionaryKey)?.id ?? null;\n }\n }\n if (token && dictionaryId) {\n await apiRequest(request, 'DELETE', `/api/dictionaries/${encodeURIComponent(dictionaryId)}`, { token }).catch(() => {});\n }\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AAWzC,KAAK,SAAS,uCAAuC,MAAM;AACzD,OAAK,4DAA4D,OAAO,EAAE,MAAM,QAAQ,MAAM;AAC5F,QAAI,QAAuB;AAC3B,QAAI,eAA8B;AAClC,QAAI,gBAA+B;AAEnC,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,8BAA8B;AAG9C,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,gBAAgB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGxF,YAAM,KAAK,UAAU,sBAAsB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGzG,YAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,CAAC,EAAE,YAAY;AAG/E,YAAM,OAAO,KAAK,UAAU,uCAAuC,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AACpG,YAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,UAAU,CAAC,CAAC,EAAE,YAAY;AACxE,YAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,CAAC,EAAE,YAAY;AAG1E,YAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,YAAY;AAC5E,YAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,YAAY;AAG5E,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,EAAE,MAAM;AAGjE,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,qBAAqB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAG/G,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,UAAU,mBAAmB,SAAS;AAC5C,YAAM,WAAW,mBAAmB,SAAS;AAC7C,sBAAgB;AAChB,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,YAAY,CAAC,EAAE,KAAK,OAAO;AAGnE,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,eAAe,CAAC,EAAE,KAAK,QAAQ;AAGvE,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM;AAGvD,YAAM,OAAO,KAAK,UAAU,QAAQ,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAAA,IACvE,UAAE;AACA,UAAI,SAAS,eAAe;AAC1B,cAAM,eAAe,MAAM,WAAW,SAAS,OAAO,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI;AACtG,YAAI,gBAAgB,aAAa,GAAG,GAAG;AACrC,gBAAM,WAAY,MAAM,aAAa,KAAK,EAAE,MAAM,MAAM,IAAI;AAC5D,yBAAe,UAAU,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,aAAa,GAAG,MAAM;AAAA,QACpF;AAAA,MACF;AACA,UAAI,SAAS,cAAc;AACzB,cAAM,WAAW,SAAS,UAAU,qBAAqB,mBAAmB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACxH;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
test.describe("TC-ADMIN-005: Feature Toggles Management", () => {
|
|
4
|
-
test("should display feature toggles list and create form for superadmin", async ({ page }) => {
|
|
5
|
-
await login(page, "superadmin");
|
|
6
|
-
await page.goto("/backend/feature-toggles/global");
|
|
7
|
-
await expect(page.getByRole("heading", { name: /Feature Toggles/i })).toBeVisible();
|
|
8
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
9
|
-
});
|
|
10
|
-
await expect(page.getByRole("columnheader", { name: "Category" })).toBeVisible();
|
|
11
|
-
await expect(page.getByRole("columnheader", { name: "Identifier" })).toBeVisible();
|
|
12
|
-
await expect(page.getByRole("columnheader", { name: "Name" })).toBeVisible();
|
|
13
|
-
await expect(page.getByRole("columnheader", { name: "Type" })).toBeVisible();
|
|
14
|
-
const createLink = page.getByRole("link", { name: /^Create$/i }).first();
|
|
15
|
-
if (await createLink.isVisible().catch(() => false)) {
|
|
16
|
-
await createLink.click();
|
|
17
|
-
} else {
|
|
18
|
-
await page.getByRole("button", { name: /^Create$/i }).first().click();
|
|
19
|
-
}
|
|
20
|
-
await expect(page).toHaveURL(/\/backend\/feature-toggles\/global\/create(?:\?.*)?$/);
|
|
21
|
-
await expect(page.locator("main").getByText("Create Feature Toggle", { exact: true })).toBeVisible();
|
|
22
|
-
await expect(page.getByText("Basic Information")).toBeVisible();
|
|
23
|
-
await expect(page.getByText("Type Configuration")).toBeVisible();
|
|
24
|
-
await expect(page.getByText("Default Value", { exact: true })).toBeVisible();
|
|
25
|
-
const textboxes = page.locator("main").getByRole("textbox");
|
|
26
|
-
expect(await textboxes.count()).toBeGreaterThanOrEqual(3);
|
|
27
|
-
const comboboxes = page.locator("main").getByRole("combobox");
|
|
28
|
-
expect(await comboboxes.count()).toBeGreaterThan(0);
|
|
29
|
-
await expect(page.getByRole("button", { name: "Save" }).first()).toBeVisible();
|
|
30
|
-
await expect(page.getByRole("link", { name: /Back/i }).first()).toBeVisible();
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
//# sourceMappingURL=TC-ADMIN-005.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-005.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-005: Feature Toggles Management\n * Source: .ai/qa/scenarios/TC-ADMIN-005-feature-toggle-create.md\n *\n * Verifies that the feature toggles page is accessible to superadmins,\n * displays existing toggles with proper columns, and has a working\n * create form with all expected fields.\n *\n * Navigation: Settings \u2192 Feature Toggles \u2192 Global\n */\ntest.describe('TC-ADMIN-005: Feature Toggles Management', () => {\n test('should display feature toggles list and create form for superadmin', async ({ page }) => {\n await login(page, 'superadmin');\n\n await page.goto('/backend/feature-toggles/global');\n await expect(page.getByRole('heading', { name: /Feature Toggles/i })).toBeVisible();\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n await expect(page.getByRole('columnheader', { name: 'Category' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Identifier' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Name' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Type' })).toBeVisible();\n\n const createLink = page.getByRole('link', { name: /^Create$/i }).first();\n if (await createLink.isVisible().catch(() => false)) {\n await createLink.click();\n } else {\n await page.getByRole('button', { name: /^Create$/i }).first().click();\n }\n await expect(page).toHaveURL(/\\/backend\\/feature-toggles\\/global\\/create(?:\\?.*)?$/);\n await expect(page.locator('main').getByText('Create Feature Toggle', { exact: true })).toBeVisible();\n\n await expect(page.getByText('Basic Information')).toBeVisible();\n await expect(page.getByText('Type Configuration')).toBeVisible();\n await expect(page.getByText('Default Value', { exact: true })).toBeVisible();\n\n const textboxes = page.locator('main').getByRole('textbox');\n expect(await textboxes.count()).toBeGreaterThanOrEqual(3);\n\n const comboboxes = page.locator('main').getByRole('combobox');\n expect(await comboboxes.count()).toBeGreaterThan(0);\n\n await expect(page.getByRole('button', { name: 'Save' }).first()).toBeVisible();\n await expect(page.getByRole('link', { name: /Back/i }).first()).toBeVisible();\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAYtB,KAAK,SAAS,4CAA4C,MAAM;AAC9D,OAAK,sEAAsE,OAAO,EAAE,KAAK,MAAM;AAC7F,UAAM,MAAM,MAAM,YAAY;AAE9B,UAAM,KAAK,KAAK,iCAAiC;AACjD,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,mBAAmB,CAAC,CAAC,EAAE,YAAY;AAClF,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAEpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,WAAW,CAAC,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AACjF,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAE3E,UAAM,aAAa,KAAK,UAAU,QAAQ,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AACvE,QAAI,MAAM,WAAW,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACnD,YAAM,WAAW,MAAM;AAAA,IACzB,OAAO;AACL,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM;AAAA,IACtE;AACA,UAAM,OAAO,IAAI,EAAE,UAAU,sDAAsD;AACnF,UAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,UAAU,yBAAyB,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY;AAEnG,UAAM,OAAO,KAAK,UAAU,mBAAmB,CAAC,EAAE,YAAY;AAC9D,UAAM,OAAO,KAAK,UAAU,oBAAoB,CAAC,EAAE,YAAY;AAC/D,UAAM,OAAO,KAAK,UAAU,iBAAiB,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY;AAE3E,UAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS;AAC1D,WAAO,MAAM,UAAU,MAAM,CAAC,EAAE,uBAAuB,CAAC;AAExD,UAAM,aAAa,KAAK,QAAQ,MAAM,EAAE,UAAU,UAAU;AAC5D,WAAO,MAAM,WAAW,MAAM,CAAC,EAAE,gBAAgB,CAAC;AAElD,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,EAC9E,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
test.describe("TC-ADMIN-006: Feature Toggle Overrides", () => {
|
|
4
|
-
test("should display overrides list and allow viewing override details", async ({ page }) => {
|
|
5
|
-
await login(page, "superadmin");
|
|
6
|
-
await page.goto("/backend/feature-toggles/overrides");
|
|
7
|
-
await expect(page.getByRole("heading", { name: "Feature Toggle Overrides", level: 2 })).toBeVisible();
|
|
8
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
9
|
-
});
|
|
10
|
-
await expect(page.getByRole("columnheader", { name: "Tenant" })).toBeVisible();
|
|
11
|
-
await expect(page.getByRole("columnheader", { name: "Identifier" })).toBeVisible();
|
|
12
|
-
await expect(page.getByRole("columnheader", { name: "Name" })).toBeVisible();
|
|
13
|
-
await expect(page.getByRole("columnheader", { name: "Category" })).toBeVisible();
|
|
14
|
-
await expect(page.getByRole("columnheader", { name: "Override State" })).toBeVisible();
|
|
15
|
-
await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible();
|
|
16
|
-
const rows = page.locator("table tbody tr");
|
|
17
|
-
await expect(rows.first()).toBeVisible();
|
|
18
|
-
await rows.first().click();
|
|
19
|
-
await expect(page.getByRole("heading", { name: "Details", level: 2 })).toBeVisible();
|
|
20
|
-
await expect(page.getByRole("heading", { name: "Description", level: 2 })).toBeVisible();
|
|
21
|
-
await expect(page.getByRole("heading", { name: "Default Value", level: 2 })).toBeVisible();
|
|
22
|
-
await expect(page.getByText("Override", { exact: true })).toBeVisible();
|
|
23
|
-
await expect(page.getByText("Override Mode")).toBeVisible();
|
|
24
|
-
await expect(page.getByRole("checkbox", { name: "Enable Override" })).toBeVisible();
|
|
25
|
-
await expect(page.getByRole("button", { name: "Save Override" })).toBeVisible();
|
|
26
|
-
await expect(page.getByText("Name")).toBeVisible();
|
|
27
|
-
await expect(page.getByText("Identifier")).toBeVisible();
|
|
28
|
-
});
|
|
29
|
-
});
|
|
30
|
-
//# sourceMappingURL=TC-ADMIN-006.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-006.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-006: Feature Toggle Overrides\n * Source: .ai/qa/scenarios/TC-ADMIN-006-feature-toggle-override.md\n *\n * Verifies that the feature toggle overrides page displays per-tenant\n * overrides with proper columns, and that clicking an override shows\n * the detail view with enable/disable controls.\n *\n * Navigation: Settings \u2192 Feature Toggles \u2192 Overrides\n */\ntest.describe('TC-ADMIN-006: Feature Toggle Overrides', () => {\n test('should display overrides list and allow viewing override details', async ({ page }) => {\n await login(page, 'superadmin');\n\n // Navigate to overrides page\n await page.goto('/backend/feature-toggles/overrides');\n await expect(page.getByRole('heading', { name: 'Feature Toggle Overrides', level: 2 })).toBeVisible();\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify table columns\n await expect(page.getByRole('columnheader', { name: 'Tenant' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Identifier' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Name' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Category' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Override State' })).toBeVisible();\n\n // Verify Refresh button\n await expect(page.getByRole('button', { name: 'Refresh' })).toBeVisible();\n\n // Verify at least one override row exists\n const rows = page.locator('table tbody tr');\n await expect(rows.first()).toBeVisible();\n\n // Click the first override row to see detail view\n await rows.first().click();\n\n // Verify detail page loads with expected sections\n await expect(page.getByRole('heading', { name: 'Details', level: 2 })).toBeVisible();\n await expect(page.getByRole('heading', { name: 'Description', level: 2 })).toBeVisible();\n await expect(page.getByRole('heading', { name: 'Default Value', level: 2 })).toBeVisible();\n\n // Verify override section\n await expect(page.getByText('Override', { exact: true })).toBeVisible();\n await expect(page.getByText('Override Mode')).toBeVisible();\n\n // Verify Enable Override checkbox\n await expect(page.getByRole('checkbox', { name: 'Enable Override' })).toBeVisible();\n\n // Verify Save Override button\n await expect(page.getByRole('button', { name: 'Save Override' })).toBeVisible();\n\n // Verify toggle detail fields\n await expect(page.getByText('Name')).toBeVisible();\n await expect(page.getByText('Identifier')).toBeVisible();\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAYtB,KAAK,SAAS,0CAA0C,MAAM;AAC5D,OAAK,oEAAoE,OAAO,EAAE,KAAK,MAAM;AAC3F,UAAM,MAAM,MAAM,YAAY;AAG9B,UAAM,KAAK,KAAK,oCAAoC;AACpD,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,4BAA4B,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACpG,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AACjF,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,WAAW,CAAC,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,iBAAiB,CAAC,CAAC,EAAE,YAAY;AAGrF,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,UAAU,CAAC,CAAC,EAAE,YAAY;AAGxE,UAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,UAAM,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAGvC,UAAM,KAAK,MAAM,EAAE,MAAM;AAGzB,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,WAAW,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACnF,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,eAAe,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACvF,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,iBAAiB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGzF,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY;AACtE,UAAM,OAAO,KAAK,UAAU,eAAe,CAAC,EAAE,YAAY;AAG1D,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC,CAAC,EAAE,YAAY;AAGlF,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,YAAY;AAG9E,UAAM,OAAO,KAAK,UAAU,MAAM,CAAC,EAAE,YAAY;AACjD,UAAM,OAAO,KAAK,UAAU,YAAY,CAAC,EAAE,YAAY;AAAA,EACzD,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { test, expect } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
test.describe("TC-ADMIN-007: Custom Entity Creation", () => {
|
|
4
|
-
test("should display user entities list and create form", async ({ page }) => {
|
|
5
|
-
await login(page, "superadmin");
|
|
6
|
-
await page.goto("/backend/entities/user");
|
|
7
|
-
await expect(page.getByRole("heading", { name: "User Entities", level: 2 })).toBeVisible();
|
|
8
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
9
|
-
});
|
|
10
|
-
await expect(page.getByRole("columnheader", { name: /Entity/ })).toBeVisible();
|
|
11
|
-
await expect(page.getByRole("columnheader", { name: "Label" })).toBeVisible();
|
|
12
|
-
await expect(page.getByRole("columnheader", { name: "Source" })).toBeVisible();
|
|
13
|
-
await expect(page.getByRole("columnheader", { name: "Fields" })).toBeVisible();
|
|
14
|
-
await expect(page.getByRole("columnheader", { name: "In Sidebar" })).toBeVisible();
|
|
15
|
-
const rows = page.locator("table tbody tr");
|
|
16
|
-
await expect(rows.first()).toBeVisible();
|
|
17
|
-
await expect(page.getByRole("button", { name: "Export" })).toBeVisible();
|
|
18
|
-
await expect(page.getByRole("link", { name: "Create" })).toBeVisible();
|
|
19
|
-
await expect(page.getByRole("textbox", { name: "Search" })).toBeVisible();
|
|
20
|
-
await page.getByRole("link", { name: "Create" }).click();
|
|
21
|
-
await expect(page).toHaveURL(/\/backend\/entities\/user\/create$/);
|
|
22
|
-
await expect(page.getByText("Create Entity")).toBeVisible();
|
|
23
|
-
await expect(page.getByText("Entity ID", { exact: false })).toBeVisible();
|
|
24
|
-
await expect(page.getByText("Label", { exact: false })).toBeVisible();
|
|
25
|
-
await expect(page.getByText("Description")).toBeVisible();
|
|
26
|
-
const entityIdField = page.getByRole("textbox", { name: "module_name:entity_id" });
|
|
27
|
-
await expect(entityIdField).toBeVisible();
|
|
28
|
-
await expect(entityIdField).toHaveValue("user:your_entity");
|
|
29
|
-
await expect(page.locator("main").getByRole("combobox")).toBeVisible();
|
|
30
|
-
await expect(page.getByRole("checkbox", { name: "Show in sidebar" })).toBeVisible();
|
|
31
|
-
await expect(page.getByRole("button", { name: "Create" }).first()).toBeVisible();
|
|
32
|
-
await expect(page.getByRole("link", { name: "Cancel" }).first()).toBeVisible();
|
|
33
|
-
await expect(page.getByRole("link", { name: "\u2190 Back" })).toBeVisible();
|
|
34
|
-
});
|
|
35
|
-
});
|
|
36
|
-
//# sourceMappingURL=TC-ADMIN-007.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-007.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-007: Custom Entity Creation\n * Source: .ai/qa/scenarios/TC-ADMIN-007-custom-entity-creation.md\n *\n * Verifies that the User Entities page displays existing entities,\n * and that the create form has all expected fields.\n *\n * Navigation: Settings \u2192 Data Designer \u2192 User Entities\n */\ntest.describe('TC-ADMIN-007: Custom Entity Creation', () => {\n test('should display user entities list and create form', async ({ page }) => {\n await login(page, 'superadmin');\n\n // Navigate to User Entities\n await page.goto('/backend/entities/user');\n await expect(page.getByRole('heading', { name: 'User Entities', level: 2 })).toBeVisible();\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify table columns\n await expect(page.getByRole('columnheader', { name: /Entity/ })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Label' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Source' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Fields' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'In Sidebar' })).toBeVisible();\n\n // Verify at least one entity row exists\n const rows = page.locator('table tbody tr');\n await expect(rows.first()).toBeVisible();\n\n // Verify Export and Create buttons\n await expect(page.getByRole('button', { name: 'Export' })).toBeVisible();\n await expect(page.getByRole('link', { name: 'Create' })).toBeVisible();\n\n // Verify Search box\n await expect(page.getByRole('textbox', { name: 'Search' })).toBeVisible();\n\n // Navigate to Create form\n await page.getByRole('link', { name: 'Create' }).click();\n await expect(page).toHaveURL(/\\/backend\\/entities\\/user\\/create$/);\n await expect(page.getByText('Create Entity')).toBeVisible();\n\n // Verify form fields\n await expect(page.getByText('Entity ID', { exact: false })).toBeVisible();\n await expect(page.getByText('Label', { exact: false })).toBeVisible();\n await expect(page.getByText('Description')).toBeVisible();\n\n // Verify Entity ID default placeholder value\n const entityIdField = page.getByRole('textbox', { name: 'module_name:entity_id' });\n await expect(entityIdField).toBeVisible();\n await expect(entityIdField).toHaveValue('user:your_entity');\n\n // Verify Default Editor combobox\n await expect(page.locator('main').getByRole('combobox')).toBeVisible();\n\n // Verify Show in sidebar checkbox\n await expect(page.getByRole('checkbox', { name: 'Show in sidebar' })).toBeVisible();\n\n // Verify Create and Cancel buttons\n await expect(page.getByRole('button', { name: 'Create' }).first()).toBeVisible();\n await expect(page.getByRole('link', { name: 'Cancel' }).first()).toBeVisible();\n\n // Verify Back link\n await expect(page.getByRole('link', { name: '\u2190 Back' })).toBeVisible();\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAWtB,KAAK,SAAS,wCAAwC,MAAM;AAC1D,OAAK,qDAAqD,OAAO,EAAE,KAAK,MAAM;AAC5E,UAAM,MAAM,MAAM,YAAY;AAG9B,UAAM,KAAK,KAAK,wBAAwB;AACxC,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,iBAAiB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACzF,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,YAAY;AAC5E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AAGjF,UAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,UAAM,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAGvC,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AACvE,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAGrE,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAGxE,UAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM;AACvD,UAAM,OAAO,IAAI,EAAE,UAAU,oCAAoC;AACjE,UAAM,OAAO,KAAK,UAAU,eAAe,CAAC,EAAE,YAAY;AAG1D,UAAM,OAAO,KAAK,UAAU,aAAa,EAAE,OAAO,MAAM,CAAC,CAAC,EAAE,YAAY;AACxE,UAAM,OAAO,KAAK,UAAU,SAAS,EAAE,OAAO,MAAM,CAAC,CAAC,EAAE,YAAY;AACpE,UAAM,OAAO,KAAK,UAAU,aAAa,CAAC,EAAE,YAAY;AAGxD,UAAM,gBAAgB,KAAK,UAAU,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACjF,UAAM,OAAO,aAAa,EAAE,YAAY;AACxC,UAAM,OAAO,aAAa,EAAE,YAAY,kBAAkB;AAG1D,UAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,UAAU,UAAU,CAAC,EAAE,YAAY;AAGrE,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC,CAAC,EAAE,YAAY;AAGlF,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAG7E,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,cAAS,CAAC,CAAC,EAAE,YAAY;AAAA,EACvE,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
import { expect, test } from "@playwright/test";
|
|
2
|
-
import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
|
|
3
|
-
import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
|
|
4
|
-
function escapeRegExp(value) {
|
|
5
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
6
|
-
}
|
|
7
|
-
test.describe("TC-ADMIN-008: Create Custom Entity Record", () => {
|
|
8
|
-
test("should create and edit a record for a custom entity", async ({ page, request }) => {
|
|
9
|
-
const stamp = Date.now();
|
|
10
|
-
const entityId = `user:qa_admin_008_${stamp}`;
|
|
11
|
-
const location = `QA Location ${stamp}`;
|
|
12
|
-
const title = `QA Title ${stamp}`;
|
|
13
|
-
const updatedTitle = `${title} Updated`;
|
|
14
|
-
let token = null;
|
|
15
|
-
let recordId = null;
|
|
16
|
-
const fillField = async (label, fallbackIndex, value) => {
|
|
17
|
-
const namedInput = page.getByRole("textbox", { name: new RegExp(`^${escapeRegExp(label)}$`, "i") }).first();
|
|
18
|
-
if (await namedInput.count() > 0) {
|
|
19
|
-
await namedInput.fill(value);
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
const textboxes = page.locator("main").getByRole("textbox");
|
|
23
|
-
await expect(textboxes.nth(fallbackIndex)).toBeVisible();
|
|
24
|
-
await textboxes.nth(fallbackIndex).fill(value);
|
|
25
|
-
};
|
|
26
|
-
try {
|
|
27
|
-
token = await getAuthToken(request, "superadmin");
|
|
28
|
-
const entityCreateResponse = await apiRequest(request, "POST", "/api/entities/entities", {
|
|
29
|
-
token,
|
|
30
|
-
data: {
|
|
31
|
-
entityId,
|
|
32
|
-
label: `QA Admin 008 ${stamp}`,
|
|
33
|
-
description: "Temporary QA entity",
|
|
34
|
-
showInSidebar: false
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
expect(entityCreateResponse.ok()).toBeTruthy();
|
|
38
|
-
const fieldDefinitions = [
|
|
39
|
-
{ key: "location", label: "Location" },
|
|
40
|
-
{ key: "title", label: "Title" },
|
|
41
|
-
{ key: "event_date", label: "Event Date" }
|
|
42
|
-
];
|
|
43
|
-
for (const field of fieldDefinitions) {
|
|
44
|
-
const definitionResponse = await apiRequest(request, "POST", "/api/entities/definitions", {
|
|
45
|
-
token,
|
|
46
|
-
data: {
|
|
47
|
-
entityId,
|
|
48
|
-
key: field.key,
|
|
49
|
-
kind: "text",
|
|
50
|
-
configJson: {
|
|
51
|
-
label: field.label,
|
|
52
|
-
priority: 10
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
|
-
expect(definitionResponse.ok()).toBeTruthy();
|
|
57
|
-
}
|
|
58
|
-
await login(page, "superadmin");
|
|
59
|
-
await page.goto(`/backend/entities/user/${encodeURIComponent(entityId)}/records`);
|
|
60
|
-
await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
|
|
61
|
-
});
|
|
62
|
-
await expect(page.getByRole("heading", { name: new RegExp(`Records:\\s*${entityId}`, "i") })).toBeVisible();
|
|
63
|
-
await page.getByRole("link", { name: "Create" }).click();
|
|
64
|
-
await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/create$`, "i"));
|
|
65
|
-
await fillField("Location", 0, location);
|
|
66
|
-
await fillField("Title", 1, title);
|
|
67
|
-
await fillField("Event Date", 2, "2026-02-14");
|
|
68
|
-
await page.getByRole("button", { name: "Save" }).first().click();
|
|
69
|
-
await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, "i"));
|
|
70
|
-
await expect(page.getByRole("row", { name: new RegExp(location, "i") })).toBeVisible();
|
|
71
|
-
await page.getByRole("row", { name: new RegExp(location, "i") }).click();
|
|
72
|
-
await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/[^/]+$`, "i"));
|
|
73
|
-
recordId = page.url().match(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/([^/?#]+)$`, "i"))?.[1] ?? null;
|
|
74
|
-
await fillField("Title", 1, updatedTitle);
|
|
75
|
-
await page.getByRole("button", { name: "Save" }).first().click();
|
|
76
|
-
await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, "i"));
|
|
77
|
-
await expect(page.getByRole("row", { name: new RegExp(updatedTitle, "i") })).toBeVisible();
|
|
78
|
-
} finally {
|
|
79
|
-
if (token && recordId) {
|
|
80
|
-
await apiRequest(
|
|
81
|
-
request,
|
|
82
|
-
"DELETE",
|
|
83
|
-
`/api/entities/records?entityId=${encodeURIComponent(entityId)}&recordId=${encodeURIComponent(recordId)}`,
|
|
84
|
-
{ token }
|
|
85
|
-
).catch(() => {
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
if (token) {
|
|
89
|
-
await apiRequest(request, "DELETE", "/api/entities/definitions", {
|
|
90
|
-
token,
|
|
91
|
-
data: { entityId, key: "event_date" }
|
|
92
|
-
}).catch(() => {
|
|
93
|
-
});
|
|
94
|
-
await apiRequest(request, "DELETE", "/api/entities/definitions", {
|
|
95
|
-
token,
|
|
96
|
-
data: { entityId, key: "title" }
|
|
97
|
-
}).catch(() => {
|
|
98
|
-
});
|
|
99
|
-
await apiRequest(request, "DELETE", "/api/entities/definitions", {
|
|
100
|
-
token,
|
|
101
|
-
data: { entityId, key: "location" }
|
|
102
|
-
}).catch(() => {
|
|
103
|
-
});
|
|
104
|
-
await apiRequest(request, "DELETE", "/api/entities/entities", {
|
|
105
|
-
token,
|
|
106
|
-
data: { entityId }
|
|
107
|
-
}).catch(() => {
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
//# sourceMappingURL=TC-ADMIN-008.spec.js.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-008.spec.ts"],
|
|
4
|
-
"sourcesContent": ["import { expect, test } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * TC-ADMIN-008: Create Custom Entity Record\n * Source: .ai/qa/scenarios/TC-ADMIN-008-custom-entity-record.md\n */\ntest.describe('TC-ADMIN-008: Create Custom Entity Record', () => {\n test('should create and edit a record for a custom entity', async ({ page, request }) => {\n const stamp = Date.now();\n const entityId = `user:qa_admin_008_${stamp}`;\n const location = `QA Location ${stamp}`;\n const title = `QA Title ${stamp}`;\n const updatedTitle = `${title} Updated`;\n let token: string | null = null;\n let recordId: string | null = null;\n\n const fillField = async (label: string, fallbackIndex: number, value: string): Promise<void> => {\n const namedInput = page\n .getByRole('textbox', { name: new RegExp(`^${escapeRegExp(label)}$`, 'i') })\n .first();\n if ((await namedInput.count()) > 0) {\n await namedInput.fill(value);\n return;\n }\n\n const textboxes = page.locator('main').getByRole('textbox');\n await expect(textboxes.nth(fallbackIndex)).toBeVisible();\n await textboxes.nth(fallbackIndex).fill(value);\n };\n\n try {\n token = await getAuthToken(request, 'superadmin');\n const entityCreateResponse = await apiRequest(request, 'POST', '/api/entities/entities', {\n token,\n data: {\n entityId,\n label: `QA Admin 008 ${stamp}`,\n description: 'Temporary QA entity',\n showInSidebar: false,\n },\n });\n expect(entityCreateResponse.ok()).toBeTruthy();\n\n const fieldDefinitions = [\n { key: 'location', label: 'Location' },\n { key: 'title', label: 'Title' },\n { key: 'event_date', label: 'Event Date' },\n ];\n for (const field of fieldDefinitions) {\n const definitionResponse = await apiRequest(request, 'POST', '/api/entities/definitions', {\n token,\n data: {\n entityId,\n key: field.key,\n kind: 'text',\n configJson: {\n label: field.label,\n priority: 10,\n },\n },\n });\n expect(definitionResponse.ok()).toBeTruthy();\n }\n\n await login(page, 'superadmin');\n await page.goto(`/backend/entities/user/${encodeURIComponent(entityId)}/records`);\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n await expect(page.getByRole('heading', { name: new RegExp(`Records:\\\\s*${entityId}`, 'i') })).toBeVisible();\n await page.getByRole('link', { name: 'Create' }).click();\n\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/create$`, 'i'));\n await fillField('Location', 0, location);\n await fillField('Title', 1, title);\n await fillField('Event Date', 2, '2026-02-14');\n await page.getByRole('button', { name: 'Save' }).first().click();\n\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, 'i'));\n await expect(page.getByRole('row', { name: new RegExp(location, 'i') })).toBeVisible();\n\n await page.getByRole('row', { name: new RegExp(location, 'i') }).click();\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/[^/]+$`, 'i'));\n recordId =\n page.url().match(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/([^/?#]+)$`, 'i'))?.[1] ??\n null;\n\n await fillField('Title', 1, updatedTitle);\n await page.getByRole('button', { name: 'Save' }).first().click();\n\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, 'i'));\n await expect(page.getByRole('row', { name: new RegExp(updatedTitle, 'i') })).toBeVisible();\n } finally {\n if (token && recordId) {\n await apiRequest(\n request,\n 'DELETE',\n `/api/entities/records?entityId=${encodeURIComponent(entityId)}&recordId=${encodeURIComponent(recordId)}`,\n { token },\n ).catch(() => {});\n }\n if (token) {\n await apiRequest(request, 'DELETE', '/api/entities/definitions', {\n token,\n data: { entityId, key: 'event_date' },\n }).catch(() => {});\n await apiRequest(request, 'DELETE', '/api/entities/definitions', {\n token,\n data: { entityId, key: 'title' },\n }).catch(() => {});\n await apiRequest(request, 'DELETE', '/api/entities/definitions', {\n token,\n data: { entityId, key: 'location' },\n }).catch(() => {});\n await apiRequest(request, 'DELETE', '/api/entities/entities', {\n token,\n data: { entityId },\n }).catch(() => {});\n }\n }\n });\n});\n"],
|
|
5
|
-
"mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AAEzC,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAMA,KAAK,SAAS,6CAA6C,MAAM;AAC/D,OAAK,uDAAuD,OAAO,EAAE,MAAM,QAAQ,MAAM;AACvF,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,WAAW,qBAAqB,KAAK;AAC3C,UAAM,WAAW,eAAe,KAAK;AACrC,UAAM,QAAQ,YAAY,KAAK;AAC/B,UAAM,eAAe,GAAG,KAAK;AAC7B,QAAI,QAAuB;AAC3B,QAAI,WAA0B;AAE9B,UAAM,YAAY,OAAO,OAAe,eAAuB,UAAiC;AAC9F,YAAM,aAAa,KAChB,UAAU,WAAW,EAAE,MAAM,IAAI,OAAO,IAAI,aAAa,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAC1E,MAAM;AACT,UAAK,MAAM,WAAW,MAAM,IAAK,GAAG;AAClC,cAAM,WAAW,KAAK,KAAK;AAC3B;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS;AAC1D,YAAM,OAAO,UAAU,IAAI,aAAa,CAAC,EAAE,YAAY;AACvD,YAAM,UAAU,IAAI,aAAa,EAAE,KAAK,KAAK;AAAA,IAC/C;AAEA,QAAI;AACF,cAAQ,MAAM,aAAa,SAAS,YAAY;AAChD,YAAM,uBAAuB,MAAM,WAAW,SAAS,QAAQ,0BAA0B;AAAA,QACvF;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,UACA,OAAO,gBAAgB,KAAK;AAAA,UAC5B,aAAa;AAAA,UACb,eAAe;AAAA,QACjB;AAAA,MACF,CAAC;AACD,aAAO,qBAAqB,GAAG,CAAC,EAAE,WAAW;AAE7C,YAAM,mBAAmB;AAAA,QACvB,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,QACrC,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC/B,EAAE,KAAK,cAAc,OAAO,aAAa;AAAA,MAC3C;AACA,iBAAW,SAAS,kBAAkB;AACpC,cAAM,qBAAqB,MAAM,WAAW,SAAS,QAAQ,6BAA6B;AAAA,UACxF;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,YACA,KAAK,MAAM;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO,mBAAmB,GAAG,CAAC,EAAE,WAAW;AAAA,MAC7C;AAEA,YAAM,MAAM,MAAM,YAAY;AAC9B,YAAM,KAAK,KAAK,0BAA0B,mBAAmB,QAAQ,CAAC,UAAU;AAChF,YAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAEpG,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,IAAI,OAAO,eAAe,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAC1G,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM;AAEvD,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,oBAAoB,GAAG,CAAC;AACtH,YAAM,UAAU,YAAY,GAAG,QAAQ;AACvC,YAAM,UAAU,SAAS,GAAG,KAAK;AACjC,YAAM,UAAU,cAAc,GAAG,YAAY;AAC7C,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM;AAE/D,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,aAAa,GAAG,CAAC;AAC/G,YAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAErF,YAAM,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,MAAM;AACvE,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,mBAAmB,GAAG,CAAC;AACrH,iBACE,KAAK,IAAI,EAAE,MAAM,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,KAClH;AAEF,YAAM,UAAU,SAAS,GAAG,YAAY;AACxC,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM;AAE/D,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,aAAa,GAAG,CAAC;AAC/G,YAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,cAAc,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAAA,IAC3F,UAAE;AACA,UAAI,SAAS,UAAU;AACrB,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,kCAAkC,mBAAmB,QAAQ,CAAC,aAAa,mBAAmB,QAAQ,CAAC;AAAA,UACvG,EAAE,MAAM;AAAA,QACV,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAClB;AACA,UAAI,OAAO;AACT,cAAM,WAAW,SAAS,UAAU,6BAA6B;AAAA,UAC/D;AAAA,UACA,MAAM,EAAE,UAAU,KAAK,aAAa;AAAA,QACtC,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,cAAM,WAAW,SAAS,UAAU,6BAA6B;AAAA,UAC/D;AAAA,UACA,MAAM,EAAE,UAAU,KAAK,QAAQ;AAAA,QACjC,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,cAAM,WAAW,SAAS,UAAU,6BAA6B;AAAA,UAC/D;AAAA,UACA,MAAM,EAAE,UAAU,KAAK,WAAW;AAAA,QACpC,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,cAAM,WAAW,SAAS,UAAU,0BAA0B;AAAA,UAC5D;AAAA,UACA,MAAM,EAAE,SAAS;AAAA,QACnB,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
|
|
6
|
-
"names": []
|
|
7
|
-
}
|