Browse Source

Add tests for special Omdb json

crobibero 4 years ago
parent
commit
6ddbe8420f

+ 36 - 0
MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableConverterFactory.cs

@@ -0,0 +1,36 @@
+using System;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace MediaBrowser.Common.Json.Converters
+{
+    /// <summary>
+    /// Json Omdb converter factory.
+    /// </summary>
+    /// <remarks>
+    /// Remove when Omdb is moved to plugin.
+    /// </remarks>
+    public class JsonOmdbNotAvailableConverterFactory : JsonConverterFactory
+    {
+        /// <inheritdoc />
+        public override bool CanConvert(Type typeToConvert)
+        {
+            return (typeToConvert.IsGenericType
+                    && typeToConvert.GetGenericTypeDefinition() == typeof(Nullable<>)
+                    && typeToConvert.GenericTypeArguments[0].IsValueType)
+                   || typeToConvert == typeof(string);
+        }
+
+        /// <inheritdoc />
+        public override JsonConverter CreateConverter(Type typeToConvert, JsonSerializerOptions options)
+        {
+            if (typeToConvert == typeof(string))
+            {
+                return (JsonConverter)Activator.CreateInstance(typeof(JsonOmdbNotAvailableStringConverter));
+            }
+
+            var structType = typeToConvert.GenericTypeArguments[0];
+            return (JsonConverter)Activator.CreateInstance(typeof(JsonOmdbNotAvailableStructConverter<>).MakeGenericType(structType));
+        }
+    }
+}

+ 33 - 0
MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableStringConverter.cs

@@ -0,0 +1,33 @@
+using System;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace MediaBrowser.Common.Json.Converters
+{
+    /// <summary>
+    /// Converts a string <c>N/A</c> to <c>string.Empty</c>.
+    /// </summary>
+    public class JsonOmdbNotAvailableStringConverter : JsonConverter<string>
+    {
+        /// <inheritdoc />
+        public override string Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            if (reader.TokenType == JsonTokenType.String)
+            {
+                var str = reader.GetString();
+                if (str != null && str.Equals("N/A", StringComparison.OrdinalIgnoreCase))
+                {
+                    return null;
+                }
+            }
+
+            return JsonSerializer.Deserialize<string>(ref reader, options);
+        }
+
+        /// <inheritdoc />
+        public override void Write(Utf8JsonWriter writer, string value, JsonSerializerOptions options)
+        {
+            JsonSerializer.Serialize(value, options);
+        }
+    }
+}

+ 35 - 0
MediaBrowser.Common/Json/Converters/JsonOmdbNotAvailableStructConverter.cs

@@ -0,0 +1,35 @@
+using System;
+using System.Text.Json;
+using System.Text.Json.Serialization;
+
+namespace MediaBrowser.Common.Json.Converters
+{
+    /// <summary>
+    /// Converts a string <c>N/A</c> to <c>string.Empty</c>.
+    /// </summary>
+    /// <typeparam name="T">The resulting type.</typeparam>
+    public class JsonOmdbNotAvailableStructConverter<T> : JsonConverter<T?>
+        where T : struct
+    {
+        /// <inheritdoc />
+        public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+        {
+            if (reader.TokenType == JsonTokenType.String)
+            {
+                var str = reader.GetString();
+                if (str != null && str.Equals("N/A", StringComparison.OrdinalIgnoreCase))
+                {
+                    return null;
+                }
+            }
+
+            return JsonSerializer.Deserialize<T>(ref reader, options);
+        }
+
+        /// <inheritdoc />
+        public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options)
+        {
+            JsonSerializer.Serialize(value, options);
+        }
+    }
+}

+ 36 - 4
MediaBrowser.Providers/Plugins/Omdb/OmdbProvider.cs

@@ -8,10 +8,12 @@ using System.Linq;
 using System.Net.Http;
 using System.Text;
 using System.Text.Json;
+using System.Text.Json.Serialization;
 using System.Threading;
 using System.Threading.Tasks;
 using MediaBrowser.Common;
 using MediaBrowser.Common.Json;
+using MediaBrowser.Common.Json.Converters;
 using MediaBrowser.Common.Net;
 using MediaBrowser.Controller.Configuration;
 using MediaBrowser.Controller.Entities;
@@ -467,74 +469,104 @@ namespace MediaBrowser.Providers.Plugins.Omdb
             return string.Equals(lang, "en", StringComparison.OrdinalIgnoreCase);
         }
 
-        internal class SeasonRootObject
+        public class SeasonRootObject
         {
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Title { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string seriesID { get; set; }
 
-            public int Season { get; set; }
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
+            public int? Season { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public int? totalSeasons { get; set; }
 
             public RootObject[] Episodes { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Response { get; set; }
         }
 
-        internal class RootObject
+        public class RootObject
         {
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Title { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Year { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Rated { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Released { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Runtime { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Genre { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Director { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Writer { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Actors { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Plot { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Language { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Country { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Awards { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Poster { get; set; }
 
             public List<OmdbRating> Ratings { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Metascore { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string imdbRating { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string imdbVotes { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string imdbID { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Type { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string DVD { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string BoxOffice { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Production { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Website { get; set; }
 
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
             public string Response { get; set; }
 
-            public int Episode { get; set; }
+            [JsonConverter(typeof(JsonOmdbNotAvailableConverterFactory))]
+            public int? Episode { get; set; }
 
             public float? GetRottenTomatoScore()
             {

+ 1 - 0
tests/Jellyfin.Common.Tests/Jellyfin.Common.Tests.csproj

@@ -29,6 +29,7 @@
 
   <ItemGroup>
     <ProjectReference Include="../../MediaBrowser.Common/MediaBrowser.Common.csproj" />
+    <ProjectReference Include="..\..\MediaBrowser.Providers\MediaBrowser.Providers.csproj" />
   </ItemGroup>
 
   <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">

+ 21 - 0
tests/Jellyfin.Common.Tests/Json/JsonOmdbConverterTests.cs

@@ -0,0 +1,21 @@
+using System.Text.Json;
+using MediaBrowser.Common.Json;
+using MediaBrowser.Providers.Plugins.Omdb;
+using Xunit;
+
+namespace Jellyfin.Common.Tests.Json
+{
+    public static class JsonOmdbConverterTests
+    {
+        [Fact]
+        public static void Deserialize_Omdb_Response_Not_Available_Success()
+        {
+            const string Input = "{\"Title\":\"Chapter 1\",\"Year\":\"2013\",\"Rated\":\"TV-MA\",\"Released\":\"01 Feb 2013\",\"Season\":\"N/A\",\"Episode\":\"N/A\",\"Runtime\":\"55 min\",\"Genre\":\"Drama\",\"Director\":\"David Fincher\",\"Writer\":\"Michael Dobbs (based on the novels by), Andrew Davies (based on the mini-series by), Beau Willimon (created for television by), Beau Willimon, Sam Forman (staff writer)\",\"Actors\":\"Kevin Spacey, Robin Wright, Kate Mara, Corey Stoll\",\"Plot\":\"Congressman Francis Underwood has been declined the chair for Secretary of State. He's now gathering his own team to plot his revenge. Zoe Barnes, a reporter for the Washington Herald, will do anything to get her big break.\",\"Language\":\"English\",\"Country\":\"USA\",\"Awards\":\"N/A\",\"Poster\":\"https://m.media-amazon.com/images/M/MV5BMTY5MTU4NDQzNV5BMl5BanBnXkFtZTgwMzk2ODcxMzE@._V1_SX300.jpg\",\"Ratings\":[{\"Source\":\"Internet Movie Database\",\"Value\":\"8.7/10\"}],\"Metascore\":\"N/A\",\"imdbRating\":\"8.7\",\"imdbVotes\":\"6736\",\"imdbID\":\"tt2161930\",\"seriesID\":\"N/A\",\"Type\":\"episode\",\"Response\":\"True\"}";
+            var seasonRootObject = JsonSerializer.Deserialize<OmdbProvider.RootObject>(Input, JsonDefaults.GetOptions());
+            Assert.NotNull(seasonRootObject);
+            Assert.Null(seasonRootObject?.Awards);
+            Assert.Null(seasonRootObject?.Episode);
+            Assert.Null(seasonRootObject?.Metascore);
+        }
+    }
+}