@solidxai/core 0.1.2 → 0.1.5-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +8 -0
- package/dist/commands/run-tests.command.d.ts +37 -0
- package/dist/commands/run-tests.command.d.ts.map +1 -0
- package/dist/commands/run-tests.command.js +345 -0
- package/dist/commands/run-tests.command.js.map +1 -0
- package/dist/commands/test-data.command.d.ts +6 -6
- package/dist/commands/test-data.command.d.ts.map +1 -1
- package/dist/commands/test-data.command.js +25 -25
- package/dist/commands/test-data.command.js.map +1 -1
- package/dist/commands/test.command.d.ts +5 -0
- package/dist/commands/test.command.d.ts.map +1 -0
- package/dist/commands/test.command.js +26 -0
- package/dist/commands/test.command.js.map +1 -0
- package/dist/constants/error-messages.d.ts +1 -0
- package/dist/constants/error-messages.d.ts.map +1 -1
- package/dist/constants/error-messages.js +1 -0
- package/dist/constants/error-messages.js.map +1 -1
- package/dist/constants.d.ts +3 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +12 -12
- package/dist/constants.js.map +1 -1
- package/dist/controllers/otp-authentication.controller.d.ts +1 -4
- package/dist/controllers/otp-authentication.controller.d.ts.map +1 -1
- package/dist/controllers/otp-authentication.controller.js +1 -1
- package/dist/controllers/role-metadata.controller.d.ts +1 -0
- package/dist/controllers/role-metadata.controller.d.ts.map +1 -1
- package/dist/controllers/role-metadata.controller.js +15 -0
- package/dist/controllers/role-metadata.controller.js.map +1 -1
- package/dist/controllers/service.controller.d.ts +0 -9
- package/dist/controllers/service.controller.d.ts.map +1 -1
- package/dist/controllers/service.controller.js +0 -45
- package/dist/controllers/service.controller.js.map +1 -1
- package/dist/dtos/basic-filters.dto.d.ts.map +1 -1
- package/dist/dtos/basic-filters.dto.js.map +1 -1
- package/dist/dtos/create-email-template.dto.d.ts.map +1 -1
- package/dist/dtos/create-email-template.dto.js.map +1 -1
- package/dist/dtos/create-list-of-values.dto.d.ts.map +1 -1
- package/dist/dtos/create-list-of-values.dto.js.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/create-role-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-role-metadata.dto.js.map +1 -1
- package/dist/dtos/create-scheduled-job.dto.d.ts.map +1 -1
- package/dist/dtos/create-scheduled-job.dto.js.map +1 -1
- package/dist/dtos/create-security-rule.dto.d.ts.map +1 -1
- package/dist/dtos/create-security-rule.dto.js.map +1 -1
- package/dist/dtos/create-sms-template.dto.d.ts.map +1 -1
- package/dist/dtos/create-sms-template.dto.js.map +1 -1
- package/dist/dtos/create-user.dto.d.ts +1 -0
- package/dist/dtos/create-user.dto.d.ts.map +1 -1
- package/dist/dtos/create-user.dto.js +2 -1
- package/dist/dtos/create-user.dto.js.map +1 -1
- package/dist/dtos/create-view-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/create-view-metadata.dto.js.map +1 -1
- package/dist/dtos/otp-sign-in.dto.d.ts +1 -1
- package/dist/dtos/otp-sign-in.dto.d.ts.map +1 -1
- package/dist/dtos/otp-sign-in.dto.js +2 -2
- package/dist/dtos/otp-sign-in.dto.js.map +1 -1
- package/dist/dtos/otp-sign-up.dto.d.ts +2 -2
- package/dist/dtos/otp-sign-up.dto.d.ts.map +1 -1
- package/dist/dtos/otp-sign-up.dto.js +2 -2
- package/dist/dtos/otp-sign-up.dto.js.map +1 -1
- package/dist/dtos/resolve-s3-url.dto.d.ts +2 -5
- package/dist/dtos/resolve-s3-url.dto.d.ts.map +1 -1
- package/dist/dtos/resolve-s3-url.dto.js +1 -13
- package/dist/dtos/resolve-s3-url.dto.js.map +1 -1
- package/dist/dtos/sign-up.dto.d.ts.map +1 -1
- package/dist/dtos/sign-up.dto.js.map +1 -1
- package/dist/dtos/update-email-template.dto.d.ts.map +1 -1
- package/dist/dtos/update-email-template.dto.js.map +1 -1
- package/dist/dtos/update-list-of-values.dto.d.ts.map +1 -1
- package/dist/dtos/update-list-of-values.dto.js.map +1 -1
- package/dist/dtos/update-menu-item-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/update-menu-item-metadata.dto.js.map +1 -1
- package/dist/dtos/update-scheduled-job.dto.d.ts.map +1 -1
- package/dist/dtos/update-scheduled-job.dto.js.map +1 -1
- package/dist/dtos/update-security-rule.dto.d.ts.map +1 -1
- package/dist/dtos/update-security-rule.dto.js.map +1 -1
- package/dist/dtos/update-sms-template.dto.d.ts.map +1 -1
- package/dist/dtos/update-sms-template.dto.js.map +1 -1
- package/dist/dtos/update-view-metadata.dto.d.ts.map +1 -1
- package/dist/dtos/update-view-metadata.dto.js.map +1 -1
- package/dist/entities/user.entity.d.ts +1 -0
- package/dist/entities/user.entity.d.ts.map +1 -1
- package/dist/entities/user.entity.js +6 -1
- package/dist/entities/user.entity.js.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts +2 -0
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js +33 -23
- package/dist/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts +3 -0
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.d.ts.map +1 -1
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js +36 -23
- package/dist/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.js.map +1 -1
- package/dist/helpers/security.helper.js +1 -0
- package/dist/helpers/security.helper.js.map +1 -1
- package/dist/index.d.ts +3 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -4
- package/dist/index.js.map +1 -1
- package/dist/repository/solid-base.repository.d.ts +10 -1
- package/dist/repository/solid-base.repository.d.ts.map +1 -1
- package/dist/repository/solid-base.repository.js +109 -0
- package/dist/repository/solid-base.repository.js.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.d.ts +2 -0
- package/dist/seeders/module-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/module-metadata-seeder.service.js +142 -91
- package/dist/seeders/module-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/module-test-data.service.d.ts.map +1 -1
- package/dist/seeders/module-test-data.service.js +3 -3
- package/dist/seeders/module-test-data.service.js.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.d.ts +1 -1
- package/dist/seeders/permission-metadata-seeder.service.d.ts.map +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js +1 -1
- package/dist/seeders/permission-metadata-seeder.service.js.map +1 -1
- package/dist/seeders/seed-data/solid-core-metadata.json +12 -25
- package/dist/services/authentication.service.d.ts +22 -8
- package/dist/services/authentication.service.d.ts.map +1 -1
- package/dist/services/authentication.service.js +228 -214
- package/dist/services/authentication.service.js.map +1 -1
- package/dist/services/chatter-message.service.d.ts +2 -0
- package/dist/services/chatter-message.service.d.ts.map +1 -1
- package/dist/services/chatter-message.service.js +18 -2
- package/dist/services/chatter-message.service.js.map +1 -1
- package/dist/services/crud-helper.service.d.ts +4 -0
- package/dist/services/crud-helper.service.d.ts.map +1 -1
- package/dist/services/crud-helper.service.js +66 -32
- package/dist/services/crud-helper.service.js.map +1 -1
- package/dist/services/crud.service.d.ts.map +1 -1
- package/dist/services/crud.service.js +7 -4
- package/dist/services/crud.service.js.map +1 -1
- package/dist/services/field-metadata.service.d.ts.map +1 -1
- package/dist/services/field-metadata.service.js.map +1 -1
- package/dist/services/file/disk-file.service.d.ts +0 -2
- package/dist/services/file/disk-file.service.d.ts.map +1 -1
- package/dist/services/file/disk-file.service.js +7 -16
- package/dist/services/file/disk-file.service.js.map +1 -1
- package/dist/services/file/index.d.ts +1 -0
- package/dist/services/file/index.d.ts.map +1 -1
- package/dist/services/file/index.js +1 -0
- package/dist/services/file/index.js.map +1 -1
- package/dist/services/file/storage-path-builder.d.ts +17 -0
- package/dist/services/file/storage-path-builder.d.ts.map +1 -0
- package/dist/{seeders/sms-template-seeder.service.js → services/file/storage-path-builder.js} +45 -35
- package/dist/services/file/storage-path-builder.js.map +1 -0
- package/dist/services/media.service.d.ts +1 -1
- package/dist/services/media.service.d.ts.map +1 -1
- package/dist/services/media.service.js +45 -6
- package/dist/services/media.service.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-s3-storage-provider.js.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.d.ts.map +1 -1
- package/dist/services/mediaStorageProviders/file-storage-provider.js +46 -7
- package/dist/services/mediaStorageProviders/file-storage-provider.js.map +1 -1
- package/dist/services/module-metadata.service.d.ts +4 -6
- package/dist/services/module-metadata.service.d.ts.map +1 -1
- package/dist/services/module-metadata.service.js +16 -14
- package/dist/services/module-metadata.service.js.map +1 -1
- package/dist/services/queues/common.d.ts +3 -0
- package/dist/services/queues/common.d.ts.map +1 -0
- package/dist/services/queues/common.js +39 -0
- package/dist/services/queues/common.js.map +1 -0
- package/dist/services/queues/database-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/database-publisher.service.js +3 -1
- package/dist/services/queues/database-publisher.service.js.map +1 -1
- package/dist/services/queues/database-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/database-subscriber.service.js +5 -2
- package/dist/services/queues/database-subscriber.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.d.ts.map +1 -1
- package/dist/services/queues/rabbitmq-publisher.service.js +13 -6
- package/dist/services/queues/rabbitmq-publisher.service.js.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.d.ts.map +1 -1
- package/dist/services/queues/rabbitmq-subscriber.service.js +9 -5
- package/dist/services/queues/rabbitmq-subscriber.service.js.map +1 -1
- package/dist/services/setting.service.d.ts +3 -2
- package/dist/services/setting.service.d.ts.map +1 -1
- package/dist/services/setting.service.js +7 -4
- package/dist/services/setting.service.js.map +1 -1
- package/dist/services/settings/default-settings-provider.service.d.ts +24 -2
- package/dist/services/settings/default-settings-provider.service.d.ts.map +1 -1
- package/dist/services/settings/default-settings-provider.service.js +8 -6
- package/dist/services/settings/default-settings-provider.service.js.map +1 -1
- package/dist/solid-core.module.d.ts +3 -1
- package/dist/solid-core.module.d.ts.map +1 -1
- package/dist/solid-core.module.js +49 -9
- package/dist/solid-core.module.js.map +1 -1
- package/dist/testing/__examples__/register-example-specs.d.ts +3 -0
- package/dist/testing/__examples__/register-example-specs.d.ts.map +1 -0
- package/dist/testing/__examples__/register-example-specs.js +8 -0
- package/dist/testing/__examples__/register-example-specs.js.map +1 -0
- package/dist/testing/__examples__/specs/custom-health.spec.d.ts +17 -0
- package/dist/testing/__examples__/specs/custom-health.spec.d.ts.map +1 -0
- package/dist/testing/__examples__/specs/custom-health.spec.js +30 -0
- package/dist/testing/__examples__/specs/custom-health.spec.js.map +1 -0
- package/dist/testing/adapters/api/api-adapter.d.ts +9 -0
- package/dist/testing/adapters/api/api-adapter.d.ts.map +1 -0
- package/dist/testing/adapters/api/api-adapter.js +76 -0
- package/dist/testing/adapters/api/api-adapter.js.map +1 -0
- package/dist/testing/adapters/api/api.types.d.ts +14 -0
- package/dist/testing/adapters/api/api.types.d.ts.map +1 -0
- package/dist/testing/adapters/api/api.types.js +3 -0
- package/dist/testing/adapters/api/api.types.js.map +1 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts +14 -0
- package/dist/testing/adapters/ui/playwright-adapter.d.ts.map +1 -0
- package/dist/testing/adapters/ui/playwright-adapter.js +80 -0
- package/dist/testing/adapters/ui/playwright-adapter.js.map +1 -0
- package/dist/testing/adapters/ui/ui.types.d.ts +5 -0
- package/dist/testing/adapters/ui/ui.types.d.ts.map +1 -0
- package/dist/testing/adapters/ui/ui.types.js +3 -0
- package/dist/testing/adapters/ui/ui.types.js.map +1 -0
- package/dist/testing/contracts/runtime-context.types.d.ts +35 -0
- package/dist/testing/contracts/runtime-context.types.d.ts.map +1 -0
- package/dist/testing/contracts/runtime-context.types.js +3 -0
- package/dist/testing/contracts/runtime-context.types.js.map +1 -0
- package/dist/testing/contracts/test-spec.types.d.ts +21 -0
- package/dist/testing/contracts/test-spec.types.d.ts.map +1 -0
- package/dist/testing/contracts/test-spec.types.js +3 -0
- package/dist/testing/contracts/test-spec.types.js.map +1 -0
- package/dist/testing/contracts/testing-metadata.types.d.ts +41 -0
- package/dist/testing/contracts/testing-metadata.types.d.ts.map +1 -0
- package/dist/testing/contracts/testing-metadata.types.js +3 -0
- package/dist/testing/contracts/testing-metadata.types.js.map +1 -0
- package/dist/testing/core/interpolation.d.ts +4 -0
- package/dist/testing/core/interpolation.d.ts.map +1 -0
- package/dist/testing/core/interpolation.js +180 -0
- package/dist/testing/core/interpolation.js.map +1 -0
- package/dist/testing/core/normalize-steps.d.ts +7 -0
- package/dist/testing/core/normalize-steps.d.ts.map +1 -0
- package/dist/testing/core/normalize-steps.js +20 -0
- package/dist/testing/core/normalize-steps.js.map +1 -0
- package/dist/testing/core/resource-store.d.ts +8 -0
- package/dist/testing/core/resource-store.d.ts.map +1 -0
- package/dist/testing/core/resource-store.js +41 -0
- package/dist/testing/core/resource-store.js.map +1 -0
- package/dist/testing/core/spec-registry.d.ts +10 -0
- package/dist/testing/core/spec-registry.d.ts.map +1 -0
- package/dist/testing/core/spec-registry.js +32 -0
- package/dist/testing/core/spec-registry.js.map +1 -0
- package/dist/testing/core/step-registry.d.ts +10 -0
- package/dist/testing/core/step-registry.d.ts.map +1 -0
- package/dist/testing/core/step-registry.js +26 -0
- package/dist/testing/core/step-registry.js.map +1 -0
- package/dist/testing/core/testing-engine.d.ts +14 -0
- package/dist/testing/core/testing-engine.d.ts.map +1 -0
- package/dist/testing/core/testing-engine.js +97 -0
- package/dist/testing/core/testing-engine.js.map +1 -0
- package/dist/testing/core/timeout.d.ts +2 -0
- package/dist/testing/core/timeout.d.ts.map +1 -0
- package/dist/testing/core/timeout.js +18 -0
- package/dist/testing/core/timeout.js.map +1 -0
- package/dist/testing/reporter/attachments.d.ts +4 -0
- package/dist/testing/reporter/attachments.d.ts.map +1 -0
- package/dist/testing/reporter/attachments.js +25 -0
- package/dist/testing/reporter/attachments.js.map +1 -0
- package/dist/testing/reporter/console-reporter.d.ts +45 -0
- package/dist/testing/reporter/console-reporter.d.ts.map +1 -0
- package/dist/testing/reporter/console-reporter.js +189 -0
- package/dist/testing/reporter/console-reporter.js.map +1 -0
- package/dist/testing/reporter/reporter.types.d.ts +37 -0
- package/dist/testing/reporter/reporter.types.d.ts.map +1 -0
- package/dist/testing/reporter/reporter.types.js +3 -0
- package/dist/testing/reporter/reporter.types.js.map +1 -0
- package/dist/testing/runner/lifecycle.d.ts +9 -0
- package/dist/testing/runner/lifecycle.d.ts.map +1 -0
- package/dist/testing/runner/lifecycle.js +33 -0
- package/dist/testing/runner/lifecycle.js.map +1 -0
- package/dist/testing/runner/run-from-metadata.d.ts +24 -0
- package/dist/testing/runner/run-from-metadata.d.ts.map +1 -0
- package/dist/testing/runner/run-from-metadata.js +70 -0
- package/dist/testing/runner/run-from-metadata.js.map +1 -0
- package/dist/testing/runner/scenario-filter.d.ts +9 -0
- package/dist/testing/runner/scenario-filter.d.ts.map +1 -0
- package/dist/testing/runner/scenario-filter.js +22 -0
- package/dist/testing/runner/scenario-filter.js.map +1 -0
- package/dist/testing/steps/api/auth.step.d.ts +3 -0
- package/dist/testing/steps/api/auth.step.d.ts.map +1 -0
- package/dist/testing/steps/api/auth.step.js +38 -0
- package/dist/testing/steps/api/auth.step.js.map +1 -0
- package/dist/testing/steps/api/index.d.ts +3 -0
- package/dist/testing/steps/api/index.d.ts.map +1 -0
- package/dist/testing/steps/api/index.js +10 -0
- package/dist/testing/steps/api/index.js.map +1 -0
- package/dist/testing/steps/api/request.step.d.ts +3 -0
- package/dist/testing/steps/api/request.step.d.ts.map +1 -0
- package/dist/testing/steps/api/request.step.js +281 -0
- package/dist/testing/steps/api/request.step.js.map +1 -0
- package/dist/testing/steps/assert/http.step.d.ts +3 -0
- package/dist/testing/steps/assert/http.step.d.ts.map +1 -0
- package/dist/testing/steps/assert/http.step.js +27 -0
- package/dist/testing/steps/assert/http.step.js.map +1 -0
- package/dist/testing/steps/assert/index.d.ts +3 -0
- package/dist/testing/steps/assert/index.d.ts.map +1 -0
- package/dist/testing/steps/assert/index.js +12 -0
- package/dist/testing/steps/assert/index.js.map +1 -0
- package/dist/testing/steps/assert/jsonpath.step.d.ts +3 -0
- package/dist/testing/steps/assert/jsonpath.step.d.ts.map +1 -0
- package/dist/testing/steps/assert/jsonpath.step.js +40 -0
- package/dist/testing/steps/assert/jsonpath.step.js.map +1 -0
- package/dist/testing/steps/assert/primitives.step.d.ts +3 -0
- package/dist/testing/steps/assert/primitives.step.d.ts.map +1 -0
- package/dist/testing/steps/assert/primitives.step.js +43 -0
- package/dist/testing/steps/assert/primitives.step.js.map +1 -0
- package/dist/testing/steps/test/index.d.ts +3 -0
- package/dist/testing/steps/test/index.d.ts.map +1 -0
- package/dist/testing/steps/test/index.js +8 -0
- package/dist/testing/steps/test/index.js.map +1 -0
- package/dist/testing/steps/test/test-spec.step.d.ts +3 -0
- package/dist/testing/steps/test/test-spec.step.d.ts.map +1 -0
- package/dist/testing/steps/test/test-spec.step.js +41 -0
- package/dist/testing/steps/test/test-spec.step.js.map +1 -0
- package/dist/testing/steps/ui/actions.step.d.ts +3 -0
- package/dist/testing/steps/ui/actions.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/actions.step.js +31 -0
- package/dist/testing/steps/ui/actions.step.js.map +1 -0
- package/dist/testing/steps/ui/assertions.step.d.ts +3 -0
- package/dist/testing/steps/ui/assertions.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/assertions.step.js +41 -0
- package/dist/testing/steps/ui/assertions.step.js.map +1 -0
- package/dist/testing/steps/ui/form.step.d.ts +3 -0
- package/dist/testing/steps/ui/form.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/form.step.js +34 -0
- package/dist/testing/steps/ui/form.step.js.map +1 -0
- package/dist/testing/steps/ui/index.d.ts +3 -0
- package/dist/testing/steps/ui/index.d.ts.map +1 -0
- package/dist/testing/steps/ui/index.js +14 -0
- package/dist/testing/steps/ui/index.js.map +1 -0
- package/dist/testing/steps/ui/navigation.step.d.ts +3 -0
- package/dist/testing/steps/ui/navigation.step.d.ts.map +1 -0
- package/dist/testing/steps/ui/navigation.step.js +39 -0
- package/dist/testing/steps/ui/navigation.step.js.map +1 -0
- package/dist/testing/steps/util/index.d.ts +3 -0
- package/dist/testing/steps/util/index.d.ts.map +1 -0
- package/dist/testing/steps/util/index.js +12 -0
- package/dist/testing/steps/util/index.js.map +1 -0
- package/dist/testing/steps/util/log.step.d.ts +3 -0
- package/dist/testing/steps/util/log.step.d.ts.map +1 -0
- package/dist/testing/steps/util/log.step.js +18 -0
- package/dist/testing/steps/util/log.step.js.map +1 -0
- package/dist/testing/steps/util/require.step.d.ts +3 -0
- package/dist/testing/steps/util/require.step.d.ts.map +1 -0
- package/dist/testing/steps/util/require.step.js +16 -0
- package/dist/testing/steps/util/require.step.js.map +1 -0
- package/dist/testing/steps/util/sleep.step.d.ts +3 -0
- package/dist/testing/steps/util/sleep.step.d.ts.map +1 -0
- package/dist/testing/steps/util/sleep.step.js +13 -0
- package/dist/testing/steps/util/sleep.step.js.map +1 -0
- package/docs/test-data-workflow.md +51 -11
- package/package.json +10 -2
- package/src/commands/run-tests.command.ts +278 -0
- package/src/commands/test-data.command.ts +26 -26
- package/src/commands/test.command.ts +14 -0
- package/src/constants/error-messages.ts +1 -0
- package/src/constants.ts +3 -3
- package/src/controllers/role-metadata.controller.ts +26 -18
- package/src/controllers/service.controller.ts +58 -59
- package/src/dtos/basic-filters.dto.ts +0 -2
- package/src/dtos/create-email-template.dto.ts +7 -0
- package/src/dtos/create-list-of-values.dto.ts +7 -0
- package/src/dtos/create-menu-item-metadata.dto.ts +12 -1
- package/src/dtos/create-role-metadata.dto.ts +9 -0
- package/src/dtos/create-scheduled-job.dto.ts +14 -0
- package/src/dtos/create-security-rule.dto.ts +6 -0
- package/src/dtos/create-sms-template.dto.ts +6 -0
- package/src/dtos/create-user.dto.ts +1 -0
- package/src/dtos/create-view-metadata.dto.ts +11 -0
- package/src/dtos/otp-sign-in.dto.ts +3 -3
- package/src/dtos/otp-sign-up.dto.ts +3 -3
- package/src/dtos/resolve-s3-url.dto.ts +2 -12
- package/src/dtos/sign-up.dto.ts +0 -2
- package/src/dtos/update-email-template.dto.ts +6 -0
- package/src/dtos/update-list-of-values.dto.ts +8 -0
- package/src/dtos/update-menu-item-metadata.dto.ts +12 -0
- package/src/dtos/update-scheduled-job.dto.ts +15 -0
- package/src/dtos/update-security-rule.dto.ts +7 -0
- package/src/dtos/update-sms-template.dto.ts +32 -32
- package/src/dtos/update-view-metadata.dto.ts +12 -0
- package/src/entities/user.entity.ts +3 -0
- package/src/helpers/field-crud-managers/ManyToManyRelationFieldCrudManager.ts +43 -32
- package/src/helpers/field-crud-managers/OneToManyRelationFieldCrudManager.ts +45 -33
- package/src/helpers/security.helper.ts +1 -1
- package/src/index.ts +3 -4
- package/src/repository/solid-base.repository.ts +172 -1
- package/src/seeders/module-metadata-seeder.service.ts +191 -150
- package/src/seeders/module-test-data.service.ts +5 -3
- package/src/seeders/permission-metadata-seeder.service.ts +1 -4
- package/src/seeders/seed-data/solid-core-metadata.json +12 -25
- package/src/services/authentication.service.ts +268 -266
- package/src/services/chatter-message.service.ts +18 -1
- package/src/services/crud-helper.service.ts +79 -36
- package/src/services/crud.service.ts +10 -4
- package/src/services/field-metadata.service.ts +0 -71
- package/src/services/file/disk-file.service.ts +8 -18
- package/src/services/file/index.ts +1 -0
- package/src/services/file/storage-path-builder.ts +56 -0
- package/src/services/media.service.ts +13 -7
- package/src/services/mediaStorageProviders/file-s3-storage-provider.ts +1 -1
- package/src/services/mediaStorageProviders/file-storage-provider.ts +13 -8
- package/src/services/module-metadata.service.ts +18 -15
- package/src/services/queues/common.ts +75 -0
- package/src/services/queues/database-publisher.service.ts +4 -1
- package/src/services/queues/database-subscriber.service.ts +5 -3
- package/src/services/queues/rabbitmq-publisher.service.ts +17 -7
- package/src/services/queues/rabbitmq-subscriber.service.ts +9 -5
- package/src/services/setting.service.ts +5 -3
- package/src/services/settings/default-settings-provider.service.ts +5 -3
- package/src/solid-core.module.ts +20 -12
- package/src/testing/README.md +364 -0
- package/src/testing/__examples__/register-example-specs.ts +6 -0
- package/src/testing/__examples__/specs/custom-health.spec.ts +29 -0
- package/src/testing/__examples__/testing.sample.json +82 -0
- package/src/testing/adapters/api/api-adapter.ts +85 -0
- package/src/testing/adapters/api/api.types.ts +15 -0
- package/src/testing/adapters/ui/playwright-adapter.ts +54 -0
- package/src/testing/adapters/ui/ui.types.ts +4 -0
- package/src/testing/contracts/runtime-context.types.ts +36 -0
- package/src/testing/contracts/test-spec.types.ts +24 -0
- package/src/testing/contracts/testing-metadata.types.ts +46 -0
- package/src/testing/core/interpolation.ts +189 -0
- package/src/testing/core/normalize-steps.ts +21 -0
- package/src/testing/core/resource-store.ts +38 -0
- package/src/testing/core/spec-registry.ts +33 -0
- package/src/testing/core/step-registry.ts +27 -0
- package/src/testing/core/testing-engine.ts +127 -0
- package/src/testing/core/timeout.ts +19 -0
- package/src/testing/reporter/attachments.ts +25 -0
- package/src/testing/reporter/console-reporter.ts +229 -0
- package/src/testing/reporter/reporter.types.ts +36 -0
- package/src/testing/runner/lifecycle.ts +31 -0
- package/src/testing/runner/run-from-metadata.ts +87 -0
- package/src/testing/runner/scenario-filter.ts +33 -0
- package/src/testing/steps/api/auth.step.ts +66 -0
- package/src/testing/steps/api/index.ts +10 -0
- package/src/testing/steps/api/request.step.ts +358 -0
- package/src/testing/steps/assert/http.step.ts +33 -0
- package/src/testing/steps/assert/index.ts +12 -0
- package/src/testing/steps/assert/jsonpath.step.ts +50 -0
- package/src/testing/steps/assert/primitives.step.ts +69 -0
- package/src/testing/steps/test/index.ts +8 -0
- package/src/testing/steps/test/test-spec.step.ts +52 -0
- package/src/testing/steps/ui/actions.step.ts +36 -0
- package/src/testing/steps/ui/assertions.step.ts +54 -0
- package/src/testing/steps/ui/form.step.ts +39 -0
- package/src/testing/steps/ui/index.ts +12 -0
- package/src/testing/steps/ui/navigation.step.ts +53 -0
- package/src/testing/steps/util/index.ts +10 -0
- package/src/testing/steps/util/log.step.ts +19 -0
- package/src/testing/steps/util/require.step.ts +16 -0
- package/src/testing/steps/util/sleep.step.ts +15 -0
- package/tsconfig.json +35 -25
- package/tsconfig.tests.json +14 -0
- package/dist/passport-strategies/local.strategy.d.ts +0 -15
- package/dist/passport-strategies/local.strategy.d.ts.map +0 -1
- package/dist/passport-strategies/local.strategy.js +0 -44
- package/dist/passport-strategies/local.strategy.js.map +0 -1
- package/dist/seeders/email-template-seeder.service.d.ts +0 -10
- package/dist/seeders/email-template-seeder.service.d.ts.map +0 -1
- package/dist/seeders/email-template-seeder.service.js +0 -84
- package/dist/seeders/email-template-seeder.service.js.map +0 -1
- package/dist/seeders/sms-template-seeder.service.d.ts +0 -10
- package/dist/seeders/sms-template-seeder.service.d.ts.map +0 -1
- package/dist/seeders/sms-template-seeder.service.js.map +0 -1
- package/dist/seeders/user-seeder.service.d.ts +0 -10
- package/dist/seeders/user-seeder.service.d.ts.map +0 -1
- package/dist/seeders/user-seeder.service.js +0 -44
- package/dist/seeders/user-seeder.service.js.map +0 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/src/passport-strategies/local.strategy.ts +0 -28
- package/src/seeders/email-template-seeder.service.ts +0 -49
- package/src/seeders/sms-template-seeder.service.ts +0 -50
- package/src/seeders/user-seeder.service.ts +0 -33
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { Reporter } from "./reporter.types";
|
|
2
|
+
import type { OpStep } from "../contracts/testing-metadata.types";
|
|
3
|
+
export declare class ConsoleReporter implements Reporter {
|
|
4
|
+
onScenarioStart(scenario: {
|
|
5
|
+
id: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
}): void;
|
|
8
|
+
onScenarioEnd(scenario: {
|
|
9
|
+
id: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
}, result: {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
error?: unknown;
|
|
14
|
+
durationMs: number;
|
|
15
|
+
}): void;
|
|
16
|
+
onStepStart(args: {
|
|
17
|
+
scenarioId: string;
|
|
18
|
+
phase: string;
|
|
19
|
+
step: OpStep;
|
|
20
|
+
}): void;
|
|
21
|
+
onStepEnd(args: {
|
|
22
|
+
scenarioId: string;
|
|
23
|
+
phase: string;
|
|
24
|
+
step: OpStep;
|
|
25
|
+
ok: boolean;
|
|
26
|
+
error?: unknown;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
}): void;
|
|
29
|
+
onSpecResult(args: {
|
|
30
|
+
scenarioId: string;
|
|
31
|
+
specId: string;
|
|
32
|
+
stepName?: string;
|
|
33
|
+
result: {
|
|
34
|
+
ok: boolean;
|
|
35
|
+
details?: Record<string, any>;
|
|
36
|
+
};
|
|
37
|
+
}): void;
|
|
38
|
+
attach(args: {
|
|
39
|
+
scenarioId: string;
|
|
40
|
+
name: string;
|
|
41
|
+
contentType: string;
|
|
42
|
+
data: Buffer | string;
|
|
43
|
+
}): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=console-reporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-reporter.d.ts","sourceRoot":"","sources":["../../../src/testing/reporter/console-reporter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAgJlE,qBAAa,eAAgB,YAAW,QAAQ;IAC9C,eAAe,CAAC,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAK9D,aAAa,CACX,QAAQ,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,EACvC,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI;IAMP,WAAW,CAAC,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI;IAMR,SAAS,CAAC,IAAI,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI;IAwBR,YAAY,CAAC,IAAI,EAAE;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE;YAAE,EAAE,EAAE,OAAO,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;SAAE,CAAC;KACxD,GAAG,IAAI;IAQR,MAAM,CAAC,IAAI,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,GAAG,IAAI;CAOT"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ConsoleReporter = void 0;
|
|
4
|
+
const INDENT = " ";
|
|
5
|
+
const STEP_INDENT = INDENT;
|
|
6
|
+
const MAX_DETAIL_LEN = 140;
|
|
7
|
+
function formatError(err) {
|
|
8
|
+
if (!err)
|
|
9
|
+
return "";
|
|
10
|
+
if (err instanceof Error) {
|
|
11
|
+
return err.stack || err.message;
|
|
12
|
+
}
|
|
13
|
+
return String(err);
|
|
14
|
+
}
|
|
15
|
+
function indentLines(text, indent) {
|
|
16
|
+
return text
|
|
17
|
+
.split("\n")
|
|
18
|
+
.map((line) => (line.length ? `${indent}${line}` : indent))
|
|
19
|
+
.join("\n");
|
|
20
|
+
}
|
|
21
|
+
function truncate(value, maxLen = MAX_DETAIL_LEN) {
|
|
22
|
+
if (value.length <= maxLen)
|
|
23
|
+
return value;
|
|
24
|
+
return `${value.slice(0, maxLen - 1)}…`;
|
|
25
|
+
}
|
|
26
|
+
function formatHttpBody(body) {
|
|
27
|
+
if (body === null || body === undefined)
|
|
28
|
+
return "";
|
|
29
|
+
if (typeof body === "string") {
|
|
30
|
+
const trimmed = body.trim();
|
|
31
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.stringify(JSON.parse(trimmed), null, 2);
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return body;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return body;
|
|
40
|
+
}
|
|
41
|
+
try {
|
|
42
|
+
return JSON.stringify(body, null, 2);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return String(body);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function withoutQuery(url) {
|
|
49
|
+
const idx = url.indexOf("?");
|
|
50
|
+
return idx === -1 ? url : url.slice(0, idx);
|
|
51
|
+
}
|
|
52
|
+
function maskIfSensitive(value, hints) {
|
|
53
|
+
const lower = hints.join(" ").toLowerCase();
|
|
54
|
+
if (lower.includes("password") || lower.includes("pwd")) {
|
|
55
|
+
return "••••••";
|
|
56
|
+
}
|
|
57
|
+
return value;
|
|
58
|
+
}
|
|
59
|
+
function stepDetails(step) {
|
|
60
|
+
const withObj = (step.with ?? {});
|
|
61
|
+
switch (step.op) {
|
|
62
|
+
case "api.request": {
|
|
63
|
+
const method = String(withObj.method ?? "").toUpperCase();
|
|
64
|
+
const url = typeof withObj.url === "string" ? withoutQuery(withObj.url) : "";
|
|
65
|
+
if (!method && !url)
|
|
66
|
+
return undefined;
|
|
67
|
+
return `${method} ${url}`.trim();
|
|
68
|
+
}
|
|
69
|
+
case "api.auth.bearerFromLogin": {
|
|
70
|
+
const url = typeof withObj.url === "string" ? withoutQuery(withObj.url) : "";
|
|
71
|
+
return url ? `url: ${url}` : undefined;
|
|
72
|
+
}
|
|
73
|
+
case "ui.goto": {
|
|
74
|
+
return withObj.url ? `url: ${withObj.url}` : undefined;
|
|
75
|
+
}
|
|
76
|
+
case "ui.click":
|
|
77
|
+
case "ui.expectVisible": {
|
|
78
|
+
return withObj.selector ? `selector: ${withObj.selector}` : undefined;
|
|
79
|
+
}
|
|
80
|
+
case "ui.fill":
|
|
81
|
+
case "ui.select": {
|
|
82
|
+
const selector = withObj.selector ? `selector: ${withObj.selector}` : "";
|
|
83
|
+
const value = withObj.value !== undefined
|
|
84
|
+
? `value: ${maskIfSensitive(String(withObj.value), [String(withObj.selector ?? ""), String(step.op)])}`
|
|
85
|
+
: "";
|
|
86
|
+
return [selector, value].filter(Boolean).join(", ") || undefined;
|
|
87
|
+
}
|
|
88
|
+
case "ui.press": {
|
|
89
|
+
const selector = withObj.selector ? `selector: ${withObj.selector}` : "";
|
|
90
|
+
const key = withObj.key ? `key: ${withObj.key}` : "";
|
|
91
|
+
return [selector, key].filter(Boolean).join(", ") || undefined;
|
|
92
|
+
}
|
|
93
|
+
case "ui.expectUrl": {
|
|
94
|
+
const equals = withObj.equals ? `equals: ${withObj.equals}` : "";
|
|
95
|
+
const contains = withObj.contains ? `contains: ${withObj.contains}` : "";
|
|
96
|
+
return [equals, contains].filter(Boolean).join(", ") || undefined;
|
|
97
|
+
}
|
|
98
|
+
case "ui.expectText": {
|
|
99
|
+
const selector = withObj.selector ? `selector: ${withObj.selector}` : "";
|
|
100
|
+
const equals = withObj.equals ? `equals: ${truncate(String(withObj.equals))}` : "";
|
|
101
|
+
const contains = withObj.contains ? `contains: ${truncate(String(withObj.contains))}` : "";
|
|
102
|
+
return [selector, equals, contains].filter(Boolean).join(", ") || undefined;
|
|
103
|
+
}
|
|
104
|
+
case "assert.httpStatus": {
|
|
105
|
+
return withObj.is !== undefined ? `status: ${withObj.is}` : undefined;
|
|
106
|
+
}
|
|
107
|
+
case "assert.jsonPath": {
|
|
108
|
+
const path = withObj.path ? `path: ${withObj.path}` : "";
|
|
109
|
+
const equals = withObj.equals !== undefined ? `equals: ${truncate(String(withObj.equals))}` : "";
|
|
110
|
+
return [path, equals].filter(Boolean).join(", ") || undefined;
|
|
111
|
+
}
|
|
112
|
+
case "assert.contains":
|
|
113
|
+
case "assert.equals":
|
|
114
|
+
case "assert.matches": {
|
|
115
|
+
const expected = withObj.expected !== undefined
|
|
116
|
+
? `expected: ${truncate(String(withObj.expected))}`
|
|
117
|
+
: withObj.pattern
|
|
118
|
+
? `pattern: ${truncate(String(withObj.pattern))}`
|
|
119
|
+
: withObj.equals !== undefined
|
|
120
|
+
? `equals: ${truncate(String(withObj.equals))}`
|
|
121
|
+
: "";
|
|
122
|
+
return expected || undefined;
|
|
123
|
+
}
|
|
124
|
+
case "util.sleep": {
|
|
125
|
+
return withObj.ms !== undefined ? `ms: ${withObj.ms}` : undefined;
|
|
126
|
+
}
|
|
127
|
+
case "util.log": {
|
|
128
|
+
return withObj.message ? `message: ${truncate(String(withObj.message))}` : undefined;
|
|
129
|
+
}
|
|
130
|
+
default:
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
function formatStepLabel(step) {
|
|
135
|
+
const base = step.name ? `${step.op} (${step.name})` : step.op;
|
|
136
|
+
const details = stepDetails(step);
|
|
137
|
+
if (!details)
|
|
138
|
+
return base;
|
|
139
|
+
return `${base} (${details})`;
|
|
140
|
+
}
|
|
141
|
+
class ConsoleReporter {
|
|
142
|
+
onScenarioStart(scenario) {
|
|
143
|
+
const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
|
|
144
|
+
console.log(`\n▶ Scenario: ${label}`);
|
|
145
|
+
}
|
|
146
|
+
onScenarioEnd(scenario, result) {
|
|
147
|
+
const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;
|
|
148
|
+
const status = result.ok ? "✔" : "✖";
|
|
149
|
+
console.log(`${status} Scenario: ${label} (${result.durationMs}ms)`);
|
|
150
|
+
}
|
|
151
|
+
onStepStart(args) {
|
|
152
|
+
const label = formatStepLabel(args.step);
|
|
153
|
+
const phase = args.phase.toUpperCase();
|
|
154
|
+
console.log(`${STEP_INDENT}↳ ${phase} ${label}`);
|
|
155
|
+
}
|
|
156
|
+
onStepEnd(args) {
|
|
157
|
+
const label = formatStepLabel(args.step);
|
|
158
|
+
const phase = args.phase.toUpperCase();
|
|
159
|
+
const status = args.ok ? "✔" : "✖";
|
|
160
|
+
console.log(`${STEP_INDENT}${status} ${phase} ${label} (${args.durationMs}ms)`);
|
|
161
|
+
if (!args.ok && args.error) {
|
|
162
|
+
const details = formatError(args.error);
|
|
163
|
+
console.error(indentLines(details, `${STEP_INDENT}${INDENT}`));
|
|
164
|
+
const httpBody = args.error?.httpResponseBody;
|
|
165
|
+
if (httpBody !== undefined) {
|
|
166
|
+
const formatted = formatHttpBody(httpBody);
|
|
167
|
+
const bodyText = formatted.length ? formatted : "<empty>";
|
|
168
|
+
console.error(indentLines(`HTTP Response Body:\n${bodyText}`, `${STEP_INDENT}${INDENT}`));
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
onSpecResult(args) {
|
|
173
|
+
console.log(`${INDENT}↳ SPEC ${args.specId} ok=${args.result.ok}`);
|
|
174
|
+
if (args.result.details) {
|
|
175
|
+
const details = JSON.stringify(args.result.details, null, 2);
|
|
176
|
+
console.log(indentLines(details, `${INDENT}${INDENT}`));
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
attach(args) {
|
|
180
|
+
const header = `ATTACH ${args.name} (${args.contentType})`;
|
|
181
|
+
console.log(indentLines(header, `${STEP_INDENT}${INDENT}`));
|
|
182
|
+
const dataText = Buffer.isBuffer(args.data) ? args.data.toString("utf8") : String(args.data ?? "");
|
|
183
|
+
if (!dataText.length)
|
|
184
|
+
return;
|
|
185
|
+
console.log(indentLines(dataText, `${STEP_INDENT}${INDENT}${INDENT}`));
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
exports.ConsoleReporter = ConsoleReporter;
|
|
189
|
+
//# sourceMappingURL=console-reporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"console-reporter.js","sourceRoot":"","sources":["../../../src/testing/reporter/console-reporter.ts"],"names":[],"mappings":"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","sourcesContent":["// Purpose: Basic console reporter implementation.\n\nimport type { Reporter } from \"./reporter.types\";\nimport type { OpStep } from \"../contracts/testing-metadata.types\";\n\nconst INDENT = \" \";\nconst STEP_INDENT = INDENT;\nconst MAX_DETAIL_LEN = 140;\n\nfunction formatError(err: unknown): string {\n if (!err) return \"\";\n if (err instanceof Error) {\n return err.stack || err.message;\n }\n return String(err);\n}\n\nfunction indentLines(text: string, indent: string): string {\n return text\n .split(\"\\n\")\n .map((line) => (line.length ? `${indent}${line}` : indent))\n .join(\"\\n\");\n}\n\nfunction truncate(value: string, maxLen: number = MAX_DETAIL_LEN): string {\n if (value.length <= maxLen) return value;\n return `${value.slice(0, maxLen - 1)}…`;\n}\n\nfunction formatHttpBody(body: unknown): string {\n if (body === null || body === undefined) return \"\";\n if (typeof body === \"string\") {\n const trimmed = body.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n try {\n return JSON.stringify(JSON.parse(trimmed), null, 2);\n } catch {\n return body;\n }\n }\n return body;\n }\n try {\n return JSON.stringify(body, null, 2);\n } catch {\n return String(body);\n }\n}\n\nfunction withoutQuery(url: string): string {\n const idx = url.indexOf(\"?\");\n return idx === -1 ? url : url.slice(0, idx);\n}\n\nfunction maskIfSensitive(value: string, hints: string[]): string {\n const lower = hints.join(\" \").toLowerCase();\n if (lower.includes(\"password\") || lower.includes(\"pwd\")) {\n return \"••••••\";\n }\n return value;\n}\n\nfunction stepDetails(step: OpStep): string | undefined {\n const withObj = (step.with ?? {}) as Record<string, any>;\n\n switch (step.op) {\n case \"api.request\": {\n const method = String(withObj.method ?? \"\").toUpperCase();\n const url = typeof withObj.url === \"string\" ? withoutQuery(withObj.url) : \"\";\n if (!method && !url) return undefined;\n return `${method} ${url}`.trim();\n }\n case \"api.auth.bearerFromLogin\": {\n const url = typeof withObj.url === \"string\" ? withoutQuery(withObj.url) : \"\";\n return url ? `url: ${url}` : undefined;\n }\n case \"ui.goto\": {\n return withObj.url ? `url: ${withObj.url}` : undefined;\n }\n case \"ui.click\":\n case \"ui.expectVisible\": {\n return withObj.selector ? `selector: ${withObj.selector}` : undefined;\n }\n case \"ui.fill\":\n case \"ui.select\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const value =\n withObj.value !== undefined\n ? `value: ${maskIfSensitive(String(withObj.value), [String(withObj.selector ?? \"\"), String(step.op)])}`\n : \"\";\n return [selector, value].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.press\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const key = withObj.key ? `key: ${withObj.key}` : \"\";\n return [selector, key].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.expectUrl\": {\n const equals = withObj.equals ? `equals: ${withObj.equals}` : \"\";\n const contains = withObj.contains ? `contains: ${withObj.contains}` : \"\";\n return [equals, contains].filter(Boolean).join(\", \") || undefined;\n }\n case \"ui.expectText\": {\n const selector = withObj.selector ? `selector: ${withObj.selector}` : \"\";\n const equals = withObj.equals ? `equals: ${truncate(String(withObj.equals))}` : \"\";\n const contains = withObj.contains ? `contains: ${truncate(String(withObj.contains))}` : \"\";\n return [selector, equals, contains].filter(Boolean).join(\", \") || undefined;\n }\n case \"assert.httpStatus\": {\n return withObj.is !== undefined ? `status: ${withObj.is}` : undefined;\n }\n case \"assert.jsonPath\": {\n const path = withObj.path ? `path: ${withObj.path}` : \"\";\n const equals = withObj.equals !== undefined ? `equals: ${truncate(String(withObj.equals))}` : \"\";\n return [path, equals].filter(Boolean).join(\", \") || undefined;\n }\n case \"assert.contains\":\n case \"assert.equals\":\n case \"assert.matches\": {\n const expected =\n withObj.expected !== undefined\n ? `expected: ${truncate(String(withObj.expected))}`\n : withObj.pattern\n ? `pattern: ${truncate(String(withObj.pattern))}`\n : withObj.equals !== undefined\n ? `equals: ${truncate(String(withObj.equals))}`\n : \"\";\n return expected || undefined;\n }\n case \"util.sleep\": {\n return withObj.ms !== undefined ? `ms: ${withObj.ms}` : undefined;\n }\n case \"util.log\": {\n return withObj.message ? `message: ${truncate(String(withObj.message))}` : undefined;\n }\n default:\n return undefined;\n }\n}\n\nfunction formatStepLabel(step: OpStep): string {\n const base = step.name ? `${step.op} (${step.name})` : step.op;\n const details = stepDetails(step);\n if (!details) return base;\n return `${base} (${details})`;\n}\n\nexport class ConsoleReporter implements Reporter {\n onScenarioStart(scenario: { id: string; name?: string }): void {\n const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;\n console.log(`\\n▶ Scenario: ${label}`);\n }\n\n onScenarioEnd(\n scenario: { id: string; name?: string },\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void {\n const label = scenario.name ? `${scenario.id} (${scenario.name})` : scenario.id;\n const status = result.ok ? \"✔\" : \"✖\";\n console.log(`${status} Scenario: ${label} (${result.durationMs}ms)`);\n }\n\n onStepStart(args: {\n scenarioId: string;\n phase: string;\n step: OpStep;\n }): void {\n const label = formatStepLabel(args.step);\n const phase = args.phase.toUpperCase();\n console.log(`${STEP_INDENT}↳ ${phase} ${label}`);\n }\n\n onStepEnd(args: {\n scenarioId: string;\n phase: string;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void {\n const label = formatStepLabel(args.step);\n const phase = args.phase.toUpperCase();\n const status = args.ok ? \"✔\" : \"✖\";\n console.log(\n `${STEP_INDENT}${status} ${phase} ${label} (${args.durationMs}ms)`\n );\n if (!args.ok && args.error) {\n const details = formatError(args.error);\n console.error(indentLines(details, `${STEP_INDENT}${INDENT}`));\n const httpBody = (args.error as any)?.httpResponseBody;\n if (httpBody !== undefined) {\n const formatted = formatHttpBody(httpBody);\n const bodyText = formatted.length ? formatted : \"<empty>\";\n console.error(\n indentLines(\n `HTTP Response Body:\\n${bodyText}`,\n `${STEP_INDENT}${INDENT}`,\n ),\n );\n }\n }\n }\n\n onSpecResult(args: {\n scenarioId: string;\n specId: string;\n stepName?: string;\n result: { ok: boolean; details?: Record<string, any> };\n }): void {\n console.log(`${INDENT}↳ SPEC ${args.specId} ok=${args.result.ok}`);\n if (args.result.details) {\n const details = JSON.stringify(args.result.details, null, 2);\n console.log(indentLines(details, `${INDENT}${INDENT}`));\n }\n }\n\n attach(args: {\n scenarioId: string;\n name: string;\n contentType: string;\n data: Buffer | string;\n }): void {\n const header = `ATTACH ${args.name} (${args.contentType})`;\n console.log(indentLines(header, `${STEP_INDENT}${INDENT}`));\n const dataText = Buffer.isBuffer(args.data) ? args.data.toString(\"utf8\") : String(args.data ?? \"\");\n if (!dataText.length) return;\n console.log(indentLines(dataText, `${STEP_INDENT}${INDENT}${INDENT}`));\n }\n}\n"]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { StepPhase } from "../contracts/runtime-context.types";
|
|
2
|
+
import type { OpStep, ScenarioSpec } from "../contracts/testing-metadata.types";
|
|
3
|
+
import type { SolidTestSpecResult } from "../contracts/test-spec.types";
|
|
4
|
+
export interface Reporter {
|
|
5
|
+
onScenarioStart(scenario: ScenarioSpec): void;
|
|
6
|
+
onScenarioEnd(scenario: ScenarioSpec, result: {
|
|
7
|
+
ok: boolean;
|
|
8
|
+
error?: unknown;
|
|
9
|
+
durationMs: number;
|
|
10
|
+
}): void;
|
|
11
|
+
onStepStart(args: {
|
|
12
|
+
scenarioId: string;
|
|
13
|
+
phase: StepPhase;
|
|
14
|
+
step: OpStep;
|
|
15
|
+
}): void;
|
|
16
|
+
onStepEnd(args: {
|
|
17
|
+
scenarioId: string;
|
|
18
|
+
phase: StepPhase;
|
|
19
|
+
step: OpStep;
|
|
20
|
+
ok: boolean;
|
|
21
|
+
error?: unknown;
|
|
22
|
+
durationMs: number;
|
|
23
|
+
}): void;
|
|
24
|
+
onSpecResult?(args: {
|
|
25
|
+
scenarioId: string;
|
|
26
|
+
specId: string;
|
|
27
|
+
stepName?: string;
|
|
28
|
+
result: SolidTestSpecResult;
|
|
29
|
+
}): void;
|
|
30
|
+
attach?(args: {
|
|
31
|
+
scenarioId: string;
|
|
32
|
+
name: string;
|
|
33
|
+
contentType: string;
|
|
34
|
+
data: Buffer | string;
|
|
35
|
+
}): void;
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=reporter.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.types.d.ts","sourceRoot":"","sources":["../../../src/testing/reporter/reporter.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAExE,MAAM,WAAW,QAAQ;IACvB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IAC9C,aAAa,CACX,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI,CAAC;IACR,WAAW,CAAC,IAAI,EAAE;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,GAAG,IAAI,CAAC;IACT,SAAS,CAAC,IAAI,EAAE;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,SAAS,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,OAAO,CAAC;QACZ,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,IAAI,CAAC;IACT,YAAY,CAAC,CAAC,IAAI,EAAE;QAClB,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,mBAAmB,CAAC;KAC7B,GAAG,IAAI,CAAC;IACT,MAAM,CAAC,CAAC,IAAI,EAAE;QACZ,UAAU,EAAE,MAAM,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,GAAG,IAAI,CAAC;CACV"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reporter.types.js","sourceRoot":"","sources":["../../../src/testing/reporter/reporter.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { StepPhase } from \"../contracts/runtime-context.types\";\nimport type { OpStep, ScenarioSpec } from \"../contracts/testing-metadata.types\";\nimport type { SolidTestSpecResult } from \"../contracts/test-spec.types\";\n\nexport interface Reporter {\n onScenarioStart(scenario: ScenarioSpec): void;\n onScenarioEnd(\n scenario: ScenarioSpec,\n result: { ok: boolean; error?: unknown; durationMs: number },\n ): void;\n onStepStart(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n }): void;\n onStepEnd(args: {\n scenarioId: string;\n phase: StepPhase;\n step: OpStep;\n ok: boolean;\n error?: unknown;\n durationMs: number;\n }): void;\n onSpecResult?(args: {\n scenarioId: string;\n specId: string;\n stepName?: string;\n result: SolidTestSpecResult;\n }): void;\n attach?(args: {\n scenarioId: string;\n name: string;\n contentType: string;\n data: Buffer | string;\n }): void;\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { TestContext } from "../contracts/runtime-context.types";
|
|
2
|
+
import type { ScenarioSpec } from "../contracts/testing-metadata.types";
|
|
3
|
+
type StartedFlag = {
|
|
4
|
+
value: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function scenarioNeedsUi(scenario: ScenarioSpec): boolean;
|
|
7
|
+
export declare function ensureUiStarted(ctxBase: Omit<TestContext, "scenarioId" | "scenarioType" | "params">, startedFlag: StartedFlag): Promise<void>;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/testing/runner/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,KAAK,EAAU,YAAY,EAAa,MAAM,qCAAqC,CAAC;AAE3F,KAAK,WAAW,GAAG;IAAE,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC;AAUtC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAQ/D;AAED,wBAAsB,eAAe,CACnC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,YAAY,GAAG,cAAc,GAAG,QAAQ,CAAC,EACpE,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.scenarioNeedsUi = scenarioNeedsUi;
|
|
4
|
+
exports.ensureUiStarted = ensureUiStarted;
|
|
5
|
+
function stepsFromBlock(block) {
|
|
6
|
+
if ("given" in block)
|
|
7
|
+
return [block.given];
|
|
8
|
+
if ("when" in block)
|
|
9
|
+
return [block.when];
|
|
10
|
+
if ("and" in block)
|
|
11
|
+
return [block.and];
|
|
12
|
+
if ("then" in block)
|
|
13
|
+
return Array.isArray(block.then) ? block.then : [block.then];
|
|
14
|
+
return [block];
|
|
15
|
+
}
|
|
16
|
+
function scenarioNeedsUi(scenario) {
|
|
17
|
+
if (scenario.type === "ui" || scenario.type === "mixed")
|
|
18
|
+
return true;
|
|
19
|
+
for (const block of scenario.steps) {
|
|
20
|
+
for (const step of stepsFromBlock(block)) {
|
|
21
|
+
if (step.op.startsWith("ui."))
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
async function ensureUiStarted(ctxBase, startedFlag) {
|
|
28
|
+
if (!ctxBase.ui || startedFlag.value)
|
|
29
|
+
return;
|
|
30
|
+
await ctxBase.ui.start();
|
|
31
|
+
startedFlag.value = true;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/testing/runner/lifecycle.ts"],"names":[],"mappings":";;AAaA,0CAQC;AAED,0CAOC;AAzBD,SAAS,cAAc,CAAC,KAAgB;IACtC,IAAI,OAAO,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,MAAM,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClF,OAAO,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,SAAgB,eAAe,CAAC,QAAsB;IACpD,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACrE,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACzC,IAAI,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,OAAoE,EACpE,WAAwB;IAExB,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,WAAW,CAAC,KAAK;QAAE,OAAO;IAC7C,MAAM,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IACzB,WAAW,CAAC,KAAK,GAAG,IAAI,CAAC;AAC3B,CAAC","sourcesContent":["import type { TestContext } from \"../contracts/runtime-context.types\";\nimport type { OpStep, ScenarioSpec, StepBlock } from \"../contracts/testing-metadata.types\";\n\ntype StartedFlag = { value: boolean };\n\nfunction stepsFromBlock(block: StepBlock): OpStep[] {\n if (\"given\" in block) return [block.given];\n if (\"when\" in block) return [block.when];\n if (\"and\" in block) return [block.and];\n if (\"then\" in block) return Array.isArray(block.then) ? block.then : [block.then];\n return [block];\n}\n\nexport function scenarioNeedsUi(scenario: ScenarioSpec): boolean {\n if (scenario.type === \"ui\" || scenario.type === \"mixed\") return true;\n for (const block of scenario.steps) {\n for (const step of stepsFromBlock(block)) {\n if (step.op.startsWith(\"ui.\")) return true;\n }\n }\n return false;\n}\n\nexport async function ensureUiStarted(\n ctxBase: Omit<TestContext, \"scenarioId\" | \"scenarioType\" | \"params\">,\n startedFlag: StartedFlag,\n): Promise<void> {\n if (!ctxBase.ui || startedFlag.value) return;\n await ctxBase.ui.start();\n startedFlag.value = true;\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Reporter } from "../reporter/reporter.types";
|
|
2
|
+
import type { TestingMetadata } from "../contracts/testing-metadata.types";
|
|
3
|
+
import type { ApiAdapterOptions } from "../adapters/api/api.types";
|
|
4
|
+
import type { PlaywrightAdapterOptions } from "../adapters/ui/ui.types";
|
|
5
|
+
import { SpecRegistry } from "../core/spec-registry";
|
|
6
|
+
export type RunnerOptions = {
|
|
7
|
+
metadata: TestingMetadata;
|
|
8
|
+
scenarioIds?: string[];
|
|
9
|
+
includeTags?: string[];
|
|
10
|
+
skipScenarioIds?: string[];
|
|
11
|
+
reporter?: Reporter;
|
|
12
|
+
api?: ApiAdapterOptions;
|
|
13
|
+
ui?: PlaywrightAdapterOptions;
|
|
14
|
+
defaults?: {
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
retries?: number;
|
|
17
|
+
};
|
|
18
|
+
options?: {
|
|
19
|
+
printApiLogs?: boolean;
|
|
20
|
+
};
|
|
21
|
+
specs?: (registry: SpecRegistry) => void;
|
|
22
|
+
};
|
|
23
|
+
export declare function runFromMetadata(opts: RunnerOptions): Promise<void>;
|
|
24
|
+
//# sourceMappingURL=run-from-metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-from-metadata.d.ts","sourceRoot":"","sources":["../../../src/testing/runner/run-from-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAqB,MAAM,qCAAqC,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAUxE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAoBrD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,EAAE,eAAe,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,GAAG,CAAC,EAAE,iBAAiB,CAAC;IACxB,EAAE,CAAC,EAAE,wBAAwB,CAAC;IAC9B,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpD,OAAO,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCxE"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runFromMetadata = runFromMetadata;
|
|
4
|
+
const api_adapter_1 = require("../adapters/api/api-adapter");
|
|
5
|
+
const playwright_adapter_1 = require("../adapters/ui/playwright-adapter");
|
|
6
|
+
const api_1 = require("../steps/api");
|
|
7
|
+
const ui_1 = require("../steps/ui");
|
|
8
|
+
const assert_1 = require("../steps/assert");
|
|
9
|
+
const util_1 = require("../steps/util");
|
|
10
|
+
const test_1 = require("../steps/test");
|
|
11
|
+
const resource_store_1 = require("../core/resource-store");
|
|
12
|
+
const step_registry_1 = require("../core/step-registry");
|
|
13
|
+
const spec_registry_1 = require("../core/spec-registry");
|
|
14
|
+
const testing_engine_1 = require("../core/testing-engine");
|
|
15
|
+
const scenario_filter_1 = require("./scenario-filter");
|
|
16
|
+
const lifecycle_1 = require("./lifecycle");
|
|
17
|
+
const console_reporter_1 = require("../reporter/console-reporter");
|
|
18
|
+
function buildTestDataIndex(data) {
|
|
19
|
+
const index = {};
|
|
20
|
+
if (!Array.isArray(data))
|
|
21
|
+
return index;
|
|
22
|
+
for (const record of data) {
|
|
23
|
+
if (!record?.modelUserKey || !record?.recUserKeyValue)
|
|
24
|
+
continue;
|
|
25
|
+
if (!index[record.modelUserKey]) {
|
|
26
|
+
index[record.modelUserKey] = {};
|
|
27
|
+
}
|
|
28
|
+
index[record.modelUserKey][record.recUserKeyValue] = record.data ?? {};
|
|
29
|
+
}
|
|
30
|
+
return index;
|
|
31
|
+
}
|
|
32
|
+
async function runFromMetadata(opts) {
|
|
33
|
+
const registry = new step_registry_1.StepRegistry();
|
|
34
|
+
(0, api_1.registerApiSteps)(registry);
|
|
35
|
+
(0, ui_1.registerUiSteps)(registry);
|
|
36
|
+
(0, assert_1.registerAssertSteps)(registry);
|
|
37
|
+
(0, util_1.registerUtilSteps)(registry);
|
|
38
|
+
(0, test_1.registerTestSteps)(registry);
|
|
39
|
+
const engine = new testing_engine_1.TestingEngine(registry, opts.defaults);
|
|
40
|
+
const scenarios = (0, scenario_filter_1.filterScenarios)(opts.metadata.testing.scenarios, {
|
|
41
|
+
scenarioIds: opts.scenarioIds,
|
|
42
|
+
includeTags: opts.includeTags,
|
|
43
|
+
skipScenarioIds: opts.skipScenarioIds,
|
|
44
|
+
});
|
|
45
|
+
const specRegistry = new spec_registry_1.SpecRegistry();
|
|
46
|
+
const testData = buildTestDataIndex(opts.metadata.testing?.data);
|
|
47
|
+
if (opts.specs) {
|
|
48
|
+
opts.specs(specRegistry);
|
|
49
|
+
}
|
|
50
|
+
const resources = new resource_store_1.SimpleResourceStore();
|
|
51
|
+
const reporter = opts.reporter ?? new console_reporter_1.ConsoleReporter();
|
|
52
|
+
const api = new api_adapter_1.ApiAdapter(opts.api);
|
|
53
|
+
const ui = new playwright_adapter_1.PlaywrightAdapter(opts.ui);
|
|
54
|
+
const ctxBase = { resources, reporter, api, ui, specRegistry, testData, options: opts.options };
|
|
55
|
+
const uiStarted = { value: false };
|
|
56
|
+
try {
|
|
57
|
+
for (const scenario of scenarios) {
|
|
58
|
+
if ((0, lifecycle_1.scenarioNeedsUi)(scenario)) {
|
|
59
|
+
await (0, lifecycle_1.ensureUiStarted)(ctxBase, uiStarted);
|
|
60
|
+
}
|
|
61
|
+
await engine.runScenario(scenario, ctxBase);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
if (uiStarted.value) {
|
|
66
|
+
await ui.stop();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=run-from-metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-from-metadata.js","sourceRoot":"","sources":["../../../src/testing/runner/run-from-metadata.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Reporter } from \"../reporter/reporter.types\";\nimport type { TestingMetadata, TestingDataRecord } from \"../contracts/testing-metadata.types\";\nimport type { ApiAdapterOptions } from \"../adapters/api/api.types\";\nimport type { PlaywrightAdapterOptions } from \"../adapters/ui/ui.types\";\nimport { ApiAdapter } from \"../adapters/api/api-adapter\";\nimport { PlaywrightAdapter } from \"../adapters/ui/playwright-adapter\";\nimport { registerApiSteps } from \"../steps/api\";\nimport { registerUiSteps } from \"../steps/ui\";\nimport { registerAssertSteps } from \"../steps/assert\";\nimport { registerUtilSteps } from \"../steps/util\";\nimport { registerTestSteps } from \"../steps/test\";\nimport { SimpleResourceStore } from \"../core/resource-store\";\nimport { StepRegistry } from \"../core/step-registry\";\nimport { SpecRegistry } from \"../core/spec-registry\";\nimport { TestingEngine } from \"../core/testing-engine\";\nimport { filterScenarios } from \"./scenario-filter\";\nimport { ensureUiStarted, scenarioNeedsUi } from \"./lifecycle\";\nimport { ConsoleReporter } from \"../reporter/console-reporter\";\n\n\nfunction buildTestDataIndex(data?: TestingDataRecord[]): Record<string, Record<string, any>> {\n const index: Record<string, Record<string, any>> = {};\n if (!Array.isArray(data)) return index;\n for (const record of data) {\n if (!record?.modelUserKey || !record?.recUserKeyValue) continue;\n if (!index[record.modelUserKey]) {\n index[record.modelUserKey] = {};\n }\n index[record.modelUserKey][record.recUserKeyValue] = record.data ?? {};\n }\n return index;\n}\n\nexport type RunnerOptions = {\n metadata: TestingMetadata;\n scenarioIds?: string[];\n includeTags?: string[];\n skipScenarioIds?: string[];\n reporter?: Reporter;\n api?: ApiAdapterOptions;\n ui?: PlaywrightAdapterOptions;\n defaults?: { timeoutMs?: number; retries?: number };\n options?: { printApiLogs?: boolean };\n specs?: (registry: SpecRegistry) => void;\n};\n\nexport async function runFromMetadata(opts: RunnerOptions): Promise<void> {\n const registry = new StepRegistry();\n registerApiSteps(registry);\n registerUiSteps(registry);\n registerAssertSteps(registry);\n registerUtilSteps(registry);\n registerTestSteps(registry);\n\n const engine = new TestingEngine(registry, opts.defaults);\n const scenarios = filterScenarios(opts.metadata.testing.scenarios, {\n scenarioIds: opts.scenarioIds,\n includeTags: opts.includeTags,\n skipScenarioIds: opts.skipScenarioIds,\n });\n\n const specRegistry = new SpecRegistry();\n const testData = buildTestDataIndex(opts.metadata.testing?.data);\n if (opts.specs) {\n opts.specs(specRegistry);\n }\n\n const resources = new SimpleResourceStore();\n const reporter = opts.reporter ?? new ConsoleReporter();\n const api = new ApiAdapter(opts.api);\n const ui = new PlaywrightAdapter(opts.ui);\n const ctxBase = { resources, reporter, api, ui, specRegistry, testData, options: opts.options };\n const uiStarted = { value: false };\n\n try {\n for (const scenario of scenarios) {\n if (scenarioNeedsUi(scenario)) {\n await ensureUiStarted(ctxBase, uiStarted);\n }\n await engine.runScenario(scenario, ctxBase);\n }\n } finally {\n if (uiStarted.value) {\n await ui.stop();\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ScenarioSpec } from "../contracts/testing-metadata.types";
|
|
2
|
+
type ScenarioFilterOptions = {
|
|
3
|
+
scenarioIds?: string[];
|
|
4
|
+
includeTags?: string[];
|
|
5
|
+
skipScenarioIds?: string[];
|
|
6
|
+
};
|
|
7
|
+
export declare function filterScenarios(scenarios: ScenarioSpec[], opts: ScenarioFilterOptions): ScenarioSpec[];
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=scenario-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-filter.d.ts","sourceRoot":"","sources":["../../../src/testing/runner/scenario-filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAExE,KAAK,qBAAqB,GAAG;IAC3B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF,wBAAgB,eAAe,CAC7B,SAAS,EAAE,YAAY,EAAE,EACzB,IAAI,EAAE,qBAAqB,GAC1B,YAAY,EAAE,CAqBhB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.filterScenarios = filterScenarios;
|
|
4
|
+
function filterScenarios(scenarios, opts) {
|
|
5
|
+
let result = scenarios;
|
|
6
|
+
if (opts.scenarioIds && opts.scenarioIds.length > 0) {
|
|
7
|
+
const idSet = new Set(opts.scenarioIds);
|
|
8
|
+
result = result.filter((scenario) => idSet.has(scenario.id));
|
|
9
|
+
}
|
|
10
|
+
if (opts.includeTags && opts.includeTags.length > 0) {
|
|
11
|
+
result = result.filter((scenario) => {
|
|
12
|
+
const tags = scenario.tags ?? [];
|
|
13
|
+
return opts.includeTags.every((tag) => tags.includes(tag));
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
if (opts.skipScenarioIds && opts.skipScenarioIds.length > 0) {
|
|
17
|
+
const skipSet = new Set(opts.skipScenarioIds);
|
|
18
|
+
result = result.filter((scenario) => !skipSet.has(scenario.id));
|
|
19
|
+
}
|
|
20
|
+
return result;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=scenario-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-filter.js","sourceRoot":"","sources":["../../../src/testing/runner/scenario-filter.ts"],"names":[],"mappings":";;AAQA,0CAwBC;AAxBD,SAAgB,eAAe,CAC7B,SAAyB,EACzB,IAA2B;IAE3B,IAAI,MAAM,GAAG,SAAS,CAAC;IAEvB,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpD,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;YAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,WAAY,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import type { ScenarioSpec } from \"../contracts/testing-metadata.types\";\n\ntype ScenarioFilterOptions = {\n scenarioIds?: string[];\n includeTags?: string[];\n skipScenarioIds?: string[];\n};\n\nexport function filterScenarios(\n scenarios: ScenarioSpec[],\n opts: ScenarioFilterOptions,\n): ScenarioSpec[] {\n let result = scenarios;\n\n if (opts.scenarioIds && opts.scenarioIds.length > 0) {\n const idSet = new Set(opts.scenarioIds);\n result = result.filter((scenario) => idSet.has(scenario.id));\n }\n\n if (opts.includeTags && opts.includeTags.length > 0) {\n result = result.filter((scenario) => {\n const tags = scenario.tags ?? [];\n return opts.includeTags!.every((tag) => tags.includes(tag));\n });\n }\n\n if (opts.skipScenarioIds && opts.skipScenarioIds.length > 0) {\n const skipSet = new Set(opts.skipScenarioIds);\n result = result.filter((scenario) => !skipSet.has(scenario.id));\n }\n\n return result;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.step.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/api/auth.step.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAQxD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAqD9D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAuthSteps = registerAuthSteps;
|
|
4
|
+
function registerAuthSteps(registry) {
|
|
5
|
+
registry.register("api.auth.bearerFromLogin", async (ctx, step) => {
|
|
6
|
+
if (!ctx.api) {
|
|
7
|
+
throw new Error('Missing API adapter on context for op "api.auth.bearerFromLogin"');
|
|
8
|
+
}
|
|
9
|
+
const input = (step.with ?? {});
|
|
10
|
+
if (!input.url) {
|
|
11
|
+
throw new Error('Missing "url" in step.with for op "api.auth.bearerFromLogin"');
|
|
12
|
+
}
|
|
13
|
+
if (!input.username) {
|
|
14
|
+
throw new Error('Missing "username" in step.with for op "api.auth.bearerFromLogin"');
|
|
15
|
+
}
|
|
16
|
+
if (!input.password) {
|
|
17
|
+
throw new Error('Missing "password" in step.with for op "api.auth.bearerFromLogin"');
|
|
18
|
+
}
|
|
19
|
+
const response = await ctx.api.http({
|
|
20
|
+
method: "POST",
|
|
21
|
+
url: input.url,
|
|
22
|
+
json: {
|
|
23
|
+
username: input.username,
|
|
24
|
+
password: input.password,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
if (response.status < 200 || response.status >= 300) {
|
|
28
|
+
throw new Error(`Login failed with status ${response.status}: ${response.bodyText}`);
|
|
29
|
+
}
|
|
30
|
+
const bodyJson = response.bodyJson;
|
|
31
|
+
const token = bodyJson?.data?.accessToken ?? bodyJson?.accessToken;
|
|
32
|
+
if (typeof token !== "string" || token.length === 0) {
|
|
33
|
+
throw new Error("Missing access token in login response");
|
|
34
|
+
}
|
|
35
|
+
return token;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=auth.step.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.step.js","sourceRoot":"","sources":["../../../../src/testing/steps/api/auth.step.ts"],"names":[],"mappings":";;AAYA,8CAqDC;AArDD,SAAgB,iBAAiB,CAAC,QAAsB;IACtD,QAAQ,CAAC,QAAQ,CACf,0BAA0B,EAC1B,KAAK,EAAE,GAAgB,EAAE,IAAY,EAAE,EAAE;QACvC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,kEAAkE,CACnE,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAyB,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;YAClC,MAAM,EAAE,MAAM;YACd,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,IAAI,EAAE;gBACJ,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,QAAQ,EAAE,KAAK,CAAC,QAAQ;aACzB;SACF,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,4BAA4B,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,QAAQ,EAAE,CACpE,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAEb,CAAC;QACd,MAAM,KAAK,GAAG,QAAQ,EAAE,IAAI,EAAE,WAAW,IAAI,QAAQ,EAAE,WAAW,CAAC;QACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAC5D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CACF,CAAC;AACJ,CAAC","sourcesContent":["// Purpose: API auth step registrations.\n\nimport type { TestContext } from \"../../contracts/runtime-context.types\";\nimport type { OpStep } from \"../../contracts/testing-metadata.types\";\nimport { StepRegistry } from \"../../core/step-registry\";\n\ntype BearerFromLoginInput = {\n url: string;\n username: string;\n password: string;\n};\n\nexport function registerAuthSteps(registry: StepRegistry): void {\n registry.register(\n \"api.auth.bearerFromLogin\",\n async (ctx: TestContext, step: OpStep) => {\n if (!ctx.api) {\n throw new Error(\n 'Missing API adapter on context for op \"api.auth.bearerFromLogin\"',\n );\n }\n\n const input = (step.with ?? {}) as BearerFromLoginInput;\n if (!input.url) {\n throw new Error(\n 'Missing \"url\" in step.with for op \"api.auth.bearerFromLogin\"',\n );\n }\n if (!input.username) {\n throw new Error(\n 'Missing \"username\" in step.with for op \"api.auth.bearerFromLogin\"',\n );\n }\n if (!input.password) {\n throw new Error(\n 'Missing \"password\" in step.with for op \"api.auth.bearerFromLogin\"',\n );\n }\n\n const response = await ctx.api.http({\n method: \"POST\",\n url: input.url,\n json: {\n username: input.username,\n password: input.password,\n },\n });\n\n if (response.status < 200 || response.status >= 300) {\n throw new Error(\n `Login failed with status ${response.status}: ${response.bodyText}`,\n );\n }\n\n const bodyJson = response.bodyJson as\n | { data?: { accessToken?: unknown }; accessToken?: unknown }\n | undefined;\n const token = bodyJson?.data?.accessToken ?? bodyJson?.accessToken;\n if (typeof token !== \"string\" || token.length === 0) {\n throw new Error(\"Missing access token in login response\");\n }\n\n return token;\n },\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/testing/steps/api/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAIxD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAG7D"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerApiSteps = registerApiSteps;
|
|
4
|
+
const auth_step_1 = require("./auth.step");
|
|
5
|
+
const request_step_1 = require("./request.step");
|
|
6
|
+
function registerApiSteps(registry) {
|
|
7
|
+
(0, request_step_1.registerApiRequestStep)(registry);
|
|
8
|
+
(0, auth_step_1.registerAuthSteps)(registry);
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/testing/steps/api/index.ts"],"names":[],"mappings":";;AAMA,4CAGC;AAND,2CAAgD;AAChD,iDAAwD;AAExD,SAAgB,gBAAgB,CAAC,QAAsB;IACrD,IAAA,qCAAsB,EAAC,QAAQ,CAAC,CAAC;IACjC,IAAA,6BAAiB,EAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC","sourcesContent":["// Purpose: API step registrations.\n\nimport { StepRegistry } from \"../../core/step-registry\";\nimport { registerAuthSteps } from \"./auth.step\";\nimport { registerApiRequestStep } from \"./request.step\";\n\nexport function registerApiSteps(registry: StepRegistry): void {\n registerApiRequestStep(registry);\n registerAuthSteps(registry);\n}\n"]}
|