Files
Assistant/cmd/continuity-runtime/internal_executor_test.go
2026-08-16 16:19:23 +03:00

65 lines
2.4 KiB
Go

package main
import (
"bytes"
"context"
"encoding/json"
"net/http"
"net/http/httptest"
"testing"
"git.cin.su/m/Assistant/adapters/postgres"
"git.cin.su/m/Assistant/contracts/continuity"
)
type fakeContinuityExecutorRepository struct {
receipt continuity.ActionReceipt
err error
calls int
}
func (f *fakeContinuityExecutorRepository) SatisfyDelivered(context.Context, continuity.SatisfyDeliveredCommand) (continuity.ActionReceipt, error) {
f.calls++
return f.receipt, f.err
}
func (f *fakeContinuityExecutorRepository) LoadActionReceipt(context.Context, continuity.CommittedActionIntentID) (continuity.ActionReceipt, error) {
return f.receipt, f.err
}
func TestInternalExecutorRequiresTokenAndReturnsReceipt(t *testing.T) {
repository := &fakeContinuityExecutorRepository{receipt: continuity.ActionReceipt{ActionIntentID: "intent-1", ResultState: continuity.ProspectiveSatisfied, ResultRevision: 2}}
mux := http.NewServeMux()
registerInternalExecutorRoutes(mux, repository, "secret")
command := continuity.SatisfyDeliveredCommand{ActionIntentID: "intent-1"}
body, _ := json.Marshal(command)
denied := httptest.NewRequest(http.MethodPost, "/v1/internal/executor/satisfy-delivered", bytes.NewReader(body))
deniedResult := httptest.NewRecorder()
mux.ServeHTTP(deniedResult, denied)
if deniedResult.Code != http.StatusUnauthorized || repository.calls != 0 {
t.Fatalf("denied status=%d calls=%d", deniedResult.Code, repository.calls)
}
request := httptest.NewRequest(http.MethodPost, "/v1/internal/executor/satisfy-delivered", bytes.NewReader(body))
request.Header.Set("Authorization", "Bearer secret")
result := httptest.NewRecorder()
mux.ServeHTTP(result, request)
if result.Code != http.StatusOK || repository.calls != 1 {
t.Fatalf("status=%d calls=%d body=%s", result.Code, repository.calls, result.Body.String())
}
}
func TestInternalExecutorMapsOwnerConflictWithoutLeakingDetails(t *testing.T) {
repository := &fakeContinuityExecutorRepository{err: postgres.ErrProspectiveOwnerConflict}
mux := http.NewServeMux()
registerInternalExecutorRoutes(mux, repository, "secret")
request := httptest.NewRequest(http.MethodPost, "/v1/internal/executor/satisfy-delivered", bytes.NewBufferString(`{}`))
request.Header.Set("Authorization", "Bearer secret")
result := httptest.NewRecorder()
mux.ServeHTTP(result, request)
if result.Code != http.StatusConflict {
t.Fatalf("status=%d", result.Code)
}
}