public async Task MoveToSameHeap()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var card = await CardHelper.CreateAsync(db, user);

            var lastLearnTime = RandomHelper.Date();
            await DeckHelper.AddCardAsync(db, deck, card.Id, heap : 1, lastLearnUtcTime : lastLearnTime);

            using (var dbContext = new MemCheckDbContext(db))
                await new MoveCardsToHeap(dbContext.AsCallContext()).RunAsync(new MoveCardsToHeap.Request(user, deck, 1, card.Id.AsArray()));

            using (var dbContext = new MemCheckDbContext(db))
            {
                var cardInDeck = dbContext.CardsInDecks.Single();
                Assert.AreEqual(1, cardInDeck.CurrentHeap);
                Assert.AreEqual(lastLearnTime, cardInDeck.LastLearnUtcTime);
                Assert.AreEqual(lastLearnTime.AddDays(1), cardInDeck.ExpiryUtcTime);
                Assert.AreEqual(1, cardInDeck.NbTimesInNotLearnedHeap);
                Assert.AreEqual(1, cardInDeck.BiggestHeapReached);
            }
        }
Example #2
0
        public async Task CardWithPreviousVersion()
        {
            var db       = DbHelper.GetEmptyTestDB();
            var language = await CardLanguagHelper.CreateAsync(db);

            var firstVersionCreatorId = await UserHelper.CreateInDbAsync(db);

            var firstVersionDate = RandomHelper.Date();
            var card             = await CardHelper.CreateAsync(db, firstVersionCreatorId, language : language, versionDate : firstVersionDate);

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

            var lastVersionDate        = RandomHelper.Date();
            var lastVersionDescription = RandomHelper.String();
            var lastVersionFrontSide   = RandomHelper.String();

            using (var dbContext = new MemCheckDbContext(db))
                await new UpdateCard(dbContext.AsCallContext(), lastVersionDate).RunAsync(UpdateCardHelper.RequestForFrontSideChange(card, lastVersionFrontSide, versionCreator: lastVersionCreatorId, versionDescription: lastVersionDescription));

            var otherUserId = await UserHelper.CreateInDbAsync(db);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var loaded = await new GetCardForEdit(dbContext.AsCallContext()).RunAsync(new GetCardForEdit.Request(otherUserId, card.Id));

                Assert.AreEqual(firstVersionDate, loaded.FirstVersionUtcDate);
                Assert.AreEqual(lastVersionDate, loaded.LastVersionUtcDate);
                Assert.AreEqual(lastVersionCreatorName, loaded.LastVersionCreatorName);
                Assert.AreEqual(lastVersionDescription, loaded.LastVersionDescription);
                Assert.AreEqual(lastVersionFrontSide, loaded.FrontSide);
            }
        }
Example #3
0
        public async Task Complex()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var tag1 = await TagHelper.CreateAsync(db);

            var card1 = await CardHelper.CreateAsync(db, user, tagIds : tag1.AsArray());

            await DeckHelper.AddCardAsync(db, deck, card1.Id);

            var tag2 = await TagHelper.CreateAsync(db);

            var card2 = await CardHelper.CreateAsync(db, user, tagIds : tag2.AsArray());

            await DeckHelper.AddCardAsync(db, deck, card2.Id);

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

            await DeckHelper.AddCardAsync(db, deck, card3.Id);

            var card4 = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddCardAsync(db, deck, card4.Id);

            using var dbContext = new MemCheckDbContext(db);
            var request = new GetTagsOfDeck.Request(user, deck);
            var result  = await new GetTagsOfDeck(dbContext).RunAsync(request);

            Assert.AreEqual(2, result.Count());
            Assert.IsTrue(result.Any(t => t.TagId == tag1));
            Assert.IsTrue(result.Any(t => t.TagId == tag2));
        }
Example #4
0
        public async Task Ratings()
        {
            var db         = DbHelper.GetEmptyTestDB();
            var loggedUser = await UserHelper.CreateInDbAsync(db);

            var userToDelete = await UserHelper.CreateInDbAsync(db);

            var card = await CardHelper.CreateAsync(db, userToDelete);

            using (var dbContext = new MemCheckDbContext(db))
            {
                await new SetCardRating(dbContext.AsCallContext()).RunAsync(new SetCardRating.Request(loggedUser, card.Id, 3));
                await new SetCardRating(dbContext.AsCallContext()).RunAsync(new SetCardRating.Request(userToDelete, card.Id, 3));
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                using var userManager = UserHelper.GetUserManager(dbContext);
                await new DeleteUserAccount(dbContext.AsCallContext(new TestRoleChecker(loggedUser)), userManager).RunAsync(new DeleteUserAccount.Request(loggedUser, userToDelete));
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.IsFalse(await dbContext.UserCardRatings.AnyAsync(rating => rating.UserId == userToDelete));
                Assert.IsTrue(await dbContext.UserCardRatings.AnyAsync(rating => rating.UserId == loggedUser));
            }
        }
Example #5
0
        public async Task PrivateCardDeleted()
        {
            var db         = DbHelper.GetEmptyTestDB();
            var loggedUser = await UserHelper.CreateInDbAsync(db);

            var language = await CardLanguagHelper.CreateAsync(db);

            var userToDelete = await UserHelper.CreateInDbAsync(db);

            var card = await CardHelper.CreateAsync(db, userToDelete, language : language);                                                  //Public

            await UpdateCardHelper.RunAsync(db, UpdateCardHelper.RequestForVisibilityChange(card, userWithViewIds: userToDelete.AsArray())); //Private

            using (var dbContext = new MemCheckDbContext(db))
            {
                using var userManager = UserHelper.GetUserManager(dbContext);
                await new DeleteUserAccount(dbContext.AsCallContext(new TestRoleChecker(loggedUser)), userManager).RunAsync(new DeleteUserAccount.Request(loggedUser, userToDelete));
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.IsFalse(dbContext.Cards.Any());
                Assert.IsFalse(dbContext.CardPreviousVersions.Any());
            }
        }
        public async Task TwoCardsWithLanguages()
        {
            var db     = DbHelper.GetEmptyTestDB();
            var french = await CardLanguagHelper.CreateAsync(db, "Français");

            var otherLanguage = await CardLanguagHelper.CreateAsync(db, RandomHelper.String());

            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var frenchCreatedCard = await CardHelper.CreateAsync(db, user, language : french);

            var otherLanguageCard = await CardHelper.CreateAsync(db, user, language : otherLanguage);

            await DeckHelper.AddNeverLearntCardAsync(db, deck, frenchCreatedCard.Id);

            await DeckHelper.AddNeverLearntCardAsync(db, deck, otherLanguageCard.Id);

            using var dbContext = new MemCheckDbContext(db);
            var request = new GetUnknownCardsToLearn.Request(user, deck, Array.Empty <Guid>(), Array.Empty <Guid>(), 10);
            var cards   = await new GetUnknownCardsToLearn(dbContext.AsCallContext()).RunAsync(request);

            Assert.IsTrue(cards.Cards.Single(card => card.CardId == frenchCreatedCard.Id).IsInFrench);
            Assert.IsFalse(cards.Cards.Single(card => card.CardId == otherLanguageCard.Id).IsInFrench);
        }
Example #7
0
        public async Task UsedInCards()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var name               = RandomHelper.String();
            var source             = RandomHelper.String();
            var description        = RandomHelper.String();
            var uploadDate         = RandomHelper.Date();
            var versionDescription = RandomHelper.String();
            var image              = await ImageHelper.CreateAsync(db, user, name : name, source : source, description : description, lastChangeUtcDate : uploadDate, versionDescription : versionDescription);

            var otherImage = await ImageHelper.CreateAsync(db, user);

            await CardHelper.CreateAsync(db, user, frontSideImages : new[] { image, otherImage });

            await CardHelper.CreateAsync(db, user, frontSideImages : new[] { image });

            await CardHelper.CreateAsync(db, user, frontSideImages : new[] { otherImage });

            using var dbContext = new MemCheckDbContext(db);
            var loaded = await new GetImageInfoFromId(dbContext.AsCallContext()).RunAsync(new GetImageInfoFromId.Request(image));

            Assert.AreEqual(user, loaded.Owner.Id);
            Assert.AreEqual(name, loaded.Name);
            Assert.AreEqual(description, loaded.Description);
            Assert.AreEqual(source, loaded.Source);
            Assert.AreEqual(2, loaded.CardCount);
            Assert.AreEqual(uploadDate, loaded.InitialUploadUtcDate);
            Assert.AreEqual(uploadDate, loaded.LastChangeUtcDate);
            Assert.AreEqual(versionDescription, loaded.CurrentVersionDescription);
        }
Example #8
0
        public async Task LearnMoveToUnknown()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var card = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddCardAsync(db, deck, card.Id, heap : 4);

            var runTime = RandomHelper.Date();

            using (var dbContext = new MemCheckDbContext(db))
                await new MoveCardToHeap(dbContext.AsCallContext(), runTime).RunAsync(new MoveCardToHeap.Request(user, deck, card.Id, CardInDeck.UnknownHeap));

            using (var dbContext = new MemCheckDbContext(db))
            {
                var cardInDeck = dbContext.CardsInDecks.Single();
                Assert.AreEqual(CardInDeck.UnknownHeap, cardInDeck.CurrentHeap);
                Assert.AreEqual(runTime, cardInDeck.LastLearnUtcTime);
                Assert.AreEqual(2, cardInDeck.NbTimesInNotLearnedHeap);
                Assert.AreEqual(4, cardInDeck.BiggestHeapReached);
                Assert.AreEqual(DateTime.MinValue, cardInDeck.ExpiryUtcTime);
            }
        }
Example #9
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 #10
0
        public async Task LearnMoveUp()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user, algorithmId : UnitTestsHeapingAlgorithm.ID);

            var card = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddCardAsync(db, deck, card.Id, heap : 1);

            var runTime = RandomHelper.Date();

            using (var dbContext = new MemCheckDbContext(db))
                await new MoveCardToHeap(dbContext.AsCallContext(), runTime).RunAsync(new MoveCardToHeap.Request(user, deck, card.Id, 2));

            using (var dbContext = new MemCheckDbContext(db))
            {
                var cardInDeck = dbContext.CardsInDecks.Single();
                Assert.AreEqual(2, cardInDeck.CurrentHeap);
                Assert.AreEqual(runTime, cardInDeck.LastLearnUtcTime);
                Assert.AreEqual(1, cardInDeck.NbTimesInNotLearnedHeap);
                Assert.AreEqual(2, cardInDeck.BiggestHeapReached);
                Assert.AreEqual(runTime.AddDays(2), cardInDeck.ExpiryUtcTime);
            }
        }
Example #11
0
        public async Task LearnMoveToSameHeap()
        {
            //This could happen due to multiple sessions by the user

            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var card = await CardHelper.CreateAsync(db, user);

            var initialTime = RandomHelper.Date();
            await DeckHelper.AddCardAsync(db, deck, card.Id, heap : 1, lastLearnUtcTime : initialTime);

            using (var dbContext = new MemCheckDbContext(db))
                await new MoveCardToHeap(dbContext.AsCallContext(), RandomHelper.Date(initialTime)).RunAsync(new MoveCardToHeap.Request(user, deck, card.Id, 1));

            using (var dbContext = new MemCheckDbContext(db))
            {
                var cardInDeck = dbContext.CardsInDecks.Single();
                Assert.AreEqual(1, cardInDeck.CurrentHeap);
                Assert.AreEqual(initialTime, cardInDeck.LastLearnUtcTime);
                Assert.AreEqual(1, cardInDeck.NbTimesInNotLearnedHeap);
                Assert.AreEqual(1, cardInDeck.BiggestHeapReached);
                Assert.AreEqual(initialTime.AddDays(1), cardInDeck.ExpiryUtcTime);
            }
        }
Example #12
0
        public async Task CardWithoutPreviousVersion_ToBeNotified_UsingApplicationDelete()
        {
            var db   = GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var card = await CardHelper.CreateAsync(db, user, new DateTime(2020, 11, 1));

            await CardSubscriptionHelper.CreateAsync(db, user, card.Id, new DateTime(2020, 11, 1));

            await DeleteCardAsync(db, user, card.Id, new DateTime(2020, 11, 2));

            var now = new DateTime(2020, 11, 3);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var notifier = new UserCardDeletionsNotifier(dbContext.AsCallContext(), now);

                var deletions = await notifier.RunAsync(user);

                Assert.AreEqual(1, deletions.Length);
                Assert.IsTrue(deletions[0].CardIsViewable);
                Assert.AreEqual(card.FrontSide, deletions[0].FrontSide);
                Assert.AreEqual(DeletionDescription, deletions[0].DeletionDescription);
            }

            using (var dbContext = new MemCheckDbContext(db))
                Assert.AreEqual(now, dbContext.CardNotifications.Single(cn => cn.CardId == card.Id && cn.UserId == user).LastNotificationUtcDate);
        }
Example #13
0
        public async Task FailIfNotCreatorOfCurrentVersion()
        {
            var db = DbHelper.GetEmptyTestDB();
            var firstVersionCreator = await UserHelper.CreateInDbAsync(db);

            var languageId = await CardLanguagHelper.CreateAsync(db);

            var card = await CardHelper.CreateAsync(db, firstVersionCreator, language : languageId);

            var lastVersionCreator = await UserHelper.CreateInDbAsync(db);

            using (var dbContext = new MemCheckDbContext(db))
                await new UpdateCard(dbContext.AsCallContext()).RunAsync(UpdateCardHelper.RequestForFrontSideChange(card, RandomHelper.String(), lastVersionCreator));
            using (var dbContext = new MemCheckDbContext(db))
            {
                var deleter = new DeleteCards(dbContext.AsCallContext(new TestLocalizer(new System.Collections.Generic.KeyValuePair <string, string>("YouAreNotTheCreatorOfCurrentVersion", "YouAreNotTheCreatorOfCurrentVersion"))));
                var e       = await Assert.ThrowsExceptionAsync <RequestInputException>(async() => await deleter.RunAsync(new DeleteCards.Request(firstVersionCreator, card.Id.AsArray())));

                StringAssert.Contains(e.Message, "YouAreNotTheCreatorOfCurrentVersion");
            }
            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.AreEqual(card.Id, dbContext.Cards.Single().Id);
                Assert.AreEqual(card.Id, dbContext.CardPreviousVersions.Single().Card);
            }
        }
Example #14
0
        public async Task MoveToZeroTwice()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var card = await CardHelper.CreateAsync(db, user);

            var addTime = RandomHelper.Date();
            await DeckHelper.AddCardAsync(db, deck, card.Id, heap : 8, lastLearnUtcTime : addTime);

            using (var dbContext = new MemCheckDbContext(db))
                await new MoveCardsToHeap(dbContext.AsCallContext()).RunAsync(new MoveCardsToHeap.Request(user, deck, CardInDeck.UnknownHeap, card.Id.AsArray()));

            for (int i = 0; i < 2; i++)
            {
                using (var dbContext = new MemCheckDbContext(db))
                {
                    var loadedCard = dbContext.CardsInDecks.Single();
                    Assert.AreEqual(CardInDeck.UnknownHeap, loadedCard.CurrentHeap);
                    Assert.AreEqual(addTime, loadedCard.LastLearnUtcTime);
                    Assert.AreEqual(DateTime.MinValue, loadedCard.ExpiryUtcTime);
                    Assert.AreEqual(2, loadedCard.NbTimesInNotLearnedHeap);
                    Assert.AreEqual(8, loadedCard.BiggestHeapReached);
                }
            }
        }
        public async Task UnknownCardsLearnt_CheckOrder()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user, algorithmId : DeveloperHeapingAlgorithm.ID);

            const int cardCount = 100;

            for (int i = 0; i < cardCount; i++)
            {
                var card = await CardHelper.CreateAsync(db, user);

                await DeckHelper.AddCardAsync(db, deck, card.Id, 0);
            }
            using var dbContext = new MemCheckDbContext(db);
            var request = new GetUnknownCardsToLearn.Request(user, deck, Array.Empty <Guid>(), Array.Empty <Guid>(), cardCount);
            var cards   = (await new GetUnknownCardsToLearn(dbContext.AsCallContext()).RunAsync(request)).Cards.ToImmutableArray();

            Assert.AreEqual(cardCount, cards.Length);
            for (int i = 1; i < cards.Length; i++)
            {
                Assert.IsTrue(cards[i].LastLearnUtcTime >= cards[i - 1].LastLearnUtcTime);
            }
        }
        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 OrderingOfNeverLearnt()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user, algorithmId : DefaultHeapingAlgorithm.ID);

            var randomDate     = RandomHelper.Date();
            var cardAddedLater = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddNeverLearntCardAsync(db, deck, cardAddedLater.Id, randomDate.AddDays(1));

            for (int i = 0; i < 9; i++)
            {
                var card = await CardHelper.CreateAsync(db, user);

                await DeckHelper.AddNeverLearntCardAsync(db, deck, card.Id, randomDate);
            }

            using var dbContext = new MemCheckDbContext(db);
            var request         = new GetUnknownCardsToLearn.Request(user, deck, Array.Empty <Guid>(), Array.Empty <Guid>(), 3);
            var downloadedCards = (await new GetUnknownCardsToLearn(dbContext.AsCallContext()).RunAsync(request)).Cards.Select(c => c.CardId).ToImmutableHashSet();

            Assert.IsFalse(downloadedCards.Contains(cardAddedLater.Id));
        }
Example #18
0
        public async Task CardWithoutPreviousVersion_ToBeNotified()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var user   = await UserHelper.CreateInDbAsync(testDB);

            var card = await CardHelper.CreateAsync(testDB, user, new DateTime(2020, 11, 2));

            await CardSubscriptionHelper.CreateAsync(testDB, user, card.Id, new DateTime(2020, 11, 1));

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var versions = await new UserCardVersionsNotifier(dbContext.AsCallContext(), new DateTime(2020, 11, 2)).RunAsync(user);
                Assert.AreEqual(1, versions.Length);
                Assert.AreEqual(card.Id, versions[0].CardId);
                Assert.IsTrue(versions[0].CardIsViewable);
                Assert.AreEqual(card.FrontSide, versions[0].FrontSide);
                Assert.AreEqual(card.VersionDescription, versions[0].VersionDescription);
                Assert.IsNull(versions[0].VersionIdOnLastNotification);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var notif = dbContext.CardNotifications.Single(cn => cn.CardId == card.Id && cn.UserId == user);
                Assert.IsTrue(notif.LastNotificationUtcDate > new DateTime(2020, 11, 1));
            }
        }
        public async Task Complex()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user);

            var card1 = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddCardAsync(db, deck, card1.Id);

            var card2 = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddCardAsync(db, deck, card2.Id);

            var card3 = await CardHelper.CreateAsync(db, user);

            await DeckHelper.AddCardAsync(db, deck, card3.Id);

            using (var dbContext = new MemCheckDbContext(db))
                await new RemoveCardFromDeck(dbContext.AsCallContext()).RunAsync(new RemoveCardFromDeck.Request(user, deck, card2.Id));

            await DeckHelper.CheckDeckDoesNotContainCard(db, deck, card2.Id);

            await DeckHelper.CheckDeckContainsCards(db, deck, card1.Id, card3.Id);
        }
Example #20
0
        public async Task CardWithPreviousVersions_NotToBeNotified_BecauseLastNotifAfterVersion()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var user1  = await UserHelper.CreateInDbAsync(testDB);

            var card = await CardHelper.CreateAsync(testDB, user1, new DateTime(2020, 11, 3));

            var user2 = await UserHelper.CreateInDbAsync(testDB);

            var previousVersion1 = await CreateCardPreviousVersionAsync(testDB, user2, card.Id, new DateTime(2020, 11, 2));

            await CreatePreviousVersionPreviousVersionAsync(testDB, user2, previousVersion1, new DateTime(2020, 11, 1));

            var lastNotificationDate = new DateTime(2020, 11, 3);
            await CardSubscriptionHelper.CreateAsync(testDB, user1, card.Id, lastNotificationDate);

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var versions = await new UserCardVersionsNotifier(dbContext.AsCallContext(), new DateTime(2020, 11, 5)).RunAsync(user1);
                Assert.AreEqual(0, versions.Length);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var notif = dbContext.CardNotifications.Single(cn => cn.CardId == card.Id && cn.UserId == user1);
                Assert.AreEqual(lastNotificationDate, notif.LastNotificationUtcDate);
            }
        }
Example #21
0
        public async Task DoesNotDeleteOtherUserDeck()
        {
            var db         = DbHelper.GetEmptyTestDB();
            var loggedUser = await UserHelper.CreateInDbAsync(db);

            var deckNotToDelete = await DeckHelper.CreateAsync(db, loggedUser);

            var userToDelete = await UserHelper.CreateInDbAsync(db);

            var deckToDelete = await DeckHelper.CreateAsync(db, userToDelete);

            var card = await CardHelper.CreateAsync(db, userToDelete);

            await DeckHelper.AddCardAsync(db, deckToDelete, card.Id);

            await DeckHelper.AddCardAsync(db, deckNotToDelete, card.Id);

            using (var dbContext = new MemCheckDbContext(db))
            {
                using var userManager = UserHelper.GetUserManager(dbContext);
                await new DeleteUserAccount(dbContext.AsCallContext(new TestRoleChecker(loggedUser)), userManager).RunAsync(new DeleteUserAccount.Request(loggedUser, userToDelete));
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.IsFalse(await dbContext.Decks.AnyAsync(deck => deck.Id == deckToDelete));
                Assert.IsFalse(await dbContext.CardsInDecks.AnyAsync(cardInDeck => cardInDeck.Deck.Id == deckToDelete));

                Assert.IsTrue(await dbContext.Decks.AnyAsync(deck => deck.Id == deckNotToDelete));
                Assert.IsTrue(await dbContext.CardsInDecks.AnyAsync(cardInDeck => cardInDeck.Deck.Id == deckNotToDelete));
            }
        }
Example #22
0
        public async Task CardWithPreviousVersions_ToBeNotified_LastNotifBeforePreviousVersionCreation()
        {
            var testDB = DbHelper.GetEmptyTestDB();
            var user1  = await UserHelper.CreateInDbAsync(testDB);

            var card = await CardHelper.CreateAsync(testDB, user1, new DateTime(2020, 11, 5));

            var user2 = await UserHelper.CreateInDbAsync(testDB);

            var previousVersion1 = await CreateCardPreviousVersionAsync(testDB, user2, card.Id, new DateTime(2020, 11, 3));

            var oldestVersion = await CreatePreviousVersionPreviousVersionAsync(testDB, user2, previousVersion1, new DateTime(2020, 11, 1));

            await CardSubscriptionHelper.CreateAsync(testDB, user1, card.Id, new DateTime(2020, 11, 2));

            var now = new DateTime(2020, 11, 5);

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var versions = await new UserCardVersionsNotifier(dbContext.AsCallContext(), now).RunAsync(user1);
                Assert.AreEqual(1, versions.Length);
                Assert.AreEqual(card.Id, versions[0].CardId);
                Assert.IsTrue(versions[0].CardIsViewable);
                Assert.AreEqual(oldestVersion.Id, versions[0].VersionIdOnLastNotification);
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var notif = dbContext.CardNotifications.Single(cn => cn.CardId == card.Id && cn.UserId == user1);
                Assert.AreEqual(now, notif.LastNotificationUtcDate);
            }
        }
Example #23
0
        public async Task NonPrivateCardNotDeleted_UserOwnerOfCurrentButNotPrevious()
        {
            var db             = DbHelper.GetEmptyTestDB();
            var loggedUserName = RandomHelper.String();
            var loggedUser     = await UserHelper.CreateInDbAsync(db, userName : loggedUserName);

            var language = await CardLanguagHelper.CreateAsync(db);

            var userToDelete = await UserHelper.CreateInDbAsync(db);

            var card = await CardHelper.CreateAsync(db, loggedUser, language : language);

            await UpdateCardHelper.RunAsync(db, UpdateCardHelper.RequestForFrontSideChange(card, RandomHelper.String(), versionCreator: userToDelete));

            using (var dbContext = new MemCheckDbContext(db))
            {
                using var userManager = UserHelper.GetUserManager(dbContext);
                await new DeleteUserAccount(dbContext.AsCallContext(new TestRoleChecker(loggedUser)), userManager).RunAsync(new DeleteUserAccount.Request(loggedUser, userToDelete));
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                Assert.AreEqual(DeleteUserAccount.DeletedUserName, dbContext.Cards.Include(card => card.VersionCreator).Single(card => card.Id == card.Id).VersionCreator.UserName);
                Assert.AreEqual(loggedUserName, dbContext.CardPreviousVersions.Include(cardPreviousVersion => cardPreviousVersion.VersionCreator).Single(cardPreviousVersion => cardPreviousVersion.Card == card.Id).VersionCreator.UserName);
            }
        }
Example #24
0
        public async Task FailIfUserCanNotViewCurrentVersion()
        {
            var db       = DbHelper.GetEmptyTestDB();
            var userName = RandomHelper.String();
            var userId   = await UserHelper.CreateInDbAsync(db, userName : userName);

            var originalVersionDate        = RandomHelper.Date();
            var originalFrontSide          = RandomHelper.String();
            var originalVersionDescription = RandomHelper.String();
            var language = await CardLanguagHelper.CreateAsync(db);

            var card = await CardHelper.CreateAsync(db, userId, originalVersionDate, frontSide : originalFrontSide, language : language, versionDescription : originalVersionDescription);

            var newFrontSide          = RandomHelper.String();
            var newVersionDate        = RandomHelper.Date(originalVersionDate);
            var newVersionDescription = RandomHelper.String();

            using (var dbContext = new MemCheckDbContext(db))
                await new UpdateCard(dbContext.AsCallContext(), newVersionDate).RunAsync(UpdateCardHelper.RequestForVisibilityChange(card, userWithViewIds: userId.AsArray()));
            Guid previousVersionId;

            using (var dbContext = new MemCheckDbContext(db))
                previousVersionId = (await dbContext.CardPreviousVersions.Where(previous => previous.Card == card.Id).SingleAsync()).Id;
            var otherUserId = await UserHelper.CreateInDbAsync(db);

            using (var dbContext = new MemCheckDbContext(db))
                await Assert.ThrowsExceptionAsync <InvalidOperationException>(async() => await new GetCardDiff(dbContext.AsCallContext()).RunAsync(new GetCardDiff.Request(otherUserId, card.Id, previousVersionId)));
        }
Example #25
0
        public async Task ComplexCase()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var registeredCard1 = await CardHelper.CreateAsync(db, user);

            await CardSubscriptionHelper.CreateAsync(db, user, registeredCard1.Id);

            var registeredCard2 = await CardHelper.CreateAsync(db, user);

            await CardSubscriptionHelper.CreateAsync(db, user, registeredCard2.Id);

            var deletedCard = await CardHelper.CreateAsync(db, user);

            await CardSubscriptionHelper.CreateAsync(db, user, deletedCard.Id);

            using (var dbContext = new MemCheckDbContext(db))
                await new DeleteCards(dbContext.AsCallContext()).RunAsync(new DeleteCards.Request(user, deletedCard.Id.AsArray()));

            var nonRegisteredCard = await CardHelper.CreateAsync(db, user);

            using (var dbContext = new MemCheckDbContext(db))
            {
                var result = new CardRegistrationsLoader(dbContext).RunForCardIds(user, new[] { registeredCard1.Id, registeredCard2.Id, deletedCard.Id, nonRegisteredCard.Id });
                Assert.AreEqual(4, result.Count);
                Assert.IsTrue(result[registeredCard1.Id]);
                Assert.IsTrue(result[registeredCard2.Id]);
                Assert.IsTrue(result[deletedCard.Id]);
                Assert.IsFalse(result[nonRegisteredCard.Id]);
            }
        }
Example #26
0
        public async Task Complex()
        {
            var db            = DbHelper.GetEmptyTestDB();
            var language1Name = RandomHelper.String();
            var language1     = await CardLanguagHelper.CreateAsync(db, language1Name);

            var language2Name = RandomHelper.String();
            var language2     = await CardLanguagHelper.CreateAsync(db, language2Name);

            var user = await UserHelper.CreateInDbAsync(db);

            await CardHelper.CreateAsync(db, versionCreatorId : user, language : language1);

            await CardHelper.CreateAsync(db, versionCreatorId : user, language : language1);

            await CardHelper.CreateAsync(db, versionCreatorId : user, language : language1);

            await CardHelper.CreateAsync(db, versionCreatorId : user, language : language2);

            using var dbContext = new MemCheckDbContext(db);
            var result = await new GetAllLanguages(dbContext.AsCallContext()).RunAsync(new GetAllLanguages.Request());

            var resultLang1 = result.Single(l => l.Id == language1);

            Assert.AreEqual(language1Name, resultLang1.Name);
            Assert.AreEqual(3, resultLang1.CardCount);

            var resultLang2 = result.Single(l => l.Id == language2);

            Assert.AreEqual(language2Name, resultLang2.Name);
            Assert.AreEqual(1, resultLang2.CardCount);
        }
        public async Task TestOtherUserCreatesVersion()
        {
            var testDB = DbHelper.GetEmptyTestDB();

            var ownerId = await UserHelper.CreateInDbAsync(testDB);

            var card = await CardHelper.CreateAsync(testDB, ownerId);

            var newVersionCreatorId = await UserHelper.CreateInDbAsync(testDB, subscribeToCardOnEdit : true);

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var request = new PreviousVersionCreator(dbContext);
                await request.RunAsync(card.Id, newVersionCreatorId, RandomHelper.String());

                await dbContext.SaveChangesAsync();
            }

            using (var dbContext = new MemCheckDbContext(testDB))
            {
                var previousVersion = await dbContext.CardPreviousVersions.Where(previous => previous.Card == card.Id).SingleAsync();

                Assert.AreNotEqual(card.Id, previousVersion.Id);
            }
            Assert.IsTrue(await CardSubscriptionHelper.UserIsSubscribedToCardAsync(testDB, newVersionCreatorId, card.Id));
        }
        public async Task CardsNeverLearnt_NotTheSameOrderOnSuccessiveRuns()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user, algorithmId : DefaultHeapingAlgorithm.ID);

            const int cardCount = 100;

            for (int i = 0; i < cardCount; i++)
            {
                var card = await CardHelper.CreateAsync(db, user);

                await DeckHelper.AddNeverLearntCardAsync(db, deck, card.Id);
            }
            using var dbContext = new MemCheckDbContext(db);
            var request       = new GetUnknownCardsToLearn.Request(user, deck, Array.Empty <Guid>(), Array.Empty <Guid>(), cardCount);
            var firstRunCards = (await new GetUnknownCardsToLearn(dbContext.AsCallContext()).RunAsync(request)).Cards.Select(c => c.CardId).ToImmutableArray();

            Assert.AreEqual(cardCount, firstRunCards.Length);
            var secondRunCards = (await new GetUnknownCardsToLearn(dbContext.AsCallContext()).RunAsync(request)).Cards.Select(c => c.CardId).ToImmutableArray();

            Assert.AreEqual(cardCount, secondRunCards.Length);
            var thirdRunCards = (await new GetUnknownCardsToLearn(dbContext.AsCallContext()).RunAsync(request)).Cards.Select(c => c.CardId).ToImmutableArray();

            Assert.AreEqual(cardCount, thirdRunCards.Length);
            Assert.IsFalse(firstRunCards.SequenceEqual(secondRunCards));
            Assert.IsFalse(firstRunCards.SequenceEqual(thirdRunCards));
            Assert.IsFalse(secondRunCards.SequenceEqual(thirdRunCards));
        }
Example #29
0
        public async Task OneDeck()
        {
            var db   = DbHelper.GetEmptyTestDB();
            var user = await UserHelper.CreateInDbAsync(db);

            var deck = await DeckHelper.CreateAsync(db, user, algorithmId : HeapingAlgorithms.DefaultAlgoId);

            var tag1 = await TagHelper.CreateAsync(db);

            var tag2 = await TagHelper.CreateAsync(db);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user, tagIds: tag1.AsArray())).Id, 0);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user)).Id, 0);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user)).Id, 1);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user, tagIds: new[] { tag1, tag2 })).Id, 1);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user)).Id, 2);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user)).Id, 4);

            await DeckHelper.AddCardAsync(db, deck, (await CardHelper.CreateAsync(db, user)).Id, 4);

            using var dbContext = new MemCheckDbContext(db);
            var result     = await new GetUserDecksWithHeapsAndTags(dbContext.AsCallContext()).RunAsync(new GetUserDecksWithHeapsAndTags.Request(user));
            var resultDeck = result.Single();

            Assert.AreEqual(deck, resultDeck.DeckId);
            Assert.IsTrue(resultDeck.Heaps.SequenceEqual(new[] { 0, 1, 2, 4 }));
            Assert.AreEqual(2, resultDeck.Tags.Count());
            Assert.IsTrue(resultDeck.Tags.Any(tag => tag.TagId == tag1));
            Assert.IsTrue(resultDeck.Tags.Any(tag => tag.TagId == tag2));
        }
Example #30
0
        public async Task ReduceVisibility_OtherUserHasView_NoUserHasInDeck_OnlyAuthor()
        {
            var db          = DbHelper.GetEmptyTestDB();
            var cardCreator = await UserHelper.CreateInDbAsync(db);

            var languageId = await CardLanguagHelper.CreateAsync(db);

            var otherUser = await UserHelper.CreateInDbAsync(db);

            var card = await CardHelper.CreateAsync(db, cardCreator, language : languageId, userWithViewIds : new[] { cardCreator, otherUser });

            using (var dbContext = new MemCheckDbContext(db))
            {
                CardVisibilityHelper.CheckUserIsAllowedToViewCards(dbContext, cardCreator, card.Id);
                CardVisibilityHelper.CheckUserIsAllowedToViewCards(dbContext, otherUser, card.Id);
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                var r = UpdateCardHelper.RequestForVisibilityChange(card, cardCreator.AsArray());
                await new UpdateCard(dbContext.AsCallContext()).RunAsync(r);
            }

            using (var dbContext = new MemCheckDbContext(db))
            {
                CardVisibilityHelper.CheckUserIsAllowedToViewCards(dbContext, cardCreator, card.Id);
                Assert.ThrowsException <InvalidOperationException>(() => CardVisibilityHelper.CheckUserIsAllowedToViewCards(dbContext, otherUser, card.Id));
            }
        }