public void post_returns_ticket_etag_on_success(
            TicketModel ticket,
            TicketDetails ticketDetails,
            [Frozen]Mock<IQuery<Guid, TicketDetails>> ticketQuery,
            [Frozen]Mock<UrlHelper> url,
            TicketsController sut)
        {
            var createdUri = "http://localhost:8051/api/tickets/123";
            url.Setup(u => u.Link(It.IsAny<string>(), It.IsAny<object>()))
                            .Returns(createdUri);
            ticketQuery.Setup(q => q.Execute(It.IsAny<Envelope<Guid>>())).Returns(ticketDetails);

            var actual = sut.Post(ticket);

            actual.Should().BeOfType<CreatedResultWithETag<TicketResponseModel>>()
                  .Which.ETagValue.Should().Be(ticketDetails.Version.ToString());
        }
        public void post_returns_created_ticket_on_success(
            TicketModel ticket,
            TicketDetails ticketDetails,
            [Frozen]Mock<IQuery<Guid, TicketDetails>> ticketQuery,
            [Frozen]Mock<UrlHelper> url,
            TicketsController sut)
        {
            var createdUri = "http://localhost:8051/api/tickets/123";
            url.Setup(u => u.Link(It.IsAny<string>(), It.IsAny<object>()))
                            .Returns(createdUri);
            ticketQuery.Setup(q => q.Execute(It.IsAny<Envelope<Guid>>())).Returns(ticketDetails);

            var actual = sut.Post(ticket);

            actual.Should().BeOfType<CreatedResultWithETag<TicketResponseModel>>()
                  .Which.Content.ShouldBeEquivalentTo(ticketDetails, options => options.ExcludingMissingMembers());
        }
        public void post_returns_400_bad_request_on_validation_error(
            TicketModel ticket,
            ValidationException exception,
            [Frozen]Mock<ICommand<Ticket>> addCmd,
            TicketsController sut)
        {
            addCmd.Setup(cmd => cmd.Execute(It.IsAny<Envelope<Ticket>>())).Throws(exception);

            var actual = sut.Post(ticket);

            actual.Should().BeOfType<BadRequestErrorMessageResult>();
        }
        public void post_returns_403_unauthorized_if_not_authorized(
            TicketModel ticket,
            [Frozen]Mock<ICommand<Ticket>> cmd,
            TicketsController sut)
        {
            cmd.Setup(c => c.Execute(It.IsAny<Envelope<Ticket>>())).Throws<UnauthorizedAccessException>();

            var actual = sut.Post(ticket);

            actual.Should().BeOfType<UnauthorizedResult>("because user name query returned nothing");
        }
        public void post_returns_201_created_with_correct_location_on_success(
            TicketModel ticket,
            [Frozen]Mock<UrlHelper> url,
            TicketsController sut)
        {
            var createdUri = "http://localhost:8051/api/tickets/123";
            url.Setup(u => u.Link(It.IsAny<string>(), It.IsAny<object>()))
                            .Returns(createdUri);

            var actual = sut.Post(ticket);

            actual.Should().BeOfType<CreatedResultWithETag<TicketResponseModel>>()
                  .Which.Location.OriginalString.Should().Be(createdUri);
        }