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) } }