5691858d46
CI / lint (pull_request) Successful in 15s
CI / typecheck (pull_request) Successful in 27s
CI / security (pull_request) Successful in 23s
CI / quality (pull_request) Successful in 15s
CI / integration_tests (pull_request) Successful in 4m37s
CI / build (pull_request) Successful in 16s
CI / unit_tests (pull_request) Successful in 10m41s
CI / coverage (pull_request) Successful in 7m23s
CI / docker (pull_request) Successful in 39s
126 lines
5.9 KiB
Gherkin
126 lines
5.9 KiB
Gherkin
@phase1 @domain @repository @plan_repository
|
|
Feature: Lifecycle Plan Repository Persistence
|
|
As a system operator managing lifecycle plans
|
|
I want the plan repository to reliably persist and retrieve plans
|
|
So that plan state survives process restarts and supports CLI list/filter commands
|
|
|
|
Background:
|
|
Given a clean in-memory database for plan repository tests
|
|
And a lifecycle plan repository backed by the database
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Create and retrieve
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_create @plan_get
|
|
Scenario: Create a plan and retrieve it by ID
|
|
Given a valid plan domain object with id "01HGZ6FE0AQDYTR4BX00000001"
|
|
When the plan is saved through the plan repository
|
|
Then the plan repository should not raise an error
|
|
And the plan retrieved by id "01HGZ6FE0AQDYTR4BX00000001" should exist
|
|
And the retrieved plan description should be "Test plan description"
|
|
|
|
@plan_create @plan_get_by_name
|
|
Scenario: Create a plan and retrieve it by name
|
|
Given a valid plan domain object with id "01HGZ6FE0AQDYTR4BX00000002"
|
|
When the plan is saved through the plan repository
|
|
Then the plan retrieved by name "local/test-plan" should exist
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Update
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_update
|
|
Scenario: Update plan phase and processing state
|
|
Given a valid plan domain object with id "01HGZ6FE0AQDYTR4BX00000003"
|
|
And the plan is saved through the plan repository
|
|
When the plan phase is updated to "strategize" with state "processing"
|
|
Then the retrieved plan should have phase "strategize"
|
|
And the retrieved plan should have processing state "processing"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# List filters
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_list @plan_filter_phase
|
|
Scenario: List plans filtered by phase
|
|
Given 3 plans exist in phase "action" and 2 plans in phase "strategize"
|
|
When plans are listed with phase filter "action"
|
|
Then the plan list should contain 3 plans
|
|
|
|
@plan_list @plan_filter_state
|
|
Scenario: List plans filtered by processing state
|
|
Given 2 plans exist in state "queued" and 1 plan in state "processing"
|
|
When plans are listed with processing state filter "queued"
|
|
Then the plan list should contain 2 plans
|
|
|
|
@plan_list @plan_filter_action
|
|
Scenario: List plans filtered by action name
|
|
Given 2 plans referencing action "local/deploy" and 1 plan referencing "local/review"
|
|
When plans are listed with action name filter "local/deploy"
|
|
Then the plan list should contain 2 plans
|
|
|
|
@plan_list @plan_filter_project
|
|
Scenario: List plans filtered by project name
|
|
Given a plan linked to project "local/api-service" and another with no project link
|
|
When plans are listed with project name filter "local/api-service"
|
|
Then the plan list should contain 1 plan
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Delete
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_delete
|
|
Scenario: Delete plan cascades to child tables
|
|
Given a valid plan domain object with id "01HGZ6FE0AQDYTR4BX00000010" and child rows
|
|
And the plan is saved through the plan repository
|
|
When the plan with id "01HGZ6FE0AQDYTR4BX00000010" is deleted
|
|
Then the plan retrieved by id "01HGZ6FE0AQDYTR4BX00000010" should not exist
|
|
And the child rows for plan "01HGZ6FE0AQDYTR4BX00000010" should be gone
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Error handling
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_create @error_handling
|
|
Scenario: Creating duplicate plan raises error
|
|
Given a valid plan domain object with id "01HGZ6FE0AQDYTR4BX00000011"
|
|
And the plan is saved through the plan repository
|
|
When a duplicate plan with id "01HGZ6FE0AQDYTR4BX00000011" is saved
|
|
Then a DuplicatePlanError should be raised mentioning "01HGZ6FE0AQDYTR4BX00000011"
|
|
|
|
@plan_get @error_handling
|
|
Scenario: Getting non-existent plan returns None
|
|
When the plan is retrieved by id "01HGZ6FE0AQDYTR4BXZZZZZZZZ"
|
|
Then the plan retrieve result should be None
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Phase and state persistence
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_phase @action_phase
|
|
Scenario: Plan with Action phase persists correctly
|
|
Given a plan domain object in phase "action" with state "queued" and id "01HGZ6FE0AQDYTR4BX00000012"
|
|
When the plan is saved through the plan repository
|
|
Then the retrieved plan should have phase "action"
|
|
And the retrieved plan should have processing state "queued"
|
|
|
|
@plan_phase @apply_terminal
|
|
Scenario: Plan with Apply terminal state persists correctly
|
|
Given a plan domain object in phase "apply" with state "applied" and id "01HGZ6FE0AQDYTR4BX00000013"
|
|
When the plan is saved through the plan repository
|
|
Then the retrieved plan should have phase "apply"
|
|
And the retrieved plan should have processing state "applied"
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Child row ordering
|
|
# ---------------------------------------------------------------------------
|
|
|
|
@plan_children @ordering
|
|
Scenario: Child rows (projects, arguments, invariants) persist in order
|
|
Given a plan with ordered children and id "01HGZ6FE0AQDYTR4BX00000014"
|
|
When the plan is saved through the plan repository
|
|
Then the retrieved plan should have arguments in order "alpha,beta,gamma"
|
|
And the retrieved plan should have invariants in order "first,second,third"
|
|
And the retrieved plan should have project links including "local/proj-a"
|