Remove now reconciles document slots and returns ERR_DUTY_SYNC on failure. CreateOrGetDocument errors abort the task. The frontend refreshes workflow docs after add, update, restore, and remove. Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
package server
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"strings"
|
|
"testing"
|
|
|
|
"chat-agent-system/internal/authz"
|
|
)
|
|
|
|
func TestResolveUpdateProjectRole_KeepsExistingOwner(t *testing.T) {
|
|
role, err := resolveUpdateProjectRole("", &authz.ProjectMemberRecord{ProjectRole: authz.RoleOwner})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if role != authz.RoleOwner {
|
|
t.Fatalf("omitted project_role must keep owner, got %q", role)
|
|
}
|
|
}
|
|
|
|
func TestResolveUpdateProjectRole_RejectsMissingMember(t *testing.T) {
|
|
if _, err := resolveUpdateProjectRole("", nil); !errors.Is(err, errProjectRoleRequired) {
|
|
t.Fatalf("want errProjectRoleRequired, got %v", err)
|
|
}
|
|
if _, err := resolveUpdateProjectRole("", &authz.ProjectMemberRecord{}); !errors.Is(err, errProjectRoleRequired) {
|
|
t.Fatalf("empty existing role must be rejected, got %v", err)
|
|
}
|
|
}
|
|
|
|
func TestDutyChangeForRemove_UsesExistingReviewerDuty(t *testing.T) {
|
|
got := dutyChangeForRemove(&authz.ProjectMemberRecord{DocumentDuty: "reviewer"}, 171)
|
|
if !got.Exited || got.UserID != 171 || got.PreviousDuty != "reviewer" || got.NextDuty != "reviewer" {
|
|
t.Fatalf("remove change: %+v", got)
|
|
}
|
|
}
|
|
|
|
func TestWriteDutySyncError_UsesExplicitCode(t *testing.T) {
|
|
rec := httptest.NewRecorder()
|
|
writeDutySyncError(rec)
|
|
if rec.Code != http.StatusInternalServerError {
|
|
t.Fatalf("status=%d", rec.Code)
|
|
}
|
|
if !strings.Contains(rec.Body.String(), "ERR_DUTY_SYNC") {
|
|
t.Fatalf("body=%s", rec.Body.String())
|
|
}
|
|
}
|
|
|
|
func TestResolveUpdateProjectRole_ExplicitRoleWins(t *testing.T) {
|
|
role, err := resolveUpdateProjectRole(authz.RoleViewer, &authz.ProjectMemberRecord{ProjectRole: authz.RoleOwner})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if role != authz.RoleViewer {
|
|
t.Fatalf("explicit role must win, got %q", role)
|
|
}
|
|
}
|