memory-journal-mcp 6.1.2 → 6.2.1
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 +44 -28
- package/dist/{chunk-X4SWFATC.js → chunk-BI4ZNSKA.js} +38 -24
- package/dist/{chunk-HCEWINSB.js → chunk-N6EBIDN7.js} +99 -102
- package/dist/cli.js +2 -2
- package/dist/index.js +2 -2
- package/dist/tools-WPRY5MJ6.js +2 -0
- package/package.json +10 -1
- package/skills/github-commander/SKILL.md +151 -0
- package/skills/github-commander/config/project-config.example.md +125 -0
- package/skills/github-commander/workflows/code-quality-audit.md +80 -0
- package/skills/github-commander/workflows/full-audit.md +134 -0
- package/skills/github-commander/workflows/issue-triage.md +239 -0
- package/skills/github-commander/workflows/milestone-sprint.md +81 -0
- package/skills/github-commander/workflows/perf-audit.md +142 -0
- package/skills/github-commander/workflows/pr-review.md +123 -0
- package/skills/github-commander/workflows/security-audit.md +170 -0
- package/skills/github-commander/workflows/update-deps.md +109 -0
- package/.dockerignore +0 -139
- package/.gitattributes +0 -20
- package/.github/ISSUE_TEMPLATE/bug_report.md +0 -95
- package/.github/ISSUE_TEMPLATE/config.yml +0 -11
- package/.github/ISSUE_TEMPLATE/feature_request.md +0 -110
- package/.github/ISSUE_TEMPLATE/question.md +0 -78
- package/.github/aw/actions-lock.json +0 -14
- package/.github/copilot-instructions.md +0 -122
- package/.github/dependabot.yml +0 -93
- package/.github/pull_request_template.md +0 -135
- package/.github/workflows/README.md +0 -133
- package/.github/workflows/agentics-maintenance.yml +0 -141
- package/.github/workflows/auto-release.yml +0 -68
- package/.github/workflows/ci-health-monitor.lock.yml +0 -1121
- package/.github/workflows/ci-health-monitor.md +0 -87
- package/.github/workflows/codeql.yml +0 -41
- package/.github/workflows/dependabot-auto-merge.yml +0 -42
- package/.github/workflows/dependency-maintenance.lock.yml +0 -1182
- package/.github/workflows/dependency-maintenance.md +0 -147
- package/.github/workflows/docker-publish.yml +0 -254
- package/.github/workflows/docs-drift-detector.lock.yml +0 -1142
- package/.github/workflows/docs-drift-detector.md +0 -115
- package/.github/workflows/lint-and-test.yml +0 -60
- package/.github/workflows/publish-npm.yml +0 -85
- package/.github/workflows/secrets-scanning.yml +0 -32
- package/.github/workflows/security-update.yml +0 -127
- package/.gitleaks.toml +0 -9
- package/.prettierignore +0 -21
- package/.prettierrc +0 -33
- package/.scout-ignore +0 -12
- package/.trivyignore +0 -21
- package/CHANGELOG.md +0 -1814
- package/CODE_OF_CONDUCT.md +0 -133
- package/CONTRIBUTING.md +0 -263
- package/DOCKER_README.md +0 -331
- package/Dockerfile +0 -128
- package/SECURITY.md +0 -227
- package/UNRELEASED.md +0 -1
- package/dist/tools-T4U5A3X4.js +0 -2
- package/docker-compose.yml +0 -71
- package/docs/README.md +0 -18
- package/docs/agentic-journal-synergy.md +0 -175
- package/docs/copilot-setup.md +0 -72
- package/eslint.config.js +0 -110
- package/mcp-config-example.json +0 -21
- package/playwright.config.ts +0 -35
- package/releases/v2.1.0.md +0 -220
- package/releases/v2.2.0.md +0 -168
- package/releases/v3.0.0.md +0 -237
- package/releases/v3.1.0.md +0 -104
- package/releases/v3.1.1.md +0 -42
- package/releases/v3.1.2.md +0 -40
- package/releases/v3.1.3.md +0 -64
- package/releases/v3.1.4.md +0 -32
- package/releases/v3.1.5.md +0 -44
- package/releases/v4.0.0.md +0 -71
- package/releases/v4.1.0.md +0 -88
- package/releases/v4.2.0.md +0 -90
- package/releases/v4.3.0.md +0 -92
- package/releases/v4.3.1.md +0 -69
- package/releases/v4.4.0.md +0 -120
- package/releases/v4.4.1.md +0 -33
- package/releases/v4.4.2.md +0 -31
- package/releases/v4.5.0.md +0 -116
- package/releases/v5.0.0.md +0 -105
- package/releases/v5.0.1.md +0 -25
- package/releases/v5.1.0.md +0 -83
- package/releases/v5.1.1.md +0 -10
- package/releases/v6.0.0.md +0 -48
- package/releases/v6.0.1.md +0 -36
- package/releases/v6.1.0.md +0 -68
- package/releases/v6.1.1.md +0 -30
- package/releases/v6.1.2.md +0 -23
- package/scripts/generate-server-instructions.ts +0 -306
- package/scripts/server-instructions-function-body.ts +0 -107
- package/scripts/server-instructions-gotchas.ts +0 -45
- package/server.json +0 -42
- package/social-preview.png +0 -0
- package/src/auth/auth-context.ts +0 -78
- package/src/auth/authorization-server-discovery.ts +0 -263
- package/src/auth/errors.ts +0 -215
- package/src/auth/index.ts +0 -58
- package/src/auth/middleware.ts +0 -392
- package/src/auth/oauth-resource-server.ts +0 -170
- package/src/auth/scope-map.ts +0 -46
- package/src/auth/scopes.ts +0 -256
- package/src/auth/token-validator.ts +0 -293
- package/src/auth/transport-agnostic.ts +0 -164
- package/src/auth/types.ts +0 -372
- package/src/cli.ts +0 -279
- package/src/codemode/api-constants.ts +0 -263
- package/src/codemode/api.ts +0 -302
- package/src/codemode/auto-return.ts +0 -65
- package/src/codemode/index.ts +0 -47
- package/src/codemode/sandbox-factory.ts +0 -144
- package/src/codemode/sandbox.ts +0 -220
- package/src/codemode/security.ts +0 -155
- package/src/codemode/types.ts +0 -228
- package/src/codemode/worker-sandbox.ts +0 -277
- package/src/codemode/worker-script.ts +0 -239
- package/src/constants/icons.ts +0 -183
- package/src/constants/server-instructions.md +0 -166
- package/src/constants/server-instructions.ts +0 -514
- package/src/database/adapter-factory.ts +0 -16
- package/src/database/core/entry-columns.ts +0 -10
- package/src/database/core/interfaces.ts +0 -188
- package/src/database/core/schema.ts +0 -152
- package/src/database/sqlite-adapter/backup.ts +0 -167
- package/src/database/sqlite-adapter/entries/crud.ts +0 -233
- package/src/database/sqlite-adapter/entries/importance.ts +0 -76
- package/src/database/sqlite-adapter/entries/index.ts +0 -142
- package/src/database/sqlite-adapter/entries/search.ts +0 -294
- package/src/database/sqlite-adapter/entries/shared.ts +0 -102
- package/src/database/sqlite-adapter/entries/statistics.ts +0 -162
- package/src/database/sqlite-adapter/index.ts +0 -265
- package/src/database/sqlite-adapter/native-connection.ts +0 -301
- package/src/database/sqlite-adapter/relationships.ts +0 -70
- package/src/database/sqlite-adapter/tags.ts +0 -182
- package/src/filtering/tool-filter.ts +0 -312
- package/src/github/github-integration/client.ts +0 -114
- package/src/github/github-integration/index.ts +0 -297
- package/src/github/github-integration/insights.ts +0 -155
- package/src/github/github-integration/issues.ts +0 -213
- package/src/github/github-integration/milestones.ts +0 -262
- package/src/github/github-integration/projects.ts +0 -414
- package/src/github/github-integration/pull-requests.ts +0 -235
- package/src/github/github-integration/repository.ts +0 -110
- package/src/github/github-integration/types.ts +0 -43
- package/src/handlers/prompts/github.ts +0 -210
- package/src/handlers/prompts/index.ts +0 -97
- package/src/handlers/prompts/workflow.ts +0 -361
- package/src/handlers/resources/core/briefing/context-section.ts +0 -182
- package/src/handlers/resources/core/briefing/github-section.ts +0 -354
- package/src/handlers/resources/core/briefing/index.ts +0 -106
- package/src/handlers/resources/core/briefing/user-message.ts +0 -114
- package/src/handlers/resources/core/health.ts +0 -75
- package/src/handlers/resources/core/index.ts +0 -31
- package/src/handlers/resources/core/instructions.ts +0 -45
- package/src/handlers/resources/core/utilities.ts +0 -310
- package/src/handlers/resources/github.ts +0 -340
- package/src/handlers/resources/graph.ts +0 -218
- package/src/handlers/resources/help.ts +0 -410
- package/src/handlers/resources/index.ts +0 -143
- package/src/handlers/resources/shared.ts +0 -219
- package/src/handlers/resources/team.ts +0 -134
- package/src/handlers/resources/templates.ts +0 -334
- package/src/handlers/tools/admin.ts +0 -351
- package/src/handlers/tools/analytics.ts +0 -346
- package/src/handlers/tools/backup.ts +0 -272
- package/src/handlers/tools/codemode.ts +0 -188
- package/src/handlers/tools/core.ts +0 -359
- package/src/handlers/tools/error-fields-mixin.ts +0 -10
- package/src/handlers/tools/export.ts +0 -150
- package/src/handlers/tools/github/copilot-tools.ts +0 -72
- package/src/handlers/tools/github/helpers.ts +0 -125
- package/src/handlers/tools/github/insights-tools.ts +0 -112
- package/src/handlers/tools/github/issue-tools.ts +0 -442
- package/src/handlers/tools/github/kanban-tools.ts +0 -153
- package/src/handlers/tools/github/milestone-tools.ts +0 -371
- package/src/handlers/tools/github/mutation-tools.ts +0 -17
- package/src/handlers/tools/github/read-tools.ts +0 -302
- package/src/handlers/tools/github/schemas.ts +0 -435
- package/src/handlers/tools/github.ts +0 -39
- package/src/handlers/tools/index.ts +0 -255
- package/src/handlers/tools/relationships.ts +0 -390
- package/src/handlers/tools/schemas.ts +0 -165
- package/src/handlers/tools/search.ts +0 -448
- package/src/handlers/tools/team/admin-tools.ts +0 -164
- package/src/handlers/tools/team/analytics-tools.ts +0 -233
- package/src/handlers/tools/team/backup-tools.ts +0 -83
- package/src/handlers/tools/team/core-tools.ts +0 -197
- package/src/handlers/tools/team/export-tools.ts +0 -130
- package/src/handlers/tools/team/helpers.ts +0 -66
- package/src/handlers/tools/team/index.ts +0 -45
- package/src/handlers/tools/team/relationship-tools.ts +0 -219
- package/src/handlers/tools/team/schemas.ts +0 -558
- package/src/handlers/tools/team/search-tools.ts +0 -145
- package/src/handlers/tools/team/vector-tools.ts +0 -261
- package/src/index.ts +0 -57
- package/src/server/mcp-server.ts +0 -446
- package/src/server/registration.ts +0 -141
- package/src/server/scheduler.ts +0 -283
- package/src/transports/http/handlers.ts +0 -78
- package/src/transports/http/index.ts +0 -8
- package/src/transports/http/security.ts +0 -147
- package/src/transports/http/server/index.ts +0 -397
- package/src/transports/http/server/legacy-sse.ts +0 -87
- package/src/transports/http/server/stateful.ts +0 -222
- package/src/transports/http/server/stateless.ts +0 -42
- package/src/transports/http/types.ts +0 -132
- package/src/types/entities.ts +0 -145
- package/src/types/error-types.ts +0 -92
- package/src/types/errors.ts +0 -200
- package/src/types/filtering.ts +0 -55
- package/src/types/github.ts +0 -216
- package/src/types/index.ts +0 -348
- package/src/utils/error-helpers.ts +0 -78
- package/src/utils/errors/error-response-fields.ts +0 -29
- package/src/utils/errors/suggestions.ts +0 -94
- package/src/utils/github-helpers.ts +0 -33
- package/src/utils/logger.ts +0 -107
- package/src/utils/mcp-logger.ts +0 -155
- package/src/utils/progress-utils.ts +0 -100
- package/src/utils/query-helpers.ts +0 -78
- package/src/utils/resource-annotations.ts +0 -75
- package/src/utils/security-utils.ts +0 -198
- package/src/utils/vector-index-helpers.ts +0 -24
- package/src/vector/vector-search-manager.ts +0 -409
- package/src/version.ts +0 -15
- package/test-server/README.md +0 -193
- package/test-server/code-map.md +0 -399
- package/test-server/test-agent-experience.md +0 -213
- package/test-server/test-filter-instructions.mjs +0 -295
- package/test-server/test-instruction-levels.mjs +0 -102
- package/test-server/test-preflight.md +0 -55
- package/test-server/test-prompts.mjs +0 -185
- package/test-server/test-scheduler.mjs +0 -174
- package/test-server/test-tool-annotations.mjs +0 -115
- package/test-server/test-tools-codemode.md +0 -632
- package/test-server/test-tools-codemode2.md +0 -1218
- package/test-server/test-tools-team.md +0 -215
- package/test-server/test-tools.md +0 -429
- package/test-server/test-tools2.md +0 -361
- package/test-server/test-tools3.md +0 -396
- package/test-server/tool-reference.md +0 -231
- package/tests/README.md +0 -54
- package/tests/auth/auth-context.test.ts +0 -162
- package/tests/auth/authorization-server-discovery.test.ts +0 -265
- package/tests/auth/errors.test.ts +0 -170
- package/tests/auth/middleware.test.ts +0 -585
- package/tests/auth/oauth-resource-server.test.ts +0 -173
- package/tests/auth/scope-map.test.ts +0 -66
- package/tests/auth/scopes.test.ts +0 -347
- package/tests/auth/token-validator.test.ts +0 -271
- package/tests/codemode/api.test.ts +0 -396
- package/tests/codemode/auto-return.test.ts +0 -167
- package/tests/codemode/codemode-tool-handlers.test.ts +0 -197
- package/tests/codemode/sandbox-factory.test.ts +0 -152
- package/tests/codemode/sandbox.test.ts +0 -190
- package/tests/codemode/security.test.ts +0 -242
- package/tests/codemode/worker-sandbox.test.ts +0 -106
- package/tests/constants/icons.test.ts +0 -101
- package/tests/constants/server-instructions.test.ts +0 -514
- package/tests/database/crud-workflow-branches.test.ts +0 -418
- package/tests/database/database-branches.test.ts +0 -132
- package/tests/database/entries-auth-branches.test.ts +0 -390
- package/tests/database/native-connection.test.ts +0 -249
- package/tests/database/shared-helpers.test.ts +0 -103
- package/tests/database/sqlite-adapter.bench.ts +0 -63
- package/tests/database/sqlite-adapter.test.ts +0 -690
- package/tests/database/tags.test.ts +0 -134
- package/tests/e2e/README.md +0 -39
- package/tests/e2e/auth.spec.ts +0 -106
- package/tests/e2e/codemode-abuse.spec.ts +0 -75
- package/tests/e2e/health.spec.ts +0 -63
- package/tests/e2e/helpers.ts +0 -139
- package/tests/e2e/oauth-discovery.spec.ts +0 -102
- package/tests/e2e/oauth-scopes.spec.ts +0 -222
- package/tests/e2e/payloads-admin.spec.ts +0 -76
- package/tests/e2e/payloads-analytics.spec.ts +0 -37
- package/tests/e2e/payloads-backup-restore.spec.ts +0 -102
- package/tests/e2e/payloads-backup.spec.ts +0 -44
- package/tests/e2e/payloads-codemode-api.spec.ts +0 -131
- package/tests/e2e/payloads-codemode-readonly.spec.ts +0 -116
- package/tests/e2e/payloads-codemode.spec.ts +0 -116
- package/tests/e2e/payloads-core.spec.ts +0 -82
- package/tests/e2e/payloads-error-contracts.spec.ts +0 -159
- package/tests/e2e/payloads-export.spec.ts +0 -46
- package/tests/e2e/payloads-github-degradation.spec.ts +0 -73
- package/tests/e2e/payloads-github.spec.ts +0 -176
- package/tests/e2e/payloads-relationships.spec.ts +0 -56
- package/tests/e2e/payloads-search.spec.ts +0 -64
- package/tests/e2e/payloads-team-happy.spec.ts +0 -231
- package/tests/e2e/payloads-team.spec.ts +0 -174
- package/tests/e2e/prompts-expanded.spec.ts +0 -137
- package/tests/e2e/prompts.spec.ts +0 -62
- package/tests/e2e/protocols.spec.ts +0 -134
- package/tests/e2e/rate-limiting.spec.ts +0 -291
- package/tests/e2e/resources-briefing-env.spec.ts +0 -106
- package/tests/e2e/resources-complete.spec.ts +0 -180
- package/tests/e2e/resources-expanded.spec.ts +0 -83
- package/tests/e2e/resources-instructions-levels.spec.ts +0 -145
- package/tests/e2e/resources-templates.spec.ts +0 -123
- package/tests/e2e/resources.spec.ts +0 -103
- package/tests/e2e/scheduler.spec.ts +0 -79
- package/tests/e2e/security.spec.ts +0 -112
- package/tests/e2e/session-advanced.spec.ts +0 -152
- package/tests/e2e/sessions.spec.ts +0 -95
- package/tests/e2e/stateless.spec.ts +0 -79
- package/tests/e2e/streaming.spec.ts +0 -176
- package/tests/e2e/tool-filtering-presets.spec.ts +0 -192
- package/tests/e2e/tool-filtering.spec.ts +0 -77
- package/tests/e2e/tools.spec.ts +0 -111
- package/tests/filtering/tool-filter.test.ts +0 -314
- package/tests/github/client-issues-errors.test.ts +0 -433
- package/tests/github/github-integration-branches.test.ts +0 -490
- package/tests/github/github-integration.test.ts +0 -1015
- package/tests/github/github-managers-branches.test.ts +0 -907
- package/tests/github/pull-requests.test.ts +0 -334
- package/tests/handlers/analytics-branches.test.ts +0 -222
- package/tests/handlers/backup-branches.test.ts +0 -270
- package/tests/handlers/briefing-context-section.test.ts +0 -388
- package/tests/handlers/briefing-github-section.test.ts +0 -392
- package/tests/handlers/briefing-user-message.test.ts +0 -405
- package/tests/handlers/codemode-tools.test.ts +0 -85
- package/tests/handlers/copilot-tools.test.ts +0 -126
- package/tests/handlers/error-path-coverage.test.ts +0 -324
- package/tests/handlers/export-tools.test.ts +0 -203
- package/tests/handlers/github-resource-handlers.test.ts +0 -929
- package/tests/handlers/github-tool-handlers.test.ts +0 -1452
- package/tests/handlers/handler-error-branches.test.ts +0 -346
- package/tests/handlers/help-resource.test.ts +0 -92
- package/tests/handlers/prompt-handler-coverage.test.ts +0 -108
- package/tests/handlers/prompt-handlers.test.ts +0 -131
- package/tests/handlers/resource-handler-coverage.test.ts +0 -281
- package/tests/handlers/resource-handlers.test.ts +0 -357
- package/tests/handlers/resource-prompt-branches.test.ts +0 -495
- package/tests/handlers/search-tool-handlers.test.ts +0 -379
- package/tests/handlers/targeted-gap-closure.test.ts +0 -387
- package/tests/handlers/team-admin.test.ts +0 -291
- package/tests/handlers/team-analytics.test.ts +0 -220
- package/tests/handlers/team-core.test.ts +0 -148
- package/tests/handlers/team-data.test.ts +0 -198
- package/tests/handlers/team-relationships.test.ts +0 -271
- package/tests/handlers/team-resource-handlers.test.ts +0 -161
- package/tests/handlers/team-search.test.ts +0 -134
- package/tests/handlers/team-tool-handlers.test.ts +0 -301
- package/tests/handlers/team-vector.test.ts +0 -213
- package/tests/handlers/template-github-branches.test.ts +0 -676
- package/tests/handlers/tool-annotations.test.ts +0 -90
- package/tests/handlers/tool-handler-coverage.test.ts +0 -514
- package/tests/handlers/tool-handlers.test.ts +0 -510
- package/tests/handlers/tool-output-schemas.test.ts +0 -116
- package/tests/handlers/vector-tool-handlers.test.ts +0 -238
- package/tests/security/sql-injection.test.ts +0 -284
- package/tests/server/mcp-server.bench.ts +0 -55
- package/tests/server/mcp-server.test.ts +0 -1326
- package/tests/server/scheduler.test.ts +0 -400
- package/tests/transports/http-legacy-sse.test.ts +0 -275
- package/tests/transports/http-security.test.ts +0 -322
- package/tests/transports/http-stateful.test.ts +0 -487
- package/tests/transports/http-transport-server.test.ts +0 -301
- package/tests/transports/http-transport.test.ts +0 -771
- package/tests/utils/github-helpers.test.ts +0 -58
- package/tests/utils/logger.test.ts +0 -180
- package/tests/utils/mcp-logger.test.ts +0 -211
- package/tests/utils/progress-utils.test.ts +0 -156
- package/tests/utils/query-helpers.test.ts +0 -80
- package/tests/utils/security-utils.test.ts +0 -82
- package/tests/vector/vector-search-branches.test.ts +0 -111
- package/tests/vector/vector-search-manager.test.ts +0 -375
- package/tests/vector/vector-search.bench.ts +0 -48
- package/tsconfig.json +0 -42
- package/tsup.config.ts +0 -19
- package/vitest.config.ts +0 -25
|
@@ -1,418 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp — CRUD + Workflow Prompt Branch Coverage
|
|
3
|
-
*
|
|
4
|
-
* Targets uncovered branches in:
|
|
5
|
-
* - crud.ts (80.24%): timestamp normalization, update all field types, GitHub extensions loop, permanent delete
|
|
6
|
-
* - workflow.ts (79.41%): prepare-standup, prepare-retro, weekly-digest, analyze-period, get-context-bundle
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest'
|
|
10
|
-
import Database from 'better-sqlite3'
|
|
11
|
-
|
|
12
|
-
vi.mock('../../src/utils/logger.js', () => ({
|
|
13
|
-
logger: { info: vi.fn(), warning: vi.fn(), error: vi.fn(), debug: vi.fn() },
|
|
14
|
-
}))
|
|
15
|
-
|
|
16
|
-
import {
|
|
17
|
-
createEntry,
|
|
18
|
-
getEntryById,
|
|
19
|
-
getEntriesByIds,
|
|
20
|
-
getEntryByIdIncludeDeleted,
|
|
21
|
-
getActiveEntryCount,
|
|
22
|
-
updateEntry,
|
|
23
|
-
deleteEntry,
|
|
24
|
-
} from '../../src/database/sqlite-adapter/entries/crud.js'
|
|
25
|
-
import { TagsManager } from '../../src/database/sqlite-adapter/tags.js'
|
|
26
|
-
import { getWorkflowPromptDefinitions } from '../../src/handlers/prompts/workflow.js'
|
|
27
|
-
import type { IDatabaseAdapter } from '../../src/database/core/interfaces.js'
|
|
28
|
-
import type { JournalEntry } from '../../src/types/index.js'
|
|
29
|
-
|
|
30
|
-
// ============================================================================
|
|
31
|
-
// In-memory DB helper
|
|
32
|
-
// ============================================================================
|
|
33
|
-
|
|
34
|
-
function createTestDb() {
|
|
35
|
-
const db = new Database(':memory:')
|
|
36
|
-
db.exec(`
|
|
37
|
-
CREATE TABLE memory_journal (
|
|
38
|
-
id INTEGER PRIMARY KEY,
|
|
39
|
-
content TEXT NOT NULL,
|
|
40
|
-
entry_type TEXT DEFAULT 'personal_reflection',
|
|
41
|
-
timestamp TEXT NOT NULL,
|
|
42
|
-
is_personal INTEGER DEFAULT 1,
|
|
43
|
-
deleted_at TEXT DEFAULT NULL,
|
|
44
|
-
project_number INTEGER DEFAULT NULL,
|
|
45
|
-
issue_number INTEGER DEFAULT NULL,
|
|
46
|
-
pr_number INTEGER DEFAULT NULL,
|
|
47
|
-
issue_url TEXT DEFAULT NULL,
|
|
48
|
-
pr_url TEXT DEFAULT NULL,
|
|
49
|
-
pr_status TEXT DEFAULT NULL,
|
|
50
|
-
project_owner TEXT DEFAULT NULL,
|
|
51
|
-
workflow_run_id INTEGER DEFAULT NULL,
|
|
52
|
-
workflow_name TEXT DEFAULT NULL,
|
|
53
|
-
workflow_status TEXT DEFAULT NULL,
|
|
54
|
-
significance_type TEXT DEFAULT NULL,
|
|
55
|
-
auto_context TEXT DEFAULT NULL,
|
|
56
|
-
share_with_team INTEGER DEFAULT 0
|
|
57
|
-
);
|
|
58
|
-
CREATE TABLE tags (id INTEGER PRIMARY KEY, name TEXT UNIQUE NOT NULL, usage_count INTEGER DEFAULT 0);
|
|
59
|
-
CREATE TABLE entry_tags (entry_id INTEGER, tag_id INTEGER);
|
|
60
|
-
CREATE TABLE relationships (
|
|
61
|
-
id INTEGER PRIMARY KEY,
|
|
62
|
-
from_entry_id INTEGER,
|
|
63
|
-
to_entry_id INTEGER,
|
|
64
|
-
relationship_type TEXT,
|
|
65
|
-
description TEXT DEFAULT NULL
|
|
66
|
-
);
|
|
67
|
-
CREATE VIRTUAL TABLE fts_content USING fts5(content, content_rowid='rowid');
|
|
68
|
-
CREATE TRIGGER trg_fts_insert AFTER INSERT ON memory_journal BEGIN
|
|
69
|
-
INSERT INTO fts_content(rowid, content) VALUES (NEW.id, NEW.content);
|
|
70
|
-
END;
|
|
71
|
-
`)
|
|
72
|
-
return db
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/** Creates a mock NativeConnectionManager for TagsManager */
|
|
76
|
-
function makeCtx(db: InstanceType<typeof Database>) {
|
|
77
|
-
return { getRawDb: () => db } as ConstructorParameters<typeof TagsManager>[0]
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function createContext(db: InstanceType<typeof Database>) {
|
|
81
|
-
const tagsMgr = new TagsManager(makeCtx(db))
|
|
82
|
-
return { db, tagsMgr }
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// ============================================================================
|
|
86
|
-
// CRUD Branch Coverage
|
|
87
|
-
// ============================================================================
|
|
88
|
-
|
|
89
|
-
describe('CRUD — branch coverage', () => {
|
|
90
|
-
let db: InstanceType<typeof Database>
|
|
91
|
-
let context: ReturnType<typeof createContext>
|
|
92
|
-
|
|
93
|
-
beforeEach(() => {
|
|
94
|
-
db = createTestDb()
|
|
95
|
-
context = createContext(db)
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
describe('createEntry', () => {
|
|
99
|
-
it('should normalize timestamp without T', () => {
|
|
100
|
-
const entry = createEntry(context, {
|
|
101
|
-
content: 'test',
|
|
102
|
-
timestamp: '2025-01-15',
|
|
103
|
-
})
|
|
104
|
-
expect(entry.timestamp).toContain('T')
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
it('should auto-generate timestamp when not provided', () => {
|
|
108
|
-
const entry = createEntry(context, { content: 'auto ts' })
|
|
109
|
-
expect(entry.timestamp).toBeTruthy()
|
|
110
|
-
})
|
|
111
|
-
|
|
112
|
-
it('should link tags when provided', () => {
|
|
113
|
-
const entry = createEntry(context, {
|
|
114
|
-
content: 'tagged',
|
|
115
|
-
tags: ['tag-a', 'tag-b'],
|
|
116
|
-
})
|
|
117
|
-
expect(entry.tags.length).toBe(2)
|
|
118
|
-
})
|
|
119
|
-
|
|
120
|
-
it('should create entry with all GitHub extension fields', () => {
|
|
121
|
-
const entry = createEntry(context, {
|
|
122
|
-
content: 'github entry',
|
|
123
|
-
projectNumber: 1,
|
|
124
|
-
projectOwner: 'owner',
|
|
125
|
-
issueNumber: 42,
|
|
126
|
-
issueUrl: 'https://github.com/issue',
|
|
127
|
-
prNumber: 10,
|
|
128
|
-
prUrl: 'https://github.com/pr',
|
|
129
|
-
prStatus: 'open',
|
|
130
|
-
workflowRunId: 100,
|
|
131
|
-
workflowName: 'CI',
|
|
132
|
-
workflowStatus: 'success',
|
|
133
|
-
significanceType: 'decision',
|
|
134
|
-
autoContext: true,
|
|
135
|
-
isPersonal: false,
|
|
136
|
-
entryType: 'decision',
|
|
137
|
-
})
|
|
138
|
-
expect(entry.entryType).toBe('decision')
|
|
139
|
-
expect(entry.isPersonal).toBe(false)
|
|
140
|
-
})
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
describe('getEntryById', () => {
|
|
144
|
-
it('should return null for non-existent', () => {
|
|
145
|
-
expect(getEntryById(context, 999)).toBeNull()
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
it('should return entry for existing', () => {
|
|
149
|
-
const created = createEntry(context, { content: 'hello' })
|
|
150
|
-
const found = getEntryById(context, created.id)
|
|
151
|
-
expect(found!.content).toBe('hello')
|
|
152
|
-
})
|
|
153
|
-
})
|
|
154
|
-
|
|
155
|
-
describe('getEntriesByIds', () => {
|
|
156
|
-
it('should return empty map for empty ids', () => {
|
|
157
|
-
expect(getEntriesByIds(context, []).size).toBe(0)
|
|
158
|
-
})
|
|
159
|
-
|
|
160
|
-
it('should return entries for valid ids', () => {
|
|
161
|
-
const e1 = createEntry(context, { content: 'one' })
|
|
162
|
-
const e2 = createEntry(context, { content: 'two' })
|
|
163
|
-
const result = getEntriesByIds(context, [e1.id, e2.id])
|
|
164
|
-
expect(result.size).toBe(2)
|
|
165
|
-
})
|
|
166
|
-
|
|
167
|
-
it('should return empty for non-existent ids', () => {
|
|
168
|
-
expect(getEntriesByIds(context, [999, 1000]).size).toBe(0)
|
|
169
|
-
})
|
|
170
|
-
})
|
|
171
|
-
|
|
172
|
-
describe('getEntryByIdIncludeDeleted', () => {
|
|
173
|
-
it('should return deleted entries', () => {
|
|
174
|
-
const entry = createEntry(context, { content: 'to delete' })
|
|
175
|
-
deleteEntry(context, entry.id)
|
|
176
|
-
const found = getEntryByIdIncludeDeleted(context, entry.id)
|
|
177
|
-
expect(found).not.toBeNull()
|
|
178
|
-
})
|
|
179
|
-
|
|
180
|
-
it('should return null for non-existent', () => {
|
|
181
|
-
expect(getEntryByIdIncludeDeleted(context, 999)).toBeNull()
|
|
182
|
-
})
|
|
183
|
-
})
|
|
184
|
-
|
|
185
|
-
describe('getActiveEntryCount', () => {
|
|
186
|
-
it('should count only non-deleted', () => {
|
|
187
|
-
createEntry(context, { content: '1' })
|
|
188
|
-
const e2 = createEntry(context, { content: '2' })
|
|
189
|
-
deleteEntry(context, e2.id)
|
|
190
|
-
expect(getActiveEntryCount(context)).toBe(1)
|
|
191
|
-
})
|
|
192
|
-
})
|
|
193
|
-
|
|
194
|
-
describe('updateEntry', () => {
|
|
195
|
-
it('should return null for non-existent entry', () => {
|
|
196
|
-
expect(updateEntry(context, 999, { content: 'new' })).toBeNull()
|
|
197
|
-
})
|
|
198
|
-
|
|
199
|
-
it('should update content', () => {
|
|
200
|
-
const entry = createEntry(context, { content: 'old' })
|
|
201
|
-
const updated = updateEntry(context, entry.id, { content: 'new' })
|
|
202
|
-
expect(updated!.content).toBe('new')
|
|
203
|
-
})
|
|
204
|
-
|
|
205
|
-
it('should update entryType', () => {
|
|
206
|
-
const entry = createEntry(context, { content: 'test' })
|
|
207
|
-
const updated = updateEntry(context, entry.id, { entryType: 'decision' })
|
|
208
|
-
expect(updated!.entryType).toBe('decision')
|
|
209
|
-
})
|
|
210
|
-
|
|
211
|
-
it('should update isPersonal', () => {
|
|
212
|
-
const entry = createEntry(context, { content: 'test', isPersonal: true })
|
|
213
|
-
const updated = updateEntry(context, entry.id, { isPersonal: false })
|
|
214
|
-
expect(updated!.isPersonal).toBe(false)
|
|
215
|
-
})
|
|
216
|
-
|
|
217
|
-
it('should update significanceType', () => {
|
|
218
|
-
const entry = createEntry(context, { content: 'test' })
|
|
219
|
-
const updated = updateEntry(context, entry.id, { significanceType: 'milestone' })
|
|
220
|
-
expect(updated).not.toBeNull()
|
|
221
|
-
})
|
|
222
|
-
|
|
223
|
-
it('should update autoContext', () => {
|
|
224
|
-
const entry = createEntry(context, { content: 'test' })
|
|
225
|
-
const updated = updateEntry(context, entry.id, { autoContext: true })
|
|
226
|
-
expect(updated).not.toBeNull()
|
|
227
|
-
})
|
|
228
|
-
|
|
229
|
-
it('should update GitHub extension fields (projectNumber, issueNumber, etc.)', () => {
|
|
230
|
-
const entry = createEntry(context, { content: 'test' })
|
|
231
|
-
const updated = updateEntry(context, entry.id, {
|
|
232
|
-
projectNumber: 42,
|
|
233
|
-
projectOwner: 'org',
|
|
234
|
-
issueNumber: 10,
|
|
235
|
-
issueUrl: 'https://issue',
|
|
236
|
-
prNumber: 5,
|
|
237
|
-
prUrl: 'https://pr',
|
|
238
|
-
prStatus: 'merged',
|
|
239
|
-
workflowRunId: 100,
|
|
240
|
-
workflowName: 'Deploy',
|
|
241
|
-
workflowStatus: 'completed',
|
|
242
|
-
})
|
|
243
|
-
expect(updated).not.toBeNull()
|
|
244
|
-
})
|
|
245
|
-
|
|
246
|
-
it('should update tags', () => {
|
|
247
|
-
const entry = createEntry(context, { content: 'test', tags: ['old-tag'] })
|
|
248
|
-
const updated = updateEntry(context, entry.id, { tags: ['new-tag-1', 'new-tag-2'] })
|
|
249
|
-
expect(updated!.tags.length).toBe(2)
|
|
250
|
-
})
|
|
251
|
-
|
|
252
|
-
it('should handle update with no changes (empty update)', () => {
|
|
253
|
-
const entry = createEntry(context, { content: 'test' })
|
|
254
|
-
const updated = updateEntry(context, entry.id, {})
|
|
255
|
-
expect(updated).not.toBeNull()
|
|
256
|
-
expect(updated!.content).toBe('test')
|
|
257
|
-
})
|
|
258
|
-
})
|
|
259
|
-
|
|
260
|
-
describe('deleteEntry', () => {
|
|
261
|
-
it('should soft-delete by default', () => {
|
|
262
|
-
const entry = createEntry(context, { content: 'soft' })
|
|
263
|
-
const result = deleteEntry(context, entry.id)
|
|
264
|
-
expect(result).toBe(true)
|
|
265
|
-
expect(getEntryByIdIncludeDeleted(context, entry.id)).not.toBeNull()
|
|
266
|
-
expect(getEntryById(context, entry.id)).toBeNull()
|
|
267
|
-
})
|
|
268
|
-
|
|
269
|
-
it('should hard-delete when permanent=true', () => {
|
|
270
|
-
const entry = createEntry(context, { content: 'hard' })
|
|
271
|
-
const result = deleteEntry(context, entry.id, true)
|
|
272
|
-
expect(result).toBe(true)
|
|
273
|
-
expect(getEntryByIdIncludeDeleted(context, entry.id)).toBeNull()
|
|
274
|
-
})
|
|
275
|
-
|
|
276
|
-
it('should return false for non-existent soft delete', () => {
|
|
277
|
-
expect(deleteEntry(context, 999)).toBe(false)
|
|
278
|
-
})
|
|
279
|
-
|
|
280
|
-
it('should return false for non-existent hard delete', () => {
|
|
281
|
-
expect(deleteEntry(context, 999, true)).toBe(false)
|
|
282
|
-
})
|
|
283
|
-
})
|
|
284
|
-
})
|
|
285
|
-
|
|
286
|
-
// ============================================================================
|
|
287
|
-
// Workflow Prompts Branch Coverage (assertions based on actual output text)
|
|
288
|
-
// ============================================================================
|
|
289
|
-
|
|
290
|
-
describe('Workflow prompts — branch coverage', () => {
|
|
291
|
-
function mockEntry(overrides?: Partial<JournalEntry>): JournalEntry {
|
|
292
|
-
return {
|
|
293
|
-
id: 1,
|
|
294
|
-
content: 'test content',
|
|
295
|
-
entryType: 'personal_reflection',
|
|
296
|
-
timestamp: '2025-01-15T10:00:00Z',
|
|
297
|
-
isPersonal: true,
|
|
298
|
-
tags: ['test'],
|
|
299
|
-
...overrides,
|
|
300
|
-
} as JournalEntry
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
function createMockDb(entries: JournalEntry[] = []): IDatabaseAdapter {
|
|
304
|
-
return {
|
|
305
|
-
searchByDateRange: vi.fn().mockReturnValue(entries),
|
|
306
|
-
getStatistics: vi.fn().mockReturnValue({
|
|
307
|
-
totalEntries: entries.length,
|
|
308
|
-
entriesByType: {},
|
|
309
|
-
entriesByPeriod: [],
|
|
310
|
-
decisionDensity: [],
|
|
311
|
-
relationshipComplexity: { totalRelationships: 0, avgPerEntry: 0 },
|
|
312
|
-
activityTrend: { currentPeriod: '', previousPeriod: '', growthPercent: null },
|
|
313
|
-
causalMetrics: {},
|
|
314
|
-
}),
|
|
315
|
-
searchEntries: vi.fn().mockReturnValue(entries),
|
|
316
|
-
getRecentEntries: vi.fn().mockReturnValue(entries),
|
|
317
|
-
executeRawQuery: vi.fn().mockReturnValue(
|
|
318
|
-
entries.map((e) => ({
|
|
319
|
-
id: e.id,
|
|
320
|
-
content: e.content,
|
|
321
|
-
entry_type: e.entryType,
|
|
322
|
-
timestamp: e.timestamp,
|
|
323
|
-
significance_type: 'decision',
|
|
324
|
-
}))
|
|
325
|
-
),
|
|
326
|
-
} as unknown as IDatabaseAdapter
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
it('should generate prepare-standup prompt', () => {
|
|
330
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
331
|
-
const standup = prompts.find((p) => p.name === 'prepare-standup')!
|
|
332
|
-
const db = createMockDb([mockEntry({ content: 'worked on auth' })])
|
|
333
|
-
const result = standup.handler({}, db)
|
|
334
|
-
expect(result.messages[0]!.content.text).toContain('standup')
|
|
335
|
-
})
|
|
336
|
-
|
|
337
|
-
it('should generate prepare-retro prompt with default 14 days', () => {
|
|
338
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
339
|
-
const retro = prompts.find((p) => p.name === 'prepare-retro')!
|
|
340
|
-
const db = createMockDb([mockEntry()])
|
|
341
|
-
const result = retro.handler({}, db)
|
|
342
|
-
expect(result.messages[0]!.content.text).toContain('14 days')
|
|
343
|
-
})
|
|
344
|
-
|
|
345
|
-
it('should generate prepare-retro prompt with custom days', () => {
|
|
346
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
347
|
-
const retro = prompts.find((p) => p.name === 'prepare-retro')!
|
|
348
|
-
const db = createMockDb()
|
|
349
|
-
const result = retro.handler({ days: '7' }, db)
|
|
350
|
-
expect(result.messages[0]!.content.text).toContain('7 days')
|
|
351
|
-
})
|
|
352
|
-
|
|
353
|
-
it('should generate weekly-digest prompt', () => {
|
|
354
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
355
|
-
const digest = prompts.find((p) => p.name === 'weekly-digest')!
|
|
356
|
-
const db = createMockDb([mockEntry()])
|
|
357
|
-
const result = digest.handler({}, db)
|
|
358
|
-
expect(result.messages[0]!.content.text).toContain('weekly')
|
|
359
|
-
})
|
|
360
|
-
|
|
361
|
-
it('should generate analyze-period prompt with dates', () => {
|
|
362
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
363
|
-
const analyze = prompts.find((p) => p.name === 'analyze-period')!
|
|
364
|
-
const db = createMockDb()
|
|
365
|
-
// Uses start_date and end_date arg names
|
|
366
|
-
const result = analyze.handler({ start_date: '2025-01-01', end_date: '2025-02-01' }, db)
|
|
367
|
-
expect(result.messages[0]!.content.text).toContain('2025-01-01')
|
|
368
|
-
expect(result.messages[0]!.content.text).toContain('2025-02-01')
|
|
369
|
-
})
|
|
370
|
-
|
|
371
|
-
it('should generate analyze-period prompt without dates', () => {
|
|
372
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
373
|
-
const analyze = prompts.find((p) => p.name === 'analyze-period')!
|
|
374
|
-
const db = createMockDb()
|
|
375
|
-
const result = analyze.handler({}, db)
|
|
376
|
-
expect(result.messages[0]!.content.text).toContain('Analyze')
|
|
377
|
-
})
|
|
378
|
-
|
|
379
|
-
it('should generate goal-tracker prompt', () => {
|
|
380
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
381
|
-
const goal = prompts.find((p) => p.name === 'goal-tracker')!
|
|
382
|
-
const db = createMockDb([mockEntry({ content: 'goal: ship v2' })])
|
|
383
|
-
const result = goal.handler({}, db)
|
|
384
|
-
expect(result.messages[0]!.content.text).toContain('progress')
|
|
385
|
-
})
|
|
386
|
-
|
|
387
|
-
it('should generate get-context-bundle prompt', () => {
|
|
388
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
389
|
-
const bundle = prompts.find((p) => p.name === 'get-context-bundle')!
|
|
390
|
-
const db = createMockDb()
|
|
391
|
-
const result = bundle.handler({}, db)
|
|
392
|
-
expect(result.messages[0]!.content.text).toContain('Project context bundle')
|
|
393
|
-
})
|
|
394
|
-
|
|
395
|
-
it('should generate get-recent-entries prompt', () => {
|
|
396
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
397
|
-
const recent = prompts.find((p) => p.name === 'get-recent-entries')!
|
|
398
|
-
const db = createMockDb([mockEntry()])
|
|
399
|
-
const result = recent.handler({}, db)
|
|
400
|
-
expect(result.messages[0]!.content.text).toContain('entries')
|
|
401
|
-
})
|
|
402
|
-
|
|
403
|
-
it('should generate confirm-briefing prompt', () => {
|
|
404
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
405
|
-
const confirm = prompts.find((p) => p.name === 'confirm-briefing')!
|
|
406
|
-
const db = createMockDb([mockEntry()])
|
|
407
|
-
const result = confirm.handler({}, db)
|
|
408
|
-
expect(result.messages.length).toBeGreaterThan(0)
|
|
409
|
-
})
|
|
410
|
-
|
|
411
|
-
it('should generate session-summary prompt', () => {
|
|
412
|
-
const prompts = getWorkflowPromptDefinitions()
|
|
413
|
-
const summary = prompts.find((p) => p.name === 'session-summary')!
|
|
414
|
-
const db = createMockDb([mockEntry({ content: 'debug session' })])
|
|
415
|
-
const result = summary.handler({}, db)
|
|
416
|
-
expect(result.messages[0]!.content.text).toContain('session summary')
|
|
417
|
-
})
|
|
418
|
-
})
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* memory-journal-mcp — Database Adapter Branch Coverage Tests
|
|
3
|
-
*
|
|
4
|
-
* Targets uncovered branches in native-connection.ts exec/run methods.
|
|
5
|
-
* Uses a raw better-sqlite3 db to manually set up tables, bypassing
|
|
6
|
-
* the sqlite-vec extension requirement.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'
|
|
10
|
-
import Database from 'better-sqlite3'
|
|
11
|
-
|
|
12
|
-
vi.mock('../../src/utils/logger.js', () => ({
|
|
13
|
-
logger: { info: vi.fn(), warning: vi.fn(), error: vi.fn(), debug: vi.fn() },
|
|
14
|
-
}))
|
|
15
|
-
|
|
16
|
-
import { NativeConnectionManager } from '../../src/database/sqlite-adapter/native-connection.js'
|
|
17
|
-
|
|
18
|
-
// ============================================================================
|
|
19
|
-
// Helpers
|
|
20
|
-
// ============================================================================
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Create a NativeConnectionManager with internal db set to a manual
|
|
24
|
-
* better-sqlite3 instance that has basic tables, bypassing initialize().
|
|
25
|
-
*/
|
|
26
|
-
function createTestConn(): NativeConnectionManager {
|
|
27
|
-
const conn = new NativeConnectionManager(':memory:')
|
|
28
|
-
const db = new Database(':memory:')
|
|
29
|
-
|
|
30
|
-
// Create minimal tables for testing exec/run branches
|
|
31
|
-
db.exec(`
|
|
32
|
-
CREATE TABLE IF NOT EXISTS test_table (
|
|
33
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
34
|
-
name TEXT,
|
|
35
|
-
value TEXT
|
|
36
|
-
);
|
|
37
|
-
CREATE TABLE IF NOT EXISTS tags (
|
|
38
|
-
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
39
|
-
name TEXT UNIQUE NOT NULL,
|
|
40
|
-
usage_count INTEGER DEFAULT 0
|
|
41
|
-
);
|
|
42
|
-
`)
|
|
43
|
-
|
|
44
|
-
// Inject the db into the connection manager
|
|
45
|
-
Object.assign(conn, { db, initialized: true })
|
|
46
|
-
return conn
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// ============================================================================
|
|
50
|
-
// Tests
|
|
51
|
-
// ============================================================================
|
|
52
|
-
|
|
53
|
-
describe('NativeConnectionManager exec branches', () => {
|
|
54
|
-
let conn: NativeConnectionManager
|
|
55
|
-
|
|
56
|
-
beforeEach(() => {
|
|
57
|
-
vi.clearAllMocks()
|
|
58
|
-
conn = createTestConn()
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
afterEach(() => {
|
|
62
|
-
conn.close()
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
it('should handle INSERT (mutation) without params', () => {
|
|
66
|
-
const result = conn.exec("INSERT INTO test_table (name, value) VALUES ('a', 'b')")
|
|
67
|
-
expect(result).toEqual([])
|
|
68
|
-
})
|
|
69
|
-
|
|
70
|
-
it('should handle INSERT (mutation) with params', () => {
|
|
71
|
-
const result = conn.exec('INSERT INTO test_table (name, value) VALUES (?, ?)', [
|
|
72
|
-
'test',
|
|
73
|
-
'data',
|
|
74
|
-
])
|
|
75
|
-
expect(result).toEqual([])
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it('should handle multi-statement mutation (semicolon path)', () => {
|
|
79
|
-
const result = conn.exec(
|
|
80
|
-
"INSERT INTO tags (name, usage_count) VALUES ('a', 1); INSERT INTO tags (name, usage_count) VALUES ('b', 2);"
|
|
81
|
-
)
|
|
82
|
-
expect(result).toEqual([])
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('should handle SELECT returning rows with columns/values', () => {
|
|
86
|
-
conn.run("INSERT INTO test_table (name, value) VALUES ('row1', 'val1')")
|
|
87
|
-
conn.run("INSERT INTO test_table (name, value) VALUES ('row2', 'val2')")
|
|
88
|
-
|
|
89
|
-
const result = conn.exec('SELECT * FROM test_table')
|
|
90
|
-
expect(result.length).toBe(1)
|
|
91
|
-
expect(result[0]!.columns).toContain('name')
|
|
92
|
-
expect(result[0]!.values.length).toBe(2)
|
|
93
|
-
})
|
|
94
|
-
|
|
95
|
-
it('should handle SELECT with params', () => {
|
|
96
|
-
conn.run('INSERT INTO test_table (name, value) VALUES (?, ?)', ['find-me', 'v1'])
|
|
97
|
-
|
|
98
|
-
const result = conn.exec('SELECT * FROM test_table WHERE name = ?', ['find-me'])
|
|
99
|
-
expect(result.length).toBe(1)
|
|
100
|
-
expect(result[0]!.values[0]![1]).toBe('find-me')
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it('should handle SELECT returning empty rows', () => {
|
|
104
|
-
const result = conn.exec("SELECT * FROM test_table WHERE name = 'nonexistent'")
|
|
105
|
-
expect(result).toEqual([])
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it('should handle PRAGMA queries', () => {
|
|
109
|
-
const result = conn.exec('PRAGMA table_info(test_table)')
|
|
110
|
-
expect(result.length).toBeGreaterThan(0)
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
it('should handle run() without params', () => {
|
|
114
|
-
expect(() =>
|
|
115
|
-
conn.run("INSERT INTO tags (name, usage_count) VALUES ('test', 0)")
|
|
116
|
-
).not.toThrow()
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it('should handle run() with params', () => {
|
|
120
|
-
expect(() =>
|
|
121
|
-
conn.run('INSERT INTO tags (name, usage_count) VALUES (?, ?)', ['tag1', 0])
|
|
122
|
-
).not.toThrow()
|
|
123
|
-
})
|
|
124
|
-
|
|
125
|
-
it('should handle scheduleSave as no-op', () => {
|
|
126
|
-
expect(() => conn.scheduleSave()).not.toThrow()
|
|
127
|
-
})
|
|
128
|
-
|
|
129
|
-
it('should return db path', () => {
|
|
130
|
-
expect(conn.getDbPath()).toBe(':memory:')
|
|
131
|
-
})
|
|
132
|
-
})
|