public Given_no_issue_labeled()
 {
     UserLabelRepository = Substitute.For <InMemoryLabelSubscriptionRepository>();
     IssueSubscriber     = Substitute.For <IIssueSubscriber>();
     IssueQuery          = Substitute.For <IIssueQuery>();
     IssueSubscription   = new IssueSubscription(new InMemoryIssueLabelRepository(), UserLabelRepository, IssueSubscriber);
     LabelSubscription   = new LabelSubscription(UserLabelRepository, IssueSubscriber, IssueQuery);
 }
        public async Task subscribe_already_subscribed_user()
        {
            await LabelSubscription.SetUserSubscription(RepositoryOwner, RepositoryName, "userX", Label);

            IssueSubscriber.ClearReceivedCalls();
            await IssueSubscription.TryAddLabel(Issue, Label, ToBeLabeledAt);

            //assert
            await IssueSubscriber.ReceivedWithAnyArgs().SubscribeToIssue(default !, default !);
        public async Task change_area_label()
        {
            var wasAdded = await IssueSubscription.TryAddLabel(Issue, "area-another", ToBeLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, "area-another");

            wasAdded.Should().BeTrue();
            labeled.Should().BeTrue();
        }
        public async Task remove_area_label()
        {
            var wasRemoved = await IssueSubscription.TryRemoveLabel(Issue, AreaLabel, ToBeLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, AreaLabel);

            wasRemoved.Should().BeTrue();
            labeled.Should().BeFalse();
        }
        public async Task set_to_same_label()
        {
            var wasAdded = await IssueSubscription.TryAddLabel(Issue, Label, ToBeLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, Label);

            wasAdded.Should().BeFalse();
            labeled.Should().BeTrue();
        }
        public async Task set_another_label()
        {
            var wasAdded = await IssueSubscription.TryAddLabel(Issue, "another-label", ToBeLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, "another-label");

            wasAdded.Should().BeTrue();
            labeled.Should().BeTrue();
        }
        public async Task handle_idempotent_label()
        {
            var wasAdded = await IssueSubscription.TryAddLabel(Issue, Label, AlreadyLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, Label);

            wasAdded.Should().BeFalse();
            labeled.Should().BeTrue();
        }
        public async Task handle_outdated_remove_label()
        {
            var wasAdded = await IssueSubscription.TryRemoveLabel(Issue, Label, AlreadyLabeledAt.AddHours(-1));

            var labeled = await IssueSubscription.TestLabel(Issue, Label);

            // so we can handle situation when labeling events are received out of order
            wasAdded.Should().BeFalse();
            labeled.Should().BeTrue();
        }
        public async Task remove_non_assigned_area_label()
        {
            var wasRemoved = await IssueSubscription.TryRemoveLabel(Issue, "area-non-existing", ToBeLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, "area-non-existing");

            wasRemoved.Should()
            .BeTrue(
                "Removing not used label, make record that such issue has removed that label, so we can detect outdated labels");
            labeled.Should().BeFalse();
        }
        public async Task handle_idempotent_label()
        {
            var wasAdded = await IssueSubscription.TryAddLabel(Issue, AreaLabel, AlreadyLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, AreaLabel);

            wasAdded.Should().BeFalse();
            labeled.Should().BeTrue();

            // TODO: verify no comments was created or updated
        }
        public async Task handle_set_and_remove_in_reverse_order()
        {
            // with remove time after label
            var wasRemoved = await IssueSubscription.TryRemoveLabel(Issue, AreaLabel, ToBeLabeledAt.AddHours(1));

            // with label time before remove but executed after remove
            var wasAdded = await IssueSubscription.TryAddLabel(Issue, AreaLabel, ToBeLabeledAt);

            var labeled = await IssueSubscription.TestLabel(Issue, AreaLabel);

            wasRemoved.Should().BeTrue();
            wasAdded.Should().BeFalse();
            labeled.Should().BeFalse();
        }
 public Given_issue_had_label_removed()
 {
     AlreadyRemovedAt = AlreadyLabeledAt.AddMinutes(+1);
     IssueSubscription.TryRemoveLabel(Issue, Label, AlreadyRemovedAt).Wait();
 }
 public Given_issue_area_label()
 {
     IssueSubscription.TryAddLabel(Issue, AreaLabel, AlreadyLabeledAt).Wait();
 }