public void put_returns_412_precondition_failed_on_version_conflict(
            Guid ticketId,
            TicketModel ticket,
            OptimisticConcurrencyException exception,
            [Frozen]Mock<ICommand<Ticket>> updateCmd,
            TicketsController sut)
        {
            updateCmd.Setup(cmd => cmd.Execute(It.IsAny<Envelope<Ticket>>())).Throws(exception);

            var actual = sut.Put(ticketId, ticket);

            actual.Should().BeOfType<ResponseMessageResult>()
                  .Which.Response.StatusCode.Should().Be(HttpStatusCode.PreconditionFailed);
        }
        public void put_returns_404_notfound_when_ticket_not_found(
            Guid ticketId,
            TicketModel ticket,
            TicketNotFoundException exception,
            [Frozen]Mock<ICommand<Ticket>> updateCmd,
            TicketsController sut)
        {
            updateCmd.Setup(cmd => cmd.Execute(It.IsAny<Envelope<Ticket>>())).Throws(exception);

            var actual = sut.Put(ticketId, ticket);

            actual.Should().BeOfType<NotFoundResult>("because TicketNotFoundException was thrown");
        }
        public void put_returns_400_bad_request_on_validation_error(
            TicketModel ticket,
            Guid ticketId,
            ValidationException exception,
            [Frozen]Mock<ICommand<Ticket>> updateCmd,
            TicketsController sut)
        {
            updateCmd.Setup(cmd => cmd.Execute(It.IsAny<Envelope<Ticket>>())).Throws(exception);

            var actual = sut.Put(ticketId, ticket);

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

            var actual = sut.Put(ticketId, ticket);

            actual.Should().BeOfType<UnauthorizedResult>("because user name query returned nothing");
        }
        public void put_returns_200_ok_with_correct_etag_on_success(
            Guid ticketId,
            TicketModel ticket,
            TicketDetails ticketDetails,
            [Frozen]Mock<IUserNameQuery> userQuery,
            [Frozen]Mock<IQuery<Guid, TicketDetails>> ticketQuery,
            TicketsController sut)
        {
            ticketQuery.Setup(q => q.Execute(It.IsAny<Envelope<Guid>>())).Returns(ticketDetails);

            var actual = sut.Put(ticketId, ticket);

            actual.Should().BeOfType<OkResultWithETag<TicketResponseModel>>()
                .Which.ETagValue.Should().Be(ticketDetails.Version.ToString());
        }