public async Task TestSearchText()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            var text             = RandomHelper.String();
            var subscriptionName = RandomHelper.String();

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new SubscribeToSearch.Request(userId, Guid.Empty, subscriptionName, text, Array.Empty <Guid>(), Array.Empty <Guid>());
                await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(request);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var subscription = await dbContext.SearchSubscriptions
                                   .Include(subscription => subscription.ExcludedTags)
                                   .Include(subscription => subscription.RequiredTags)
                                   .SingleAsync();

                Assert.AreEqual(userId, subscription.UserId);
                Assert.AreEqual(subscriptionName, subscription.Name);
                Assert.AreEqual(Guid.Empty, subscription.ExcludedDeck);
                Assert.AreEqual(text, subscription.RequiredText);
                Assert.AreEqual(0, subscription.RequiredTags.Count());
                Assert.IsFalse(subscription.ExcludeAllTags);
                Assert.AreEqual(0, subscription.ExcludedTags !.Count());
            }
        }
        public async Task TestSearchWithoutTag()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            Guid tagId;

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var user = await dbContext.Users.SingleAsync();

                tagId = (await new CreateTag(dbContext.AsCallContext()).RunAsync(new CreateTag.Request(user.Id, RandomHelper.String(), ""))).TagId;
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new SubscribeToSearch.Request(userId, Guid.Empty, RandomHelper.String(), "", Array.Empty <Guid>(), new Guid[] { tagId });
                await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(request);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var subscription = await dbContext.SearchSubscriptions
                                   .Include(subscription => subscription.ExcludedTags)
                                   .Include(subscription => subscription.RequiredTags)
                                   .SingleAsync();

                Assert.AreEqual(userId, subscription.UserId);
                Assert.AreEqual(Guid.Empty, subscription.ExcludedDeck);
                Assert.AreEqual("", subscription.RequiredText);
                Assert.AreEqual(0, subscription.RequiredTags.Count());
                Assert.IsFalse(subscription.ExcludeAllTags);
                Assert.AreEqual(tagId, subscription.ExcludedTags.First().TagId);
            }
        }
        public async Task TestBadExcludedTag()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            using var dbContext = new MemCheckDbContext(testDB);
            var request = new SubscribeToSearch.Request(userId, Guid.Empty, RandomHelper.String(), "", Array.Empty <Guid>(), new Guid[] { Guid.NewGuid() });
            await Assert.ThrowsExceptionAsync <RequestInputException>(async() => await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(request));
        }
        public async Task TestTooManySubscriptions()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            using (var dbContext = new MemCheckDbContext(testDB))
                for (int i = 0; i < SubscribeToSearch.Request.MaxSubscriptionCount; i++)
                {
                    await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(new SubscribeToSearch.Request(userId, Guid.Empty, RandomHelper.String(), "", Array.Empty <Guid>(), Array.Empty <Guid>()));
                }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new SubscribeToSearch.Request(userId, Guid.Empty, RandomHelper.String(), "", Array.Empty <Guid>(), Array.Empty <Guid>());
                await Assert.ThrowsExceptionAsync <RequestInputException>(async() => await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(request));
            }
        }
示例#5
0
        public async Task CascadeDeletion()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            Guid tagId1;

            using (var dbContext = new MemCheckDbContext(db))
                tagId1 = (await new CreateTag(dbContext.AsCallContext()).RunAsync(new CreateTag.Request(user, RandomHelper.String(), ""))).TagId;

            await CardHelper.CreateAsync(db, user, tagIds : tagId1.AsArray());

            await CardHelper.CreateAsync(db, user);

            await CardHelper.CreateAsync(db, user, tagIds : tagId1.AsArray());

            Guid subscriptionId;

            using (var dbContext = new MemCheckDbContext(db))
            {
                var tagId2  = (await new CreateTag(dbContext.AsCallContext()).RunAsync(new CreateTag.Request(user, RandomHelper.String(), ""))).TagId;
                var tagId3  = (await new CreateTag(dbContext.AsCallContext()).RunAsync(new CreateTag.Request(user, RandomHelper.String(), ""))).TagId;
                var request = new SubscribeToSearch.Request(user, Guid.Empty, RandomHelper.String(), "", tagId1.AsArray(), new[] { tagId2, tagId3 });
                subscriptionId = (await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(request)).SearchId;
            }

            using (var dbContext = new MemCheckDbContext(db))
                await new UserSearchNotifier(dbContext.AsCallContext(), 10, new DateTime(2050, 05, 01)).RunAsync(subscriptionId);

            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.AreEqual(2, dbContext.CardsInSearchResults.Count(c => c.SearchSubscriptionId == subscriptionId));
                Assert.AreEqual(1, dbContext.RequiredTagInSearchSubscriptions.Count(c => c.SearchSubscriptionId == subscriptionId));
                Assert.AreEqual(2, dbContext.ExcludedTagInSearchSubscriptions.Count(c => c.SearchSubscriptionId == subscriptionId));
            }

            using (var dbContext = new MemCheckDbContext(db))
                await new DeleteSearchSubscription(dbContext.AsCallContext()).RunAsync(new DeleteSearchSubscription.Request(user, subscriptionId));

            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.AreEqual(0, dbContext.CardsInSearchResults.Count(c => c.SearchSubscriptionId == subscriptionId));
                Assert.AreEqual(0, dbContext.RequiredTagInSearchSubscriptions.Count(c => c.SearchSubscriptionId == subscriptionId));
                Assert.AreEqual(0, dbContext.ExcludedTagInSearchSubscriptions.Count(c => c.SearchSubscriptionId == subscriptionId));
            }
        }
        public async Task TestSearchWithSameExcludedTagTwice()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var userId = await UserHelper.CreateInDbAsync(testDB);

            Guid tagId;

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var user = await dbContext.Users.SingleAsync();

                tagId = (await new CreateTag(dbContext.AsCallContext()).RunAsync(new CreateTag.Request(user.Id, RandomHelper.String(), ""))).TagId;
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new SubscribeToSearch.Request(userId, Guid.Empty, RandomHelper.String(), "", Array.Empty <Guid>(), new Guid[] { tagId, tagId });
                await Assert.ThrowsExceptionAsync <RequestInputException>(async() => await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(request));
            }
        }
        public async Task MoreNewFoundThanMaxReported()
        {
            var db = DbHelper.GetEmptyTestDB();

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

            var language = await CardLanguagHelper.CreateAsync(db);

            for (int i = 0; i < SearchCards.Request.MaxPageSize * 2; i++)
            {
                await CardHelper.CreateAsync(db, user, language : language);
            }
            var card = await CardHelper.CreateAsync(db, user, language : language);

            Guid subscriptionId;

            using (var dbContext = new MemCheckDbContext(db))
            {
                var subscriberRequest = new SubscribeToSearch.Request(user, Guid.Empty, RandomHelper.String(), "", Array.Empty <Guid>(), Array.Empty <Guid>());
                subscriptionId = (await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(subscriberRequest)).SearchId;
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 2, new DateTime(2050, 05, 01)).RunAsync(subscriptionId);
                Assert.AreEqual(SearchCards.Request.MaxPageSize * 2 + 1, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(2, 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 deletionDate = new DateTime(2050, 05, 02);

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

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

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 2, runDate).RunAsync(subscriptionId);
                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.IsNotNull(deletedCard.FrontSide);
                Assert.AreEqual(card.FrontSide, deletedCard.FrontSide !);
                Assert.AreEqual(userName, deletedCard.DeletionAuthor);
                Assert.IsTrue(deletedCard.CardIsViewable);
                Assert.AreEqual(deletionDate, deletedCard.DeletionUtcDate);
                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 == subscriptionId).LastRunUtcDate);
        }
        public async Task NewAndNotAnymoreToReport()
        {
            var db = DbHelper.GetEmptyTestDB();

            var user = await UserHelper.CreateInDbAsync(db);

            var language = await CardLanguagHelper.CreateAsync(db);

            var ignoredTag = await TagHelper.CreateAsync(db);

            var requiredTag1 = await TagHelper.CreateAsync(db);

            var requiredTag2 = await TagHelper.CreateAsync(db);

            var excludedTag = await TagHelper.CreateAsync(db);

            var card1 = await CardHelper.CreateAsync(db, user, language : language, tagIds : new[] { ignoredTag, requiredTag1, requiredTag2, excludedTag });

            var card2 = await CardHelper.CreateAsync(db, user, language : language, tagIds : new[] { ignoredTag, requiredTag1, requiredTag2 });

            var card3 = await CardHelper.CreateAsync(db, user, language : language, tagIds : new[] { ignoredTag });

            var card4 = await CardHelper.CreateAsync(db, user, language : language, tagIds : new[] { ignoredTag });

            Guid subscriptionId;

            using (var dbContext = new MemCheckDbContext(db))
            {
                var subscriberRequest = new SubscribeToSearch.Request(user, Guid.Empty, RandomHelper.String(), "", new[] { requiredTag1, requiredTag2 }, new[] { excludedTag });
                subscriptionId = (await new SubscribeToSearch(dbContext.AsCallContext()).RunAsync(subscriberRequest)).SearchId;
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 10, new DateTime(2050, 05, 01)).RunAsync(subscriptionId);
                Assert.AreEqual(1, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(1, searchResult.NewlyFoundCards.Length);
                Assert.AreEqual(card2.Id, searchResult.NewlyFoundCards.Single().CardId);
                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))
            {
                var updateDate = new DateTime(2050, 05, 02);
                await new UpdateCard(dbContext.AsCallContext(), updateDate).RunAsync(UpdateCardHelper.RequestForTagChange(card1, new[] { ignoredTag, requiredTag1, requiredTag2 }));
                await new UpdateCard(dbContext.AsCallContext(), updateDate).RunAsync(UpdateCardHelper.RequestForTagChange(card2, new[] { requiredTag1, requiredTag2, excludedTag }));
                await new UpdateCard(dbContext.AsCallContext(), updateDate).RunAsync(UpdateCardHelper.RequestForTagChange(card3, new[] { requiredTag1 }));
                await new UpdateCard(dbContext.AsCallContext(), new DateTime(2050, 05, 03)).RunAsync(UpdateCardHelper.RequestForTagChange(card3, new[] { requiredTag1, requiredTag2 }));
                await new UpdateCard(dbContext.AsCallContext(), updateDate).RunAsync(UpdateCardHelper.RequestForTagChange(card4, new[] { requiredTag1 }));
            }

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

            using (var dbContext = new MemCheckDbContext(db))
            {
                var searchResult = await new UserSearchNotifier(dbContext.AsCallContext(), 55, runDate).RunAsync(subscriptionId);
                Assert.AreEqual(2, searchResult.TotalNewlyFoundCardCount);
                Assert.AreEqual(2, searchResult.NewlyFoundCards.Length);
                Assert.IsTrue(searchResult.NewlyFoundCards.Any(c => c.CardId == card1.Id));
                Assert.IsTrue(searchResult.NewlyFoundCards.Any(c => c.CardId == card3.Id));
                Assert.AreEqual(1, searchResult.CountOfCardsNotFoundAnymore_StillExists_UserAllowedToView);
                Assert.AreEqual(1, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Length);
                Assert.AreEqual(card2.Id, searchResult.CardsNotFoundAnymore_StillExists_UserAllowedToView.Single().CardId);
                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 == subscriptionId).LastRunUtcDate);
        }