From ba46b202d92f2425877eedfb118f43b056c8ecc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Fr=C3=B6hling?= Date: Thu, 13 Oct 2022 21:03:42 +0200 Subject: [PATCH] GH-346 GH-323: Add separate type for collection remove posts --- .../Objects/Json/JsonFactoryContainer.cs | 1 + .../ITraktSyncCollectionRemovePost.cs | 10 ++++ .../TraktSyncCollectionRemovePost.cs | 10 ++++ .../SyncCollectionRemovePostJsonIOFactory.cs | 13 +++++ .../ASyncCollectionPostObjectJsonReader.cs | 54 +++++++++++++++++ .../SyncCollectionPostObjectJsonReader.cs | 48 +-------------- ...yncCollectionRemovePostObjectJsonReader.cs | 6 ++ .../ASyncCollectionPostObjectJsonWriter.cs | 50 ++++++++++++++++ .../SyncCollectionPostObjectJsonWriter.cs | 42 +------------- ...yncCollectionRemovePostObjectJsonWriter.cs | 6 ++ .../TraktSyncCollectionRemovePost_Tests.cs | 58 +++++++++++++++++++ 11 files changed, 210 insertions(+), 88 deletions(-) create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs create mode 100644 Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs create mode 100644 Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs diff --git a/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs b/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs index e571aea294..b9f1c59c31 100644 --- a/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs +++ b/Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs @@ -293,6 +293,7 @@ static JsonFactoryContainer() s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostShow), new SyncCollectionPostShowJsonIOFactory()); s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostShowEpisode), new SyncCollectionPostShowEpisodeJsonIOFactory()); s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostShowSeason), new SyncCollectionPostShowSeasonJsonIOFactory()); + s_jsonIOFactories.Add(typeof(ITraktSyncCollectionRemovePost), new SyncCollectionRemovePostJsonIOFactory()); // sync collection post response objects s_jsonIOFactories.Add(typeof(ITraktSyncCollectionPostResponse), new SyncCollectionPostResponseJsonIOFactory()); diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs new file mode 100644 index 0000000000..76ce6b5309 --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/ITraktSyncCollectionRemovePost.cs @@ -0,0 +1,10 @@ +namespace TraktNet.Objects.Post.Syncs.Collection +{ + /// + /// A Trakt collection remove post, containing all movies, shows and / or episodes, + /// which should be removed from the user's collection. + /// + public interface ITraktSyncCollectionRemovePost : ITraktSyncCollectionPost + { + } +} diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs new file mode 100644 index 0000000000..e10aa881bd --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost.cs @@ -0,0 +1,10 @@ +namespace TraktNet.Objects.Post.Syncs.Collection +{ + /// + /// A Trakt collection remove post, containing all movies, shows and / or episodes, + /// which should be removed from the user's collection. + /// + public class TraktSyncCollectionRemovePost : TraktSyncCollectionPost, ITraktSyncCollectionRemovePost + { + } +} diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs new file mode 100644 index 0000000000..6e9a74c18c --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Factories/SyncCollectionRemovePostJsonIOFactory.cs @@ -0,0 +1,13 @@ +namespace TraktNet.Objects.Post.Syncs.Collection.Json.Factories +{ + using Objects.Json; + using Reader; + using Writer; + + internal class SyncCollectionRemovePostJsonIOFactory : IJsonIOFactory + { + public IObjectJsonReader CreateObjectReader() => new SyncCollectionRemovePostObjectJsonReader(); + + public IObjectJsonWriter CreateObjectWriter() => new SyncCollectionRemovePostObjectJsonWriter(); + } +} diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs new file mode 100644 index 0000000000..3612b068a2 --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/ASyncCollectionPostObjectJsonReader.cs @@ -0,0 +1,54 @@ +namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader +{ + using Newtonsoft.Json; + using System; + using System.Threading; + using System.Threading.Tasks; + using TraktNet.Objects.Json; + + internal abstract class ASyncCollectionPostObjectJsonReader : AObjectJsonReader + where TSyncCollectionPost : ITraktSyncCollectionPost + { + public override async Task ReadObjectAsync(JsonTextReader jsonReader, CancellationToken cancellationToken = default) + { + CheckJsonTextReader(jsonReader); + + if (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.StartObject) + { + TSyncCollectionPost traktSyncCollectionPost = Activator.CreateInstance(); + var syncCollectionPostMovieArrayJsonReader = new ArrayJsonReader(); + var syncCollectionPostShowArrayJsonReader = new ArrayJsonReader(); + var syncCollectionPostSeasonArrayJsonReader = new ArrayJsonReader(); + var syncCollectionPostEpisodeArrayJsonReader = new ArrayJsonReader(); + + while (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.PropertyName) + { + var propertyName = jsonReader.Value.ToString(); + + switch (propertyName) + { + case JsonProperties.PROPERTY_NAME_MOVIES: + traktSyncCollectionPost.Movies = await syncCollectionPostMovieArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); + break; + case JsonProperties.PROPERTY_NAME_SHOWS: + traktSyncCollectionPost.Shows = await syncCollectionPostShowArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); + break; + case JsonProperties.PROPERTY_NAME_SEASONS: + traktSyncCollectionPost.Seasons = await syncCollectionPostSeasonArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); + break; + case JsonProperties.PROPERTY_NAME_EPISODES: + traktSyncCollectionPost.Episodes = await syncCollectionPostEpisodeArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); + break; + default: + await JsonReaderHelper.ReadAndIgnoreInvalidContentAsync(jsonReader, cancellationToken); + break; + } + } + + return traktSyncCollectionPost; + } + + return await Task.FromResult(default(TSyncCollectionPost)); + } + } +} diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs index d887f61a3f..62c828b35e 100644 --- a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionPostObjectJsonReader.cs @@ -1,52 +1,6 @@ namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader { - using Newtonsoft.Json; - using Objects.Json; - using System.Threading; - using System.Threading.Tasks; - - internal class SyncCollectionPostObjectJsonReader : AObjectJsonReader + internal class SyncCollectionPostObjectJsonReader : ASyncCollectionPostObjectJsonReader { - public override async Task ReadObjectAsync(JsonTextReader jsonReader, CancellationToken cancellationToken = default) - { - CheckJsonTextReader(jsonReader); - - if (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.StartObject) - { - ITraktSyncCollectionPost traktSyncCollectionPost = new TraktSyncCollectionPost(); - var syncCollectionPostMovieArrayJsonReader = new ArrayJsonReader(); - var syncCollectionPostShowArrayJsonReader = new ArrayJsonReader(); - var syncCollectionPostSeasonArrayJsonReader = new ArrayJsonReader(); - var syncCollectionPostEpisodeArrayJsonReader = new ArrayJsonReader(); - - while (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.PropertyName) - { - var propertyName = jsonReader.Value.ToString(); - - switch (propertyName) - { - case JsonProperties.PROPERTY_NAME_MOVIES: - traktSyncCollectionPost.Movies = await syncCollectionPostMovieArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); - break; - case JsonProperties.PROPERTY_NAME_SHOWS: - traktSyncCollectionPost.Shows = await syncCollectionPostShowArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); - break; - case JsonProperties.PROPERTY_NAME_SEASONS: - traktSyncCollectionPost.Seasons = await syncCollectionPostSeasonArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); - break; - case JsonProperties.PROPERTY_NAME_EPISODES: - traktSyncCollectionPost.Episodes = await syncCollectionPostEpisodeArrayJsonReader.ReadArrayAsync(jsonReader, cancellationToken); - break; - default: - await JsonReaderHelper.ReadAndIgnoreInvalidContentAsync(jsonReader, cancellationToken); - break; - } - } - - return traktSyncCollectionPost; - } - - return await Task.FromResult(default(ITraktSyncCollectionPost)); - } } } diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs new file mode 100644 index 0000000000..e089ef412d --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Reader/SyncCollectionRemovePostObjectJsonReader.cs @@ -0,0 +1,6 @@ +namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader +{ + internal class SyncCollectionRemovePostObjectJsonReader : ASyncCollectionPostObjectJsonReader + { + } +} diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs new file mode 100644 index 0000000000..294dcb3d54 --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/ASyncCollectionPostObjectJsonWriter.cs @@ -0,0 +1,50 @@ +namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer +{ + using Newtonsoft.Json; + using System.Threading; + using System.Threading.Tasks; + using TraktNet.Objects.Json; + + internal class ASyncCollectionPostObjectJsonWriter : AObjectJsonWriter + where TSyncCollectionPost : ITraktSyncCollectionPost + { + public override async Task WriteObjectAsync(JsonTextWriter jsonWriter, TSyncCollectionPost obj, CancellationToken cancellationToken = default) + { + CheckJsonTextWriter(jsonWriter); + await jsonWriter.WriteStartObjectAsync(cancellationToken).ConfigureAwait(false); + await WriteCollectionPostObjectAsync(jsonWriter, obj, cancellationToken).ConfigureAwait(false); + await jsonWriter.WriteEndObjectAsync(cancellationToken).ConfigureAwait(false); + } + + protected virtual async Task WriteCollectionPostObjectAsync(JsonTextWriter jsonWriter, TSyncCollectionPost obj, CancellationToken cancellationToken = default) + { + if (obj.Movies != null) + { + var syncCollectionPostMovieArrayJsonWriter = new ArrayJsonWriter(); + await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_MOVIES, cancellationToken).ConfigureAwait(false); + await syncCollectionPostMovieArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Movies, cancellationToken).ConfigureAwait(false); + } + + if (obj.Shows != null) + { + var syncCollectionPostShowArrayJsonWriter = new ArrayJsonWriter(); + await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SHOWS, cancellationToken).ConfigureAwait(false); + await syncCollectionPostShowArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Shows, cancellationToken).ConfigureAwait(false); + } + + if (obj.Seasons != null) + { + var syncCollectionPostSeasonArrayJsonWriter = new ArrayJsonWriter(); + await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SEASONS, cancellationToken).ConfigureAwait(false); + await syncCollectionPostSeasonArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Seasons, cancellationToken).ConfigureAwait(false); + } + + if (obj.Episodes != null) + { + var syncCollectionPostEpisodeArrayJsonWriter = new ArrayJsonWriter(); + await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_EPISODES, cancellationToken).ConfigureAwait(false); + await syncCollectionPostEpisodeArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Episodes, cancellationToken).ConfigureAwait(false); + } + } + } +} diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs index cf34238faa..076155da9e 100644 --- a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionPostObjectJsonWriter.cs @@ -1,46 +1,6 @@ namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer { - using Newtonsoft.Json; - using Objects.Json; - using System.Threading; - using System.Threading.Tasks; - - internal class SyncCollectionPostObjectJsonWriter : AObjectJsonWriter + internal class SyncCollectionPostObjectJsonWriter : ASyncCollectionPostObjectJsonWriter { - public override async Task WriteObjectAsync(JsonTextWriter jsonWriter, ITraktSyncCollectionPost obj, CancellationToken cancellationToken = default) - { - CheckJsonTextWriter(jsonWriter); - await jsonWriter.WriteStartObjectAsync(cancellationToken).ConfigureAwait(false); - - if (obj.Movies != null) - { - var syncCollectionPostMovieArrayJsonWriter = new ArrayJsonWriter(); - await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_MOVIES, cancellationToken).ConfigureAwait(false); - await syncCollectionPostMovieArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Movies, cancellationToken).ConfigureAwait(false); - } - - if (obj.Shows != null) - { - var syncCollectionPostShowArrayJsonWriter = new ArrayJsonWriter(); - await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SHOWS, cancellationToken).ConfigureAwait(false); - await syncCollectionPostShowArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Shows, cancellationToken).ConfigureAwait(false); - } - - if (obj.Seasons != null) - { - var syncCollectionPostSeasonArrayJsonWriter = new ArrayJsonWriter(); - await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_SEASONS, cancellationToken).ConfigureAwait(false); - await syncCollectionPostSeasonArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Seasons, cancellationToken).ConfigureAwait(false); - } - - if (obj.Episodes != null) - { - var syncCollectionPostEpisodeArrayJsonWriter = new ArrayJsonWriter(); - await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_EPISODES, cancellationToken).ConfigureAwait(false); - await syncCollectionPostEpisodeArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Episodes, cancellationToken).ConfigureAwait(false); - } - - await jsonWriter.WriteEndObjectAsync(cancellationToken).ConfigureAwait(false); - } } } diff --git a/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs new file mode 100644 index 0000000000..0d37c789bd --- /dev/null +++ b/Source/Lib/Trakt.NET/Objects/Post/Syncs/Collection/Json/Writer/SyncCollectionRemovePostObjectJsonWriter.cs @@ -0,0 +1,6 @@ +namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer +{ + internal class SyncCollectionRemovePostObjectJsonWriter : ASyncCollectionPostObjectJsonWriter + { + } +} diff --git a/Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs b/Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs new file mode 100644 index 0000000000..192d6e9fb2 --- /dev/null +++ b/Source/Tests/Trakt.NET.Objects.Post.Tests/Syncs/Collection/Implementations/TraktSyncCollectionRemovePost_Tests.cs @@ -0,0 +1,58 @@ +namespace TraktNet.Objects.Post.Tests.Syncs.Collection.Implementations +{ + using FluentAssertions; + using System; + using System.Collections.Generic; + using Trakt.NET.Tests.Utility.Traits; + using TraktNet.Objects.Post.Syncs.Collection; + using Xunit; + + [Category("Objects.Post.Syncs.Collection.Implementations")] + public class TraktSyncCollectionRemovePost_Tests + { + [Fact] + public void Test_TraktSyncCollectionRemovePost_Validate() + { + ITraktSyncCollectionRemovePost syncCollectionRemovePost = new TraktSyncCollectionRemovePost(); + + // movies = null, shows = null, seasons = null, episodes = null + Action act = () => syncCollectionRemovePost.Validate(); + act.Should().Throw(); + + // movies = empty, shows = null, seasons = null, episodes = null + syncCollectionRemovePost.Movies = new List(); + act.Should().Throw(); + + // movies = empty, shows = empty, seasons = null, episodes = null + syncCollectionRemovePost.Shows = new List(); + act.Should().Throw(); + + // movies = empty, shows = empty, seasons = empty, episodes = null + syncCollectionRemovePost.Seasons = new List(); + act.Should().Throw(); + + // movies = empty, shows = empty, seasons = empty, episodes = empty + syncCollectionRemovePost.Episodes = new List(); + act.Should().Throw(); + + // movies with at least one item, shows = empty, seasons = empty, episodes = empty + (syncCollectionRemovePost.Movies as List).Add(new TraktSyncCollectionPostMovie()); + act.Should().NotThrow(); + + // movies = empty, shows with at least one item, seasons = empty, episodes = empty + (syncCollectionRemovePost.Movies as List).Clear(); + (syncCollectionRemovePost.Shows as List).Add(new TraktSyncCollectionPostShow()); + act.Should().NotThrow(); + + // movies = empty, shows = empty, seasons with at least one item, episodes = empty + (syncCollectionRemovePost.Shows as List).Clear(); + (syncCollectionRemovePost.Seasons as List).Add(new TraktSyncCollectionPostSeason()); + act.Should().NotThrow(); + + // movies = empty, shows = empty, seasons = empty, episodes with at least one item + (syncCollectionRemovePost.Seasons as List).Clear(); + (syncCollectionRemovePost.Episodes as List).Add(new TraktSyncCollectionPostEpisode()); + act.Should().NotThrow(); + } + } +}