public async Task NothingToReportBecauseDbEmpty()
        {
            var db = DbHelper.GetEmptyTestDB();

            var user = await UserHelper.CreateInDbAsync(db);

            var subscription = await SearchSubscriptionHelper.CreateAsync(db, user, lastNotificationDate : new DateTime(2050, 04, 01));

            var runDate = new DateTime(2050, 05, 01);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, runDate).RunAsync(subscription.Id);
                Assert.AreEqual(0, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(0, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(runDate, dbContext.SearchSubscriptions.Single(s => s.Id == subscription.Id).LastRunUtcDate);
        }
Example #2
0
        public async Task TestGetRightSearchesPerUser()
        {
            var testDB = DbHelper.GetEmptyTestDB();

            var user1Id = await UserHelper.CreateInDbAsync(testDB);

            await SearchSubscriptionHelper.CreateAsync(testDB, user1Id);

            await SearchSubscriptionHelper.CreateAsync(testDB, user1Id);

            var user2Id = await UserHelper.CreateInDbAsync(testDB);

            await SearchSubscriptionHelper.CreateAsync(testDB, user2Id);

            await SearchSubscriptionHelper.CreateAsync(testDB, user2Id);

            await SearchSubscriptionHelper.CreateAsync(testDB, user2Id);

            using var dbContext = new MemCheckDbContext(testDB);
            var user1Request       = new GetSearchSubscriptions.Request(user1Id);
            var user1Subscriptions = await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(user1Request);

            Assert.AreEqual(2, user1Subscriptions.Count());

            var user2Request       = new GetSearchSubscriptions.Request(user2Id);
            var user2Subscriptions = await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(user2Request);

            Assert.AreEqual(3, user2Subscriptions.Count());
        }
Example #3
0
        public async Task TestCardCountOnLastRun()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using (var dbContext = new MemCheckDbContext(testDB))
                await new UserSearchNotifier(dbContext.AsCallContext(), 100, new DateTime(2050, 05, 01)).RunAsync(subscription.Id);

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new GetSearchSubscriptions.Request(userId);
                var s       = (await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(request)).Single();
                Assert.AreEqual(0, s.CardCountOnLastRun);
            }

            await CardHelper.CreateAsync(testDB, userId);

            await CardHelper.CreateAsync(testDB, userId);

            await CardHelper.CreateAsync(testDB, userId);

            await CardHelper.CreateAsync(testDB, userId);

            using (var dbContext = new MemCheckDbContext(testDB))
                await new UserSearchNotifier(dbContext.AsCallContext(), 100, new DateTime(2050, 05, 02)).RunAsync(subscription.Id);

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new GetSearchSubscriptions.Request(userId);
                var s       = (await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(request)).Single();
                Assert.AreEqual(4, s.CardCountOnLastRun);
            }
        }
Example #4
0
        public async Task CorrectDeletion_OtherSubscriptionsExist()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new DeleteSearchSubscription.Request(userId, subscription.Id);
                await new DeleteSearchSubscription(dbContext.AsCallContext()).RunAsync(request);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request       = new GetSearchSubscriptions.Request(userId);
                var subscriptions = await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(request);
                Assert.AreEqual(2, subscriptions.Count());
                Assert.IsFalse(subscriptions.Any(s => s.Id == subscription.Id));
            }
        }
Example #5
0
        public async Task TestUsersWithSubscriptions()
        {
            var testDB = DbHelper.GetEmptyTestDB();

            var user1 = await UserHelper.CreateInDbAsync(testDB);

            var user2 = await UserHelper.CreateInDbAsync(testDB);

            await SearchSubscriptionHelper.CreateAsync(testDB, user2);

            var user3 = await UserHelper.CreateInDbAsync(testDB);

            await SearchSubscriptionHelper.CreateAsync(testDB, user3);

            await SearchSubscriptionHelper.CreateAsync(testDB, user3);

            await SearchSubscriptionHelper.CreateAsync(testDB, user3);

            using var dbContext = new MemCheckDbContext(testDB);
            var counter = new UserSearchSubscriptionLister(dbContext.AsCallContext());

            var user1Subscriptions = await counter.RunAsync(user1);

            Assert.AreEqual(0, user1Subscriptions.Length);

            var user2Subscriptions = await counter.RunAsync(user2);

            Assert.AreEqual(1, user2Subscriptions.Length);

            var user3Subscriptions = await counter.RunAsync(user3);

            Assert.AreEqual(3, user3Subscriptions.Length);
        }
        public async Task CardToReportBecauseFirstRun()
        {
            var db = DbHelper.GetEmptyTestDB();

            var user = await UserHelper.CreateInDbAsync(db);

            var card = await CardHelper.CreateAsync(db, user, versionDate : new DateTime(2050, 03, 01), userWithViewIds : user.AsArray());

            var subscription = await SearchSubscriptionHelper.CreateAsync(db, user);

            var runDate = new DateTime(2050, 05, 01);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, runDate).RunAsync(subscription.Id);

                Assert.AreEqual(1, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(1, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);

                var foundCard = searchResult.NewlyFoundCards.Single();
                Assert.AreEqual(card.Id, foundCard.CardId);
                Assert.AreEqual(card.FrontSide, foundCard.FrontSide);
                Assert.AreEqual(card.VersionDescription, foundCard.VersionDescription);
                Assert.AreEqual(card.VersionUtcDate, foundCard.VersionUtcDate);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(runDate, dbContext.SearchSubscriptions.Single(s => s.Id == subscription.Id).LastRunUtcDate);
        }
        public async Task NewlyFoundToReport()
        {
            var db = DbHelper.GetEmptyTestDB();

            var user = await UserHelper.CreateInDbAsync(db);

            var language = await CardLanguagHelper.CreateAsync(db);

            var card1 = await CardHelper.CreateAsync(db, user, versionDate : new DateTime(2050, 03, 01), language : language);

            var card2 = await CardHelper.CreateAsync(db, user, versionDate : new DateTime(2050, 04, 02), language : language);

            var someText         = RandomHelper.String();
            var subscriptionName = RandomHelper.String();
            var subscription     = await SearchSubscriptionHelper.CreateAsync(db, user, subscriptionName, someText);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 10, new DateTime(2050, 05, 01)).RunAsync(subscription.Id);
                Assert.AreEqual(subscriptionName, searchResult.SubscriptionName);
                Assert.AreEqual(0, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(0, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                UpdateCard.Request updateRequest = new(card1.Id, user, someText, Array.Empty <Guid>(), RandomHelper.String(), Array.Empty <Guid>(), RandomHelper.String(), Array.Empty <Guid>(), language, Array.Empty <Guid>(), Array.Empty <Guid>(), RandomHelper.String());
                await new UpdateCard(dbContext.AsCallContext(), new DateTime(2050, 05, 02)).RunAsync(updateRequest);
            }

            var runDate = new DateTime(2050, 05, 03);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, runDate).RunAsync(subscription.Id);

                Assert.AreEqual(subscriptionName, searchResult.SubscriptionName);
                Assert.AreEqual(1, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(1, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);

                Assert.AreEqual(card1.Id, searchResult.NewlyFoundCards.Single().CardId);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(runDate, dbContext.SearchSubscriptions.Single(s => s.Id == subscription.Id).LastRunUtcDate);
        }
        public async Task TestNoUser()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using var dbContext = new MemCheckDbContext(testDB);
            var request = new SetSearchSubscriptionName.Request(Guid.Empty, subscription.Id, RandomHelper.String());
            await Assert.ThrowsExceptionAsync <InvalidOperationException>(async() => await new SetSearchSubscriptionName(dbContext.AsCallContext()).RunAsync(request));
        }
        public async Task TestTooLongName()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using var dbContext = new MemCheckDbContext(testDB);
            var request = new SetSearchSubscriptionName.Request(userId, subscription.Id, RandomHelper.String(SetSearchSubscriptionName.Request.MaxNameLength + 1));
            await Assert.ThrowsExceptionAsync <RequestInputException>(async() => await new SetSearchSubscriptionName(dbContext.AsCallContext()).RunAsync(request));
        }
        public async Task NameWithMaxLengthDoesNotThrow()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using var dbContext = new MemCheckDbContext(testDB);
            var request = new SetSearchSubscriptionName.Request(userId, subscription.Id, "      " + RandomHelper.String(SetSearchSubscriptionName.Request.MaxNameLength) + "\t\t");

            await new SetSearchSubscriptionName(dbContext.AsCallContext()).RunAsync(request);
        }
Example #11
0
        public async Task CorrectDeletion_OnlySubscription()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using (var dbContext = new MemCheckDbContext(testDB))
                await new DeleteSearchSubscription(dbContext.AsCallContext()).RunAsync(new DeleteSearchSubscription.Request(userId, subscription.Id));

            using (var dbContext = new MemCheckDbContext(testDB))
                Assert.AreEqual(0, (await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(new GetSearchSubscriptions.Request(userId))).Count());
        }
Example #12
0
        public async Task TestSimplestSearch()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            using var dbContext = new MemCheckDbContext(testDB);
            var request       = new GetSearchSubscriptions.Request(userId);
            var subscriptions = await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(request);

            Assert.AreEqual(1, subscriptions.Count());
        }
Example #13
0
        public async Task UserNotOwnerOfSubscription()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var subscriptionOwnerId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, subscriptionOwnerId);

            var userId = await UserHelper.CreateInDbAsync(testDB);

            using var dbContext = new MemCheckDbContext(testDB);
            var request = new DeleteSearchSubscription.Request(userId, subscription.Id);
            await Assert.ThrowsExceptionAsync <RequestInputException>(async() => await new DeleteSearchSubscription(dbContext.AsCallContext()).RunAsync(request));
        }
        public async Task CardsNotFoundAnymore_Deleted_UserAllowedToView()
        {
            var db = DbHelper.GetEmptyTestDB();

            var cardCreatorUserName = RandomHelper.String();
            var cardCreator         = await UserHelper.CreateInDbAsync(db, userName : cardCreatorUserName);

            var language = await CardLanguagHelper.CreateAsync(db);

            var card = await CardHelper.CreateAsync(db, cardCreator, versionDate : new DateTime(2050, 03, 01), language : language);

            var subscriber = await UserHelper.CreateInDbAsync(db);

            var subscription = await SearchSubscriptionHelper.CreateAsync(db, subscriber);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, new DateTime(2050, 05, 01)).RunAsync(subscription.Id);
                Assert.AreEqual(1, searchResult.TotalNewlyFoundCardCount);
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                var deletionRequest = new DeleteCards.Request(cardCreator, card.Id.AsArray());
                await new DeleteCards(dbContext.AsCallContext()).RunAsync(deletionRequest);
            }

            var runDate = new DateTime(2050, 05, 03);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, runDate).RunAsync(subscription.Id);
                Assert.AreEqual(0, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(0, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(1, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(1, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                var deletedCard = searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Single();
                Assert.IsTrue(deletedCard.CardIsViewable);
                Assert.AreEqual(card.FrontSide, deletedCard.FrontSide);
                Assert.AreEqual(cardCreatorUserName, deletedCard.DeletionAuthor);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(runDate, dbContext.SearchSubscriptions.Single(s => s.Id == subscription.Id).LastRunUtcDate);
        }
        public async Task CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView()
        {
            var db = DbHelper.GetEmptyTestDB();

            var cardCreator = await UserHelper.CreateInDbAsync(db);

            var language = await CardLanguagHelper.CreateAsync(db);

            var card = await CardHelper.CreateAsync(db, cardCreator, versionDate : new DateTime(2050, 03, 01), language : language);

            var subscriber = await UserHelper.CreateInDbAsync(db);

            var subscription = await SearchSubscriptionHelper.CreateAsync(db, subscriber);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, new DateTime(2050, 05, 01)).RunAsync(subscription.Id);
                Assert.AreEqual(1, searchResult.TotalNewlyFoundCardCount);
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                var updateRequest = UpdateCardHelper.RequestForVisibilityChange(card, cardCreator.AsArray());
                await new UpdateCard(dbContext.AsCallContext(), new DateTime(2050, 05, 02)).RunAsync(updateRequest);
            }

            var runDate = new DateTime(2050, 05, 03);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, runDate).RunAsync(subscription.Id);
                Assert.AreEqual(0, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(0, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(1, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(runDate, dbContext.SearchSubscriptions.Single(s => s.Id == subscription.Id).LastRunUtcDate);
        }
        public async Task TestCorrectRenaming()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var subscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId);

            var newName = RandomHelper.String();

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new SetSearchSubscriptionName.Request(userId, subscription.Id, "      " + newName + "\t\t");
                await new SetSearchSubscriptionName(dbContext.AsCallContext()).RunAsync(request);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request       = new GetSearchSubscriptions.Request(userId);
                var subscriptions = await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(request);
                Assert.AreEqual(1, subscriptions.Count());
                Assert.AreEqual(newName, subscriptions.Single().Name);
            }
        }
Example #17
0
        public async Task TestRightData()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var deckDescription = RandomHelper.String();
            var deck            = await DeckHelper.CreateAsync(testDB, userId, deckDescription);

            var name              = RandomHelper.String();
            var requiredText      = RandomHelper.String();
            var lastNotifDate     = new DateTime(2032, 1, 8);
            var savedSubscription = await SearchSubscriptionHelper.CreateAsync(testDB, userId, name : name, requiredText : requiredText, excludedDeckId : deck, lastNotificationDate : lastNotifDate);

            using var dbContext = new MemCheckDbContext(testDB);
            var request      = new GetSearchSubscriptions.Request(userId);
            var subscription = (await new GetSearchSubscriptions(dbContext.AsCallContext()).RunAsync(request)).Single();

            Assert.AreEqual(savedSubscription.Id, subscription.Id);
            Assert.AreEqual(name, subscription.Name);
            Assert.AreEqual(requiredText, subscription.RequiredText);
            Assert.AreEqual(deckDescription, subscription.ExcludedDeck);
            Assert.AreEqual(lastNotifDate, subscription.LastRunUtcDate);
            Assert.AreEqual(lastNotifDate, subscription.RegistrationUtcDate);
        }
        public async Task CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView()
        {
            var db = DbHelper.GetEmptyTestDB();

            var cardCreator = await UserHelper.CreateInDbAsync(db);

            var language = await CardLanguagHelper.CreateAsync(db);

            var card = await CardHelper.CreateAsync(db, cardCreator, versionDate : new DateTime(2050, 03, 01), language : language);

            var subscriber = await UserHelper.CreateInDbAsync(db);

            var subscription = await SearchSubscriptionHelper.CreateAsync(db, subscriber);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, new DateTime(2050, 05, 01)).RunAsync(subscription.Id);
                Assert.AreEqual(1, searchResult.TotalNewlyFoundCardCount);
            }

            //Create a previous version on which subscriber can see the card
            using (var dbContext = new MemCheckDbContext(db))
            {
                var updateRequest = UpdateCardHelper.RequestForFrontSideChange(card, RandomHelper.String());
                await new UpdateCard(dbContext.AsCallContext(), new DateTime(2050, 05, 02)).RunAsync(updateRequest);
            }

            //So this version does not appear as new in a search
            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, new DateTime(2050, 05, 03)).RunAsync(subscription.Id);
                Assert.AreEqual(0, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(0, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);
            }

            //Create a previous version which prevents subscriber from seing the card
            using (var dbContext = new MemCheckDbContext(db))
            {
                var updateRequest = UpdateCardHelper.RequestForVisibilityChange(card, cardCreator.AsArray());
                await new UpdateCard(dbContext.AsCallContext(), new DateTime(2050, 05, 02)).RunAsync(updateRequest);
            }

            //Delete the card
            using (var dbContext = new MemCheckDbContext(db))
            {
                var deletionRequest = new DeleteCards.Request(cardCreator, card.Id.AsArray());
                await new DeleteCards(dbContext.AsCallContext()).RunAsync(deletionRequest);
            }

            var runDate = new DateTime(2050, 05, 03);

            //Now the card must be reported as disappeard
            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 100, runDate).RunAsync(subscription.Id);
                Assert.AreEqual(0, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(0, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserAllowedToView);
                Assert.AreEqual(0, searchResult.CardsNotFoundAnymore_Deleted_UserAllowedToView.Length);
                Assert.AreEqual(0, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserNotAllowedToView);
                Assert.AreEqual(1, searchResult.CountOfCardsNotFoundAnymore_Deleted_UserNotAllowedToView);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(runDate, dbContext.SearchSubscriptions.Single(s => s.Id == subscription.Id).LastRunUtcDate);
        }