public void ToDomain()
        {
            // Arrange
            var updateInvoice = new UpdateInvoiceBuilder().Build();
            var expected      = new InvoiceBuilder().Build();

            // Act
            var actual = testSubject.ToDomain(updateInvoice, expected.Id);

            // Assert
            actual.ShouldBeEquivalentTo(expected);
        }
        public void ToModel()
        {
            // Arrange
            var invoice  = new InvoiceBuilder().Build();
            var expected = new UpdateInvoiceBuilder().Build();

            // Act
            var actual = testSubject.ToModel(invoice);

            // Assert
            actual.ShouldBeEquivalentTo(expected);
        }
        public void Post_should_not_accept_invalid_request()
        {
            // Arrange
            var invoice = new UpdateInvoiceBuilder().Build();

            testSubject.ModelState.AddModelError("name", "some validation failed");

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

            // Assert
            Assert.IsType <BadRequestObjectResult>(response);
        }
        public void Put_should_return_NoContent()
        {
            // Arrange
            var invoice = new UpdateInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Exists(It.IsAny <string>())).Returns(true);

            // Act
            var response = testSubject.Put(Id, invoice);

            // Assert
            Assert.IsType <NoContentResult>(response);
        }
        public void Put_should_return_NotFound_if_invoice_does_not_exist()
        {
            // Arrange
            var invoice = new UpdateInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Exists(It.IsAny <string>())).Returns(false);

            // Act
            var response = testSubject.Put("1", invoice);

            // Assert
            Assert.IsType <NotFoundResult>(response);
        }
        public void Put_should_return_NoContent_When_Etag_Is_Wildcard()
        {
            // Arrange
            var invoice = new UpdateInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Exists(It.IsAny <string>())).Returns(true);
            invoiceRepositoryMock.Setup(r => r.Update(It.IsAny <Domain.Invoice>())).Returns(new Version("2"));
            testSubject.Request.Headers.Add(HeaderNames.IfMatch, EntityTagHeaderValue.Any.Tag);

            // Act
            var response = testSubject.Put(Id, invoice);

            // Assert
            Assert.IsType <NoContentResult>(response);
        }
        public void Put_should_return_PreconditionFailed_When_Etag_Is_Wrong()
        {
            // Arrange
            var invoice = new UpdateInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Exists(It.IsAny <string>())).Returns(true);
            invoiceRepositoryMock.Setup(r => r.Update(It.IsAny <Domain.Invoice>())).Returns(new Version("2"));
            testSubject.Request.Headers.Add(HeaderNames.IfMatch, $"\"unknown\"");

            // Act
            var response = testSubject.Put(Id, invoice);

            // Assert
            Assert.Equal(StatusCodes.Status412PreconditionFailed, ((StatusCodeResult)response).StatusCode);
        }
        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 Patch_should_return_NoContent()
        {
            // Arrange
            var invoice = new InvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);
            var updateInvoice = new UpdateInvoiceBuilder().Build();

            updateInvoiceMapperMock.Setup(mapper => mapper.ToModel(invoice)).Returns((updateInvoice));

            // Act
            var response = testSubject.Patch(Id, new JsonPatchDocument <UpdateInvoice>());

            // Assert
            Assert.IsType <NoContentResult>(response);
        }
        public void Put_should_return_ETag()
        {
            // Arrange
            var invoice = new UpdateInvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Exists(It.IsAny <string>())).Returns(true);
            invoiceRepositoryMock.Setup(r => r.Update(It.IsAny <Domain.Invoice>())).Returns(new Version("2"));

            // Act
            testSubject.Put(Id, invoice);

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

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

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);
            testSubject.Request.Headers.Add(HeaderNames.IfMatch, $"\"unknown\"");

            var updateInvoice = new UpdateInvoiceBuilder().Build();

            updateInvoiceMapperMock.Setup(mapper => mapper.ToModel(invoice)).Returns((updateInvoice));

            // Act
            var response = testSubject.Patch(Id, new JsonPatchDocument <UpdateInvoice>());

            // Assert
            Assert.Equal(StatusCodes.Status412PreconditionFailed, ((StatusCodeResult)response).StatusCode);
        }
        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 Patch_should_return_ETag()
        {
            // Arrange
            var invoice = new InvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);
            invoiceRepositoryMock.Setup(r => r.Update(It.IsAny <Domain.Invoice>())).Returns(new Version("2"));
            var updateInvoice = new UpdateInvoiceBuilder().Build();

            updateInvoiceMapperMock.Setup(mapper => mapper.ToModel(invoice)).Returns((updateInvoice));

            // Act
            testSubject.Patch(Id, new JsonPatchDocument <UpdateInvoice>());

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

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

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);
            invoiceRepositoryMock.Setup(r => r.Update(It.IsAny <Domain.Invoice>())).Returns(new Version("2"));

            var updateInvoice = new UpdateInvoiceBuilder().Build();

            updateInvoiceMapperMock.Setup(mapper => mapper.ToModel(invoice)).Returns((updateInvoice));

            testSubject.Request.Headers.Add(HeaderNames.IfMatch, EntityTagHeaderValue.Any.Tag);

            // Act
            var response = testSubject.Patch(Id, new JsonPatchDocument <UpdateInvoice>());

            // Assert
            Assert.IsType <NoContentResult>(response);
        }
        public void Patch_with_illegal_request_should_return_BadRequest()
        {
            // Arrange
            var invoice = new InvoiceBuilder().Build();

            invoiceRepositoryMock.Setup(r => r.Get(Id)).Returns(invoice);
            var updateInvoice = new UpdateInvoiceBuilder().Build();

            updateInvoiceMapperMock.Setup(mapper => mapper.ToModel(invoice)).Returns((updateInvoice));


            var patchDocument = new JsonPatchDocument <UpdateInvoice>(
                new List <Operation <UpdateInvoice> >
            {
                new Operation <UpdateInvoice>("replace", @"/unknown", null, 32)
            },
                new DefaultContractResolver());

            // Act
            var response = testSubject.Patch(Id, patchDocument);

            // Assert
            Assert.IsType <BadRequestObjectResult>(response);
        }