package domain import ( "strings" "testing" "git.cin.su/m/Assistant/contracts/authority" commitcontract "git.cin.su/m/Assistant/contracts/commit" "git.cin.su/m/Assistant/contracts/work" ) type allowValidator struct{} func (allowValidator) Validate(authority.AuthorizationContext) error { return nil } func notificationProposal() commitcontract.ActionProposal { return commitcontract.ActionProposal{IntentID: "intent", ActorID: "actor", CapabilityID: commitcontract.CapabilityProspectiveNotification, Target: work.TaskTarget{TaskID: "task", GoalID: "goal", ScopeID: "scope", Revision: 1}, Operation: commitcontract.OperationDeliverProspectiveNotification, NotificationSubject: commitcontract.ProspectiveNotificationSubject{ProspectiveItemID: "item", ExpectedRevision: 1, TemplateCode: commitcontract.ProspectiveDeliveredTemplateV1, BindingID: "binding", BindingRevision: 1, RenderedTitle: "Домовой", RenderedMessage: "Пора вернуться", RequestDigest: strings.Repeat("a", 64)}} } func notificationContext() AuthorizationContext { var context AuthorizationContext context.Binding.ActorID, context.Binding.PrincipalID, context.Binding.Active = "actor", "owner", true context.Scope = authority.Scope{ID: "scope"} context.Grant = authority.AuthorityGrant{ID: "grant", ActorID: "actor", PrincipalID: "owner", ScopeID: "scope", Class: authority.GrantClassCreator, Revision: 1, Active: true} return context } func TestAuthorizeProspectiveNotification(t *testing.T) { action, err := Authorize(notificationProposal(), notificationContext(), allowValidator{}, "authorized", 1) if err != nil { t.Fatal(err) } if action.Proposal.Operation != commitcontract.OperationDeliverProspectiveNotification { t.Fatal("operation changed") } } func TestAuthorizeProspectiveNotificationRejectsInvalidEvidence(t *testing.T) { for name, mutate := range map[string]func(*commitcontract.ActionProposal){"binding": func(p *commitcontract.ActionProposal) { p.NotificationSubject.BindingID = "" }, "digest": func(p *commitcontract.ActionProposal) { p.NotificationSubject.RequestDigest = "AA" }, "message": func(p *commitcontract.ActionProposal) { p.NotificationSubject.RenderedMessage = "" }, "operation": func(p *commitcontract.ActionProposal) { p.Operation = "arbitrary-webhook" }} { t.Run(name, func(t *testing.T) { proposal := notificationProposal() mutate(&proposal) if _, err := Authorize(proposal, notificationContext(), allowValidator{}, "authorized", 1); err == nil { t.Fatal("expected denial") } }) } }