Files
cleveragents-core/features/project_tables_migration.feature
Jeffrey Phillips Freeman dbca60c98e
CI / lint (pull_request) Successful in 14s
CI / typecheck (pull_request) Successful in 27s
CI / security (pull_request) Successful in 23s
CI / quality (pull_request) Successful in 16s
CI / integration_tests (pull_request) Failing after 3m31s
CI / build (pull_request) Successful in 15s
CI / lint (push) Successful in 13s
CI / typecheck (push) Successful in 28s
CI / security (push) Successful in 23s
CI / quality (push) Successful in 15s
CI / unit_tests (pull_request) Failing after 9m45s
CI / docker (pull_request) Has been skipped
CI / integration_tests (push) Failing after 3m30s
CI / build (push) Successful in 15s
CI / unit_tests (push) Failing after 9m42s
CI / docker (push) Has been skipped
CI / coverage (pull_request) Failing after 3m29s
CI / coverage (push) Failing after 3m28s
feat(db): add projects and project links tables
2026-02-15 11:04:18 -05:00

116 lines
6.1 KiB
Gherkin

Feature: Project database tables migration
As a developer working on project infrastructure
I need database tables for projects and project resource links
So that spec-aligned namespaced projects can be persisted and queried
Background:
Given a project tables in-memory database is initialized
# ---------------------------------------------------------------------------
# Table existence
# ---------------------------------------------------------------------------
Scenario: Projects table exists after migration
Then the project database should contain table "ns_projects"
Scenario: Project resource links table exists
Then the project database should contain table "project_resource_links"
# ---------------------------------------------------------------------------
# ProjectModel CRUD
# ---------------------------------------------------------------------------
Scenario: Can insert and retrieve a project
When I insert a project "local/my-project" with namespace "local"
Then I can retrieve project "local/my-project"
And the retrieved project namespace is "local"
And the retrieved project description is empty
And the retrieved project tags_json is "[]"
Scenario: Can insert a project with description
When I insert a described project "local/described-proj" with namespace "local" and description "A test project"
Then I can retrieve project "local/described-proj"
And the retrieved project description is "A test project"
Scenario: Can insert a project with JSON fields
When I insert a project "local/json-proj" with JSON fields
Then the project invariants_json round-trips correctly
And the project context_policy_json round-trips correctly
And the project tags_json round-trips as a list
Scenario: Project namespaced_name uniqueness is enforced
When I insert a project "local/unique-test" with namespace "local"
Then inserting a duplicate project "local/unique-test" raises an integrity error
# ---------------------------------------------------------------------------
# ProjectResourceLinkModel CRUD
# ---------------------------------------------------------------------------
Scenario: Can link a resource to a project
Given a resource type "builtin/git-checkout" exists in project db
And a resource "local/my-repo" of type "builtin/git-checkout" exists in project db
And a project "local/linked-proj" exists in project db
When I create a project resource link for project "local/linked-proj" to resource "local/my-repo"
Then the project resource link can be retrieved
And the project resource link project_name is "local/linked-proj"
And the project resource link read_only is false
Scenario: Can link a resource with alias and read_only
Given a resource type "builtin/git-checkout" exists in project db
And a resource "local/aliased-repo" of type "builtin/git-checkout" exists in project db
And a project "local/aliased-proj" exists in project db
When I create a project resource link with alias "my-alias" and read_only true
Then the project resource link alias is "my-alias"
And the project resource link read_only is true
Scenario: Duplicate project-resource link is rejected
Given a resource type "builtin/git-checkout" exists in project db
And a resource "local/dup-repo" of type "builtin/git-checkout" exists in project db
And a project "local/dup-proj" exists in project db
When I create a project resource link for project "local/dup-proj" to resource "local/dup-repo"
Then creating a duplicate link for project "local/dup-proj" to resource "local/dup-repo" raises an integrity error
Scenario: Deleting a project cascades to links
Given a resource type "builtin/git-checkout" exists in project db
And a resource "local/cascade-repo" of type "builtin/git-checkout" exists in project db
And a project "local/cascade-proj" exists in project db
And a project resource link exists for "local/cascade-proj" to "local/cascade-repo"
When I delete the project "local/cascade-proj"
Then the project resource link for "local/cascade-proj" should not exist
Scenario: Deleting a linked resource is restricted
Given a resource type "builtin/git-checkout" exists in project db
And a resource "local/restrict-repo" of type "builtin/git-checkout" exists in project db
And a project "local/restrict-proj" exists in project db
And a project resource link exists for "local/restrict-proj" to "local/restrict-repo"
Then deleting the linked resource "local/restrict-repo" raises an integrity error
# ---------------------------------------------------------------------------
# ORM Model domain conversion
# ---------------------------------------------------------------------------
Scenario: NamespacedProjectModel to_domain round-trips
When I insert a described project "local/domain-proj" with namespace "local" and description "Domain test"
Then converting the project to domain returns a NamespacedProject
And the domain project name is "domain-proj"
And the domain project namespace is "local"
And the domain project description is "Domain test"
Scenario: NamespacedProjectModel from_domain creates a valid model
When I create a NamespacedProject domain model
And I convert it to a NamespacedProjectModel via from_domain
Then the model namespaced_name is "local/from-domain-test"
And the model namespace is "local"
Scenario: Project resource link index on project_name exists
Then the project database should have an index "ix_project_resource_links_project_name" on table "project_resource_links"
Scenario: Project resource link index on resource_id exists
Then the project database should have an index "ix_project_resource_links_resource_id" on table "project_resource_links"
Scenario: Project resource link composite index on project_name and alias exists
Then the project database should have an index "ix_project_resource_links_project_alias" on table "project_resource_links"
Scenario: Project namespace index exists
Then the project database should have an index "ix_ns_projects_namespace" on table "ns_projects"