65 lines
2.4 KiB
Go
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)
|
|
}
|
|
}
|