|
| 1 | +<?php |
| 2 | +/** |
| 3 | + * Pure-PHP smoke test for pending-action approval resolver contracts. |
| 4 | + * |
| 5 | + * Run with: php tests/approval-resolver-contract-smoke.php |
| 6 | + * |
| 7 | + * @package AgentsAPI\Tests |
| 8 | + */ |
| 9 | + |
| 10 | +if ( ! defined( 'ABSPATH' ) ) { |
| 11 | + define( 'ABSPATH', __DIR__ . '/' ); |
| 12 | +} |
| 13 | + |
| 14 | +$failures = array(); |
| 15 | +$passes = 0; |
| 16 | + |
| 17 | +echo "agents-api-approval-resolver-contract-smoke\n"; |
| 18 | + |
| 19 | +require_once __DIR__ . '/agents-api-smoke-helpers.php'; |
| 20 | +agents_api_smoke_require_module(); |
| 21 | + |
| 22 | +$accepted = AgentsAPI\AI\Approvals\ApprovalDecision::accepted(); |
| 23 | +$rejected = AgentsAPI\AI\Approvals\ApprovalDecision::from_string( AgentsAPI\AI\Approvals\ApprovalDecision::REJECTED ); |
| 24 | + |
| 25 | +agents_api_smoke_assert_equals( 'accepted', AgentsAPI\AI\Approvals\ApprovalDecision::ACCEPTED, 'accepted vocabulary is stable', $failures, $passes ); |
| 26 | +agents_api_smoke_assert_equals( 'rejected', AgentsAPI\AI\Approvals\ApprovalDecision::REJECTED, 'rejected vocabulary is stable', $failures, $passes ); |
| 27 | +agents_api_smoke_assert_equals( 'accepted', $accepted->value(), 'accepted decision exposes normalized value', $failures, $passes ); |
| 28 | +agents_api_smoke_assert_equals( true, $accepted->is_accepted(), 'accepted decision reports accepted', $failures, $passes ); |
| 29 | +agents_api_smoke_assert_equals( false, $accepted->is_rejected(), 'accepted decision does not report rejected', $failures, $passes ); |
| 30 | +agents_api_smoke_assert_equals( 'rejected', (string) $rejected, 'rejected decision stringifies to normalized value', $failures, $passes ); |
| 31 | +agents_api_smoke_assert_equals( true, $rejected->is_rejected(), 'rejected decision reports rejected', $failures, $passes ); |
| 32 | + |
| 33 | +$handler = new class() implements AgentsAPI\AI\Approvals\PendingActionHandlerInterface { |
| 34 | + public function handle_pending_action( AgentsAPI\AI\Approvals\ApprovalDecision $decision, array $apply_input, array $payload = array(), array $context = array() ): mixed { |
| 35 | + return array( |
| 36 | + 'decision' => $decision->value(), |
| 37 | + 'target' => $apply_input['target'] ?? null, |
| 38 | + 'reason' => $payload['reason'] ?? null, |
| 39 | + 'actor' => $context['actor'] ?? null, |
| 40 | + ); |
| 41 | + } |
| 42 | +}; |
| 43 | + |
| 44 | +$handled = $handler->handle_pending_action( |
| 45 | + $accepted, |
| 46 | + array( 'target' => 'diff-123' ), |
| 47 | + array( 'reason' => 'looks-good' ), |
| 48 | + array( 'actor' => 'reviewer' ) |
| 49 | +); |
| 50 | + |
| 51 | +agents_api_smoke_assert_equals( 'accepted', $handled['decision'], 'handler receives decision object', $failures, $passes ); |
| 52 | +agents_api_smoke_assert_equals( 'diff-123', $handled['target'], 'handler receives stored apply input', $failures, $passes ); |
| 53 | +agents_api_smoke_assert_equals( 'looks-good', $handled['reason'], 'handler receives resolver payload', $failures, $passes ); |
| 54 | +agents_api_smoke_assert_equals( 'reviewer', $handled['actor'], 'handler receives optional context', $failures, $passes ); |
| 55 | + |
| 56 | +$resolver = new class( $handler ) implements AgentsAPI\AI\Approvals\PendingActionResolverInterface { |
| 57 | + public function __construct( private AgentsAPI\AI\Approvals\PendingActionHandlerInterface $handler ) {} |
| 58 | + |
| 59 | + public function resolve_pending_action( string $pending_action_id, AgentsAPI\AI\Approvals\ApprovalDecision $decision, array $payload = array(), array $context = array() ): mixed { |
| 60 | + return $this->handler->handle_pending_action( |
| 61 | + $decision, |
| 62 | + array( 'target' => $pending_action_id ), |
| 63 | + $payload, |
| 64 | + $context |
| 65 | + ); |
| 66 | + } |
| 67 | +}; |
| 68 | + |
| 69 | +$resolved = $resolver->resolve_pending_action( |
| 70 | + 'diff-456', |
| 71 | + AgentsAPI\AI\Approvals\ApprovalDecision::rejected(), |
| 72 | + array( 'reason' => 'needs-work' ) |
| 73 | +); |
| 74 | + |
| 75 | +agents_api_smoke_assert_equals( 'rejected', $resolved['decision'], 'resolver receives rejected decision', $failures, $passes ); |
| 76 | +agents_api_smoke_assert_equals( 'diff-456', $resolved['target'], 'resolver maps pending action id to stored input', $failures, $passes ); |
| 77 | +agents_api_smoke_assert_equals( 'needs-work', $resolved['reason'], 'resolver forwards payload to handler', $failures, $passes ); |
| 78 | + |
| 79 | +try { |
| 80 | + AgentsAPI\AI\Approvals\ApprovalDecision::from_string( 'approved' ); |
| 81 | + agents_api_smoke_assert_equals( true, false, 'unknown decision is rejected', $failures, $passes ); |
| 82 | +} catch ( InvalidArgumentException $e ) { |
| 83 | + agents_api_smoke_assert_equals( true, str_contains( $e->getMessage(), 'accepted or rejected' ), 'unknown decision is rejected', $failures, $passes ); |
| 84 | +} |
| 85 | + |
| 86 | +agents_api_smoke_finish( 'Agents API approval resolver contract', $failures, $passes ); |
0 commit comments