Skip to content

Commit

Permalink
GH-346 GH-323: Add separate type for collection remove posts
Browse files Browse the repository at this point in the history
  • Loading branch information
henrikfroehling committed Oct 13, 2022
1 parent 0b2d8d9 commit ba46b20
Show file tree
Hide file tree
Showing 11 changed files with 210 additions and 88 deletions.
1 change: 1 addition & 0 deletions Source/Lib/Trakt.NET/Objects/Json/JsonFactoryContainer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace TraktNet.Objects.Post.Syncs.Collection
{
/// <summary>
/// A Trakt collection remove post, containing all movies, shows and / or episodes,
/// which should be removed from the user's collection.
/// </summary>
public interface ITraktSyncCollectionRemovePost : ITraktSyncCollectionPost
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace TraktNet.Objects.Post.Syncs.Collection
{
/// <summary>
/// A Trakt collection remove post, containing all movies, shows and / or episodes,
/// which should be removed from the user's collection.
/// </summary>
public class TraktSyncCollectionRemovePost : TraktSyncCollectionPost, ITraktSyncCollectionRemovePost
{
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
namespace TraktNet.Objects.Post.Syncs.Collection.Json.Factories
{
using Objects.Json;
using Reader;
using Writer;

internal class SyncCollectionRemovePostJsonIOFactory : IJsonIOFactory<ITraktSyncCollectionRemovePost>
{
public IObjectJsonReader<ITraktSyncCollectionRemovePost> CreateObjectReader() => new SyncCollectionRemovePostObjectJsonReader();

public IObjectJsonWriter<ITraktSyncCollectionRemovePost> CreateObjectWriter() => new SyncCollectionRemovePostObjectJsonWriter();
}
}
Original file line number Diff line number Diff line change
@@ -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<TSyncCollectionPost> : AObjectJsonReader<TSyncCollectionPost>
where TSyncCollectionPost : ITraktSyncCollectionPost
{
public override async Task<TSyncCollectionPost> ReadObjectAsync(JsonTextReader jsonReader, CancellationToken cancellationToken = default)
{
CheckJsonTextReader(jsonReader);

if (await jsonReader.ReadAsync(cancellationToken) && jsonReader.TokenType == JsonToken.StartObject)
{
TSyncCollectionPost traktSyncCollectionPost = Activator.CreateInstance<TSyncCollectionPost>();
var syncCollectionPostMovieArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostMovie>();
var syncCollectionPostShowArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostShow>();
var syncCollectionPostSeasonArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostSeason>();
var syncCollectionPostEpisodeArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostEpisode>();

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));
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ITraktSyncCollectionPost>
internal class SyncCollectionPostObjectJsonReader : ASyncCollectionPostObjectJsonReader<ITraktSyncCollectionPost>
{
public override async Task<ITraktSyncCollectionPost> 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<ITraktSyncCollectionPostMovie>();
var syncCollectionPostShowArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostShow>();
var syncCollectionPostSeasonArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostSeason>();
var syncCollectionPostEpisodeArrayJsonReader = new ArrayJsonReader<ITraktSyncCollectionPostEpisode>();

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));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TraktNet.Objects.Post.Syncs.Collection.Json.Reader
{
internal class SyncCollectionRemovePostObjectJsonReader : ASyncCollectionPostObjectJsonReader<ITraktSyncCollectionRemovePost>
{
}
}
Original file line number Diff line number Diff line change
@@ -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<TSyncCollectionPost> : AObjectJsonWriter<TSyncCollectionPost>
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<ITraktSyncCollectionPostMovie>();
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<ITraktSyncCollectionPostShow>();
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<ITraktSyncCollectionPostSeason>();
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<ITraktSyncCollectionPostEpisode>();
await jsonWriter.WritePropertyNameAsync(JsonProperties.PROPERTY_NAME_EPISODES, cancellationToken).ConfigureAwait(false);
await syncCollectionPostEpisodeArrayJsonWriter.WriteArrayAsync(jsonWriter, obj.Episodes, cancellationToken).ConfigureAwait(false);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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<ITraktSyncCollectionPost>
internal class SyncCollectionPostObjectJsonWriter : ASyncCollectionPostObjectJsonWriter<ITraktSyncCollectionPost>
{
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<ITraktSyncCollectionPostMovie>();
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<ITraktSyncCollectionPostShow>();
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<ITraktSyncCollectionPostSeason>();
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<ITraktSyncCollectionPostEpisode>();
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);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace TraktNet.Objects.Post.Syncs.Collection.Json.Writer
{
internal class SyncCollectionRemovePostObjectJsonWriter : ASyncCollectionPostObjectJsonWriter<ITraktSyncCollectionRemovePost>
{
}
}
Original file line number Diff line number Diff line change
@@ -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<ArgumentException>();

// movies = empty, shows = null, seasons = null, episodes = null
syncCollectionRemovePost.Movies = new List<ITraktSyncCollectionPostMovie>();
act.Should().Throw<ArgumentException>();

// movies = empty, shows = empty, seasons = null, episodes = null
syncCollectionRemovePost.Shows = new List<ITraktSyncCollectionPostShow>();
act.Should().Throw<ArgumentException>();

// movies = empty, shows = empty, seasons = empty, episodes = null
syncCollectionRemovePost.Seasons = new List<ITraktSyncCollectionPostSeason>();
act.Should().Throw<ArgumentException>();

// movies = empty, shows = empty, seasons = empty, episodes = empty
syncCollectionRemovePost.Episodes = new List<ITraktSyncCollectionPostEpisode>();
act.Should().Throw<ArgumentException>();

// movies with at least one item, shows = empty, seasons = empty, episodes = empty
(syncCollectionRemovePost.Movies as List<ITraktSyncCollectionPostMovie>).Add(new TraktSyncCollectionPostMovie());
act.Should().NotThrow();

// movies = empty, shows with at least one item, seasons = empty, episodes = empty
(syncCollectionRemovePost.Movies as List<ITraktSyncCollectionPostMovie>).Clear();
(syncCollectionRemovePost.Shows as List<ITraktSyncCollectionPostShow>).Add(new TraktSyncCollectionPostShow());
act.Should().NotThrow();

// movies = empty, shows = empty, seasons with at least one item, episodes = empty
(syncCollectionRemovePost.Shows as List<ITraktSyncCollectionPostShow>).Clear();
(syncCollectionRemovePost.Seasons as List<ITraktSyncCollectionPostSeason>).Add(new TraktSyncCollectionPostSeason());
act.Should().NotThrow();

// movies = empty, shows = empty, seasons = empty, episodes with at least one item
(syncCollectionRemovePost.Seasons as List<ITraktSyncCollectionPostSeason>).Clear();
(syncCollectionRemovePost.Episodes as List<ITraktSyncCollectionPostEpisode>).Add(new TraktSyncCollectionPostEpisode());
act.Should().NotThrow();
}
}
}

0 comments on commit ba46b20

Please sign in to comment.