public void Delete_Handles_Item_Not_Found()
        {
            // Arrange
            var mockLogger = new Mock<ILog>();
            var mockMessageCache = new Mock<IInventoryTakeMessageCache>();
            var mockMessageQueue = new Mock<IMessageQueueService>();
            var mockNotificationService = new Mock<INotificationService>();
            var mockRepository = new Mock<IInventoryRepository>();
            var settings = new ApplicationSettings(false);

            var item = new InventoryItem
            {
                Label = "test",
                Expires = DateTime.Now.AddDays(30)
            };

            InventoryItem output = null;

            mockRepository.Setup(r => r.Remove(item)).Returns(output);

            var controller = GetAccountControllerWithContext(mockLogger, mockMessageCache,
                mockMessageQueue, mockNotificationService, mockRepository, settings);

            // Act
            HttpResponseMessage response = null;

            Assert.DoesNotThrow(() => response = controller.Delete(item));

            // Assert
            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.NotFound, response.StatusCode);

            mockMessageQueue.Verify(n => n.QueueInventoryItem(item), Times.Never);
        }
        public void Delete_Handles_DataSource_Failure_Gracefully()
        {
            // Arrange
            var mockLogger = new Mock<ILog>();
            var mockMessageCache = new Mock<IInventoryTakeMessageCache>();
            var mockMessageQueue = new Mock<IMessageQueueService>();
            var mockNotificationService = new Mock<INotificationService>();
            var mockRepository = new Mock<IInventoryRepository>();
            var settings = new ApplicationSettings(false);

            var item = new InventoryItem
            {
                Label = "test",
                Expires = DateTime.Now.AddDays(30)
            };

            mockRepository.Setup(r => r.Remove(item)).Throws(new InventoryFatalException(new Exception()));

            var controller = GetAccountControllerWithContext(mockLogger, mockMessageCache,
                mockMessageQueue, mockNotificationService, mockRepository, settings);

            // Act
            HttpResponseMessage response = null;

            Assert.DoesNotThrow(() => response = controller.Delete(item));

            // Assert
            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.ServiceUnavailable, response.StatusCode);

            mockMessageQueue.Verify(n => n.QueueInventoryItem(item), Times.Never);
            mockMessageQueue.Verify(n => n.FlushLocalCache(mockMessageCache.Object), Times.Never);

            mockNotificationService
                .Verify(n => n.SendEmail(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
        }
 public MessageQueueService(ApplicationSettings settings)
 {
     _settings = settings;
 }
        public void Post_Succeeds()
        {
            // Arrange
            var mockLogger = new Mock<ILog>();
            var mockMessageCache = new Mock<IInventoryTakeMessageCache>();
            var mockMessageQueue = new Mock<IMessageQueueService>();
            var mockNotificationService = new Mock<INotificationService>();
            var mockRepository = new Mock<IInventoryRepository>();
            var settings = new ApplicationSettings(false);

            var item = new InventoryItem
            {
                Label = "test",
                Expires = DateTime.Now.AddDays(30)
            };

            mockRepository.Setup(r => r.Create(item)).Returns(item);

            var controller = GetAccountControllerWithContext(mockLogger, mockMessageCache,
                mockMessageQueue, mockNotificationService, mockRepository, settings);

            // Act
            HttpResponseMessage response = null;

            Assert.DoesNotThrow(() => response = controller.Post(item));

            // Assert
            Assert.NotNull(response);
            Assert.AreEqual(HttpStatusCode.Created, response.StatusCode);
        }
        public InventoryItemsController GetAccountControllerWithContext(Mock<ILog> mockLogger,
			Mock<IInventoryTakeMessageCache> mockMessageCache, Mock<IMessageQueueService> mockQueueService,
			Mock<INotificationService> mockNotificationService, Mock<IInventoryRepository> mockRepository,
			ApplicationSettings settings)
        {
            // Set up Mocks
            var mockConfig = new Mock<HttpConfiguration>();
            var mockRequest = new HttpRequestMessage(HttpMethod.Post, "http://www.test.com");
            var mockRouteData = new Mock<IHttpRouteData>();
            //mockContext.SetupGet(c => c.Request).Returns(new HttpRequestWrapper(new HttpRequest("test", "http://www.test.com", null)));

            var mockUrlHelper = new Mock<UrlHelper>();

            var controller = new InventoryItemsController(mockRepository.Object, mockQueueService.Object,
                mockMessageCache.Object, mockNotificationService.Object, mockLogger.Object)
            {Settings = settings};

            controller.ControllerContext = new HttpControllerContext(mockConfig.Object, mockRouteData.Object, mockRequest);
            controller.Url = mockUrlHelper.Object;

            return controller;
        }