public void Post_should_return_created_response()
        {
            // Arrange
            var invoice       = new UpdateInvoiceBuilder().Build();
            var domainInvoice = new InvoiceBuilder().Build();
            var getInvoice    = new GetInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Create(It.IsAny <Domain.Invoice>())).Returns(domainInvoice);
            getInvoiceMapperMock.Setup(mapper => mapper.ToModel(domainInvoice)).Returns(getInvoice);

            // Act
            var response = testSubject.Post(invoice);

            // Assert
            Assert.IsType <CreatedAtRouteResult>(response);
        }
        public void Post_should_return_ETag()
        {
            // Arrange
            var invoice       = new UpdateInvoiceBuilder().Build();
            var domainInvoice = new InvoiceBuilder().Build();
            var getInvoice    = new GetInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Create(It.IsAny <Domain.Invoice>())).Returns(domainInvoice);
            getInvoiceMapperMock.Setup(mapper => mapper.ToModel(domainInvoice)).Returns(getInvoice);

            // Act
            testSubject.Post(invoice);

            // Assert
            var headers = testSubject.Response.GetTypedHeaders();

            Assert.NotNull(headers.ETag);
        }
        public void Get_should_return_invoice()
        {
            // Arrange
            var invoice = new InvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);

            var expected = new GetInvoiceBuilder().Build();

            getInvoiceMapperMock.Setup(map => map.ToModel(invoice)).Returns(expected);

            // Act
            var response = testSubject.Get(Id) as ObjectResult;

            // Assert
            Assert.IsType <GetInvoice>(response.Value);
            Assert.Equal((int)HttpStatusCode.OK, response.StatusCode.Value);
            Assert.Equal(expected, response.Value);
        }
        public void Get_should_have_ETag_header()
        {
            // Arrange
            var invoice = new InvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);

            var expected = new GetInvoiceBuilder().Build();

            getInvoiceMapperMock.Setup(map => map.ToModel(invoice)).Returns(expected);

            // Act
            testSubject.Get(Id);

            // Assert
            var headers = testSubject.Response.GetTypedHeaders();

            Assert.NotNull(headers.ETag);
        }
        public void Get_should_return_NotModified_when_ETag_match_current_version()
        {
            // Arrange
            var invoice = new InvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);

            var expected = new GetInvoiceBuilder().Build();

            getInvoiceMapperMock.Setup(map => map.ToModel(invoice)).Returns(expected);

            testSubject.Request.Headers.Add(HeaderNames.IfNoneMatch, $"\"{Guid.Empty}\"");

            // Act
            var response = testSubject.Get(Id) as StatusCodeResult;

            // Assert
            Assert.Equal(StatusCodes.Status304NotModified, response.StatusCode);
        }