public void TicketHasCorrectIdentity(PermissionTicketRequest ticketRequest)
        {
            // Act
            var ticket = this.manager.Request(ticketRequest);

            // Assert
            ticket.Principal.Should().Be(ticketRequest.Principal);
        }
        public void ValidTicketLifetime(PermissionTicketRequest ticketRequest)
        {
            // Act
            var ticket = this.manager.Request(ticketRequest);

            // Assert
            ticket.Expiry.Should().BeAfter(DateTimeOffset.UtcNow.AddMinutes(29));
        }
        public void InvalidTickets(PermissionTicketRequest ticketRequest)
        {
            // Act
            var result = this.manager.Request(ticketRequest);

            // Assert
            result.IsValid.Should().BeFalse();
        }
        public void ValidTicketIssued(PermissionTicketRequest ticketRequest)
        {
            // Act
            var ticket = this.manager.Request(ticketRequest);

            // Assert
            ticket.IsValid.Should().BeTrue();
        }
        private ValidationResult <CRN, ResourceAction, CPN> ValidateResources(IEnumerable <Resource> resources, PermissionTicketRequest ticketRequest)
        {
            foreach (var r in resources)
            {
                if (!Validator.TryValidate(() => this.resourceValidator.Validate(r.Identifier), out var resultResource))
                {
                    return(ValidationResult <CRN, ResourceAction, CPN> .Invalid(r.Identifier, ticketRequest.Action, ticketRequest.Principal, resultResource.Reason));
                }

                if (!Validator.TryValidate(() => this.resourceValidator.ValidateAction(ticketRequest.Action), out var resultAction))
                {
                    return(ValidationResult <CRN, ResourceAction, CPN> .Invalid(ticketRequest.Resource, ticketRequest.Action, ticketRequest.Principal, resultAction.Reason));
                }

                if (!Validator.TryValidate(() => this.resourceValidator.Validate(r.Identifier, ticketRequest.Action), out var resultActionOnResource))
                {
                    return(ValidationResult <CRN, ResourceAction, CPN> .Invalid(ticketRequest.Resource, ticketRequest.Action, ticketRequest.Principal, resultActionOnResource.Reason));
                }
            }

            return(ValidationResult <CRN, ResourceAction, CPN> .Valid(ticketRequest.Resource, ticketRequest.Action, ticketRequest.Principal));
        }