Ejemplo n.º 1
0
        static void Main(string[] args)
        {
            SpendService spendService = new SpendService(
                new SupplierService(),
                new InvoiceRepository(),
                new ExternalInvoiceProcessor(new ExternalInvoiceServiceFacade(), new FailoverInvoiceService()));

            var spendSummary  = spendService.GetTotalSpend(1);
            var spendSummary2 = spendService.GetTotalSpend(2);

            Console.ReadLine();
        }
Ejemplo n.º 2
0
        public void SpendService_ExternalCustomer_Spend_ReturnToNormalAfter1Minute_Test()
        {
            // Arrange
            Mock <ICircuitBreaker> mockedInstance = new Mock <ICircuitBreaker>();

            mockedInstance.Setup(mc => mc.ClosedTimeSeconds).Returns(5); // Adjust Timeout to 5 Seconds
            mockedInstance.Setup(mc => mc.GetSpendDetail(2)).Returns(    // Set Data
                new List <SpendDetail>(
                    new SpendDetail[] {
                new SpendDetail()
                {
                    TotalSpend = 1001, Year = 2018
                },
                new SpendDetail()
                {
                    TotalSpend = 1001, Year = 2017
                }
            }
                    ));

            UnityContainer container = new UnityContainer();

            container.RegisterType <ISupplierDataService, SupplierDataServiceStub>();
            container.RegisterType <ISupplierService, SupplierService>();
            container.RegisterType <IInvoiceRepository, InvoiceRepositoryStub>();
            container.RegisterType <IExternalSpendService, ExternalInvoiceServiceStub>();
            container.RegisterType <ICircuitBreaker, ExternalSpendServiceInvoker>();
            container.RegisterType <IFailoverInvoiceService, FailoverInvoiceServiceStub>();

            SpendService spendService   = container.Resolve <ExternalSpendService>();
            SpendSummary resultFailover = spendService.GetTotalSpend(3);

            Thread.Sleep(1000 * 5 + 1); // Wait 6 Seconds

            // Act
            container.RegisterInstance <ICircuitBreaker>(mockedInstance.Object);
            spendService = container.Resolve <ExternalSpendService>();
            SpendSummary resultNormal = spendService.GetTotalSpend(2);

            // Assert
            Assert.IsNotNull(resultFailover);
            Assert.AreEqual("Supplier External (Failover)", resultFailover.Name);
            Assert.AreEqual(1, resultFailover.Years.Count);
            Assert.AreEqual(900, resultFailover.Years[0].TotalSpend);

            Assert.IsNotNull(resultNormal);
            Assert.AreEqual("Supplier External", resultNormal.Name);
            Assert.AreEqual(2, resultNormal.Years.Count);
            Assert.AreEqual(1001, resultNormal.Years[0].TotalSpend);
            Assert.AreEqual(1001, resultNormal.Years[1].TotalSpend);
        }
Ejemplo n.º 3
0
        public void Calculate_TotalSpend_GroupedByYears_ForInternalSupplier()
        {
            Mock <ISupplierService>              supplierServiceMock   = new Mock <ISupplierService>();
            Mock <IInvoiceRepository>            invoiceRepositoryMock = new Mock <IInvoiceRepository>();
            Mock <IExternalInvoiceProcessor>     externalInvoiceServiceProcessorMock = new Mock <IExternalInvoiceProcessor>();
            Mock <IExternalInvoiceServiceFacade> externalInvoiceSericeFacadeMock     = new Mock <IExternalInvoiceServiceFacade>();

            var sut = new SpendService(supplierServiceMock.Object, invoiceRepositoryMock.Object,
                                       externalInvoiceServiceProcessorMock.Object);

            supplierServiceMock.SetupAllProperties();
            supplierServiceMock.Setup(x => x.GetById(It.IsAny <int>()))
            .Returns(new SupplierBuilder().WithInternalSupplier().WithName("InternalSupplier").Build());
            invoiceRepositoryMock.Setup(x => x.Get()).Returns(new InvoiceBuilder().SampleInvoices().AsQueryable);


            var spendSummary = sut.GetTotalSpend(1);

            Assert.NotNull(spendSummary);
            Assert.Equal("InternalSupplier", spendSummary.Name);
            Assert.Equal(2, spendSummary.Years.Count);
            Assert.Equal(2010, spendSummary.Years[0].Year);
            Assert.Equal(200, spendSummary.Years[0].TotalSpend);
            Assert.Equal(2011, spendSummary.Years[1].Year);
            Assert.Equal(400, spendSummary.Years[1].TotalSpend);

            invoiceRepositoryMock.Verify(x => x.Get(), Times.Once);
            externalInvoiceServiceProcessorMock.Verify(x => x.Process(It.IsAny <int>()), Times.Never);
        }
Ejemplo n.º 4
0
        public void SpendService_ExternalCustomer_Spend_FailoverCase_IsInClosedTime_Test()
        {
            // Arrange
            int          supplierId   = 3;
            SpendService spendService = container.Resolve <ExternalSpendService>();

            // Act
            SpendSummary result = spendService.GetTotalSpend(supplierId);

            result = spendService.GetTotalSpend(supplierId);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Supplier External (Failover)", result.Name);
            Assert.AreEqual(1, result.Years.Count);
            Assert.AreEqual(900, result.Years[0].TotalSpend);
        }
Ejemplo n.º 5
0
        public void SpendService_ExternalCustomer_Spend_FailoverCase_ObsoleteDate_Test()
        {
            // Arrange
            int          supplierId   = 4;
            SpendService spendService = container.Resolve <ExternalSpendService>();

            // Act
            SpendSummary result = spendService.GetTotalSpend(supplierId);

            // Assert - See Exception
        }
Ejemplo n.º 6
0
        public void SpendService_ExternalCustomer_Name_Test()
        {
            // Arrange
            int          supplierId   = 2;
            SpendService spendService = container.Resolve <ExternalSpendService>();

            // Act
            SpendSummary result = spendService.GetTotalSpend(supplierId);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual("Supplier External", result.Name);
        }
Ejemplo n.º 7
0
        public void SpendService_ExternalCustomer_Spend_ActionCase_Test()
        {
            // Arrange
            int          supplierId   = 2;
            SpendService spendService = container.Resolve <ExternalSpendService>();

            // Act
            SpendSummary result = spendService.GetTotalSpend(supplierId);

            // Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(2, result.Years.Count);
            Assert.AreEqual(1000, result.Years[0].TotalSpend);
            Assert.AreEqual(1000, result.Years[1].TotalSpend);
        }
Ejemplo n.º 8
0
        public void Test_ExternalSupplierWithoutFailOver()
        {
            var loggerFactory = new LoggerFactory().AddConsole(LogLevel.Information);
            var supplier      = new Supplier(1, "External Supplier Without failover", true);
            var mockSupplier  = new Mock <ISupplierService>();

            mockSupplier.Setup(m => m.GetById(1)).Returns(supplier);
            mockSupplier.Verify();
            var mockRepository = new Mock <ISpendService>();
            var mockFailover   = new Mock <IFailoverInvoiceService>();

            var spendService = new SpendService(mockSupplier.Object,
                                                mockRepository.Object,
                                                mockFailover.Object,
                                                loggerFactory); // We can replace with other loggers etc

            var result = spendService.GetTotalSpend(1);

            result.Name.Should().Be("External Supplier Without failover");
        }
Ejemplo n.º 9
0
        public void InvokeExternalInvoiceService_For_ExternalSupplier()
        {
            Mock <ISupplierService>              supplierServiceMock   = new Mock <ISupplierService>();
            Mock <IInvoiceRepository>            invoiceRepositoryMock = new Mock <IInvoiceRepository>();
            Mock <IExternalInvoiceProcessor>     externalInvoiceServiceProcessorMock = new Mock <IExternalInvoiceProcessor>();
            Mock <IExternalInvoiceServiceFacade> externalInvoiceSericeFacadeMock     = new Mock <IExternalInvoiceServiceFacade>();

            var sut = new SpendService(supplierServiceMock.Object, invoiceRepositoryMock.Object,
                                       externalInvoiceServiceProcessorMock.Object);

            supplierServiceMock.SetupAllProperties();

            supplierServiceMock.Setup(x => x.GetById(It.IsAny <int>()))
            .Returns(new Supplier()
            {
                Id = 1, IsExternal = true, Name = "Internal Supplier"
            });
            sut.GetTotalSpend(1);

            invoiceRepositoryMock.Verify(x => x.Get(), Times.Never);
            externalInvoiceServiceProcessorMock.Verify(x => x.Process(It.IsAny <int>()), Times.Once);
        }
Ejemplo n.º 10
0
        public void Calculate_TotalSpend_GroupedByYears_ForExternalSupplier()
        {
            Mock <ISupplierService>              supplierServiceMock   = new Mock <ISupplierService>();
            Mock <IInvoiceRepository>            invoiceRepositoryMock = new Mock <IInvoiceRepository>();
            Mock <IExternalInvoiceProcessor>     externalInvoiceServiceProcessorMock = new Mock <IExternalInvoiceProcessor>();
            Mock <IExternalInvoiceServiceFacade> externalInvoiceSericeFacadeMock     = new Mock <IExternalInvoiceServiceFacade>();
            Mock <IFailoverInvoiceService>       failOverInvoiceServiceMock          = new Mock <IFailoverInvoiceService>();


            var sut = new SpendService(supplierServiceMock.Object, invoiceRepositoryMock.Object,
                                       new ExternalInvoiceProcessor(externalInvoiceSericeFacadeMock.Object, failOverInvoiceServiceMock.Object));


            supplierServiceMock.SetupAllProperties();
            supplierServiceMock.Setup(x => x.GetById(It.IsAny <int>()))
            .Returns(new SupplierBuilder().WithExternalSupplier().WithName("ExternalSupplier").Build());
            externalInvoiceSericeFacadeMock.Setup(x => x.GetInvoices(It.IsAny <string>())).Returns(new ExternalInvoiceBuilder().SampleExternalInvoices());


            var spendSummary = sut.GetTotalSpend(1);

            invoiceRepositoryMock.Verify(x => x.Get(), Times.Never);
            externalInvoiceSericeFacadeMock.Verify(x => x.GetInvoices(It.IsAny <string>()), Times.AtLeastOnce);
        }