public void ConvertJstBroadcastTimeToSelectedTimeZone_GivenEmptyJstBroadcastTime_SetLocalBroadcastTimeForToday()
        {
            // Arrange
            var sut = new MiruAnimeModel {
                JSTBroadcastTime = null
            };

            // Act
            sut.ConvertJstBroadcastTimeToSelectedTimeZone(It.IsAny <TimeZoneInfo>());

            // Assert
            Assert.True(sut.LocalBroadcastTime == DateTime.Today);
        }
Exemple #2
0
        public void GetDetailedSeasonAnimeListInfo_GivenConnectionIssuesWithGettingAnimeInfo_ReturnsNull()
        {
            using (var mock = AutoMock.GetLoose())
            {
                // Arrange
                var mockContext = new Mock <IMiruDbContext>();
                var date        = new DateTime(2020, 01, 26, 10, 0, 0);
                var testModel   = new MiruAnimeModel
                {
                    Title            = "initial title",
                    Type             = "TV",
                    MalId            = 1L,
                    Broadcast        = "Sundays at 10:00 (JST)",
                    JSTBroadcastTime = date,
                    IsOnWatchingList = false,
                    WatchedEpisodes  = 0,
                    TotalEpisodes    = 20,
                    CurrentlyAiring  = false,
                    ImageURL         = "stays the same",
                    URL            = "same",
                    LocalImagePath = "\\same"
                };
                var data = new List <MiruAnimeModel>
                {
                    testModel,
                }.AsQueryable();

                var seasonAnimeEntryList = new List <AnimeSubEntry>()
                {
                    new AnimeSubEntry()
                    {
                        MalId = 39, Title = "new season entry", Type = "TV", URL = "only value from seasonEntry"
                    }
                };

                var animeEntryList = new List <AnimeListEntry>()
                {
                };

                var cls = SetupMiruDbServiceMock(mockContext, mock, miruDbContext: out IMiruDbContext db, currentUserAnimeEntryList: animeEntryList,
                                                 currentSeasonList: seasonAnimeEntryList, miruAnimeModelDbSetData: data, fakeConnectionIssues: true);

                // Act
                var result = cls.GetDetailedUserAnimeList(db, animeEntryList, true).Result;

                // Assert
                Assert.Null(result);
            }
        }
        public void ParseTimeFromBroadcast_AnimeIsInSenpaiEntriesAndAirdateParseFailsTwice_SetsCorrectBroadcastTimes()
        {
            using (var mock = AutoMock.GetLoose())
            {
                // Arrange
                var      senpaiEntry             = @"{
                                    ""Items"": [
                                                {
                                                    ""MALID"": 40507,
                                                    ""airdate"": ""1337/1/2022 23:30""
                                                }
                                               ]
                                    }";
                var      jpCultureInfo           = CultureInfo.GetCultureInfo("ja-JP");
                string[] formats                 = { "dd/MM/yyyy HH:mm", "d/MM/yyyy HH:mm", "dd/M/yyyy HH:mm", "d/M/yyyy HH:mm" };
                var      deserializedSenpaiEntry = JsonConvert.DeserializeObject <SenpaiEntryModel>(senpaiEntry);
                mock.Mock <IFileSystemService>().Setup(x => x.FileSystem.File.ReadAllText(It.IsAny <string>())).Returns(senpaiEntry);
                string airingAnimeBroadcastInMalFormat = "Mondays at 18:00";
                var    mockFileSystemService           = mock.Create <IFileSystemService>();
                var    sut = new List <MiruAnimeModel>
                {
                    new MiruAnimeModel {
                        Title = "10", Type = "TV", MalId = 40507, Broadcast = airingAnimeBroadcastInMalFormat,
                    },
                };

                // Act
                sut.ParseTimeFromBroadcast(mockFileSystemService);
                var parsedBroadcast             = new DateTime(2020, 01, 20, 18, 0, 0);
                var expectedLocalBroadcastAnime = new MiruAnimeModel()
                {
                    JSTBroadcastTime = parsedBroadcast
                };
                expectedLocalBroadcastAnime.ConvertJstBroadcastTimeToSelectedTimeZone(TimeZoneInfo.Local);

                // Assert
                Assert.False(sut.First().IsOnSenpai);
                Assert.Equal(airingAnimeBroadcastInMalFormat, sut.First().Broadcast);
                Assert.Equal(parsedBroadcast, sut.First().JSTBroadcastTime);
                Assert.Equal(expectedLocalBroadcastAnime.LocalBroadcastTime, sut.First().LocalBroadcastTime);
            }
        }
        public void ParseTimeFromBroadcast_AnimeIsInSenpaiEntriesAndAirdateParseIsSuccessful_SetsCorrectBroadcastTimes()
        {
            using (var mock = AutoMock.GetLoose())
            {
                // Arrange
                var      senpaiEntry             = @"{
                                    ""Items"": [
                                                {
                                                    ""MALID"": 40507,
                                                    ""airdate"": ""13/1/2022 23:30""
                                                }
                                               ]
                                    }";
                var      jpCultureInfo           = CultureInfo.GetCultureInfo("ja-JP");
                string[] formats                 = { "dd/MM/yyyy HH:mm", "d/MM/yyyy HH:mm", "dd/M/yyyy HH:mm", "d/M/yyyy HH:mm" };
                var      deserializedSenpaiEntry = JsonConvert.DeserializeObject <SenpaiEntryModel>(senpaiEntry);
                mock.Mock <IFileSystemService>().Setup(x => x.FileSystem.File.ReadAllText(It.IsAny <string>())).Returns(senpaiEntry);

                var mockFileSystemService = mock.Create <IFileSystemService>();
                var sut = new List <MiruAnimeModel>
                {
                    new MiruAnimeModel {
                        Title = "10", Type = "TV", MalId = 40507, Broadcast = "",
                    },
                };

                // Act
                sut.ParseTimeFromBroadcast(mockFileSystemService);
                var parsed = DateTime.TryParseExact(deserializedSenpaiEntry.Items.First().Airdate, formats, jpCultureInfo, DateTimeStyles.None, out DateTime parsedSenpaiBroadcast);
                var compareLocalBroadcastAnime = new MiruAnimeModel()
                {
                    JSTBroadcastTime = parsedSenpaiBroadcast
                };
                compareLocalBroadcastAnime.ConvertJstBroadcastTimeToSelectedTimeZone(TimeZoneInfo.Local);

                // Assert
                Assert.True(sut.First().IsOnSenpai);
                Assert.Equal(deserializedSenpaiEntry.Items.First().Airdate, sut.First().Broadcast);
                Assert.Equal(parsedSenpaiBroadcast, sut.First().JSTBroadcastTime);
                Assert.Equal(compareLocalBroadcastAnime.LocalBroadcastTime, sut.First().LocalBroadcastTime);
            }
        }
        public void SetAiringAnimeModelData_GivenValidInput_SetsDataCorrectly(AiringStatus airingStatus, string broadcast)
        {
            // Arrange
            var      sut           = new MiruAnimeModel();
            DateTime airedFromDate = new DateTime(2022, 3, 14);
            var      animeInfo     = new Anime()
            {
                MalId     = MAL_ID,
                Broadcast = broadcast,
                Title     = TITLE,
                ImageURL  = IMAGE_URL,
                Type      = TYPE,
                Aired     = new TimePeriod()
                {
                    From = airedFromDate
                }
            };
            var animeListEntry = new AnimeListEntry()
            {
                TotalEpisodes   = TOTAL_EPISODES,
                URL             = URL,
                WatchedEpisodes = WATCHED_EPISODES,
                AiringStatus    = airingStatus
            };

            // Act
            sut.SetAiringAnimeModelData(animeInfo, animeListEntry);

            // Assert
            Assert.Equal(MAL_ID, sut.MalId);
            Assert.Equal(TITLE, sut.Title);
            Assert.Equal(IMAGE_URL, sut.ImageURL);
            Assert.Equal(TOTAL_EPISODES, sut.TotalEpisodes);
            Assert.Equal(URL, sut.URL);
            Assert.Equal(WATCHED_EPISODES, sut.WatchedEpisodes);
            Assert.Equal(TYPE, sut.Type);
            Assert.True(sut.IsOnWatchingList);
            Assert.Equal(Path.Combine(Constants.ImageCacheFolderPath, $"{ MAL_ID }.jpg"), sut.LocalImagePath);
            Assert.Equal(airingStatus == AiringStatus.Airing, sut.CurrentlyAiring);
            Assert.Equal(broadcast ?? airedFromDate.ToString(), sut.Broadcast);
        }
Exemple #6
0
        public void SaveDetailedAnimeListData_ParseTimeFromBroadcast_SetsCorrectBroadcastTimes()
        {
            using (var mock = AutoMock.GetLoose())
            {
                // Arrange
                var mockContext = new Mock <IMiruDbContext>();
                var data        = new List <MiruAnimeModel>
                {
                    new MiruAnimeModel {
                        Title = "10", Type = "TV", MalId = 1, Broadcast = "Sundays at 10:00 (JST)",
                    },
                }.AsQueryable();

                var animeEntryList = new List <AnimeListEntry>()
                {
                    new AnimeListEntry()
                    {
                        MalId = 1, AiringStatus = AiringStatus.Airing, WatchedEpisodes = 5, TotalEpisodes = 10, Type = "TV", Title = "10",
                    }
                };

                var cls  = SetupMiruDbServiceMock(mockContext, mock, miruAnimeModelDbSetData: data, currentUserAnimeEntryList: animeEntryList);
                var date = new DateTime(2020, 01, 26, 10, 0, 0);
                cls.UpdateAppStatusUI += (x, y) => x.ToString();
                var testModel = new MiruAnimeModel {
                    Title = "10", Type = "TV", MalId = 1, Broadcast = "Sundays at 10:00 (JST)", JSTBroadcastTime = date
                };

                // Act
                cls.SaveDetailedAnimeListData(It.IsAny <bool>()).Wait();
                testModel.ConvertJstBroadcastTimeToSelectedTimeZone(TimeZoneInfo.Local);

                // Assert
                mockContext.Verify(x => x.MiruAnimeModels
                                   .AddRange(It.Is <List <MiruAnimeModel> >(
                                                 y => y.Select(z => z.JSTBroadcastTime == date &&
                                                               z.LocalBroadcastTime == testModel.LocalBroadcastTime)
                                                 .ToList().Any())), Times.Once());
            }
        }
        public void SetSeasonalAnimeModelData_ValidInput_SetsDataCorrectly(string broadcast)
        {
            // Arrange
            var      sut           = new MiruAnimeModel();
            DateTime airedFromDate = new DateTime(2022, 3, 14);
            var      animeInfo     = new Anime()
            {
                MalId     = MAL_ID,
                Broadcast = broadcast,
                Title     = TITLE,
                ImageURL  = IMAGE_URL,
                Type      = TYPE,
                Aired     = new TimePeriod()
                {
                    From = airedFromDate
                }
            };
            var animeSubEntry = new AnimeSubEntry()
            {
                URL = URL,
            };

            // Act
            sut.SetSeasonalAnimeModelData(animeInfo, animeSubEntry);

            // Assert
            Assert.Equal(MAL_ID, sut.MalId);
            Assert.Equal(TITLE, sut.Title);
            Assert.Equal(IMAGE_URL, sut.ImageURL);
            Assert.Equal(URL, sut.URL);
            Assert.Equal(TYPE, sut.Type);
            Assert.False(sut.IsOnWatchingList);
            Assert.Equal(Path.Combine(Constants.ImageCacheFolderPath, $"{ MAL_ID }.jpg"), sut.LocalImagePath);
            Assert.True(sut.CurrentlyAiring);
            Assert.Equal(broadcast ?? airedFromDate.ToString(), sut.Broadcast);
        }
Exemple #8
0
        public void GetDetailedSeasonAnimeListInfo_GivenAnimeList_ReturnsUpdatedList()
        {
            using (var mock = AutoMock.GetLoose())
            {
                // Arrange
                var mockContext = new Mock <IMiruDbContext>();
                var date        = new DateTime(2020, 01, 26, 10, 0, 0);
                var testModel   = new MiruAnimeModel
                {
                    Title            = "initial title",
                    Type             = "TV",
                    MalId            = 1L,
                    Broadcast        = "Sundays at 10:00 (JST)",
                    JSTBroadcastTime = date,
                    IsOnWatchingList = false,
                    WatchedEpisodes  = 0,
                    TotalEpisodes    = 20,
                    CurrentlyAiring  = false,
                    ImageURL         = "stays the same",
                    URL            = "same",
                    LocalImagePath = "\\same"
                };
                var data = new List <MiruAnimeModel>
                {
                    testModel,
                }.AsQueryable();

                var seasonAnimeEntryList = new List <AnimeSubEntry>()
                {
                    new AnimeSubEntry()
                    {
                        MalId = 1, Title = "old entry", Type = "ONA", URL = "only value from seasonEntry"
                    },
                    new AnimeSubEntry()
                    {
                        MalId = 39, Title = "new season entry", Type = "TV", URL = "only value from seasonEntry"
                    }
                };

                var animeEntryList = new List <AnimeListEntry>()
                {
                };

                var cls = SetupMiruDbServiceMock(mockContext, mock, miruDbContext: out IMiruDbContext db, currentUserAnimeEntryList: animeEntryList,
                                                 currentSeasonList: seasonAnimeEntryList, miruAnimeModelDbSetData: data);

                // Act
                var result = cls.GetDetailedUserAnimeList(db, animeEntryList, true).Result;

                var resultNewEntry     = result.First(x => x != testModel);
                var resultUpdatedEntry = result.First(x => x == testModel);

                // Assert
                Assert.True(resultUpdatedEntry.CurrentlyAiring);

                // check if rest of the values for updated entry stay the same
                Assert.False(resultUpdatedEntry.IsOnWatchingList);
                Assert.Equal(1L, resultUpdatedEntry.MalId);
                Assert.Equal("Sundays at 10:00 (JST)", resultUpdatedEntry.Broadcast);
                Assert.Equal("initial title", resultUpdatedEntry.Title);
                Assert.Equal("stays the same", resultUpdatedEntry.ImageURL);
                Assert.Equal("\\same", resultUpdatedEntry.LocalImagePath);
                Assert.Equal("same", resultUpdatedEntry.URL);
                Assert.Equal("TV", resultUpdatedEntry.Type);

                // check new entry
                Assert.Equal(39, resultNewEntry.MalId);
                Assert.Equal("Sundays at 10:00 (JST)", resultNewEntry.Broadcast); // it is set in webServiceMock
                Assert.Equal("new season entry", resultNewEntry.Title);
                Assert.Equal("\\dydo", resultNewEntry.ImageURL);                  // it is set in webServiceMock
                Assert.Equal(Path.Combine(Constants.ImageCacheFolderPath, $"{ 39 }.jpg"), resultNewEntry.LocalImagePath);
                Assert.Equal("only value from seasonEntry", resultNewEntry.URL);
                Assert.False(resultNewEntry.IsOnWatchingList);
                Assert.True(resultNewEntry.CurrentlyAiring);
                Assert.Equal("TV", resultNewEntry.Type);
            }
        }
Exemple #9
0
        public void GetDetailedUserAnimeList_GivenNotNullUserAnimeListEntries_ReturnsDetailedList(
            // 1st entry updated exisiting
            int expectedUpdatedWatchedEpisodesValue,
            int expectedUpdatedTotalEpisodesValue,
            AiringStatus updatedAiringStatus,
            // 2nd entry -- new one
            long expectedMalIdOfNewEntry,
            AiringStatus expectedAiringStatusOfNewEntry,
            string titleOfNewEntry,
            int watchedEpisodesOfNewEntry,
            int totalEpisodesOfNewEntry,
            string typeOfNewEntry,
            string urlOfNewEntry)
        {
            using (var mock = AutoMock.GetLoose())
            {
                // Arrange
                var mockContext = new Mock <IMiruDbContext>();
                var date        = new DateTime(2020, 01, 26, 10, 0, 0);
                var testModel   = new MiruAnimeModel {
                    Title            = "initial title", Type = "TV", MalId = 1L, Broadcast = "Sundays at 10:00 (JST)", JSTBroadcastTime = date,
                    IsOnWatchingList = false, WatchedEpisodes = 0, TotalEpisodes = 20, CurrentlyAiring = false, ImageURL = "stays the same", URL = "same", LocalImagePath = "\\same"
                };
                var data = new List <MiruAnimeModel>
                {
                    testModel,
                }.AsQueryable();

                var animeEntryList = new List <AnimeListEntry>()
                {
                    new AnimeListEntry()
                    {
                        MalId         = 1L, AiringStatus = updatedAiringStatus, WatchedEpisodes = expectedUpdatedWatchedEpisodesValue,
                        TotalEpisodes = expectedUpdatedTotalEpisodesValue, Type = "TV", Title = "changed"
                    },

                    new AnimeListEntry()
                    {
                        MalId           = expectedMalIdOfNewEntry, AiringStatus = expectedAiringStatusOfNewEntry,
                        WatchedEpisodes = watchedEpisodesOfNewEntry, TotalEpisodes = totalEpisodesOfNewEntry, Type = typeOfNewEntry, Title = titleOfNewEntry, URL = urlOfNewEntry
                    }
                };

                var cls = SetupMiruDbServiceMock(mockContext, mock, miruDbContext: out IMiruDbContext db, currentUserAnimeEntryList: animeEntryList, miruAnimeModelDbSetData: data);

                // Act
                var result             = cls.GetDetailedUserAnimeList(db, cls.CurrentUserAnimeList.UserAnimeListData.Anime, It.IsAny <bool>()).Result;
                var resultUpdatedEntry = result.First(x => x == testModel);
                var resultNewEntry     = result.First(x => x != testModel);

                // Assert
                Assert.Equal(2, result.Count());
                // check updated anime entry - only 4 values should change
                Assert.True(resultUpdatedEntry.IsOnWatchingList);                                             // should change to true
                Assert.Equal(updatedAiringStatus == AiringStatus.Airing, resultUpdatedEntry.CurrentlyAiring); // should change depending on airing status
                Assert.Equal(expectedUpdatedWatchedEpisodesValue, resultUpdatedEntry.WatchedEpisodes);        // should change to new value
                Assert.Equal(expectedUpdatedTotalEpisodesValue, resultUpdatedEntry.TotalEpisodes);            // should change to new value
                // check if rest of the values for updated entry stay the same
                Assert.Equal(1L, resultUpdatedEntry.MalId);
                Assert.Equal("Sundays at 10:00 (JST)", resultUpdatedEntry.Broadcast);
                Assert.Equal("initial title", resultUpdatedEntry.Title);
                Assert.Equal("stays the same", resultUpdatedEntry.ImageURL);
                Assert.Equal("\\same", resultUpdatedEntry.LocalImagePath);
                Assert.Equal("same", resultUpdatedEntry.URL);
                Assert.Equal("TV", resultUpdatedEntry.Type);

                // check new entry
                Assert.Equal(expectedMalIdOfNewEntry, resultNewEntry.MalId);
                Assert.Equal("Sundays at 10:00 (JST)", resultNewEntry.Broadcast); // it is set in webServiceMock
                Assert.Equal(titleOfNewEntry, resultNewEntry.Title);
                Assert.Equal("\\dydo", resultNewEntry.ImageURL);                  // it is set in webServiceMock
                Assert.Equal(Path.Combine(Constants.ImageCacheFolderPath, $"{ expectedMalIdOfNewEntry }.jpg"), resultNewEntry.LocalImagePath);
                Assert.Equal(totalEpisodesOfNewEntry, resultNewEntry.TotalEpisodes);
                Assert.Equal(urlOfNewEntry, resultNewEntry.URL);
                Assert.Equal(watchedEpisodesOfNewEntry, resultNewEntry.WatchedEpisodes);
                Assert.True(resultNewEntry.IsOnWatchingList);
                Assert.Equal(expectedAiringStatusOfNewEntry == AiringStatus.Airing, resultNewEntry.CurrentlyAiring);
                Assert.Equal(typeOfNewEntry, resultNewEntry.Type);
            }
        }