public async Task Read_Ok()
        {
            // Arrange
            var model     = new { Name = "Name", Id = Guid.NewGuid() };
            var keyValues = new object[] { model.Id };

            _mediator.Setup(x => x.Send(
                                It.Is <ReadRequest <object, object> >(y => y.KeyValues[0] == keyValues[0]),
                                It.IsAny <CancellationToken>()))
            .ReturnsAsync(model);
            var cache = new Mock <IMemoryCache>();

            cache.Setup(x => x.CreateEntry(It.IsAny <object[]>())).Returns(Mock.Of <ICacheEntry>());
            var controller = new FakeClassController(_mediator.Object, cache.Object, Mock.Of <IOptions <CacheOptions> >());

            // Act
            var read = await controller.Read(keyValues);

            // Assert
            var result = Assert.IsType <OkObjectResult>(read);

            _mediator.Verify(x => x.Publish(
                                 It.IsAny <ReadNotification <object> >(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
            Assert.Equal(model, result.Value);
        }
        public async Task List_Ok()
        {
            // Arrange
            var request          = new DataSourceRequest();
            var dataSourceResult = new DataSourceResult();

            _mediator.Setup(x => x.Send(
                                It.Is <ListRequest <object, object> >(y => y.Request == request),
                                It.IsAny <CancellationToken>()))
            .ReturnsAsync(dataSourceResult);
            var cache = new Mock <IMemoryCache>();

            cache.Setup(x => x.CreateEntry(It.IsAny <DataSourceRequest>())).Returns(Mock.Of <ICacheEntry>());
            var controller = new FakeClassController(_mediator.Object, cache.Object, Mock.Of <IOptions <CacheOptions> >());

            // Act
            var list = await controller.List(request);

            // Assert
            var result = Assert.IsType <OkObjectResult>(list);

            _mediator.Verify(x => x.Publish(
                                 It.IsAny <ListNotification>(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
            Assert.Equal(dataSourceResult, result.Value);
        }
        public async Task Create_Ok()
        {
            // Arrange
            var model = new { Name = "Name" };

            _mediator.Setup(x => x.Send(
                                It.Is <CreateRequest <object, object> >(y => y.Model == model),
                                It.IsAny <CancellationToken>()))
            .ReturnsAsync((model, new object[] { new {} }));
            var cache = new Mock <IMemoryCache>();

            cache.Setup(x => x.CreateEntry(It.IsAny <object[]>())).Returns(Mock.Of <ICacheEntry>());
            var controller = new FakeClassController(_mediator.Object, cache.Object, Mock.Of <IOptions <CacheOptions> >());

            // Act
            var create = await controller.Create(model);

            // Assert
            var result = Assert.IsType <OkObjectResult>(create);

            _mediator.Verify(x => x.Publish(
                                 It.IsAny <CreateNotification <object> >(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
            Assert.Equal(model, result.Value);
        }
        public async Task Delete_No_Content()
        {
            // Arrange
            var keyValues  = new object[] { Guid.NewGuid() };
            var controller = new FakeClassController(_mediator.Object, Mock.Of <IMemoryCache>(), Mock.Of <IOptions <CacheOptions> >());

            // Act
            var delete = await controller.Delete(keyValues);

            // Assert
            Assert.IsType <NoContentResult>(delete);
            _mediator.Verify(x => x.Publish(
                                 It.IsAny <DeleteNotification>(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
        }
        public async Task Update_No_Content()
        {
            // Arrange
            var model = new { Name = "Name" };
            var cache = new Mock <IMemoryCache>();

            cache.Setup(x => x.CreateEntry(It.IsAny <object[]>())).Returns(Mock.Of <ICacheEntry>());
            var controller = new FakeClassController(_mediator.Object, cache.Object, Mock.Of <IOptions <CacheOptions> >());

            // Act
            var update = await controller.Update(model);

            // Assert
            Assert.IsType <NoContentResult>(update);
            _mediator.Verify(x => x.Publish(
                                 It.IsAny <UpdateNotification <object> >(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
        }
        public async Task Read_Bad_Request_Id()
        {
            // Arrange
            var keyValues = new object[] { Guid.NewGuid() };

            _mediator.Setup(x => x.Send(
                                It.Is <ReadRequest <object, object> >(y => y.KeyValues[0] == keyValues[0]),
                                It.IsAny <CancellationToken>()))
            .ThrowsAsync(new Exception());
            var controller = new FakeClassController(_mediator.Object, Mock.Of <IMemoryCache>(), Mock.Of <IOptions <CacheOptions> >());

            // Act
            var read = await controller.Read(keyValues);

            // Assert
            var result = Assert.IsType <BadRequestObjectResult>(read);

            _mediator.Verify(x => x.Publish(
                                 It.IsAny <ReadNotification <object> >(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
            Assert.Equal(keyValues, result.Value);
        }
        public async Task Create_Bad_Request_Object()
        {
            // Arrange
            var model = new { Name = "Name" };

            _mediator.Setup(x => x.Send(
                                It.Is <CreateRequest <object, object> >(y => y.Model == model),
                                It.IsAny <CancellationToken>()))
            .ThrowsAsync(new Exception());
            var controller = new FakeClassController(_mediator.Object, Mock.Of <IMemoryCache>(), Mock.Of <IOptions <CacheOptions> >());

            // Act
            var create = await controller.Create(model);

            // Assert
            var result = Assert.IsType <BadRequestObjectResult>(create);

            _mediator.Verify(x => x.Publish(
                                 It.IsAny <CreateNotification <object> >(),
                                 It.IsAny <CancellationToken>()), Times.Exactly(2));
            Assert.Equal(model, result.Value);
        }