public async Task ResetCollection_ContactNotInCollection_DoNotDisableOtherPlans()
        {
            var contact = CreateContact();
            var plans   = CreatePlansWithCampaign();

            await Model.ResetCollectionAsync(contact, plans, 1);

            MockPlans.Verify(x => x.RemoveFromCampaignAsync(It.IsAny <int>(), It.IsAny <int>()), Times.Never);
        }
        public async Task ResetCollection_InCollectionByOtherPlan_DisableThisPlan()
        {
            var contact = CreateContact(2);
            var plans   = CreatePlansWithCampaign();

            await Model.ResetCollectionAsync(contact, plans, 1);

            MockPlans.Verify(x => x.RemoveFromCampaignAsync(1, It.IsAny <int>()), Times.Once);
            MockPlans.Verify(x => x.RemoveFromCampaignAsync(2, It.IsAny <int>()), Times.Never);
        }
        public async Task ResetCollection_InCollectionAlreadyDisabled_DoesNotRemoveFromCampaign()
        {
            var contact = CreateContact(2);
            var plans   = CreatePlansWithCampaign();

            plans[0].ListCampaigns.Clear();

            await Model.ResetCollectionAsync(contact, plans, 1);

            MockPlans.Verify(x => x.RemoveFromCampaignAsync(It.IsAny <int>(), It.IsAny <int>()), Times.Never);
        }
        public Mock <PaymentPlanProcessor> CreateMockModelForQueue()
        {
            ProcessCalled = new List <int>();
            var mockModel = new Mock <PaymentPlanProcessor>(MockProcessor.Object, MockContacts.Object, MockPlans.Object, new RandomGenerator(), Config)
            {
                CallBase = true
            };

            mockModel.Setup(x => x.ProcessAsync(It.IsAny <ApiCustomContact>(), It.IsAny <IEnumerable <ApiPaymentPlan> >(), It.IsAny <DateTimeOffset>()))
            .Returns <ApiCustomContact, IEnumerable <ApiPaymentPlan>, DateTimeOffset>((contact, planList, currentDate) =>
            {
                ProcessCalled.Add(contact.Id !.Value);
                return(Task.FromResult(new PaymentResult()));
            });
            MockContacts.Setup(x => x.SelectAsync(It.IsAny <int>()))
            .Returns <int>((id) => Task.FromResult(new ApiCustomContact()
            {
                Id = id
            }));
            MockPlans.Setup(x => x.SelectAsync(It.IsAny <ApiSearchOptions>()))
            .Returns(Task.FromResult <IList <ApiPaymentPlan> >(new List <ApiPaymentPlan>()));
            return(mockModel);
        }
        public async Task ProcessInQueueAsync_LongTask_WaitUntilFinish()
        {
            var mockModel = CreateMockModelForQueue();

            MockPlans.Setup(x => x.SelectAsync(It.IsAny <ApiSearchOptions>()))
            .Returns(async() =>
            {
                await Task.Delay(100);
                return(new List <ApiPaymentPlan>());
            });

            var task1 = mockModel.Object.ProcessInQueueAsync(1, 0, _now).ConfigureAwait(false);
            var task2 = mockModel.Object.ProcessInQueueAsync(2, 0, _now).ConfigureAwait(false);
            var task3 = mockModel.Object.ProcessInQueueAsync(3, 0, _now).ConfigureAwait(false);

            var result1 = await task1;

            Assert.Single(ProcessCalled);
            var result2 = await task2;

            Assert.Equal(2, ProcessCalled.Count);
            await task3;
        }