public void WriteFullInvoiceTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.WriteLines(It.IsAny <string>(), It.IsAny <List <string> >()));

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            var invoiceInput = Invoice.Create(
                new List <InvoiceItem>
            {
                InvoiceItem.Create("item1", 10m),
                InvoiceItem.Create("item2", 10.25m),
                InvoiceItem.Create("item3", 10.25m)
            },
                30.50m);

            // Act
            jobsFileRepository.WriteInvoiceToFile("fakeFilePath", invoiceInput);

            // Assert
            _fileRepositoryMock.Verify(
                mock => mock.WriteLines(
                    "fakeFilePath",
                    new List <string> {
                "item1: $10.00", "item2: $10.25", "item3: $10.25", "total: $30.50"
            }));
        }
        public void PrintItemsExemptTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.ReadLines(It.IsAny <string>()))
            .Returns(
                new List <string>
            {
                $"print-item1 19.99 {exemptString}",
                "print-item2 29.99",
                $"print-item3 39.99 {exemptString}"
            });

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            // Act
            var job = jobsFileRepository.ReadJobFromFile("fakeFilePath");

            // Assert
            var expectedOuput = Job.Create(
                false,
                new List <PrintItem>
            {
                PrintItem.Create("print-item1", 19.99m, true),
                PrintItem.Create("print-item2", 29.99m, false),
                PrintItem.Create("print-item3", 39.99m, true)
            });

            Assert.That(job, Is.EqualTo(expectedOuput).Using(new JobEqualityComparer()));
        }
        public void EmptyFileTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.ReadLines(It.IsAny <string>()))
            .Returns(Enumerable.Empty <string>());

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            // Act and Assert
            Assert.That(
                () => jobsFileRepository.ReadJobFromFile("fakeFilePath"),
                Throws.TypeOf <InvalidOperationException>());
        }
        public void MissingPrintItemNameTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.ReadLines(It.IsAny <string>()))
            .Returns(new List <string> {
                "50.00"
            });

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            // Act and Assert
            Assert.That(
                () => jobsFileRepository.ReadJobFromFile("fakeFilePath"),
                Throws.TypeOf <InvalidOperationException>());
        }
        public void OnlyExtraMarginTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.ReadLines(It.IsAny <string>()))
            .Returns(new List <string> {
                extraMarginString
            });

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            // Act and Assert
            Assert.That(
                () => jobsFileRepository.ReadJobFromFile("fakeFilePath"),
                Throws.TypeOf <ArgumentException>().With.Property("ParamName").EqualTo("printItems"));
        }
        public void TooManyCostsTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.ReadLines(It.IsAny <string>()))
            .Returns(new List <string> {
                "print-item1 25.25 50.00 exempt"
            });

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            // Act and Assert
            Assert.That(
                () => jobsFileRepository.ReadJobFromFile("fakeFilePath"),
                Throws.TypeOf <InvalidOperationException>());
        }
        public void BasicJobTest()
        {
            // Arrange
            _fileRepositoryMock
            .Setup(mock => mock.ReadLines(It.IsAny <string>()))
            .Returns(new List <string> {
                "print-item1 50.00"
            });

            var jobsFileRepository = new JobsFileRepository(_fileRepositoryMock.Object);

            // Act
            var job = jobsFileRepository.ReadJobFromFile("fakeFilePath");

            // Assert
            var expectedOuput = Job.Create(
                false,
                new List <PrintItem> {
                PrintItem.Create("print-item1", 50.00m, false)
            });

            Assert.That(job, Is.EqualTo(expectedOuput).Using(new JobEqualityComparer()));
        }