static void Main(string[] args)
        {
            var reportsExporter = new ReportsExporter();
            var importer        = new CSVImporter(File.ReadLines(FileName).Skip(1), new[] { reportsExporter });

            if (!importer.Import())
            {
                System.Console.WriteLine($"Struggling to import file(s) {FileName}");
                return;
            }

            var reports = reportsExporter.GetReportService();

            System.Console.WriteLine($"Top {NumberOfPopularItems} popular items.");

            foreach (var product in reports.TopMostPopularProducts(NumberOfPopularItems))
            {
                System.Console.WriteLine($"Item Code - {product.ItemCode} | Price - {product.Price:C} | Description - {product.Description}");
            }

            System.Console.WriteLine($"Average order value - {reports.AverageOrderValue()}");
            System.Console.WriteLine();
            System.Console.WriteLine($"Total value of discounts after {DiscountPercentage}% discount for item {DiscountedItem} - {reports.TotalValueOfDiscountsIssuedIfForProduct(DiscountedItem, DiscountPercentage)}");
            System.Console.WriteLine();
            System.Console.WriteLine($"Press any key to exit.");
            System.Console.ReadLine();
        }
        public void GivenANumberOfSalesTransactionsForMultipleOrdersWhenImportedThenAListOfOrdersAndProductsShouldBeCorrectlyBuilt()
        {
            var mockExporter     = new Mock <IExporter>();
            var exportedOrders   = new Order[] { };
            var exportedProducts = new Product[] { };

            mockExporter
            .Setup(exporter => exporter.Export(It.IsNotNull <Order[]>(), It.IsNotNull <Product[]>()))
            .Returns(true)
            .Callback <Order[], Product[]>((orders, products) =>
            {
                exportedOrders   = orders;
                exportedProducts = products;
            });

            var csvImporter = new CSVImporter(new[]
            {
                "2470,29/05/2016,GROBI4014501,Groovi Baby Plate A6 Large Bird & Branch,4.79,1",
                "2471,29/05/2016,COLLCEM12,Collall Photoglue,2.99,4"
            },
                                              new[] { mockExporter.Object });

            var wasImportSuccessful = csvImporter.Import();

            Assert.IsTrue(wasImportSuccessful);

            Assert.AreEqual(2, exportedOrders.Length);

            Assert.AreEqual("2470", exportedOrders[0].Id);
            Assert.AreEqual(1, exportedOrders[0].Transactions.Length);

            Assert.AreEqual(new DateTime(2016, 05, 29), exportedOrders[0].Transactions[0].Timestamp);
            Assert.AreEqual(1, exportedOrders[0].Transactions[0].Quantity);
            Assert.AreEqual("GROBI4014501", exportedOrders[0].Transactions[0].Product.ItemCode);
            Assert.AreEqual(4.79m, exportedOrders[0].Transactions[0].Product.Price);
            Assert.AreEqual("Groovi Baby Plate A6 Large Bird & Branch", exportedOrders[0].Transactions[0].Product.Description);

            Assert.AreEqual("2471", exportedOrders[1].Id);
            Assert.AreEqual(1, exportedOrders[1].Transactions.Length);

            Assert.AreEqual(new DateTime(2016, 05, 29), exportedOrders[1].Transactions[0].Timestamp);
            Assert.AreEqual(4, exportedOrders[1].Transactions[0].Quantity);
            Assert.AreEqual("COLLCEM12", exportedOrders[1].Transactions[0].Product.ItemCode);
            Assert.AreEqual(2.99m, exportedOrders[1].Transactions[0].Product.Price);
            Assert.AreEqual("Collall Photoglue", exportedOrders[1].Transactions[0].Product.Description);

            Assert.AreEqual(2, exportedProducts.Length);

            Assert.AreEqual("GROBI4014501", exportedProducts[0].ItemCode);
            Assert.AreEqual(4.79m, exportedProducts[0].Price);
            Assert.AreEqual("Groovi Baby Plate A6 Large Bird & Branch", exportedProducts[0].Description);

            Assert.AreEqual("COLLCEM12", exportedProducts[1].ItemCode);
            Assert.AreEqual(2.99m, exportedProducts[1].Price);
            Assert.AreEqual("Collall Photoglue", exportedProducts[1].Description);

            mockExporter.VerifyAll();
        }
示例#3
0
        private void Import(string content)
        {
            var stream       = new MemoryStream();
            var streamWriter = new StreamWriter(stream);

            streamWriter.Write(content);
            streamWriter.Flush();
            stream.Position = 0;
            var streamReader = new StreamReader(stream);

            importer.Import(importContext, streamReader);
        }
示例#4
0
        public void ImporterUI()
        {
            Console.Clear();
            Console.WriteLine("Please drag and drop the CSV file for import in this window.");
            string path = Console.ReadLine();

            CSVImporter imp = new CSVImporter();

            imp.Import(path);

            Console.Clear();
            MainUI("Import finished.");
        }
        public void GivenASalesTransactionWithMultilpeQuotesAndCommaInTheDescriptionWhenImportedThenAListOfOrdersAndProductsShouldBeCorrectlyBuilt()
        {
            var mockExporter     = new Mock <IExporter>();
            var exportedOrders   = new Order[] { };
            var exportedProducts = new Product[] { };

            mockExporter
            .Setup(exporter => exporter.Export(It.IsNotNull <Order[]>(), It.IsNotNull <Product[]>()))
            .Returns(true)
            .Callback <Order[], Product[]>((orders, products) =>
            {
                exportedOrders   = orders;
                exportedProducts = products;
            });

            var csvImporter = new CSVImporter(new[]
            {
                "3466,20/11/2016,GROAC40345,\"Groovi, Guard 7\"\" x 7\"\"\",3.79,1"
            },
                                              new[] { mockExporter.Object });

            var wasImportSuccessful = csvImporter.Import();

            var order        = exportedOrders.Single();
            var transactions = order.Transactions;

            Assert.IsTrue(wasImportSuccessful);

            Assert.AreEqual("3466", order.Id);
            Assert.AreEqual(1, order.Transactions.Length);

            Assert.AreEqual(new DateTime(2016, 11, 20), transactions[0].Timestamp);
            Assert.AreEqual(1, transactions[0].Quantity);
            Assert.AreEqual("GROAC40345", transactions[0].Product.ItemCode);
            Assert.AreEqual(3.79m, transactions[0].Product.Price);
            Assert.AreEqual("\"Groovi, Guard 7\"\" x 7\"\"\"", transactions[0].Product.Description);

            Assert.AreEqual(1, exportedProducts.Length);

            Assert.AreEqual("GROAC40345", exportedProducts[0].ItemCode);
            Assert.AreEqual(3.79m, exportedProducts[0].Price);
            Assert.AreEqual("\"Groovi, Guard 7\"\" x 7\"\"\"", exportedProducts[0].Description);

            mockExporter.VerifyAll();
        }
        public void GivenASalesTransactionWithACommaInTheDescriptionWhenImportedThenAListOfOrdersAndProductsShouldBeCorrectlyBuilt()
        {
            var mockExporter     = new Mock <IExporter>();
            var exportedOrders   = new Order[] { };
            var exportedProducts = new Product[] { };

            mockExporter
            .Setup(exporter => exporter.Export(It.IsNotNull <Order[]>(), It.IsNotNull <Product[]>()))
            .Returns(true)
            .Callback <Order[], Product[]>((orders, products) =>
            {
                exportedOrders   = orders;
                exportedProducts = products;
            });

            var csvImporter = new CSVImporter(new[]
            {
                "2508,05/06/2016,GROWO4008609,\"Groovi Border Plate Set Calendar, Relatives & Occasions\",15.99,1"
            },
                                              new[] { mockExporter.Object });

            var wasImportSuccessful = csvImporter.Import();

            var order        = exportedOrders.Single();
            var transactions = order.Transactions;

            Assert.IsTrue(wasImportSuccessful);

            Assert.AreEqual("2508", order.Id);
            Assert.AreEqual(1, order.Transactions.Length);

            Assert.AreEqual(new DateTime(2016, 06, 05), transactions[0].Timestamp);
            Assert.AreEqual(1, transactions[0].Quantity);
            Assert.AreEqual("GROWO4008609", transactions[0].Product.ItemCode);
            Assert.AreEqual(15.99m, transactions[0].Product.Price);
            Assert.AreEqual("\"Groovi Border Plate Set Calendar, Relatives & Occasions\"", transactions[0].Product.Description);

            Assert.AreEqual(1, exportedProducts.Length);

            Assert.AreEqual("GROWO4008609", exportedProducts[0].ItemCode);
            Assert.AreEqual(15.99m, exportedProducts[0].Price);
            Assert.AreEqual("\"Groovi Border Plate Set Calendar, Relatives & Occasions\"", exportedProducts[0].Description);

            mockExporter.VerifyAll();
        }
示例#7
0
        public void ShouldImport_FromValidCSVFile()
        {
            string   fileLocation = "c:/somerandomfile.csv";
            FileInfo fileInfo     = new FileInfo(fileLocation);

            var mockFileAccess = new Mock <IFileAccess>();

            mockFileAccess.Setup(x => x.Exists(fileInfo)).Returns(true);
            mockFileAccess.Setup(x => x.ReadAllText(fileInfo)).Returns(csvData);
            var fileAccess = mockFileAccess.Object;

            CSVImporter importer = new CSVImporter(fileInfo, fileAccess);
            var         result   = importer.Import();

            Assert.AreEqual <string>(csvData, result);
            mockFileAccess.Verify(fa => fa.Exists(fileInfo), Times.AtLeastOnce());
            mockFileAccess.Verify(fa => fa.ReadAllText(fileInfo), Times.Once());
        }
        public void GivenACSVFeedWhenImportedThenTheCorrectReportsShouldBeGenerated()
        {
            var filePath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, FileName);

            var reportsExporter = new ReportsExporter();
            var importer        = new CSVImporter(File.ReadLines(filePath).Skip(1), new[] { reportsExporter });

            if (!importer.Import())
            {
                Assert.Fail("Failed to import and hence test failed.");
            }

            var reports = reportsExporter.GetReportService();

            var popularItems          = reports.TopMostPopularProducts(5);
            var averageOrderValue     = reports.AverageOrderValue();
            var totalValueOfDiscounts = reports.TotalValueOfDiscountsIssuedIfForProduct("MS55101", 20);

            Assert.AreEqual(19.09m, averageOrderValue);
            Assert.AreEqual(16126.35, totalValueOfDiscounts);

            Assert.AreEqual(5, popularItems.Length);

            Assert.AreEqual("PTYARN2", popularItems[0].ItemCode);
            Assert.AreEqual(0.15m, popularItems[0].Price);
            Assert.AreEqual("Textile Yarn - Recycled Flat Beige", popularItems[0].Description);

            Assert.AreEqual("GROAC40345", popularItems[1].ItemCode);
            Assert.AreEqual(3.79m, popularItems[1].Price);
            Assert.AreEqual("\"Groovi Guard 7\"\" x 7\"\"\"", popularItems[1].Description);

            Assert.AreEqual("GROAC40025", popularItems[2].ItemCode);
            Assert.AreEqual(4.29m, popularItems[2].Price);
            Assert.AreEqual("\"Clarity Groovi Parchment Paper 7\"\" x 7\"\"\"", popularItems[2].Description);

            Assert.AreEqual("GROTE40436", popularItems[3].ItemCode);
            Assert.AreEqual(14.99m, popularItems[3].Price);
            Assert.AreEqual("Groovi A4 Box Template - Christmas Cracker", popularItems[3].Description);

            Assert.AreEqual("GROFL40397", popularItems[4].ItemCode);
            Assert.AreEqual(13.99m, popularItems[4].Price);
            Assert.AreEqual("Alphabet Picture Frame A4 Groovi Plate by Jayne Nestorenko", popularItems[4].Description);
        }
        public void GivenACustomCSVFeedWhenImportedThenTheCorrectReportsShouldBeGenerated()
        {
            var datalines = new[]
            {
                "2469,29/05/2016,MS55999,Zig Memory System Wink of Stella Brush Glitter Marker Clear,4.99,1",
                "2469,29/05/2016,MS55000,Zig Memory System Wink of Stella Brush Glitter Marker White,4.99,1",
                "2469,29/05/2016,MS55102,Zig Memory System Wink of Stella Brush Glitter Marker Silver,4.99,1",
                "2469,29/05/2016,MS55101,Zig Memory System Wink of Stella Brush Glitter Marker Gold,4.99,100",
                "2470,29/05/2016,GROWO401311,Numbers Inset & Ovals & Tags Groovi Baby Plate,7.49,1",
                "2470,29/05/2016,GROBI4014501,Groovi Baby Plate A6 Large Bird & Branch,4.79,1",
                "2471,29/05/2016,COLLCEM12,Collall Photoglue,2.99,4",
                "2472,29/05/2016,GROPA40014,Groovi Plate Set Border Plates 1 & 2 ,14.99,1",
                "2472,29/05/2016,GROCH40015,Groovi Plate Border Set Bunting Wave-Alphabet & Christmas,14.99,1",
                "2473,29/05/2016,ACETHR001,Clear Heat Resistant Acetate,2.79,1",
                "2473,29/05/2016,SH131WH,3 Feather Spray - White,0.19,3",
                "2474,29/05/2016,GROAC40091,Clarity Groovi Tool Bag,1.99,1",
                "2474,29/05/2016,GROWO4027603,Happy Birthday  Groovi Plate A5 Square,7.49,1",
                "2477,30/05/2016,GROCN4028801,Groovi Baby Plate A6 Rocking Horse,4.79,1",
                "2477,30/05/2016,GROPE4028003,Geisha Groovi Plate A5 Square,7.49,1",
                "2477,30/05/2016,GROWO4027403,Best Wishes Groovi Plate A5 Square,7.49,50",
                "2478,30/05/2016,GROFL4021701,Groovi Baby Plate A6 Vases,4.79,1",
                "2478,30/05/2016,GROAC40025,\"Clarity Groovi Parchment Paper 7\"\" x 7\"\"\",4.29,1",
                "2478,30/05/2016,GROWO4010709,Groovi Plate Border Set Line Sentiments ,22.49,1",
                "2479,30/05/2016,GROLA4000703,Groovi Plate A5 Square Mountain Hills ,7.49,1",
                "2479,30/05/2016,GROPA4015609,Groovi Border Plate Half Tone,7.49,1",
                "2479,30/05/2016,GROBI4027701,Groovi Baby Plate A6 Small Bird & Feeder,4.79,1",
                "2480,30/05/2016,CR56329,MDF Wooden Letter T (13cm),1.79,1",
                "2480,30/05/2016,CR56314,MDF Wooden Letter E (13cm),1.79,1",
                "2480,30/05/2016,CR56318,MDF Wooden Letter I (13cm),1.79,1",
                "2480,30/05/2016,CR56321,MDF Wooden Letter L (13cm),1.79,2",
                "2480,30/05/2016,CR56324,MDF Wooden Letter O (13cm),1.79,1",
                "2481,30/05/2016,CEMDFCRACK,MDF Large Christmas Crackers by Creative Expressions,3.49,25",
                "2481,30/05/2016,CEMDFEGG,MDF Egg Stand by Creative Expressions,6.49,1",
                "2482,30/05/2016,SPECNSPACLE3,Spectrum Noir Sparkle Pens Clear Overlay,9.99,1",
                "2483,30/05/2016,AFRFLR001,Craft Consortium Always and Forever The Wedding Collection Resin Flowers - Ivory,2.79,1",
                "2483,30/05/2016,JL126,Brads-Baby Buttons,1.89,1",
                "2483,30/05/2016,CRRHINEROSEGO,Rose Gold Effect Resin Buttons (16mm),1.49,1",
                "2484,31/05/2016,GROFL40088,Groovi Plate Set Blooming Poppies,14.99,1",
                "2484,31/05/2016,GROMA40002,Groovi Plate Alphabet Mate,11.49,5",
                "2485,31/05/2016,SPECNSPACLE3,Spectrum Noir Sparkle Pens Clear Overlay,9.99,10",
                "2486,31/05/2016,GROFL40014,Groovi Plates Set Blooming Peonies/Sprig Pattern,14.99,1",
                "2486,31/05/2016,GROOB4031403,Oriental Fan & Bamboo Groovi Plate A5 Square,14.99,1",
                "2487,31/05/2016,CBC077,MDF Castle Keep Money Box,5.99,2",
                "2487,31/05/2016,BBBIH,Brusho Basics Book by Isobel Hall,5.99,1",
                "2488,01/06/2016,GROAC40091,Clarity Groovi Tool Bag,1.99,1",
                "2488,01/06/2016,GROOVIALBUM,Groovi Album,10.99,1",
                "2490,01/06/2016,GROPA4004609,Groovi Border Plates Set Lace Set 1 & 2,14.99,1",
                "2490,01/06/2016,GROPA4012609,Groovi Border Plates Set Lace Corners,7.49,1",
                "2490,01/06/2016,GROGG4020212,Groovi Piercing Grid Plate - Straight,11.49,1",
                "2490,01/06/2016,GROGG4020112,Groovi Piercing Grid Plate - Diagonal,11.49,1",
                "2490,01/06/2016,GROAC40203,Groovi Piercing Tools 0.95mm,4.79,1",
                "2490,01/06/2016,GROBI4004303,Groovi Plate Set Three Doves & Sprig ,14.99,1",
                "2491,02/06/2016,CEMDFTAG,MDF Tags by Creative Expressions,3.79,2",
                "2493,02/06/2016,GROFL40081,Groovi Plate Set Frilly Circles ,14.99,1"
            };

            var reportsExporter = new ReportsExporter();
            var importer        = new CSVImporter(datalines, new[] { reportsExporter });

            if (!importer.Import())
            {
                Assert.Fail("Failed to import and hence test failed.");
            }

            var reports = reportsExporter.GetReportService();

            var popularItems          = reports.TopMostPopularProducts(5);
            var averageOrderValue     = reports.AverageOrderValue();
            var totalValueOfDiscounts = reports.TotalValueOfDiscountsIssuedIfForProduct("MS55101", 20);

            Assert.AreEqual(69.57m, averageOrderValue);
            Assert.AreEqual(1361.07m, totalValueOfDiscounts);

            Assert.AreEqual(5, popularItems.Length);

            Assert.AreEqual("MS55101", popularItems[0].ItemCode);
            Assert.AreEqual(4.99m, popularItems[0].Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Gold", popularItems[0].Description);

            Assert.AreEqual("GROWO4027403", popularItems[1].ItemCode);
            Assert.AreEqual(7.49m, popularItems[1].Price);
            Assert.AreEqual("Best Wishes Groovi Plate A5 Square", popularItems[1].Description);

            Assert.AreEqual("CEMDFCRACK", popularItems[2].ItemCode);
            Assert.AreEqual(3.49m, popularItems[2].Price);
            Assert.AreEqual("MDF Large Christmas Crackers by Creative Expressions", popularItems[2].Description);

            Assert.AreEqual("SPECNSPACLE3", popularItems[3].ItemCode);
            Assert.AreEqual(9.99m, popularItems[3].Price);
            Assert.AreEqual("Spectrum Noir Sparkle Pens Clear Overlay", popularItems[3].Description);

            Assert.AreEqual("GROMA40002", popularItems[4].ItemCode);
            Assert.AreEqual(11.49m, popularItems[4].Price);
            Assert.AreEqual("Groovi Plate Alphabet Mate", popularItems[4].Description);
        }
        public void GivenANumberOfSalesTransactionsWithMissingItemCodesForTheSameProductForASingleOrderWhenImportedThenAListOfOrdersAndProductsShouldBeCorrectlyBuilt()
        {
            var mockExporter     = new Mock <IExporter>();
            var exportedOrders   = new Order[] { };
            var exportedProducts = new Product[] { };

            mockExporter
            .Setup(exporter => exporter.Export(It.IsNotNull <Order[]>(), It.IsNotNull <Product[]>()))
            .Returns(true)
            .Callback <Order[], Product[]>((orders, products) =>
            {
                exportedOrders   = orders;
                exportedProducts = products;
            });

            var csvImporter = new CSVImporter(new[]
            {
                "2506,05/06/2016,,Memento Dew Drop Dye Ink Pads,1.49,1",
                "2506,05/06/2016,,Memento Dew Drop Dye Ink Pads,1.49,1",
                "2506,05/06/2016,,Brilliance Dew Drop Pigment Pads,1.59,1",
                "2506,05/06/2016,,Brilliance Dew Drop Pigment Pads,1.59,1"
            },
                                              new[] { mockExporter.Object });

            var wasImportSuccessful = csvImporter.Import();

            var order        = exportedOrders.Single();
            var transactions = order.Transactions;

            Assert.IsTrue(wasImportSuccessful);

            Assert.AreEqual("2506", order.Id);
            Assert.AreEqual(4, order.Transactions.Length);

            Assert.AreEqual(new DateTime(2016, 06, 05), transactions[0].Timestamp);
            Assert.AreEqual(1, transactions[0].Quantity);
            Assert.AreEqual(string.Empty, transactions[0].Product.ItemCode);
            Assert.AreEqual(1.49m, transactions[0].Product.Price);
            Assert.AreEqual("Memento Dew Drop Dye Ink Pads", transactions[0].Product.Description);

            Assert.AreEqual(new DateTime(2016, 06, 05), transactions[1].Timestamp);
            Assert.AreEqual(1, transactions[1].Quantity);
            Assert.AreEqual(string.Empty, transactions[1].Product.ItemCode);
            Assert.AreEqual(1.49m, transactions[1].Product.Price);
            Assert.AreEqual("Memento Dew Drop Dye Ink Pads", transactions[1].Product.Description);

            Assert.AreEqual(new DateTime(2016, 06, 05), transactions[2].Timestamp);
            Assert.AreEqual(1, transactions[2].Quantity);
            Assert.AreEqual(string.Empty, transactions[2].Product.ItemCode);
            Assert.AreEqual(1.59m, transactions[2].Product.Price);
            Assert.AreEqual("Brilliance Dew Drop Pigment Pads", transactions[2].Product.Description);

            Assert.AreEqual(new DateTime(2016, 06, 05), transactions[3].Timestamp);
            Assert.AreEqual(1, transactions[3].Quantity);
            Assert.AreEqual(string.Empty, transactions[3].Product.ItemCode);
            Assert.AreEqual(1.59m, transactions[3].Product.Price);
            Assert.AreEqual("Brilliance Dew Drop Pigment Pads", transactions[3].Product.Description);

            Assert.AreEqual(2, exportedProducts.Length);

            Assert.AreEqual(string.Empty, exportedProducts[0].ItemCode);
            Assert.AreEqual(1.49m, exportedProducts[0].Price);
            Assert.AreEqual("Memento Dew Drop Dye Ink Pads", exportedProducts[0].Description);

            Assert.AreEqual(string.Empty, exportedProducts[1].ItemCode);
            Assert.AreEqual(1.59m, exportedProducts[1].Price);
            Assert.AreEqual("Brilliance Dew Drop Pigment Pads", exportedProducts[1].Description);

            mockExporter.VerifyAll();
        }
        public void GivenANumberOfSalesTransactionsForASingleOrderWhenImportedThenAListOfOrdersAndProductsShouldBeCorrectlyBuilt()
        {
            var mockExporter     = new Mock <IExporter>();
            var exportedOrders   = new Order[] { };
            var exportedProducts = new Product[] { };

            mockExporter
            .Setup(exporter => exporter.Export(It.IsNotNull <Order[]>(), It.IsNotNull <Product[]>()))
            .Returns(true)
            .Callback <Order[], Product[]>((orders, products) =>
            {
                exportedOrders   = orders;
                exportedProducts = products;
            });

            var csvImporter = new CSVImporter(new[]
            {
                "2469,29/05/2016,MS55999,Zig Memory System Wink of Stella Brush Glitter Marker Clear,4.99,1",
                "2469,29/05/2016,MS55000,Zig Memory System Wink of Stella Brush Glitter Marker White,4.99,1",
                "2469,29/05/2016,MS55102,Zig Memory System Wink of Stella Brush Glitter Marker Silver,4.99,1",
                "2469,29/05/2016,MS55101,Zig Memory System Wink of Stella Brush Glitter Marker Gold,4.99,1"
            },
                                              new[] { mockExporter.Object });

            var wasImportSuccessful = csvImporter.Import();

            var order        = exportedOrders.Single();
            var transactions = order.Transactions;

            Assert.IsTrue(wasImportSuccessful);

            Assert.AreEqual("2469", order.Id);
            Assert.AreEqual(4, order.Transactions.Length);

            Assert.AreEqual(new DateTime(2016, 05, 29), transactions[0].Timestamp);
            Assert.AreEqual(1, transactions[0].Quantity);
            Assert.AreEqual("MS55999", transactions[0].Product.ItemCode);
            Assert.AreEqual(4.99m, transactions[0].Product.Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Clear", transactions[0].Product.Description);

            Assert.AreEqual(new DateTime(2016, 05, 29), transactions[1].Timestamp);
            Assert.AreEqual(1, transactions[1].Quantity);
            Assert.AreEqual("MS55000", transactions[1].Product.ItemCode);
            Assert.AreEqual(4.99m, transactions[1].Product.Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker White", transactions[1].Product.Description);

            Assert.AreEqual(new DateTime(2016, 05, 29), transactions[2].Timestamp);
            Assert.AreEqual(1, transactions[2].Quantity);
            Assert.AreEqual("MS55102", transactions[2].Product.ItemCode);
            Assert.AreEqual(4.99m, transactions[2].Product.Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Silver", transactions[2].Product.Description);

            Assert.AreEqual(new DateTime(2016, 05, 29), transactions[3].Timestamp);
            Assert.AreEqual(1, transactions[3].Quantity);
            Assert.AreEqual("MS55101", transactions[3].Product.ItemCode);
            Assert.AreEqual(4.99m, transactions[3].Product.Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Gold", transactions[3].Product.Description);

            Assert.AreEqual(4, exportedProducts.Length);

            Assert.AreEqual("MS55999", exportedProducts[0].ItemCode);
            Assert.AreEqual(4.99m, exportedProducts[0].Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Clear", exportedProducts[0].Description);

            Assert.AreEqual("MS55000", exportedProducts[1].ItemCode);
            Assert.AreEqual(4.99m, exportedProducts[1].Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker White", exportedProducts[1].Description);

            Assert.AreEqual("MS55102", exportedProducts[2].ItemCode);
            Assert.AreEqual(4.99m, exportedProducts[2].Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Silver", exportedProducts[2].Description);

            Assert.AreEqual("MS55101", exportedProducts[3].ItemCode);
            Assert.AreEqual(4.99m, exportedProducts[3].Price);
            Assert.AreEqual("Zig Memory System Wink of Stella Brush Glitter Marker Gold", exportedProducts[3].Description);

            mockExporter.VerifyAll();
        }