示例#1
0
        public void Edit_can_remove_two_secondary_relationships_which_are_unwanted(Ticket ticket,
                                                                                   EditTicketRequest request,
                                                                                   [HasIdentity] TicketRelationship firstRelationship,
                                                                                   [HasIdentity] TicketRelationship secondRelationship,
                                                                                   [HasIdentity] TicketRelationship thirdRelationship,
                                                                                   RelationshipRemovingTicketEditorDecorator sut)
        {
            // Arrange
            ticket.SecondaryRelationships.Clear();
            ticket.SecondaryRelationships.Add(firstRelationship);
            ticket.SecondaryRelationships.Add(secondRelationship);
            ticket.SecondaryRelationships.Add(thirdRelationship);

            request.RelationshipsToRemove.Clear();
            request.RelationshipsToRemove.Add(new DeleteRelationshipRequest {
                TicketRelationshipId = firstRelationship.GetIdentity()
            });
            request.RelationshipsToRemove.Add(new DeleteRelationshipRequest {
                TicketRelationshipId = secondRelationship.GetIdentity()
            });

            // Act
            sut.Edit(ticket, request);

            // Assert
            Assert.That(ticket.SecondaryRelationships, Is.EquivalentTo(new [] { thirdRelationship }));
        }
示例#2
0
        public void Edit(Ticket ticket, EditTicketRequest request)
        {
            wrappedInstance.Edit(ticket, request);

            var labels = labelProvider.GetLabels(request.CommaSeparatedLabelNames);

            ticket.Labels.ReplaceContents(labels);
        }
        public void Edit(Ticket ticket, EditTicketRequest request)
        {
            wrappedInstance.Edit(ticket, request);

            var relationships = relationshipFactory.Convert(request.RelationshipsToAdd);

            ticket.PrimaryRelationships.UnionWith(relationships.Where(x => x.PrimaryTicket == null));
            ticket.SecondaryRelationships.UnionWith(relationships.Where(x => x.SecondaryTicket == null));
        }
        public void A_user_can_add_a_hierarchical_ticket_relationship(Project project,
                                                                      Ticket childTicket,
                                                                      Ticket parentTicket,
                                                                      TicketType type,
                                                                      DirectionalRelationship parentChildRelationship,
                                                                      [FromDi] Lazy <IEntityData> data,
                                                                      [FromDi] Lazy <IGetsTransaction> tranFactory,
                                                                      [FromDi] Lazy <IHandlesEditTicketRequest> sut)
        {
            project.Code = "AddTicketRelationshipIntegrationTests.A_user_can_add_a_hierarchical_ticket_relationship";

            parentChildRelationship.Behaviour.ProhibitCircularRelationship           = true;
            parentChildRelationship.Behaviour.ProhibitMultipleSecondaryRelationships = false;

            childTicket.Project      = project;
            childTicket.TicketNumber = 1;
            childTicket.Type         = type;

            parentTicket.Project      = project;
            parentTicket.TicketNumber = 2;
            parentTicket.Type         = type;

            using (var tran = tranFactory.Value.GetTransaction())
            {
                data.Value.Add(project);
                data.Value.Add(parentChildRelationship);
                data.Value.Add(parentTicket);
                data.Value.Add(type);
                tran.Commit();
            }

            var editRequest = new EditTicketRequest {
                Identity = parentTicket.GetIdentity(),
                CommaSeparatedLabelNames = String.Empty,
                Description        = "This is a description",
                SprintIdentity     = null,
                Title              = "This is a title",
                TicketTypeIdentity = type.GetIdentity(),
                RelationshipsToAdd = new [] {
                    new AddRelationshipRequest {
                        ParticipationType      = RelationshipParticipant.Secondary,
                        RelatedTicketReference = childTicket.GetTicketReference(),
                        RelationshipId         = parentChildRelationship.GetIdentity(),
                    },
                },
            };

            var result = sut.Value.Edit(editRequest);

            if (result?.IsSuccess != true)
            {
                var unsuccessfulRules = result.ValidationResult.RuleResults.Where(x => x.RuleResult.Outcome != RuleOutcome.Success);
                logger.Error($"Failed results are: {String.Join(", ", unsuccessfulRules.Select(x => $"{x.ManifestIdentity}: {x.RuleResult.Outcome}"))}");
            }

            Assert.That(result?.IsSuccess, Is.True);
        }
        public void Edit(Ticket ticket, EditTicketRequest request)
        {
            wrappedInstance.Edit(ticket, request);

            RemoveRelationships(ticket.PrimaryRelationships,
                                request.RelationshipsToRemove.Select(x => x.TicketRelationshipId));

            RemoveRelationships(ticket.SecondaryRelationships,
                                request.RelationshipsToRemove.Select(x => x.TicketRelationshipId));
        }
示例#6
0
        public void Edit_uses_transaction_when_validation_passes(EditTicketRequest request,
                                                                 [Frozen, AlwaysPasses] ICreatesValidators <EditTicketRequest> validatorFactory,
                                                                 [Frozen] ITransaction tran,
                                                                 [Frozen, CreatesTransaction] IGetsTransaction transactionCreator,
                                                                 EditTicketRequestHandler sut)
        {
            // Act
            sut.Edit(request);

            // Assert
            Mock.Get(transactionCreator).Verify(x => x.GetTransaction(), Times.Once);
            Mock.Get(tran).Verify(x => x.Commit(), Times.Once);
        }
示例#7
0
        public void Edit_passes_correct_ticket_to_editing_service(EditTicketRequest request,
                                                                  [Frozen, AlwaysPasses] ICreatesValidators <EditTicketRequest> validatorFactory,
                                                                  [Frozen, CreatesTransaction] IGetsTransaction transactionCreator,
                                                                  [InMemory, Frozen] IEntityData data,
                                                                  Ticket ticket,
                                                                  [Frozen] IEditsTicket editor,
                                                                  EditTicketRequestHandler sut)
        {
            // Arrange
            data.Add(ticket);
            request.Identity = ticket.GetIdentity();

            // Act
            sut.Edit(request);

            // Assert
            Mock.Get(editor).Verify(x => x.Edit(ticket, request), Times.Once);
        }
示例#8
0
        public void Edit_returns_a_result_when_validation_fails(EditTicketRequest request,
                                                                [Frozen] ICreatesValidators <EditTicketRequest> validatorFactory,
                                                                IValidator validator,
                                                                EditTicketRequestHandler sut)
        {
            // Arrange
            Mock.Get(validatorFactory)
            .Setup(x => x.GetValidator())
            .Returns(validator);
            Mock.Get(validator)
            .Setup(x => x.Validate(request))
            .Returns(Mock.Of <IValidationResult>(x => x.IsSuccess == false));

            // Act
            var result = sut.Edit(request);

            // Assert
            Assert.That(result, Is.Not.Null);
        }
示例#9
0
        public void Edit_returns_edited_ticket_in_response(EditTicketRequest request,
                                                           [Frozen, AlwaysPasses] ICreatesValidators <EditTicketRequest> validatorFactory,
                                                           [Frozen, CreatesTransaction] IGetsTransaction transactionCreator,
                                                           [InMemory, Frozen] IEntityData data,
                                                           [HasIdentity] Ticket ticket,
                                                           [Frozen] ICreatesEditTicketResponse editResponseCreator,
                                                           EditTicketRequestHandler sut)
        {
            // Arrange
            data.Add(ticket);
            request.Identity = ticket.GetIdentity();

            // Act
            sut.Edit(request);

            // Assert
            Mock.Get(editResponseCreator)
            .Verify(x => x.GetResponse(It.IsAny <IValidationResult>(), ticket), Times.Once);
        }
示例#10
0
        public void Edit_does_not_begin_transaction_when_validation_fails(EditTicketRequest request,
                                                                          [Frozen] ICreatesValidators <EditTicketRequest> validatorFactory,
                                                                          IValidator validator,
                                                                          [Frozen] IGetsTransaction transactionCreator,
                                                                          EditTicketRequestHandler sut)
        {
            // Arrange
            Mock.Get(validatorFactory)
            .Setup(x => x.GetValidator())
            .Returns(validator);
            Mock.Get(validator)
            .Setup(x => x.Validate(request))
            .Returns(Mock.Of <IValidationResult>(x => x.IsSuccess == false));

            // Act
            sut.Edit(request);

            // Assert
            Mock.Get(transactionCreator).Verify(x => x.GetTransaction(), Times.Never);
        }
示例#11
0
        public void Edit_returns_response_with_null_ticket_when_validation_fails(EditTicketRequest request,
                                                                                 [Frozen] ICreatesValidators <EditTicketRequest> validatorFactory,
                                                                                 IValidator validator,
                                                                                 [Frozen] ICreatesEditTicketResponse editResponseCreator,
                                                                                 EditTicketRequestHandler sut)
        {
            // Arrange
            Mock.Get(validatorFactory)
            .Setup(x => x.GetValidator())
            .Returns(validator);
            Mock.Get(validator)
            .Setup(x => x.Validate(request))
            .Returns(Mock.Of <IValidationResult>(x => x.IsSuccess == false));

            // Act
            sut.Edit(request);

            // Assert
            Mock.Get(editResponseCreator)
            .Verify(x => x.GetResponse(It.IsAny <IValidationResult>(), null), Times.Once);
        }
        public void A_user_may_add_a_relatinship_to_a_complex_multipath_directional_relationship_structure(Project project,
                                                                                                           Ticket editedTicket,
                                                                                                           Ticket blockedTicket1,
                                                                                                           Ticket blockedTicket2,
                                                                                                           Ticket blockedTicket3,
                                                                                                           Ticket blockedTicket4,
                                                                                                           Ticket parentTicket,
                                                                                                           TicketType type,
                                                                                                           DirectionalRelationship blocks,
                                                                                                           DirectionalRelationship childOf,
                                                                                                           [FromDi] Lazy <IEntityData> data,
                                                                                                           [FromDi] Lazy <IGetsTransaction> tranFactory,
                                                                                                           [FromDi] Lazy <IHandlesEditTicketRequest> sut)
        {
            /* The summary of the test data is that there are two directional relationships (block & child-of)
             * which prohibit circular relationships.  The edited ticket blocks other tickets 1, 2 & 3.
             * Other ticket 1 blocks other tickets 2 & 3.  Other ticket 2 blocks other ticket 3. Other ticket 3
             * blocks other ticket 4.  This is valid because the blocks flow in only one direction and cannot get
             * back to a parent ticket.
             *
             * In the test, we are adding a new child-of relationship to the edited ticket, making it a child of
             * the parent ticket.
             */

            #region Setup test data

            project.Code = "AddTicketRelationshipIntegrationTests.A_user_may_add_a_relatinship_to_a_complex_multipath_directional_relationship_structure";

            blocks.Behaviour.ProhibitCircularRelationship           = true;
            blocks.Behaviour.ProhibitMultipleSecondaryRelationships = false;

            childOf.Behaviour.ProhibitCircularRelationship           = true;
            childOf.Behaviour.ProhibitMultipleSecondaryRelationships = false;

            editedTicket.Project      = project;
            editedTicket.TicketNumber = 1;
            editedTicket.Type         = type;

            blockedTicket1.Project      = project;
            blockedTicket1.TicketNumber = 2;
            blockedTicket1.Type         = type;

            blockedTicket1.Project      = project;
            blockedTicket1.TicketNumber = 3;
            blockedTicket1.Type         = type;

            blockedTicket1.Project      = project;
            blockedTicket1.TicketNumber = 4;
            blockedTicket1.Type         = type;

            blockedTicket1.Project      = project;
            blockedTicket1.TicketNumber = 5;
            blockedTicket1.Type         = type;

            parentTicket.Project      = project;
            parentTicket.TicketNumber = 6;
            parentTicket.Type         = type;

            editedTicket.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket1, Relationship = blocks
            });
            editedTicket.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket2, Relationship = blocks
            });
            editedTicket.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket3, Relationship = blocks
            });
            blockedTicket1.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket2, Relationship = blocks
            });
            blockedTicket1.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket3, Relationship = blocks
            });
            blockedTicket2.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket3, Relationship = blocks
            });
            blockedTicket3.PrimaryRelationships.Add(new TicketRelationship {
                SecondaryTicket = blockedTicket4, Relationship = blocks
            });

            using (var tran = tranFactory.Value.GetTransaction())
            {
                data.Value.Add(project);
                data.Value.Add(blocks);
                data.Value.Add(childOf);
                data.Value.Add(editedTicket);
                data.Value.Add(parentTicket);
                data.Value.Add(type);
                tran.Commit();
            }

            #endregion

            var editRequest = new EditTicketRequest {
                Identity           = editedTicket.GetIdentity(),
                Title              = "This is a title",
                TicketTypeIdentity = type.GetIdentity(),
                RelationshipsToAdd = new[] {
                    new AddRelationshipRequest {
                        ParticipationType      = RelationshipParticipant.Secondary,
                        RelatedTicketReference = parentTicket.GetTicketReference(),
                        RelationshipId         = childOf.GetIdentity(),
                    },
                },
            };

            var result = sut.Value.Edit(editRequest);

            if (result?.IsSuccess != true)
            {
                var unsuccessfulRules = result.ValidationResult.RuleResults.Where(x => x.RuleResult.Outcome != RuleOutcome.Success);
                logger.Error($"Failed results are: {String.Join(", ", unsuccessfulRules.Select(x => $"{x.ManifestIdentity}: {x.RuleResult.Outcome}"))}");
            }

            Assert.That(result?.IsSuccess, Is.True);
        }
示例#13
0
 public void Edit(Ticket ticket, EditTicketRequest request)
 {
     mapper.Map(request, ticket);
 }