@gitgov/core 1.0.0 → 1.0.2
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/README.md +139 -135
- package/dist/src/index.d.ts +5475 -21
- package/dist/src/index.js +7873 -22
- package/dist/src/index.js.map +1 -1
- package/package.json +19 -7
- package/dist/scripts/compile-json-to-types.d.ts +0 -11
- package/dist/scripts/compile-json-to-types.d.ts.map +0 -1
- package/dist/scripts/compile-json-to-types.js +0 -129
- package/dist/scripts/compile-json-to-types.js.map +0 -1
- package/dist/scripts/diagnose-duplicates.d.ts +0 -7
- package/dist/scripts/diagnose-duplicates.d.ts.map +0 -1
- package/dist/scripts/diagnose-duplicates.js +0 -72
- package/dist/scripts/diagnose-duplicates.js.map +0 -1
- package/dist/scripts/generate-indexes.d.ts +0 -22
- package/dist/scripts/generate-indexes.d.ts.map +0 -1
- package/dist/scripts/generate-indexes.js +0 -168
- package/dist/scripts/generate-indexes.js.map +0 -1
- package/dist/scripts/sync-schemas.d.ts +0 -10
- package/dist/scripts/sync-schemas.d.ts.map +0 -1
- package/dist/scripts/sync-schemas.js +0 -84
- package/dist/scripts/sync-schemas.js.map +0 -1
- package/dist/scripts/sync-workflow-configs.d.ts +0 -11
- package/dist/scripts/sync-workflow-configs.d.ts.map +0 -1
- package/dist/scripts/sync-workflow-configs.js +0 -61
- package/dist/scripts/sync-workflow-configs.js.map +0 -1
- package/dist/scripts/update-diagram.d.ts +0 -7
- package/dist/scripts/update-diagram.d.ts.map +0 -1
- package/dist/scripts/update-diagram.js +0 -47
- package/dist/scripts/update-diagram.js.map +0 -1
- package/dist/scripts/validate-schemas.d.ts +0 -18
- package/dist/scripts/validate-schemas.d.ts.map +0 -1
- package/dist/scripts/validate-schemas.js +0 -313
- package/dist/scripts/validate-schemas.js.map +0 -1
- package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.d.ts +0 -2
- package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.d.ts.map +0 -1
- package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.js +0 -507
- package/dist/src/adapters/backlog_adapter/backlog_adapter.integration.test.js.map +0 -1
- package/dist/src/adapters/backlog_adapter/backlog_adapter.test.d.ts +0 -2
- package/dist/src/adapters/backlog_adapter/backlog_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/backlog_adapter/backlog_adapter.test.js +0 -1282
- package/dist/src/adapters/backlog_adapter/backlog_adapter.test.js.map +0 -1
- package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.d.ts +0 -10
- package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.d.ts.map +0 -1
- package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.js +0 -144
- package/dist/src/adapters/backlog_adapter/backlog_adapter_e2e.test.js.map +0 -1
- package/dist/src/adapters/backlog_adapter/index.d.ts +0 -213
- package/dist/src/adapters/backlog_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/backlog_adapter/index.js +0 -924
- package/dist/src/adapters/backlog_adapter/index.js.map +0 -1
- package/dist/src/adapters/changelog_adapter/changelog_adapter.test.d.ts +0 -2
- package/dist/src/adapters/changelog_adapter/changelog_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/changelog_adapter/changelog_adapter.test.js +0 -505
- package/dist/src/adapters/changelog_adapter/changelog_adapter.test.js.map +0 -1
- package/dist/src/adapters/changelog_adapter/index.d.ts +0 -101
- package/dist/src/adapters/changelog_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/changelog_adapter/index.js +0 -197
- package/dist/src/adapters/changelog_adapter/index.js.map +0 -1
- package/dist/src/adapters/execution_adapter/execution_adapter.test.d.ts +0 -2
- package/dist/src/adapters/execution_adapter/execution_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/execution_adapter/execution_adapter.test.js +0 -266
- package/dist/src/adapters/execution_adapter/execution_adapter.test.js.map +0 -1
- package/dist/src/adapters/execution_adapter/index.d.ts +0 -90
- package/dist/src/adapters/execution_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/execution_adapter/index.js +0 -150
- package/dist/src/adapters/execution_adapter/index.js.map +0 -1
- package/dist/src/adapters/feedback_adapter/feedback_adapter.test.d.ts +0 -2
- package/dist/src/adapters/feedback_adapter/feedback_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/feedback_adapter/feedback_adapter.test.js +0 -256
- package/dist/src/adapters/feedback_adapter/feedback_adapter.test.js.map +0 -1
- package/dist/src/adapters/feedback_adapter/index.d.ts +0 -95
- package/dist/src/adapters/feedback_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/feedback_adapter/index.js +0 -192
- package/dist/src/adapters/feedback_adapter/index.js.map +0 -1
- package/dist/src/adapters/identity_adapter/identity_adapter.test.d.ts +0 -2
- package/dist/src/adapters/identity_adapter/identity_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/identity_adapter/identity_adapter.test.js +0 -624
- package/dist/src/adapters/identity_adapter/identity_adapter.test.js.map +0 -1
- package/dist/src/adapters/identity_adapter/index.d.ts +0 -82
- package/dist/src/adapters/identity_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/identity_adapter/index.js +0 -336
- package/dist/src/adapters/identity_adapter/index.js.map +0 -1
- package/dist/src/adapters/index.d.ts +0 -10
- package/dist/src/adapters/index.d.ts.map +0 -1
- package/dist/src/adapters/index.js +0 -10
- package/dist/src/adapters/index.js.map +0 -1
- package/dist/src/adapters/indexer_adapter/index.d.ts +0 -214
- package/dist/src/adapters/indexer_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/indexer_adapter/index.js +0 -643
- package/dist/src/adapters/indexer_adapter/index.js.map +0 -1
- package/dist/src/adapters/indexer_adapter/indexer_adapter.test.d.ts +0 -2
- package/dist/src/adapters/indexer_adapter/indexer_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/indexer_adapter/indexer_adapter.test.js +0 -409
- package/dist/src/adapters/indexer_adapter/indexer_adapter.test.js.map +0 -1
- package/dist/src/adapters/metrics_adapter/index.d.ts +0 -189
- package/dist/src/adapters/metrics_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/metrics_adapter/index.js +0 -592
- package/dist/src/adapters/metrics_adapter/index.js.map +0 -1
- package/dist/src/adapters/metrics_adapter/metrics_adapter.test.d.ts +0 -2
- package/dist/src/adapters/metrics_adapter/metrics_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/metrics_adapter/metrics_adapter.test.js +0 -558
- package/dist/src/adapters/metrics_adapter/metrics_adapter.test.js.map +0 -1
- package/dist/src/adapters/project_adapter/index.d.ts +0 -164
- package/dist/src/adapters/project_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/project_adapter/index.js +0 -445
- package/dist/src/adapters/project_adapter/index.js.map +0 -1
- package/dist/src/adapters/project_adapter/project_adapter.test.d.ts +0 -2
- package/dist/src/adapters/project_adapter/project_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/project_adapter/project_adapter.test.js +0 -627
- package/dist/src/adapters/project_adapter/project_adapter.test.js.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/index.d.ts +0 -75
- package/dist/src/adapters/workflow_methodology_adapter/index.d.ts.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/index.js +0 -205
- package/dist/src/adapters/workflow_methodology_adapter/index.js.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.d.ts +0 -2
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.d.ts.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.js +0 -463
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter.test.js.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.d.ts +0 -2
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.d.ts.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.js +0 -287
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_integration.test.js.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.d.ts +0 -2
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.d.ts.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.js +0 -278
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_adapter_scrum_integration.test.js.map +0 -1
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_default.json +0 -188
- package/dist/src/adapters/workflow_methodology_adapter/workflow_methodology_scrum.json +0 -284
- package/dist/src/config_manager/config_manager.test.d.ts +0 -2
- package/dist/src/config_manager/config_manager.test.d.ts.map +0 -1
- package/dist/src/config_manager/config_manager.test.js +0 -321
- package/dist/src/config_manager/config_manager.test.js.map +0 -1
- package/dist/src/config_manager/index.d.ts +0 -107
- package/dist/src/config_manager/index.d.ts.map +0 -1
- package/dist/src/config_manager/index.js +0 -192
- package/dist/src/config_manager/index.js.map +0 -1
- package/dist/src/crypto/checksum.d.ts +0 -6
- package/dist/src/crypto/checksum.d.ts.map +0 -1
- package/dist/src/crypto/checksum.js +0 -38
- package/dist/src/crypto/checksum.js.map +0 -1
- package/dist/src/crypto/checksum.test.d.ts +0 -2
- package/dist/src/crypto/checksum.test.d.ts.map +0 -1
- package/dist/src/crypto/checksum.test.js +0 -167
- package/dist/src/crypto/checksum.test.js.map +0 -1
- package/dist/src/crypto/index.d.ts +0 -3
- package/dist/src/crypto/index.d.ts.map +0 -1
- package/dist/src/crypto/index.js +0 -3
- package/dist/src/crypto/index.js.map +0 -1
- package/dist/src/crypto/signatures.d.ts +0 -24
- package/dist/src/crypto/signatures.d.ts.map +0 -1
- package/dist/src/crypto/signatures.js +0 -67
- package/dist/src/crypto/signatures.js.map +0 -1
- package/dist/src/crypto/signatures.test.d.ts +0 -2
- package/dist/src/crypto/signatures.test.d.ts.map +0 -1
- package/dist/src/crypto/signatures.test.js +0 -378
- package/dist/src/crypto/signatures.test.js.map +0 -1
- package/dist/src/diagram_generator/diagram_generator.d.ts +0 -76
- package/dist/src/diagram_generator/diagram_generator.d.ts.map +0 -1
- package/dist/src/diagram_generator/diagram_generator.js +0 -233
- package/dist/src/diagram_generator/diagram_generator.js.map +0 -1
- package/dist/src/diagram_generator/graph_validator.d.ts +0 -19
- package/dist/src/diagram_generator/graph_validator.d.ts.map +0 -1
- package/dist/src/diagram_generator/graph_validator.js +0 -98
- package/dist/src/diagram_generator/graph_validator.js.map +0 -1
- package/dist/src/diagram_generator/index.d.ts +0 -4
- package/dist/src/diagram_generator/index.d.ts.map +0 -1
- package/dist/src/diagram_generator/index.js +0 -4
- package/dist/src/diagram_generator/index.js.map +0 -1
- package/dist/src/diagram_generator/mermaid_renderer.d.ts +0 -82
- package/dist/src/diagram_generator/mermaid_renderer.d.ts.map +0 -1
- package/dist/src/diagram_generator/mermaid_renderer.js +0 -306
- package/dist/src/diagram_generator/mermaid_renderer.js.map +0 -1
- package/dist/src/diagram_generator/relationship_analyzer.d.ts +0 -116
- package/dist/src/diagram_generator/relationship_analyzer.d.ts.map +0 -1
- package/dist/src/diagram_generator/relationship_analyzer.js +0 -381
- package/dist/src/diagram_generator/relationship_analyzer.js.map +0 -1
- package/dist/src/event_bus/event_bus.d.ts +0 -110
- package/dist/src/event_bus/event_bus.d.ts.map +0 -1
- package/dist/src/event_bus/event_bus.js +0 -161
- package/dist/src/event_bus/event_bus.js.map +0 -1
- package/dist/src/event_bus/event_bus.test.d.ts +0 -2
- package/dist/src/event_bus/event_bus.test.d.ts.map +0 -1
- package/dist/src/event_bus/event_bus.test.js +0 -332
- package/dist/src/event_bus/event_bus.test.js.map +0 -1
- package/dist/src/event_bus/event_bus_integration.test.d.ts +0 -2
- package/dist/src/event_bus/event_bus_integration.test.d.ts.map +0 -1
- package/dist/src/event_bus/event_bus_integration.test.js +0 -474
- package/dist/src/event_bus/event_bus_integration.test.js.map +0 -1
- package/dist/src/event_bus/index.d.ts +0 -3
- package/dist/src/event_bus/index.d.ts.map +0 -1
- package/dist/src/event_bus/index.js +0 -3
- package/dist/src/event_bus/index.js.map +0 -1
- package/dist/src/event_bus/types.d.ts +0 -203
- package/dist/src/event_bus/types.d.ts.map +0 -1
- package/dist/src/event_bus/types.js +0 -5
- package/dist/src/event_bus/types.js.map +0 -1
- package/dist/src/factories/actor_factory.d.ts +0 -6
- package/dist/src/factories/actor_factory.d.ts.map +0 -1
- package/dist/src/factories/actor_factory.js +0 -25
- package/dist/src/factories/actor_factory.js.map +0 -1
- package/dist/src/factories/actor_factory.test.d.ts +0 -2
- package/dist/src/factories/actor_factory.test.d.ts.map +0 -1
- package/dist/src/factories/actor_factory.test.js +0 -169
- package/dist/src/factories/actor_factory.test.js.map +0 -1
- package/dist/src/factories/agent_factory.d.ts +0 -6
- package/dist/src/factories/agent_factory.d.ts.map +0 -1
- package/dist/src/factories/agent_factory.js +0 -25
- package/dist/src/factories/agent_factory.js.map +0 -1
- package/dist/src/factories/agent_factory.test.d.ts +0 -2
- package/dist/src/factories/agent_factory.test.d.ts.map +0 -1
- package/dist/src/factories/agent_factory.test.js +0 -199
- package/dist/src/factories/agent_factory.test.js.map +0 -1
- package/dist/src/factories/changelog_factory.d.ts +0 -9
- package/dist/src/factories/changelog_factory.d.ts.map +0 -1
- package/dist/src/factories/changelog_factory.js +0 -46
- package/dist/src/factories/changelog_factory.js.map +0 -1
- package/dist/src/factories/changelog_factory.test.d.ts +0 -2
- package/dist/src/factories/changelog_factory.test.d.ts.map +0 -1
- package/dist/src/factories/changelog_factory.test.js +0 -368
- package/dist/src/factories/changelog_factory.test.js.map +0 -1
- package/dist/src/factories/cycle_factory.d.ts +0 -6
- package/dist/src/factories/cycle_factory.d.ts.map +0 -1
- package/dist/src/factories/cycle_factory.js +0 -28
- package/dist/src/factories/cycle_factory.js.map +0 -1
- package/dist/src/factories/cycle_factory.test.d.ts +0 -2
- package/dist/src/factories/cycle_factory.test.d.ts.map +0 -1
- package/dist/src/factories/cycle_factory.test.js +0 -175
- package/dist/src/factories/cycle_factory.test.js.map +0 -1
- package/dist/src/factories/execution_factory.d.ts +0 -9
- package/dist/src/factories/execution_factory.d.ts.map +0 -1
- package/dist/src/factories/execution_factory.js +0 -29
- package/dist/src/factories/execution_factory.js.map +0 -1
- package/dist/src/factories/execution_factory.test.d.ts +0 -2
- package/dist/src/factories/execution_factory.test.d.ts.map +0 -1
- package/dist/src/factories/execution_factory.test.js +0 -207
- package/dist/src/factories/execution_factory.test.js.map +0 -1
- package/dist/src/factories/feedback_factory.d.ts +0 -9
- package/dist/src/factories/feedback_factory.d.ts.map +0 -1
- package/dist/src/factories/feedback_factory.js +0 -30
- package/dist/src/factories/feedback_factory.js.map +0 -1
- package/dist/src/factories/feedback_factory.test.d.ts +0 -2
- package/dist/src/factories/feedback_factory.test.d.ts.map +0 -1
- package/dist/src/factories/feedback_factory.test.js +0 -256
- package/dist/src/factories/feedback_factory.test.js.map +0 -1
- package/dist/src/factories/index.d.ts +0 -9
- package/dist/src/factories/index.d.ts.map +0 -1
- package/dist/src/factories/index.js +0 -9
- package/dist/src/factories/index.js.map +0 -1
- package/dist/src/factories/task_factory.d.ts +0 -6
- package/dist/src/factories/task_factory.d.ts.map +0 -1
- package/dist/src/factories/task_factory.js +0 -30
- package/dist/src/factories/task_factory.js.map +0 -1
- package/dist/src/factories/task_factory.test.d.ts +0 -2
- package/dist/src/factories/task_factory.test.d.ts.map +0 -1
- package/dist/src/factories/task_factory.test.js +0 -197
- package/dist/src/factories/task_factory.test.js.map +0 -1
- package/dist/src/factories/workflow_methodology_factory.d.ts +0 -11
- package/dist/src/factories/workflow_methodology_factory.d.ts.map +0 -1
- package/dist/src/factories/workflow_methodology_factory.js +0 -173
- package/dist/src/factories/workflow_methodology_factory.js.map +0 -1
- package/dist/src/factories/workflow_methodology_factory.test.d.ts +0 -2
- package/dist/src/factories/workflow_methodology_factory.test.d.ts.map +0 -1
- package/dist/src/factories/workflow_methodology_factory.test.js +0 -244
- package/dist/src/factories/workflow_methodology_factory.test.js.map +0 -1
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/integration/cycles_tasks_integration.test.d.ts +0 -2
- package/dist/src/integration/cycles_tasks_integration.test.d.ts.map +0 -1
- package/dist/src/integration/cycles_tasks_integration.test.js +0 -258
- package/dist/src/integration/cycles_tasks_integration.test.js.map +0 -1
- package/dist/src/integration/schema_integration.test.d.ts +0 -8
- package/dist/src/integration/schema_integration.test.d.ts.map +0 -1
- package/dist/src/integration/schema_integration.test.js +0 -279
- package/dist/src/integration/schema_integration.test.js.map +0 -1
- package/dist/src/logger/index.d.ts +0 -2
- package/dist/src/logger/index.d.ts.map +0 -1
- package/dist/src/logger/index.js +0 -2
- package/dist/src/logger/index.js.map +0 -1
- package/dist/src/logger/logger.d.ts +0 -10
- package/dist/src/logger/logger.d.ts.map +0 -1
- package/dist/src/logger/logger.js +0 -48
- package/dist/src/logger/logger.js.map +0 -1
- package/dist/src/schemas/errors.d.ts +0 -28
- package/dist/src/schemas/errors.d.ts.map +0 -1
- package/dist/src/schemas/errors.js +0 -31
- package/dist/src/schemas/errors.js.map +0 -1
- package/dist/src/schemas/generated/actor_record_schema.json +0 -91
- package/dist/src/schemas/generated/agent_record_schema.json +0 -142
- package/dist/src/schemas/generated/changelog_record_schema.json +0 -227
- package/dist/src/schemas/generated/cycle_record_schema.json +0 -80
- package/dist/src/schemas/generated/embedded_metadata_schema.json +0 -318
- package/dist/src/schemas/generated/execution_record_schema.json +0 -89
- package/dist/src/schemas/generated/feedback_record_schema.json +0 -83
- package/dist/src/schemas/generated/index.d.ts +0 -2221
- package/dist/src/schemas/generated/index.d.ts.map +0 -1
- package/dist/src/schemas/generated/index.js +0 -48
- package/dist/src/schemas/generated/index.js.map +0 -1
- package/dist/src/schemas/generated/task_record_schema.json +0 -103
- package/dist/src/schemas/generated/workflow_methodology_record_schema.json +0 -393
- package/dist/src/schemas/index.d.ts +0 -4
- package/dist/src/schemas/index.d.ts.map +0 -1
- package/dist/src/schemas/index.js +0 -4
- package/dist/src/schemas/index.js.map +0 -1
- package/dist/src/schemas/schema_cache.d.ts +0 -39
- package/dist/src/schemas/schema_cache.d.ts.map +0 -1
- package/dist/src/schemas/schema_cache.js +0 -109
- package/dist/src/schemas/schema_cache.js.map +0 -1
- package/dist/src/schemas/schema_cache.test.d.ts +0 -2
- package/dist/src/schemas/schema_cache.test.d.ts.map +0 -1
- package/dist/src/schemas/schema_cache.test.js +0 -163
- package/dist/src/schemas/schema_cache.test.js.map +0 -1
- package/dist/src/store/index.d.ts +0 -2
- package/dist/src/store/index.d.ts.map +0 -1
- package/dist/src/store/index.js +0 -2
- package/dist/src/store/index.js.map +0 -1
- package/dist/src/store/record_store.d.ts +0 -30
- package/dist/src/store/record_store.d.ts.map +0 -1
- package/dist/src/store/record_store.js +0 -83
- package/dist/src/store/record_store.js.map +0 -1
- package/dist/src/store/record_store.test.d.ts +0 -2
- package/dist/src/store/record_store.test.d.ts.map +0 -1
- package/dist/src/store/record_store.test.js +0 -646
- package/dist/src/store/record_store.test.js.map +0 -1
- package/dist/src/types/common.types.d.ts +0 -43
- package/dist/src/types/common.types.d.ts.map +0 -1
- package/dist/src/types/common.types.js +0 -13
- package/dist/src/types/common.types.js.map +0 -1
- package/dist/src/types/embedded.types.d.ts +0 -17
- package/dist/src/types/embedded.types.d.ts.map +0 -1
- package/dist/src/types/embedded.types.js +0 -2
- package/dist/src/types/embedded.types.js.map +0 -1
- package/dist/src/types/generated/actor_record.d.ts +0 -45
- package/dist/src/types/generated/actor_record.d.ts.map +0 -1
- package/dist/src/types/generated/actor_record.js +0 -7
- package/dist/src/types/generated/actor_record.js.map +0 -1
- package/dist/src/types/generated/agent_record.d.ts +0 -40
- package/dist/src/types/generated/agent_record.d.ts.map +0 -1
- package/dist/src/types/generated/agent_record.js +0 -7
- package/dist/src/types/generated/agent_record.js.map +0 -1
- package/dist/src/types/generated/changelog_record.d.ts +0 -100
- package/dist/src/types/generated/changelog_record.d.ts.map +0 -1
- package/dist/src/types/generated/changelog_record.js +0 -7
- package/dist/src/types/generated/changelog_record.js.map +0 -1
- package/dist/src/types/generated/cycle_record.d.ts +0 -36
- package/dist/src/types/generated/cycle_record.d.ts.map +0 -1
- package/dist/src/types/generated/cycle_record.js +0 -7
- package/dist/src/types/generated/cycle_record.js.map +0 -1
- package/dist/src/types/generated/embedded_metadata.d.ts +0 -94
- package/dist/src/types/generated/embedded_metadata.d.ts.map +0 -1
- package/dist/src/types/generated/embedded_metadata.js +0 -7
- package/dist/src/types/generated/embedded_metadata.js.map +0 -1
- package/dist/src/types/generated/execution_record.d.ts +0 -39
- package/dist/src/types/generated/execution_record.d.ts.map +0 -1
- package/dist/src/types/generated/execution_record.js +0 -7
- package/dist/src/types/generated/execution_record.js.map +0 -1
- package/dist/src/types/generated/feedback_record.d.ts +0 -43
- package/dist/src/types/generated/feedback_record.d.ts.map +0 -1
- package/dist/src/types/generated/feedback_record.js +0 -7
- package/dist/src/types/generated/feedback_record.js.map +0 -1
- package/dist/src/types/generated/index.d.ts +0 -15
- package/dist/src/types/generated/index.d.ts.map +0 -1
- package/dist/src/types/generated/index.js +0 -15
- package/dist/src/types/generated/index.js.map +0 -1
- package/dist/src/types/generated/task_record.d.ts +0 -47
- package/dist/src/types/generated/task_record.d.ts.map +0 -1
- package/dist/src/types/generated/task_record.js +0 -7
- package/dist/src/types/generated/task_record.js.map +0 -1
- package/dist/src/types/generated/workflow_methodology_record.d.ts +0 -211
- package/dist/src/types/generated/workflow_methodology_record.d.ts.map +0 -1
- package/dist/src/types/generated/workflow_methodology_record.js +0 -7
- package/dist/src/types/generated/workflow_methodology_record.js.map +0 -1
- package/dist/src/types/index.d.ts +0 -4
- package/dist/src/types/index.d.ts.map +0 -1
- package/dist/src/types/index.js +0 -4
- package/dist/src/types/index.js.map +0 -1
- package/dist/src/utils/id_generator.d.ts +0 -44
- package/dist/src/utils/id_generator.d.ts.map +0 -1
- package/dist/src/utils/id_generator.js +0 -107
- package/dist/src/utils/id_generator.js.map +0 -1
- package/dist/src/utils/id_generator.test.d.ts +0 -2
- package/dist/src/utils/id_generator.test.d.ts.map +0 -1
- package/dist/src/utils/id_generator.test.js +0 -100
- package/dist/src/utils/id_generator.test.js.map +0 -1
- package/dist/src/utils/index.d.ts +0 -2
- package/dist/src/utils/index.d.ts.map +0 -1
- package/dist/src/utils/index.js +0 -3
- package/dist/src/utils/index.js.map +0 -1
- package/dist/src/validation/actor_validator.d.ts +0 -21
- package/dist/src/validation/actor_validator.d.ts.map +0 -1
- package/dist/src/validation/actor_validator.js +0 -48
- package/dist/src/validation/actor_validator.js.map +0 -1
- package/dist/src/validation/actor_validator.test.d.ts +0 -2
- package/dist/src/validation/actor_validator.test.d.ts.map +0 -1
- package/dist/src/validation/actor_validator.test.js +0 -83
- package/dist/src/validation/actor_validator.test.js.map +0 -1
- package/dist/src/validation/agent_validator.d.ts +0 -30
- package/dist/src/validation/agent_validator.d.ts.map +0 -1
- package/dist/src/validation/agent_validator.js +0 -66
- package/dist/src/validation/agent_validator.js.map +0 -1
- package/dist/src/validation/agent_validator.test.d.ts +0 -2
- package/dist/src/validation/agent_validator.test.d.ts.map +0 -1
- package/dist/src/validation/agent_validator.test.js +0 -73
- package/dist/src/validation/agent_validator.test.js.map +0 -1
- package/dist/src/validation/changelog_validator.d.ts +0 -23
- package/dist/src/validation/changelog_validator.d.ts.map +0 -1
- package/dist/src/validation/changelog_validator.js +0 -58
- package/dist/src/validation/changelog_validator.js.map +0 -1
- package/dist/src/validation/changelog_validator.test.d.ts +0 -2
- package/dist/src/validation/changelog_validator.test.d.ts.map +0 -1
- package/dist/src/validation/changelog_validator.test.js +0 -401
- package/dist/src/validation/changelog_validator.test.js.map +0 -1
- package/dist/src/validation/common.d.ts +0 -10
- package/dist/src/validation/common.d.ts.map +0 -1
- package/dist/src/validation/common.js +0 -12
- package/dist/src/validation/common.js.map +0 -1
- package/dist/src/validation/cycle_validator.d.ts +0 -24
- package/dist/src/validation/cycle_validator.d.ts.map +0 -1
- package/dist/src/validation/cycle_validator.js +0 -51
- package/dist/src/validation/cycle_validator.js.map +0 -1
- package/dist/src/validation/cycle_validator.test.d.ts +0 -2
- package/dist/src/validation/cycle_validator.test.d.ts.map +0 -1
- package/dist/src/validation/cycle_validator.test.js +0 -182
- package/dist/src/validation/cycle_validator.test.js.map +0 -1
- package/dist/src/validation/embedded_metadata_validator.d.ts +0 -26
- package/dist/src/validation/embedded_metadata_validator.d.ts.map +0 -1
- package/dist/src/validation/embedded_metadata_validator.js +0 -122
- package/dist/src/validation/embedded_metadata_validator.js.map +0 -1
- package/dist/src/validation/embedded_metadata_validator.test.d.ts +0 -2
- package/dist/src/validation/embedded_metadata_validator.test.d.ts.map +0 -1
- package/dist/src/validation/embedded_metadata_validator.test.js +0 -316
- package/dist/src/validation/embedded_metadata_validator.test.js.map +0 -1
- package/dist/src/validation/errors.d.ts +0 -67
- package/dist/src/validation/errors.d.ts.map +0 -1
- package/dist/src/validation/errors.js +0 -83
- package/dist/src/validation/errors.js.map +0 -1
- package/dist/src/validation/execution_validator.d.ts +0 -23
- package/dist/src/validation/execution_validator.d.ts.map +0 -1
- package/dist/src/validation/execution_validator.js +0 -58
- package/dist/src/validation/execution_validator.js.map +0 -1
- package/dist/src/validation/execution_validator.test.d.ts +0 -2
- package/dist/src/validation/execution_validator.test.d.ts.map +0 -1
- package/dist/src/validation/execution_validator.test.js +0 -167
- package/dist/src/validation/execution_validator.test.js.map +0 -1
- package/dist/src/validation/feedback_validator.d.ts +0 -23
- package/dist/src/validation/feedback_validator.d.ts.map +0 -1
- package/dist/src/validation/feedback_validator.js +0 -58
- package/dist/src/validation/feedback_validator.js.map +0 -1
- package/dist/src/validation/feedback_validator.test.d.ts +0 -2
- package/dist/src/validation/feedback_validator.test.d.ts.map +0 -1
- package/dist/src/validation/feedback_validator.test.js +0 -131
- package/dist/src/validation/feedback_validator.test.js.map +0 -1
- package/dist/src/validation/index.d.ts +0 -11
- package/dist/src/validation/index.d.ts.map +0 -1
- package/dist/src/validation/index.js +0 -10
- package/dist/src/validation/index.js.map +0 -1
- package/dist/src/validation/task_validator.d.ts +0 -24
- package/dist/src/validation/task_validator.d.ts.map +0 -1
- package/dist/src/validation/task_validator.js +0 -50
- package/dist/src/validation/task_validator.js.map +0 -1
- package/dist/src/validation/task_validator.test.d.ts +0 -2
- package/dist/src/validation/task_validator.test.d.ts.map +0 -1
- package/dist/src/validation/task_validator.test.js +0 -185
- package/dist/src/validation/task_validator.test.js.map +0 -1
- package/dist/src/validation/workflow_methodology_validator.d.ts +0 -32
- package/dist/src/validation/workflow_methodology_validator.d.ts.map +0 -1
- package/dist/src/validation/workflow_methodology_validator.js +0 -91
- package/dist/src/validation/workflow_methodology_validator.js.map +0 -1
- package/dist/src/validation/workflow_methodology_validator.test.d.ts +0 -2
- package/dist/src/validation/workflow_methodology_validator.test.d.ts.map +0 -1
- package/dist/src/validation/workflow_methodology_validator.test.js +0 -229
- package/dist/src/validation/workflow_methodology_validator.test.js.map +0 -1
|
@@ -1,646 +0,0 @@
|
|
|
1
|
-
// Mock IdentityAdapter before importing
|
|
2
|
-
jest.doMock('../adapters/identity_adapter', () => ({
|
|
3
|
-
IdentityAdapter: jest.fn().mockImplementation(() => ({
|
|
4
|
-
getActorPublicKey: jest.fn().mockResolvedValue('mock-public-key'),
|
|
5
|
-
getActor: jest.fn(),
|
|
6
|
-
createActor: jest.fn(),
|
|
7
|
-
listActors: jest.fn(),
|
|
8
|
-
signRecord: jest.fn(),
|
|
9
|
-
rotateActorKey: jest.fn(),
|
|
10
|
-
revokeActor: jest.fn(),
|
|
11
|
-
resolveCurrentActorId: jest.fn(),
|
|
12
|
-
getCurrentActor: jest.fn(),
|
|
13
|
-
getEffectiveActorForAgent: jest.fn(),
|
|
14
|
-
authenticate: jest.fn(),
|
|
15
|
-
createAgentRecord: jest.fn(),
|
|
16
|
-
getAgentRecord: jest.fn(),
|
|
17
|
-
listAgentRecords: jest.fn(),
|
|
18
|
-
}))
|
|
19
|
-
}));
|
|
20
|
-
import { RecordStore } from './record_store';
|
|
21
|
-
import * as path from 'path';
|
|
22
|
-
import { createExecutionRecord, createChangelogRecord, createFeedbackRecord } from '../factories';
|
|
23
|
-
// This is our hand-made mock for the fs dependencies.
|
|
24
|
-
const mockFs = {
|
|
25
|
-
mkdir: jest.fn(),
|
|
26
|
-
writeFile: jest.fn(),
|
|
27
|
-
readFile: jest.fn(),
|
|
28
|
-
readdir: jest.fn(),
|
|
29
|
-
unlink: jest.fn(),
|
|
30
|
-
access: jest.fn(),
|
|
31
|
-
};
|
|
32
|
-
const testRoot = '/tmp/gitgov-test-root';
|
|
33
|
-
// Helper function to create mock Dirent objects
|
|
34
|
-
const createMockDirent = (name, isFile = true) => ({
|
|
35
|
-
name,
|
|
36
|
-
isFile: () => isFile,
|
|
37
|
-
isDirectory: () => !isFile,
|
|
38
|
-
isBlockDevice: () => false,
|
|
39
|
-
isCharacterDevice: () => false,
|
|
40
|
-
isSymbolicLink: () => false,
|
|
41
|
-
isFIFO: () => false,
|
|
42
|
-
isSocket: () => false,
|
|
43
|
-
}); // Using any here because Jest mocks are complex to type correctly
|
|
44
|
-
// Helper function to create mock Signature objects
|
|
45
|
-
const createMockSignature = (keyId = 'human:test-user') => ({
|
|
46
|
-
keyId,
|
|
47
|
-
role: 'author',
|
|
48
|
-
signature: 'mock-signature-hash',
|
|
49
|
-
timestamp: 1704067200000,
|
|
50
|
-
timestamp_iso: '2024-01-01T00:00:00.000Z'
|
|
51
|
-
});
|
|
52
|
-
describe('RecordStore<ActorRecord>', () => {
|
|
53
|
-
let actorStore;
|
|
54
|
-
const actorsDir = path.join(testRoot, '.gitgov', 'actors');
|
|
55
|
-
beforeAll(() => {
|
|
56
|
-
// Set up mocks once for all tests in this suite
|
|
57
|
-
mockFs.mkdir.mockResolvedValue(undefined);
|
|
58
|
-
});
|
|
59
|
-
beforeEach(() => {
|
|
60
|
-
// Reset mocks before each test to ensure isolation
|
|
61
|
-
jest.restoreAllMocks();
|
|
62
|
-
actorStore = new RecordStore('actors', testRoot, mockFs);
|
|
63
|
-
});
|
|
64
|
-
const actorPayload = {
|
|
65
|
-
id: 'human:test-user', type: 'human', displayName: 'Test User',
|
|
66
|
-
publicKey: 'some-key', roles: ['author'], status: 'active',
|
|
67
|
-
};
|
|
68
|
-
const mockHeader = {
|
|
69
|
-
version: '1.0',
|
|
70
|
-
type: 'actor',
|
|
71
|
-
payloadChecksum: 'valid-checksum',
|
|
72
|
-
// Provide a valid signature object to satisfy the type
|
|
73
|
-
signatures: [{ keyId: 'a', role: 'b', signature: 'c', timestamp: 1, timestamp_iso: 'd' }],
|
|
74
|
-
};
|
|
75
|
-
const actorRecord = {
|
|
76
|
-
header: mockHeader,
|
|
77
|
-
payload: actorPayload,
|
|
78
|
-
};
|
|
79
|
-
const actorFileName = 'human_test-user.json';
|
|
80
|
-
const expectedPath = path.join(actorsDir, actorFileName);
|
|
81
|
-
describe('write', () => {
|
|
82
|
-
it('[EARS-1 & EARS-2] should write a record and create the directory', async () => {
|
|
83
|
-
mockFs.writeFile.mockResolvedValue(undefined);
|
|
84
|
-
await actorStore.write(actorRecord);
|
|
85
|
-
expect(mockFs.mkdir).toHaveBeenCalledWith(actorsDir, { recursive: true });
|
|
86
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedPath, expect.stringContaining('"id": "human:test-user"'), 'utf-8');
|
|
87
|
-
});
|
|
88
|
-
});
|
|
89
|
-
describe('read', () => {
|
|
90
|
-
it('[EARS-5] should read an existing record', async () => {
|
|
91
|
-
const mockContent = JSON.stringify(actorRecord);
|
|
92
|
-
mockFs.readFile.mockResolvedValue(mockContent);
|
|
93
|
-
const readData = await actorStore.read(actorPayload.id);
|
|
94
|
-
expect(mockFs.readFile).toHaveBeenCalledWith(expectedPath, 'utf-8');
|
|
95
|
-
expect(readData).toEqual(actorRecord);
|
|
96
|
-
});
|
|
97
|
-
it('[EARS-6] should return null if the record does not exist', async () => {
|
|
98
|
-
const error = new Error('File not found');
|
|
99
|
-
error.code = 'ENOENT';
|
|
100
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
101
|
-
const readData = await actorStore.read('non-existent');
|
|
102
|
-
expect(readData).toBeNull();
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
describe('delete', () => {
|
|
106
|
-
it('[EARS-10] should delete an existing file', async () => {
|
|
107
|
-
mockFs.unlink.mockResolvedValue(undefined);
|
|
108
|
-
await actorStore.delete(actorPayload.id);
|
|
109
|
-
expect(mockFs.unlink).toHaveBeenCalledWith(expectedPath);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
describe('list', () => {
|
|
113
|
-
it('[EARS-11] should list all record IDs from the directory', async () => {
|
|
114
|
-
// Mock the simplest case: readdir returns Dirent objects with just the properties we need
|
|
115
|
-
const mockFiles = [
|
|
116
|
-
createMockDirent('human_test-user.json'),
|
|
117
|
-
createMockDirent('agent_another.json'),
|
|
118
|
-
createMockDirent('not-json.txt'),
|
|
119
|
-
createMockDirent('a-directory', false),
|
|
120
|
-
];
|
|
121
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
122
|
-
const ids = await actorStore.list();
|
|
123
|
-
expect(mockFs.readdir).toHaveBeenCalledWith(actorsDir, { withFileTypes: true });
|
|
124
|
-
expect(ids).toEqual(['human:test-user', 'agent:another']);
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
describe('exists', () => {
|
|
128
|
-
it('[EARS-12] should return true if a record exists', async () => {
|
|
129
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
130
|
-
const result = await actorStore.exists(actorPayload.id);
|
|
131
|
-
expect(mockFs.access).toHaveBeenCalled();
|
|
132
|
-
expect(result).toBe(true);
|
|
133
|
-
});
|
|
134
|
-
it('[EARS-13] should return false if a record does not exist', async () => {
|
|
135
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
136
|
-
const result = await actorStore.exists('non-existent');
|
|
137
|
-
expect(result).toBe(false);
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
describe('RecordStore<AgentRecord>', () => {
|
|
142
|
-
let agentStore;
|
|
143
|
-
const agentsDir = path.join(testRoot, '.gitgov', 'agents');
|
|
144
|
-
beforeEach(() => {
|
|
145
|
-
// Reset mocks before each test to ensure isolation
|
|
146
|
-
jest.restoreAllMocks();
|
|
147
|
-
agentStore = new RecordStore('agents', testRoot, mockFs);
|
|
148
|
-
});
|
|
149
|
-
const agentPayload = {
|
|
150
|
-
id: 'agent:test-agent', guild: 'design', status: 'active',
|
|
151
|
-
engine: { type: 'local', runtime: 'typescript', entrypoint: 'test.ts', function: 'run' },
|
|
152
|
-
triggers: [], knowledge_dependencies: [], prompt_engine_requirements: {}
|
|
153
|
-
};
|
|
154
|
-
const mockAgentHeader = {
|
|
155
|
-
version: '1.0',
|
|
156
|
-
type: 'agent',
|
|
157
|
-
payloadChecksum: 'valid-agent-checksum',
|
|
158
|
-
signatures: [{ keyId: 'agent:test-agent', role: 'author', signature: 'sig', timestamp: 1, timestamp_iso: 'd' }],
|
|
159
|
-
};
|
|
160
|
-
const agentRecord = {
|
|
161
|
-
header: mockAgentHeader,
|
|
162
|
-
payload: agentPayload,
|
|
163
|
-
};
|
|
164
|
-
const agentFileName = 'agent_test-agent.json';
|
|
165
|
-
const expectedAgentPath = path.join(agentsDir, agentFileName);
|
|
166
|
-
describe('write', () => {
|
|
167
|
-
it('[EARS-1 & EARS-2] should write an agent record and create the directory', async () => {
|
|
168
|
-
mockFs.writeFile.mockResolvedValue(undefined);
|
|
169
|
-
await agentStore.write(agentRecord);
|
|
170
|
-
expect(mockFs.mkdir).toHaveBeenCalledWith(agentsDir, { recursive: true });
|
|
171
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedAgentPath, expect.stringContaining('"id": "agent:test-agent"'), 'utf-8');
|
|
172
|
-
});
|
|
173
|
-
});
|
|
174
|
-
describe('read', () => {
|
|
175
|
-
it('[EARS-5] should read an existing agent record', async () => {
|
|
176
|
-
const mockContent = JSON.stringify(agentRecord);
|
|
177
|
-
mockFs.readFile.mockResolvedValue(mockContent);
|
|
178
|
-
const readData = await agentStore.read(agentPayload.id);
|
|
179
|
-
expect(mockFs.readFile).toHaveBeenCalledWith(expectedAgentPath, 'utf-8');
|
|
180
|
-
expect(readData).toEqual(agentRecord);
|
|
181
|
-
});
|
|
182
|
-
it('[EARS-6] should return null if the agent record does not exist', async () => {
|
|
183
|
-
const error = new Error('File not found');
|
|
184
|
-
error.code = 'ENOENT';
|
|
185
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
186
|
-
const readData = await agentStore.read('agent:non-existent');
|
|
187
|
-
expect(readData).toBeNull();
|
|
188
|
-
});
|
|
189
|
-
});
|
|
190
|
-
describe('delete', () => {
|
|
191
|
-
it('[EARS-10] should delete an existing agent file', async () => {
|
|
192
|
-
mockFs.unlink.mockResolvedValue(undefined);
|
|
193
|
-
await agentStore.delete(agentPayload.id);
|
|
194
|
-
expect(mockFs.unlink).toHaveBeenCalledWith(expectedAgentPath);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
describe('list', () => {
|
|
198
|
-
it('[EARS-11] should list all agent record IDs from the directory', async () => {
|
|
199
|
-
const mockFiles = [
|
|
200
|
-
createMockDirent('agent_test-agent.json'),
|
|
201
|
-
createMockDirent('agent_design-bot.json'),
|
|
202
|
-
createMockDirent('not-json.txt'),
|
|
203
|
-
createMockDirent('a-directory', false),
|
|
204
|
-
];
|
|
205
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
206
|
-
const ids = await agentStore.list();
|
|
207
|
-
expect(mockFs.readdir).toHaveBeenCalledWith(agentsDir, { withFileTypes: true });
|
|
208
|
-
expect(ids).toEqual(['agent:test-agent', 'agent:design-bot']);
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
describe('exists', () => {
|
|
212
|
-
it('[EARS-12] should return true if an agent record exists', async () => {
|
|
213
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
214
|
-
const result = await agentStore.exists(agentPayload.id);
|
|
215
|
-
expect(mockFs.access).toHaveBeenCalled();
|
|
216
|
-
expect(result).toBe(true);
|
|
217
|
-
});
|
|
218
|
-
it('[EARS-13] should return false if an agent record does not exist', async () => {
|
|
219
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
220
|
-
const result = await agentStore.exists('agent:non-existent');
|
|
221
|
-
expect(result).toBe(false);
|
|
222
|
-
});
|
|
223
|
-
});
|
|
224
|
-
});
|
|
225
|
-
describe('RecordStore<TaskRecord>', () => {
|
|
226
|
-
let taskStore;
|
|
227
|
-
const tasksDir = path.join(testRoot, '.gitgov', 'tasks');
|
|
228
|
-
beforeEach(() => {
|
|
229
|
-
jest.restoreAllMocks();
|
|
230
|
-
taskStore = new RecordStore('tasks', testRoot, mockFs);
|
|
231
|
-
});
|
|
232
|
-
const taskPayload = {
|
|
233
|
-
id: '1752274500-task-test-task', title: 'Test Task',
|
|
234
|
-
status: 'draft', priority: 'medium', description: 'A test task for store validation', tags: ['test']
|
|
235
|
-
};
|
|
236
|
-
const mockTaskHeader = {
|
|
237
|
-
version: '1.0',
|
|
238
|
-
type: 'task',
|
|
239
|
-
payloadChecksum: 'valid-task-checksum',
|
|
240
|
-
signatures: [{ keyId: 'human:test-user', role: 'author', signature: 'sig', timestamp: 1, timestamp_iso: 'd' }],
|
|
241
|
-
};
|
|
242
|
-
const taskRecord = {
|
|
243
|
-
header: mockTaskHeader,
|
|
244
|
-
payload: taskPayload,
|
|
245
|
-
};
|
|
246
|
-
const taskFileName = '1752274500-task-test-task.json';
|
|
247
|
-
const expectedTaskPath = path.join(tasksDir, taskFileName);
|
|
248
|
-
describe('write', () => {
|
|
249
|
-
it('[EARS-1 & EARS-2] should write a task record and create the directory', async () => {
|
|
250
|
-
mockFs.writeFile.mockResolvedValue(undefined);
|
|
251
|
-
await taskStore.write(taskRecord);
|
|
252
|
-
expect(mockFs.mkdir).toHaveBeenCalledWith(tasksDir, { recursive: true });
|
|
253
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedTaskPath, expect.stringContaining('"id": "1752274500-task-test-task"'), 'utf-8');
|
|
254
|
-
});
|
|
255
|
-
});
|
|
256
|
-
describe('read', () => {
|
|
257
|
-
it('[EARS-5] should read an existing task record', async () => {
|
|
258
|
-
const mockContent = JSON.stringify(taskRecord);
|
|
259
|
-
mockFs.readFile.mockResolvedValue(mockContent);
|
|
260
|
-
const readData = await taskStore.read(taskPayload.id);
|
|
261
|
-
expect(mockFs.readFile).toHaveBeenCalledWith(expectedTaskPath, 'utf-8');
|
|
262
|
-
expect(readData).toEqual(taskRecord);
|
|
263
|
-
});
|
|
264
|
-
it('[EARS-6] should return null if the task record does not exist', async () => {
|
|
265
|
-
const error = new Error('File not found');
|
|
266
|
-
error.code = 'ENOENT';
|
|
267
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
268
|
-
const readData = await taskStore.read('1752274500-task-non-existent');
|
|
269
|
-
expect(readData).toBeNull();
|
|
270
|
-
});
|
|
271
|
-
});
|
|
272
|
-
describe('list', () => {
|
|
273
|
-
it('[EARS-11] should list all task record IDs from the directory', async () => {
|
|
274
|
-
const mockFiles = [
|
|
275
|
-
createMockDirent('1752274500-task-test-task.json'),
|
|
276
|
-
createMockDirent('1752360900-task-another-task.json'),
|
|
277
|
-
createMockDirent('not-json.txt'),
|
|
278
|
-
createMockDirent('a-directory', false),
|
|
279
|
-
];
|
|
280
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
281
|
-
const ids = await taskStore.list();
|
|
282
|
-
expect(mockFs.readdir).toHaveBeenCalledWith(tasksDir, { withFileTypes: true });
|
|
283
|
-
expect(ids).toEqual(['1752274500-task-test-task', '1752360900-task-another-task']);
|
|
284
|
-
});
|
|
285
|
-
});
|
|
286
|
-
describe('exists', () => {
|
|
287
|
-
it('[EARS-12] should return true if a task record exists', async () => {
|
|
288
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
289
|
-
const result = await taskStore.exists(taskPayload.id);
|
|
290
|
-
expect(mockFs.access).toHaveBeenCalled();
|
|
291
|
-
expect(result).toBe(true);
|
|
292
|
-
});
|
|
293
|
-
it('[EARS-13] should return false if a task record does not exist', async () => {
|
|
294
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
295
|
-
const result = await taskStore.exists('1752274500-task-non-existent');
|
|
296
|
-
expect(result).toBe(false);
|
|
297
|
-
});
|
|
298
|
-
});
|
|
299
|
-
});
|
|
300
|
-
describe('RecordStore<CycleRecord>', () => {
|
|
301
|
-
let cycleStore;
|
|
302
|
-
const cyclesDir = path.join(testRoot, '.gitgov', 'cycles');
|
|
303
|
-
beforeEach(() => {
|
|
304
|
-
jest.restoreAllMocks();
|
|
305
|
-
cycleStore = new RecordStore('cycles', testRoot, mockFs);
|
|
306
|
-
});
|
|
307
|
-
const cyclePayload = {
|
|
308
|
-
id: '1754400000-cycle-test-cycle', title: 'Test Cycle',
|
|
309
|
-
status: 'planning', taskIds: ['1752274500-task-test-task'], tags: ['test']
|
|
310
|
-
};
|
|
311
|
-
const mockCycleHeader = {
|
|
312
|
-
version: '1.0',
|
|
313
|
-
type: 'cycle',
|
|
314
|
-
payloadChecksum: 'valid-cycle-checksum',
|
|
315
|
-
signatures: [{ keyId: 'human:test-user', role: 'author', signature: 'sig', timestamp: 1, timestamp_iso: 'd' }],
|
|
316
|
-
};
|
|
317
|
-
const cycleRecord = {
|
|
318
|
-
header: mockCycleHeader,
|
|
319
|
-
payload: cyclePayload,
|
|
320
|
-
};
|
|
321
|
-
const cycleFileName = '1754400000-cycle-test-cycle.json';
|
|
322
|
-
const expectedCyclePath = path.join(cyclesDir, cycleFileName);
|
|
323
|
-
describe('write', () => {
|
|
324
|
-
it('[EARS-1 & EARS-2] should write a cycle record and create the directory', async () => {
|
|
325
|
-
mockFs.writeFile.mockResolvedValue(undefined);
|
|
326
|
-
await cycleStore.write(cycleRecord);
|
|
327
|
-
expect(mockFs.mkdir).toHaveBeenCalledWith(cyclesDir, { recursive: true });
|
|
328
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedCyclePath, expect.stringContaining('"id": "1754400000-cycle-test-cycle"'), 'utf-8');
|
|
329
|
-
});
|
|
330
|
-
});
|
|
331
|
-
describe('read', () => {
|
|
332
|
-
it('[EARS-5] should read an existing cycle record', async () => {
|
|
333
|
-
const mockContent = JSON.stringify(cycleRecord);
|
|
334
|
-
mockFs.readFile.mockResolvedValue(mockContent);
|
|
335
|
-
const readData = await cycleStore.read(cyclePayload.id);
|
|
336
|
-
expect(mockFs.readFile).toHaveBeenCalledWith(expectedCyclePath, 'utf-8');
|
|
337
|
-
expect(readData).toEqual(cycleRecord);
|
|
338
|
-
});
|
|
339
|
-
it('[EARS-6] should return null if the cycle record does not exist', async () => {
|
|
340
|
-
const error = new Error('File not found');
|
|
341
|
-
error.code = 'ENOENT';
|
|
342
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
343
|
-
const readData = await cycleStore.read('1754400000-cycle-non-existent');
|
|
344
|
-
expect(readData).toBeNull();
|
|
345
|
-
});
|
|
346
|
-
});
|
|
347
|
-
describe('list', () => {
|
|
348
|
-
it('[EARS-11] should list all cycle record IDs from the directory', async () => {
|
|
349
|
-
const mockFiles = [
|
|
350
|
-
createMockDirent('1754400000-cycle-test-cycle.json'),
|
|
351
|
-
createMockDirent('1754500000-cycle-another-cycle.json'),
|
|
352
|
-
createMockDirent('not-json.txt'),
|
|
353
|
-
createMockDirent('a-directory', false),
|
|
354
|
-
];
|
|
355
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
356
|
-
const ids = await cycleStore.list();
|
|
357
|
-
expect(mockFs.readdir).toHaveBeenCalledWith(cyclesDir, { withFileTypes: true });
|
|
358
|
-
expect(ids).toEqual(['1754400000-cycle-test-cycle', '1754500000-cycle-another-cycle']);
|
|
359
|
-
});
|
|
360
|
-
});
|
|
361
|
-
describe('exists', () => {
|
|
362
|
-
it('[EARS-12] should return true if a cycle record exists', async () => {
|
|
363
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
364
|
-
const result = await cycleStore.exists(cyclePayload.id);
|
|
365
|
-
expect(mockFs.access).toHaveBeenCalled();
|
|
366
|
-
expect(result).toBe(true);
|
|
367
|
-
});
|
|
368
|
-
it('[EARS-13] should return false if a cycle record does not exist', async () => {
|
|
369
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
370
|
-
const result = await cycleStore.exists('1754400000-cycle-non-existent');
|
|
371
|
-
expect(result).toBe(false);
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
});
|
|
375
|
-
// --- Validation Methods Tests ---
|
|
376
|
-
// Mock the validation module at the top level
|
|
377
|
-
jest.mock('../validation/embedded_metadata_validator', () => ({
|
|
378
|
-
validateFullEmbeddedMetadataRecord: jest.fn().mockResolvedValue(undefined)
|
|
379
|
-
}));
|
|
380
|
-
import { validateFullEmbeddedMetadataRecord } from '../validation/embedded_metadata_validator';
|
|
381
|
-
const mockValidateFullEmbeddedMetadataRecord = validateFullEmbeddedMetadataRecord;
|
|
382
|
-
// Global beforeEach to reset validation mock
|
|
383
|
-
beforeEach(() => {
|
|
384
|
-
mockValidateFullEmbeddedMetadataRecord.mockResolvedValue(undefined);
|
|
385
|
-
});
|
|
386
|
-
describe('RecordStore Validation Methods', () => {
|
|
387
|
-
let actorStore;
|
|
388
|
-
beforeEach(() => {
|
|
389
|
-
jest.clearAllMocks();
|
|
390
|
-
actorStore = new RecordStore('actors', testRoot, mockFs);
|
|
391
|
-
});
|
|
392
|
-
const validActorRecord = {
|
|
393
|
-
header: {
|
|
394
|
-
version: '1.0',
|
|
395
|
-
type: 'actor',
|
|
396
|
-
payloadChecksum: 'valid-checksum',
|
|
397
|
-
signatures: [{ keyId: 'human:test-user', role: 'author', signature: 'sig', timestamp: 1, timestamp_iso: 'd' }],
|
|
398
|
-
},
|
|
399
|
-
payload: {
|
|
400
|
-
id: 'human:test-user', type: 'human', displayName: 'Test User',
|
|
401
|
-
publicKey: 'some-key', roles: ['author'], status: 'active',
|
|
402
|
-
}
|
|
403
|
-
};
|
|
404
|
-
describe('write (dumb storage)', () => {
|
|
405
|
-
it('[EARS-3] should persist record without validation (validation is adapter responsibility)', async () => {
|
|
406
|
-
mockFs.writeFile.mockResolvedValue(undefined);
|
|
407
|
-
await actorStore.write(validActorRecord);
|
|
408
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expect.stringContaining('human_test-user.json'), JSON.stringify(validActorRecord, null, 2), 'utf-8');
|
|
409
|
-
// RecordStore should NOT call validation - that's adapter responsibility
|
|
410
|
-
expect(mockValidateFullEmbeddedMetadataRecord).not.toHaveBeenCalled();
|
|
411
|
-
});
|
|
412
|
-
it('[EARS-4] should persist any record without validation (even invalid ones)', async () => {
|
|
413
|
-
const invalidRecord = { ...validActorRecord, payload: { ...validActorRecord.payload, id: '' } };
|
|
414
|
-
mockFs.writeFile.mockResolvedValue(undefined);
|
|
415
|
-
await actorStore.write(invalidRecord);
|
|
416
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expect.stringContaining('.json'), JSON.stringify(invalidRecord, null, 2), 'utf-8');
|
|
417
|
-
// RecordStore should NOT validate - it's "dumb storage"
|
|
418
|
-
expect(mockValidateFullEmbeddedMetadataRecord).not.toHaveBeenCalled();
|
|
419
|
-
});
|
|
420
|
-
});
|
|
421
|
-
describe('read (dumb storage)', () => {
|
|
422
|
-
it('[EARS-7] should return record without validation (validation is adapter responsibility)', async () => {
|
|
423
|
-
mockFs.readFile.mockResolvedValue(JSON.stringify(validActorRecord));
|
|
424
|
-
const result = await actorStore.read('human:test-user');
|
|
425
|
-
expect(mockFs.readFile).toHaveBeenCalledWith(expect.stringContaining('human_test-user.json'), 'utf-8');
|
|
426
|
-
expect(result).toEqual(validActorRecord);
|
|
427
|
-
// RecordStore should NOT call validation - that's adapter responsibility
|
|
428
|
-
expect(mockValidateFullEmbeddedMetadataRecord).not.toHaveBeenCalled();
|
|
429
|
-
});
|
|
430
|
-
it('[EARS-8] should return any record without validation (even invalid ones)', async () => {
|
|
431
|
-
const invalidRecord = { ...validActorRecord, payload: { ...validActorRecord.payload, id: '' } };
|
|
432
|
-
mockFs.readFile.mockResolvedValue(JSON.stringify(invalidRecord));
|
|
433
|
-
const result = await actorStore.read('human:test-user');
|
|
434
|
-
expect(mockFs.readFile).toHaveBeenCalled();
|
|
435
|
-
expect(result).toEqual(invalidRecord);
|
|
436
|
-
// RecordStore should NOT validate - it's "dumb storage"
|
|
437
|
-
expect(mockValidateFullEmbeddedMetadataRecord).not.toHaveBeenCalled();
|
|
438
|
-
});
|
|
439
|
-
it('[EARS-9] should return null when record does not exist', async () => {
|
|
440
|
-
const error = new Error('File not found');
|
|
441
|
-
error.code = 'ENOENT';
|
|
442
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
443
|
-
const result = await actorStore.read('non-existent');
|
|
444
|
-
expect(result).toBeNull();
|
|
445
|
-
expect(mockFs.readFile).toHaveBeenCalled();
|
|
446
|
-
// Should not call validation for non-existent records
|
|
447
|
-
expect(mockValidateFullEmbeddedMetadataRecord).not.toHaveBeenCalled();
|
|
448
|
-
});
|
|
449
|
-
});
|
|
450
|
-
});
|
|
451
|
-
// --- ExecutionRecord Tests ---
|
|
452
|
-
describe('RecordStore<ExecutionRecord>', () => {
|
|
453
|
-
let executionStore;
|
|
454
|
-
let mockExecutionRecord;
|
|
455
|
-
beforeEach(async () => {
|
|
456
|
-
executionStore = new RecordStore('executions', testRoot, mockFs);
|
|
457
|
-
mockExecutionRecord = {
|
|
458
|
-
header: {
|
|
459
|
-
type: 'execution',
|
|
460
|
-
version: '1.0',
|
|
461
|
-
payloadChecksum: 'a'.repeat(64), // Mock SHA-256 hash
|
|
462
|
-
signatures: [createMockSignature()]
|
|
463
|
-
},
|
|
464
|
-
payload: await createExecutionRecord({
|
|
465
|
-
id: '1757460000-exec-test-execution',
|
|
466
|
-
title: 'Test Execution',
|
|
467
|
-
taskId: '1757452191-task-implement-workflow-methodology-adapter',
|
|
468
|
-
result: 'Completed successfully.',
|
|
469
|
-
}),
|
|
470
|
-
};
|
|
471
|
-
});
|
|
472
|
-
it('[EARS-1 & EARS-2] should write an ExecutionRecord', async () => {
|
|
473
|
-
await executionStore.write(mockExecutionRecord);
|
|
474
|
-
const expectedPath = path.join('/tmp/gitgov-test-root', '.gitgov', 'executions', '1757460000-exec-test-execution.json');
|
|
475
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedPath, expect.any(String), 'utf-8');
|
|
476
|
-
});
|
|
477
|
-
it('[EARS-5] should read an ExecutionRecord', async () => {
|
|
478
|
-
mockFs.readFile.mockResolvedValue(JSON.stringify(mockExecutionRecord));
|
|
479
|
-
const record = await executionStore.read(mockExecutionRecord.payload.id);
|
|
480
|
-
expect(record).toEqual(mockExecutionRecord);
|
|
481
|
-
});
|
|
482
|
-
it('[EARS-6] should return null if ExecutionRecord does not exist', async () => {
|
|
483
|
-
const error = new Error('File not found');
|
|
484
|
-
error.code = 'ENOENT';
|
|
485
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
486
|
-
const readData = await executionStore.read('non-existent');
|
|
487
|
-
expect(readData).toBeNull();
|
|
488
|
-
});
|
|
489
|
-
it('[EARS-10] should delete an ExecutionRecord', async () => {
|
|
490
|
-
mockFs.unlink.mockResolvedValue(undefined);
|
|
491
|
-
await executionStore.delete(mockExecutionRecord.payload.id);
|
|
492
|
-
const expectedPath = path.join('/tmp/gitgov-test-root', '.gitgov', 'executions', '1757460000-exec-test-execution.json');
|
|
493
|
-
expect(mockFs.unlink).toHaveBeenCalledWith(expectedPath);
|
|
494
|
-
});
|
|
495
|
-
it('[EARS-11] should list ExecutionRecord IDs', async () => {
|
|
496
|
-
const mockFiles = [
|
|
497
|
-
createMockDirent('1757460000-exec-test-execution.json'),
|
|
498
|
-
createMockDirent('1757460001-exec-another.json'),
|
|
499
|
-
];
|
|
500
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
501
|
-
const ids = await executionStore.list();
|
|
502
|
-
expect(ids).toEqual(['1757460000-exec-test-execution', '1757460001-exec-another']);
|
|
503
|
-
});
|
|
504
|
-
it('[EARS-12] should return true if ExecutionRecord exists', async () => {
|
|
505
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
506
|
-
const result = await executionStore.exists(mockExecutionRecord.payload.id);
|
|
507
|
-
expect(result).toBe(true);
|
|
508
|
-
});
|
|
509
|
-
it('[EARS-13] should return false if ExecutionRecord does not exist', async () => {
|
|
510
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
511
|
-
const result = await executionStore.exists('non-existent');
|
|
512
|
-
expect(result).toBe(false);
|
|
513
|
-
});
|
|
514
|
-
});
|
|
515
|
-
// --- ChangelogRecord Tests ---
|
|
516
|
-
describe('RecordStore<ChangelogRecord>', () => {
|
|
517
|
-
let changelogStore;
|
|
518
|
-
let mockChangelogRecord;
|
|
519
|
-
beforeEach(async () => {
|
|
520
|
-
changelogStore = new RecordStore('changelogs', testRoot, mockFs);
|
|
521
|
-
mockChangelogRecord = {
|
|
522
|
-
header: {
|
|
523
|
-
type: 'changelog',
|
|
524
|
-
version: '1.0',
|
|
525
|
-
payloadChecksum: 'b'.repeat(64), // Mock SHA-256 hash
|
|
526
|
-
signatures: [createMockSignature()]
|
|
527
|
-
},
|
|
528
|
-
payload: await createChangelogRecord({
|
|
529
|
-
id: '1757460001-changelog-task-implement-workflow-methodology-adapter',
|
|
530
|
-
entityType: 'task',
|
|
531
|
-
entityId: '1757452191-task-implement-workflow-methodology-adapter',
|
|
532
|
-
changeType: 'completion',
|
|
533
|
-
title: 'Workflow Methodology Adapter Completed',
|
|
534
|
-
description: 'Successfully completed the implementation of workflow methodology adapter with all requirements',
|
|
535
|
-
triggeredBy: 'human:developer',
|
|
536
|
-
reason: 'All acceptance criteria met and code review passed'
|
|
537
|
-
}),
|
|
538
|
-
};
|
|
539
|
-
});
|
|
540
|
-
it('[EARS-1 & EARS-2] should write a ChangelogRecord', async () => {
|
|
541
|
-
await changelogStore.write(mockChangelogRecord);
|
|
542
|
-
const expectedPath = path.join('/tmp/gitgov-test-root', '.gitgov', 'changelogs', '1757460001-changelog-task-implement-workflow-methodology-adapter.json');
|
|
543
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedPath, expect.any(String), 'utf-8');
|
|
544
|
-
});
|
|
545
|
-
it('[EARS-5] should read a ChangelogRecord', async () => {
|
|
546
|
-
mockFs.readFile.mockResolvedValue(JSON.stringify(mockChangelogRecord));
|
|
547
|
-
const record = await changelogStore.read(mockChangelogRecord.payload.id);
|
|
548
|
-
expect(record).toEqual(mockChangelogRecord);
|
|
549
|
-
});
|
|
550
|
-
it('[EARS-6] should return null if ChangelogRecord does not exist', async () => {
|
|
551
|
-
const error = new Error('File not found');
|
|
552
|
-
error.code = 'ENOENT';
|
|
553
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
554
|
-
const readData = await changelogStore.read('non-existent');
|
|
555
|
-
expect(readData).toBeNull();
|
|
556
|
-
});
|
|
557
|
-
it('[EARS-10] should delete a ChangelogRecord', async () => {
|
|
558
|
-
mockFs.unlink.mockResolvedValue(undefined);
|
|
559
|
-
await changelogStore.delete(mockChangelogRecord.payload.id);
|
|
560
|
-
const expectedPath = path.join('/tmp/gitgov-test-root', '.gitgov', 'changelogs', '1757460001-changelog-task-implement-workflow-methodology-adapter.json');
|
|
561
|
-
expect(mockFs.unlink).toHaveBeenCalledWith(expectedPath);
|
|
562
|
-
});
|
|
563
|
-
it('[EARS-11] should list ChangelogRecord IDs', async () => {
|
|
564
|
-
const mockFiles = [
|
|
565
|
-
createMockDirent('1757460001-changelog-task-implement-workflow-methodology-adapter.json'),
|
|
566
|
-
createMockDirent('1757460002-changelog-another.json'),
|
|
567
|
-
];
|
|
568
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
569
|
-
const ids = await changelogStore.list();
|
|
570
|
-
expect(ids).toEqual(['1757460001-changelog-task-implement-workflow-methodology-adapter', '1757460002-changelog-another']);
|
|
571
|
-
});
|
|
572
|
-
it('[EARS-12] should return true if ChangelogRecord exists', async () => {
|
|
573
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
574
|
-
const result = await changelogStore.exists(mockChangelogRecord.payload.id);
|
|
575
|
-
expect(result).toBe(true);
|
|
576
|
-
});
|
|
577
|
-
it('[EARS-13] should return false if ChangelogRecord does not exist', async () => {
|
|
578
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
579
|
-
const result = await changelogStore.exists('non-existent');
|
|
580
|
-
expect(result).toBe(false);
|
|
581
|
-
});
|
|
582
|
-
});
|
|
583
|
-
// --- FeedbackRecord Tests ---
|
|
584
|
-
describe('RecordStore<FeedbackRecord>', () => {
|
|
585
|
-
let feedbackStore;
|
|
586
|
-
let mockFeedbackRecord;
|
|
587
|
-
beforeEach(async () => {
|
|
588
|
-
feedbackStore = new RecordStore('feedback', testRoot, mockFs);
|
|
589
|
-
mockFeedbackRecord = {
|
|
590
|
-
header: {
|
|
591
|
-
type: 'feedback',
|
|
592
|
-
version: '1.0',
|
|
593
|
-
payloadChecksum: 'c'.repeat(64), // Mock SHA-256 hash
|
|
594
|
-
signatures: [createMockSignature()]
|
|
595
|
-
},
|
|
596
|
-
payload: await createFeedbackRecord({
|
|
597
|
-
id: '1757460002-feedback-test-feedback',
|
|
598
|
-
entityId: '1757452191-task-implement-workflow-methodology-adapter',
|
|
599
|
-
content: 'This looks great!'
|
|
600
|
-
}),
|
|
601
|
-
};
|
|
602
|
-
});
|
|
603
|
-
it('[EARS-1 & EARS-2] should write a FeedbackRecord', async () => {
|
|
604
|
-
await feedbackStore.write(mockFeedbackRecord);
|
|
605
|
-
const expectedPath = path.join('/tmp/gitgov-test-root', '.gitgov', 'feedback', '1757460002-feedback-test-feedback.json');
|
|
606
|
-
expect(mockFs.writeFile).toHaveBeenCalledWith(expectedPath, expect.any(String), 'utf-8');
|
|
607
|
-
});
|
|
608
|
-
it('[EARS-5] should read a FeedbackRecord', async () => {
|
|
609
|
-
mockFs.readFile.mockResolvedValue(JSON.stringify(mockFeedbackRecord));
|
|
610
|
-
const record = await feedbackStore.read(mockFeedbackRecord.payload.id);
|
|
611
|
-
expect(record).toEqual(mockFeedbackRecord);
|
|
612
|
-
});
|
|
613
|
-
it('[EARS-6] should return null if FeedbackRecord does not exist', async () => {
|
|
614
|
-
const error = new Error('File not found');
|
|
615
|
-
error.code = 'ENOENT';
|
|
616
|
-
mockFs.readFile.mockRejectedValue(error);
|
|
617
|
-
const readData = await feedbackStore.read('non-existent');
|
|
618
|
-
expect(readData).toBeNull();
|
|
619
|
-
});
|
|
620
|
-
it('[EARS-10] should delete a FeedbackRecord', async () => {
|
|
621
|
-
mockFs.unlink.mockResolvedValue(undefined);
|
|
622
|
-
await feedbackStore.delete(mockFeedbackRecord.payload.id);
|
|
623
|
-
const expectedPath = path.join('/tmp/gitgov-test-root', '.gitgov', 'feedback', '1757460002-feedback-test-feedback.json');
|
|
624
|
-
expect(mockFs.unlink).toHaveBeenCalledWith(expectedPath);
|
|
625
|
-
});
|
|
626
|
-
it('[EARS-11] should list FeedbackRecord IDs', async () => {
|
|
627
|
-
const mockFiles = [
|
|
628
|
-
createMockDirent('1757460002-feedback-test-feedback.json'),
|
|
629
|
-
createMockDirent('1757460003-feedback-another.json'),
|
|
630
|
-
];
|
|
631
|
-
mockFs.readdir.mockResolvedValue(mockFiles);
|
|
632
|
-
const ids = await feedbackStore.list();
|
|
633
|
-
expect(ids).toEqual(['1757460002-feedback-test-feedback', '1757460003-feedback-another']);
|
|
634
|
-
});
|
|
635
|
-
it('[EARS-12] should return true if FeedbackRecord exists', async () => {
|
|
636
|
-
mockFs.access.mockResolvedValue(undefined);
|
|
637
|
-
const result = await feedbackStore.exists(mockFeedbackRecord.payload.id);
|
|
638
|
-
expect(result).toBe(true);
|
|
639
|
-
});
|
|
640
|
-
it('[EARS-13] should return false if FeedbackRecord does not exist', async () => {
|
|
641
|
-
mockFs.access.mockRejectedValue(new Error('ENOENT'));
|
|
642
|
-
const result = await feedbackStore.exists('non-existent');
|
|
643
|
-
expect(result).toBe(false);
|
|
644
|
-
});
|
|
645
|
-
});
|
|
646
|
-
//# sourceMappingURL=record_store.test.js.map
|