public async Task Able_to_generate_invoice() { var product = ProductMockBuilder.Build(); var productRepo = Substitute.For <IProductRepository>(); productRepo.Get(Arg.Any <Guid>()).Returns(product); var supplier = SupplierMockBuilder.Build(); var supplierRepo = Substitute.For <ISupplierRepository>(); supplierRepo.Get(Arg.Any <Guid>()).Returns(supplier); var customer = CustomerMockBuilder.Build(); var customerRepo = Substitute.For <ICustomerRepository>(); customerRepo.Get(Arg.Any <Guid>()).Returns(customer); var sut = new InvoiceGenerator(productRepo, supplierRepo, customerRepo); var actual = await sut.Generate(OrderMockBuilder.Build()); actual.Customer.Should().Be(customer); actual.Supplier.Should().Be(supplier); actual.Product.Should().Be(product); actual.Amount.Should().Be(new InvoiceAmount(30, 0.19)); }
public async Task InvoiceContainsTotalBonus( [Frozen] Mock <IStockRepository> stockRepositoryMock, [Frozen] Mock <IOrderItemPriceCalculator> orderItemPriceCalculatorMock, [Frozen] Mock <IOrderItemBonusCalculator> orderItemBonusCalculatorMock, InvoiceGenerator sut, Order order, List <OrderItem> orderItems) { orderItems.ForEach(order.AddItem); stockRepositoryMock.Setup(m => m.GetById(It.IsAny <int>())) .Returns <int>(id => Task.FromResult(new StockItem())); // mock price = 0 orderItemPriceCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>())) .ReturnsAsync(0); // mock bonus = {StockItemId} x {DurationDays} orderItemBonusCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>())) .Returns <OrderItem>(i => Task.FromResult((int?)(i.StockItemId * i.DurationDays))); var invoice = await sut.Generate(order); var expectedTotalBonus = orderItems.Sum(i => i.StockItemId * i.DurationDays); Assert.Contains($"\nBONUS\t\t{expectedTotalBonus}pt.", invoice); }
public async Task InvoiceContainsItems( [Frozen] Mock <IStockRepository> stockRepositoryMock, [Frozen] Mock <IOrderItemPriceCalculator> orderItemPriceCalculatorMock, [Frozen] Mock <IOrderItemBonusCalculator> orderItemBonusCalculatorMock, InvoiceGenerator sut, Order order, List <OrderItem> orderItems) { orderItems.ForEach(order.AddItem); // mock name = "stock-item-{Id}" stockRepositoryMock.Setup(m => m.GetById(It.IsAny <int>())) .Returns <int>(id => Task.FromResult(new StockItem { Name = $"stock-item-{id}" })); // mock price = {StockItemId} x {DurationDays} orderItemPriceCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>())) .Returns <OrderItem>(i => Task.FromResult((decimal?)(i.StockItemId * i.DurationDays))); // mock bonus = 0 orderItemBonusCalculatorMock.Setup(m => m.Calculate(It.IsAny <OrderItem>())) .ReturnsAsync(0); var invoice = await sut.Generate(order); orderItems.ForEach(i => Assert.Contains($"\nstock-item-{i.StockItemId}\t\t{i.StockItemId * i.DurationDays}€\n", invoice)); }
public void ShouldGenerateInvoiceDiscounting6Percent() { var action = new Mock <IActionAfterGenerateInvoice>(); var actions = new List <IActionAfterGenerateInvoice>(); invoiceGenerator = new InvoiceGenerator(actions); order = new Order("Gus Herzog", 1000, 1); invoice = invoiceGenerator.Generate(order); Assert.AreEqual(1000 * 0.94, invoice.Value); }
protected void OnGenerateFilesClick(object sender, EventArgs e) { m_folderBrowserDialog.SelectedPath = Configuration.Instance.MiscellaneousConfiguration.DefaultSaveFolder; m_folderBrowserDialog.Description = "Save Generated Files To..."; if (m_folderBrowserDialog.ShowDialog() == DialogResult.OK) { MonthlyTimesheets monthlyTimesheets = m_monthlyTimesheets; string outputFolder = m_folderBrowserDialog.SelectedPath; FileGenerateConfirmationDialog fileGenerateConfirmationDialog = new FileGenerateConfirmationDialog(monthlyTimesheets, outputFolder); if (fileGenerateConfirmationDialog.ShowDialog(this) == DialogResult.Cancel) { return; } else { InvoiceNumberComfirmationDialog invoiceNumberComfirmationDialog = new InvoiceNumberComfirmationDialog(monthlyTimesheets, false /* Handle the save below*/); if (invoiceNumberComfirmationDialog.ShowDialog(this) == DialogResult.Cancel) { return; } this.Enabled = false; // Save whatever changes were made first. MonthlyTimesheetSaveProcessing(); // Generate any unsent Timesheets... foreach (Timesheet timesheet in monthlyTimesheets.UnSentTimesheets) { TimesheetGenerator timesheetGenerator = new TimesheetGenerator(timesheet, outputFolder); if (timesheetGenerator.Generate(false)) { } timesheetGenerator.Save(); } // Generate our invoice... InvoiceGenerator invoiceGenerator = new InvoiceGenerator(monthlyTimesheets, outputFolder); if (invoiceGenerator.Generate(false)) { } invoiceGenerator.Save(); TimesheetGenerator.QuitExcel(); this.Enabled = true; } } }
public void ShouldExecuteActionsAfterGenerateInvoice() { var action1 = new Mock <IActionAfterGenerateInvoice>(); var action2 = new Mock <IActionAfterGenerateInvoice>(); var action3 = new Mock <IActionAfterGenerateInvoice>(); var actions = new List <IActionAfterGenerateInvoice> { action1.Object, action2.Object, action3.Object }; invoiceGenerator = new InvoiceGenerator(actions); order = new Order("Gus Herzog", 1000, 1); invoice = invoiceGenerator.Generate(order); action1.Verify(x => x.Execute(invoice), Times.Once); action2.Verify(x => x.Execute(invoice), Times.Once); action3.Verify(x => x.Execute(invoice), Times.Once); }
public static void Run( [QueueTrigger("invoice-generation-request")] InvoiceGenerationRequest request, [Table("billingItems")] CloudTable billingItems, [CosmosDB("crm", "invoices", ConnectionStringSetting = "cosmosDb")] out dynamic generatedInvoice, [Queue("invoice-print-request")] out InvoicePrintRequest printRequest, [Queue("invoice-notification-request")] out InvoiceNotificationRequest notificationRequest, ILogger log) { log.LogInformation($"[GenerateInvoiceFunc] Queue trigger. Function processed: {request.CustomerCode} {request.Year} {request.Month}"); var generator = new InvoiceGenerator(); var items = GetBillingItemsFromTable(billingItems, request); var invoice = generator.Generate(request, items); generatedInvoice = invoice; printRequest = new InvoicePrintRequest { InvoiceToPrint = invoice }; notificationRequest = new InvoiceNotificationRequest { InvoiceForNotification = invoice }; }