public async Task CannotCallAuthorizeAsyncWithNullContext()
 {
     var         testClass = new ConventionBasedOperationAuthorizer(typeof(EmptyApi));
     Func <Task> act       = () => testClass.AuthorizeAsync(
         default(OperationContext),
         CancellationToken.None);
     await act.Should().ThrowAsync <ArgumentNullException>();
 }
        public async Task CanCallAuthorizeAsync()
        {
            var context = new OperationContext(
                new EmptyApi(serviceProvider),
                s => new object(),
                "Test",
                true,
                null);
            var cancellationToken = CancellationToken.None;
            var testClass         = new ConventionBasedOperationAuthorizer(typeof(EmptyApi));
            var result            = await testClass.AuthorizeAsync(context, cancellationToken);

            result.Should().BeTrue("AuthorizeAsync should be true by default.");
        }
        public async Task AuthorizeAsyncInvokesConventionMethod()
        {
            var api     = new NoPermissionApi(serviceProvider);
            var context = new OperationContext(
                api,
                s => new object(),
                "Test",
                true,
                null);
            var cancellationToken = CancellationToken.None;
            var testClass         = new ConventionBasedOperationAuthorizer(typeof(NoPermissionApi));
            var result            = await testClass.AuthorizeAsync(context, cancellationToken);

            result.Should().BeFalse("AuthorizeAsync should invoke CanInsertObject.");
            api.InvocationCount.Should().Be(1);
        }
        public async Task AuthorizeAsyncWithWrongNumberOfArguments()
        {
            testTraceListener.Clear();
            var api     = new IncorrectArgumentsApi(serviceProvider);
            var context = new OperationContext(
                api,
                s => new object(),
                "Test",
                true,
                null);
            var cancellationToken = CancellationToken.None;
            var testClass         = new ConventionBasedOperationAuthorizer(typeof(IncorrectArgumentsApi));
            var result            = await testClass.AuthorizeAsync(context, cancellationToken);

            result.Should().BeTrue("AuthorizeAsync should return true, because the api type is incorrect.");
            testTraceListener.Messages.Should().Contain("incorrect number of arguments");
            api.InvocationCount.Should().Be(0);
        }
        public async Task AuthorizeAsyncWithWrongReturnType()
        {
            testTraceListener.Clear();
            var api     = new WrongReturnTypeApi(serviceProvider);
            var context = new OperationContext(
                api,
                s => new object(),
                "Test",
                true,
                null);
            var cancellationToken = CancellationToken.None;
            var testClass         = new ConventionBasedOperationAuthorizer(typeof(WrongReturnTypeApi));
            var result            = await testClass.AuthorizeAsync(context, cancellationToken);

            result.Should().BeTrue("AuthorizeAsync should return true, because CanInsertObject returns an int.");
            testTraceListener.Messages.Should().Contain("does not return a boolean value");
            api.InvocationCount.Should().Be(0);
        }
        public async Task AuthorizeAsyncWithPrivateMethod()
        {
            testTraceListener.Clear();
            var api     = new PrivateMethodApi(serviceProvider);
            var context = new OperationContext(
                api,
                s => new object(),
                "Test",
                true,
                null);
            var cancellationToken = CancellationToken.None;
            var testClass         = new ConventionBasedOperationAuthorizer(typeof(PrivateMethodApi));
            var result            = await testClass.AuthorizeAsync(context, cancellationToken);

            result.Should().BeTrue("AuthorizeAsync should return true, because CanInsertObject is private.");
            testTraceListener.Messages.Should().Contain("inaccessible due to its protection level");
            api.InvocationCount.Should().Be(0);
        }
        public void CanConstruct()
        {
            var instance = new ConventionBasedOperationAuthorizer(typeof(EmptyApi));

            instance.Should().NotBeNull();
        }