Files
cleveragents-core/features/resource_repository.feature
Jeffrey Phillips Freeman 36c571db83
CI / lint (pull_request) Successful in 15s
CI / typecheck (pull_request) Successful in 30s
CI / security (pull_request) Successful in 22s
CI / quality (pull_request) Successful in 16s
CI / integration_tests (pull_request) Successful in 5m12s
CI / build (pull_request) Successful in 16s
CI / lint (push) Successful in 13s
CI / typecheck (push) Successful in 29s
CI / security (push) Successful in 23s
CI / quality (push) Successful in 16s
CI / unit_tests (pull_request) Successful in 13m42s
CI / integration_tests (push) Successful in 4m53s
CI / build (push) Successful in 16s
CI / unit_tests (push) Successful in 15m9s
CI / coverage (pull_request) Successful in 7m58s
CI / coverage (push) Successful in 8m14s
CI / docker (pull_request) Successful in 9s
CI / docker (push) Successful in 8s
feat(repo): add resource repositories
2026-02-16 21:35:54 +00:00

257 lines
12 KiB
Gherkin

@phase1 @domain @repository @resource_repository
Feature: Resource Repository Persistence
As a system operator managing resources and resource types
I want the resource repositories to reliably persist and retrieve entries
So that the resource registry is durable and queryable
Background:
Given a clean resource repository database
And a resource type repository backed by the database
And a resource repository backed by the database
# ---------------------------------------------------------------------------
# ResourceTypeRepository: Creating resource types
# ---------------------------------------------------------------------------
@resource_type_create
Scenario: A new resource type is persisted and retrievable
Given a valid resource type spec named "myorg/test-type"
When the resource type is saved through the repository
Then the resource type repository should not raise an error
And the persisted resource type should have name "myorg/test-type"
@resource_type_create @error_handling
Scenario: Saving a resource type with a duplicate name is rejected
Given a valid resource type spec named "myorg/dup-type"
And the resource type has already been saved once
When a second resource type with the same name "myorg/dup-type" is saved
Then a DuplicateResourceTypeError should be raised mentioning "myorg/dup-type"
# ---------------------------------------------------------------------------
# ResourceTypeRepository: Retrieving resource types
# ---------------------------------------------------------------------------
@resource_type_read
Scenario: A resource type is retrieved by its name
Given a valid resource type spec named "myorg/lookup-type"
And the resource type has been saved through the repository
When the resource type is looked up by name "myorg/lookup-type"
Then the returned resource type should have name "myorg/lookup-type"
@resource_type_read
Scenario: Looking up a non-existent resource type returns nothing
When the resource type is looked up by name "myorg/does-not-exist"
Then no resource type should be returned
# ---------------------------------------------------------------------------
# ResourceTypeRepository: Listing resource types
# ---------------------------------------------------------------------------
@resource_type_list
Scenario: All resource types are listed in order
Given resource types "myorg/b-type" and "myorg/a-type" have been saved
When all resource types are listed
Then the resource type list should have 2 entries
And the first resource type in the list should be "myorg/a-type"
@resource_type_list
Scenario: Resource types are filtered by namespace
Given resource types "alpha/type-1" and "beta/type-2" have been saved
When resource types are listed with namespace "alpha"
Then the resource type list should have 1 entries
And the first resource type in the list should be "alpha/type-1"
@resource_type_list
Scenario: Resource types are filtered by user_addable flag
Given a resource type "myorg/addable-type" with user_addable true is saved
And a resource type "myorg/non-addable" with user_addable false is saved
When resource types are listed with user_addable true
Then the resource type list should have 1 entries
And the first resource type in the list should be "myorg/addable-type"
# ---------------------------------------------------------------------------
# ResourceTypeRepository: Updating resource types
# ---------------------------------------------------------------------------
@resource_type_update
Scenario: A resource type description is updated
Given a valid resource type spec named "myorg/update-type"
And the resource type has been saved through the repository
When the resource type description is updated to "New description"
Then the resource type should be retrievable with description "New description"
@resource_type_update @error_handling
Scenario: Updating a non-existent resource type raises error
When a non-existent resource type "myorg/phantom" is updated
Then a ResourceTypeNotFoundError should be raised
# ---------------------------------------------------------------------------
# ResourceTypeRepository: Deleting resource types
# ---------------------------------------------------------------------------
@resource_type_delete
Scenario: A resource type with no resources is deleted
Given a valid resource type spec named "myorg/deletable-type"
And the resource type has been saved through the repository
When the resource type "myorg/deletable-type" is deleted
Then the resource type deletion should return true
And the resource type "myorg/deletable-type" should no longer exist
@resource_type_delete
Scenario: Deleting a non-existent resource type returns false
When the resource type "myorg/phantom" is deleted
Then the resource type deletion should return false
@resource_type_delete @error_handling
Scenario: Deleting a resource type with existing resources is rejected
Given a valid resource type spec named "myorg/in-use-type"
And the resource type has been saved through the repository
And a resource of type "myorg/in-use-type" exists in the database
When the resource type "myorg/in-use-type" is deleted
Then a ResourceTypeHasResourcesError should be raised
# ---------------------------------------------------------------------------
# ResourceRepository: Creating resources
# ---------------------------------------------------------------------------
@resource_create
Scenario: A new resource is persisted and retrievable
Given a resource type "myorg/res-type" exists for resource tests
And a valid resource domain object with name "myorg/test-resource"
When the resource is saved through the repository
Then the resource repository should not raise an error
And the persisted resource should have name "myorg/test-resource"
@resource_create @error_handling
Scenario: Creating a resource with invalid type is rejected
Given a valid resource domain object with type "myorg/nonexistent-type"
When the resource is saved through the repository
Then a ResourceTypeNotFoundError should be raised for type "myorg/nonexistent-type"
@resource_create @error_handling
Scenario: Creating a resource with duplicate name is rejected
Given a resource type "myorg/dup-res-type" exists for resource tests
And a resource with name "myorg/dup-resource" has been saved
When a second resource with name "myorg/dup-resource" is saved
Then a DuplicateResourceError should be raised mentioning "myorg/dup-resource"
# ---------------------------------------------------------------------------
# ResourceRepository: Retrieving resources
# ---------------------------------------------------------------------------
@resource_read
Scenario: A resource is retrieved by its ULID
Given a resource type "myorg/get-type" exists for resource tests
And a resource with known ULID has been saved
When the resource is looked up by its ULID
Then the returned resource should have the correct ULID
@resource_read
Scenario: A resource is retrieved by its namespaced name
Given a resource type "myorg/name-type" exists for resource tests
And a resource with name "myorg/named-resource" has been saved
When the resource is looked up by name "myorg/named-resource"
Then the returned resource should have name "myorg/named-resource"
@resource_read
Scenario: Looking up a non-existent resource by ULID returns nothing
When the resource is looked up by ULID "01ZZZZZZZZZZZZZZZZZZZZZZZZ"
Then no resource should be returned
@resource_read
Scenario: Looking up a non-existent resource by name returns nothing
When the resource is looked up by name "myorg/no-such-resource"
Then no resource should be returned
# ---------------------------------------------------------------------------
# ResourceRepository: Listing resources
# ---------------------------------------------------------------------------
@resource_list
Scenario: Resources are listed with pagination
Given a resource type "myorg/list-type" exists for resource tests
And 5 resources of type "myorg/list-type" have been saved
When resources are listed with limit 3 and offset 0
Then the resource list should have 3 entries
@resource_list
Scenario: Resources are filtered by type_name
Given resource types "myorg/type-a" and "myorg/type-b" exist for resource tests
And 2 resources of type "myorg/type-a" have been saved
And 3 resources of type "myorg/type-b" have been saved
When resources are listed with type_name "myorg/type-a"
Then the resource list should have 2 entries
# ---------------------------------------------------------------------------
# ResourceRepository: Updating resources
# ---------------------------------------------------------------------------
@resource_update
Scenario: A resource description is updated
Given a resource type "myorg/upd-type" exists for resource tests
And a resource with name "myorg/updatable-resource" has been saved
When the resource description is updated to "Updated description"
Then the resource should be retrievable with description "Updated description"
@resource_update @error_handling
Scenario: Updating a non-existent resource raises error
When a non-existent resource with ULID "01ZZZZZZZZZZZZZZZZZZZZZZZZ" is updated
Then a ResourceNotFoundRepoError should be raised
# ---------------------------------------------------------------------------
# ResourceRepository: Deleting resources
# ---------------------------------------------------------------------------
@resource_delete
Scenario: A resource with no edges is deleted
Given a resource type "myorg/del-type" exists for resource tests
And a resource with name "myorg/deletable-resource" has been saved
When the resource is deleted by its ULID
Then the resource deletion should return true
And the resource should no longer exist
@resource_delete
Scenario: Deleting a non-existent resource returns false
When the resource with ULID "01ZZZZZZZZZZZZZZZZZZZZZZZZ" is deleted
Then the resource deletion should return false
@resource_delete @error_handling
Scenario: Deleting a resource with edges is rejected
Given a resource type "myorg/edge-type" exists for resource tests
And a parent and child resource of type "myorg/edge-type" are linked
When the parent resource is deleted
Then a ResourceHasEdgesError should be raised
# ---------------------------------------------------------------------------
# ResourceRepository: resolve_namespaced_name helper
# ---------------------------------------------------------------------------
@resource_resolve
Scenario: Resolve by name returns the resource
Given a resource type "myorg/resolve-type" exists for resource tests
And a resource with name "myorg/resolve-me" has been saved
When the resource is resolved by name_or_id "myorg/resolve-me"
Then the resolved resource should have name "myorg/resolve-me"
@resource_resolve
Scenario: Resolve by ULID returns the resource
Given a resource type "myorg/resolve-ulid-type" exists for resource tests
And a resource with known ULID has been saved for resolve test
When the resource is resolved by its ULID
Then the resolved resource should have the correct ULID
@resource_resolve
Scenario: Resolve with unknown name returns nothing
When the resource is resolved by name_or_id "myorg/unknown"
Then no resolved resource should be returned
# ---------------------------------------------------------------------------
# ResourceTypeRepository: domain round-trip
# ---------------------------------------------------------------------------
@resource_type_roundtrip
Scenario: Resource type persists and restores all fields
Given a full resource type spec with cli_args and capabilities
When the full resource type is saved and retrieved
Then the restored resource type should match the original fields