From 48df661294dc566809c765f85d3384180074f241 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Thu, 5 Dec 2019 17:13:34 +0100 Subject: [PATCH] Fix for resolved assets. --- .../ConvertContent/FieldConverters.cs | 92 +++++++-- .../ConvertContent/FieldConvertersTests.cs | 186 ++++++++++++++---- 2 files changed, 224 insertions(+), 54 deletions(-) diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs index b6d7bc1c8..aaade581d 100644 --- a/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs +++ b/backend/src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs @@ -23,14 +23,32 @@ namespace Squidex.Domain.Apps.Core.ConvertContent public static class FieldConverters { - private static readonly Func KeyNameResolver = f => f.Name; - private static readonly Func KeyIdResolver = f => f.Id.ToString(); + private delegate string FieldKeyResolver(IField field); - private static readonly Func FieldByIdResolver = - (f, k) => long.TryParse(k, out var id) ? f.FieldsById.GetOrDefault(id) : null; + private static readonly FieldKeyResolver KeyNameResolver = f => f.Name; + private static readonly FieldKeyResolver KeyIdResolver = f => f.Id.ToString(); - private static readonly Func FieldByNameResolver = - (f, k) => f.FieldsByName.GetOrDefault(k); + private delegate IField? FieldResolver(IArrayField field, string key); + + private static IField? FieldByIdResolver(IArrayField array, string key) + { + if (key != null && long.TryParse(key, out var id)) + { + return array.FieldsById.GetOrDefault(id); + } + + return null; + } + + private static IField? FieldByNameResolver(IArrayField array, string key) + { + if (key != null) + { + return array.FieldsByName.GetOrDefault(key); + } + + return null; + } public static FieldConverter ExcludeHidden() { @@ -69,11 +87,51 @@ namespace Squidex.Domain.Apps.Core.ConvertContent return (data, field) => data; } - var isAll = fields.First() == "*"; + bool ShouldHandle(IField field, IField? parent = null) + { + if (field is IField) + { + if (fields.Contains("*")) + { + return true; + } + + if (parent == null) + { + return fields.Contains(field.Name); + } + else + { + return fields.Contains($"{parent.Name}.{field.Name}"); + } + } + + return false; + } + + void Resolve(IJsonValue value) + { + if (value is JsonArray array) + { + for (var i = 0; i < array.Count; i++) + { + var id = array[i].ToString(); + + array[i] = JsonValue.Create(urlGenerator.GenerateUrl(id)); + } + } + } return (data, field) => { - if (field is IField && (isAll || fields.Contains(field.Name))) + if (ShouldHandle(field)) + { + foreach (var partition in data) + { + Resolve(partition.Value); + } + } + else if (field is IArrayField arrayField) { foreach (var partition in data) { @@ -81,9 +139,16 @@ namespace Squidex.Domain.Apps.Core.ConvertContent { for (var i = 0; i < array.Count; i++) { - var id = array[i].ToString(); - - array[i] = JsonValue.Create(urlGenerator.GenerateUrl(id)); + if (array[i] is JsonObject arrayItem) + { + foreach (var kvp in arrayItem) + { + if (arrayField.FieldsByName.TryGetValue(kvp.Key, out var nestedField) && ShouldHandle(nestedField, field)) + { + Resolve(kvp.Value); + } + } + } } } } @@ -259,10 +324,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent return ForNested(FieldByIdResolver, KeyIdResolver, converters); } - private static FieldConverter ForNested( - Func fieldResolver, - Func keyResolver, - params ValueConverter[] converters) + private static FieldConverter ForNested(FieldResolver fieldResolver, FieldKeyResolver keyResolver, params ValueConverter[] converters) { return (data, field) => { diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs index c962c2f8c..c93efc46e 100644 --- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs +++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs @@ -22,14 +22,6 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent { private readonly IAssetUrlGenerator assetUrlGenerator = A.Fake(); private readonly LanguagesConfig languagesConfig = LanguagesConfig.Build(Language.EN, Language.DE); - private readonly RootField jsonField = Fields.Json(1, "1", Partitioning.Invariant); - private readonly RootField stringLanguageField = Fields.String(1, "1", Partitioning.Language); - private readonly RootField stringInvariantField = Fields.String(1, "1", Partitioning.Invariant); - private readonly RootField numberField = Fields.Number(1, "1", Partitioning.Invariant); - private readonly RootField assetsField = Fields.Assets(1, "1", Partitioning.Invariant); - private readonly RootField arrayField = Fields.Array(1, "1", Partitioning.Invariant, - Fields.Number(1, "field1"), - Fields.Number(2, "field2").Hide()); public FieldConvertersTests() { @@ -40,11 +32,13 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_filter_for_value_conversion() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var input = new ContentFieldData() .AddValue("iv", JsonValue.Object()); - var actual = FieldConverters.ForValues((f, i) => Value.Unset)(input, stringInvariantField); + var actual = FieldConverters.ForValues((f, i) => Value.Unset)(input, field); var expected = new ContentFieldData(); @@ -54,11 +48,13 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_for_value_conversion() { + var field = Fields.Json(1, "json", Partitioning.Invariant); + var input = new ContentFieldData() .AddValue("iv", JsonValue.Object()); - var actual = FieldConverters.ForValues(ValueConverters.EncodeJson(TestUtils.DefaultSerializer))(input, jsonField); + var actual = FieldConverters.ForValues(ValueConverters.EncodeJson(TestUtils.DefaultSerializer))(input, field); var expected = new ContentFieldData() @@ -70,6 +66,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_name_to_id() { + var field = + Fields.Array(1, "1", Partitioning.Invariant, + Fields.Number(1, "field1"), + Fields.Number(2, "field2").Hide()); + var input = new ContentFieldData() .AddValue("iv", @@ -79,7 +80,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .Add("field2", 200) .Add("invalid", 300))); - var actual = FieldConverters.ForNestedName2Id(ValueConverters.ExcludeHidden())(input, arrayField); + var actual = FieldConverters.ForNestedName2Id(ValueConverters.ExcludeHidden())(input, field); var expected = new ContentFieldData() @@ -94,6 +95,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_name_to_name() { + var field = + Fields.Array(1, "1", Partitioning.Invariant, + Fields.Number(1, "field1"), + Fields.Number(2, "field2").Hide()); + var input = new ContentFieldData() .AddValue("iv", @@ -103,7 +109,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .Add("field2", 200) .Add("invalid", 300))); - var actual = FieldConverters.ForNestedName2Name(ValueConverters.ExcludeHidden())(input, arrayField); + var actual = FieldConverters.ForNestedName2Name(ValueConverters.ExcludeHidden())(input, field); var expected = new ContentFieldData() @@ -118,6 +124,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_id_to_id() { + var field = + Fields.Array(1, "1", Partitioning.Invariant, + Fields.Number(1, "field1"), + Fields.Number(2, "field2").Hide()); + var input = new ContentFieldData() .AddValue("iv", @@ -127,7 +138,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .Add("2", 200) .Add("99", 300))); - var actual = FieldConverters.ForNestedId2Id(ValueConverters.ExcludeHidden())(input, arrayField); + var actual = FieldConverters.ForNestedId2Id(ValueConverters.ExcludeHidden())(input, field); var expected = new ContentFieldData() @@ -142,6 +153,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_id_to_name() { + var field = + Fields.Array(1, "1", Partitioning.Invariant, + Fields.Number(1, "field1"), + Fields.Number(2, "field2").Hide()); + var input = new ContentFieldData() .AddValue("iv", @@ -151,7 +167,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .Add("2", 200) .Add("99", 300))); - var actual = FieldConverters.ForNestedId2Name(ValueConverters.ExcludeHidden())(input, arrayField); + var actual = FieldConverters.ForNestedId2Name(ValueConverters.ExcludeHidden())(input, field); var expected = new ContentFieldData() @@ -164,27 +180,31 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent } [Fact] - public void Should_return_same_values_if_all_values_are_valid() + public void Should_return_same_values_when_excluding_changed_types_if_all_values_are_valid() { + var field = Fields.Number(1, "number", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("en", null) .AddValue("de", 1); - var result = FieldConverters.ExcludeChangedTypes()(source, numberField); + var result = FieldConverters.ExcludeChangedTypes()(source, field); Assert.Same(source, result); } [Fact] - public void Should_return_null_values_any_value_is_invalid() + public void Should_return_null_when_excluding_changed_types_if_any_value_is_invalid() { + var field = Fields.Number(1, "number", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("en", "EN") .AddValue("de", 0); - var result = FieldConverters.ExcludeChangedTypes()(source, numberField); + var result = FieldConverters.ExcludeChangedTypes()(source, field); Assert.Null(result); } @@ -192,9 +212,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_same_values_if_field_not_hidden() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData(); - var result = FieldConverters.ExcludeHidden()(source, stringLanguageField); + var result = FieldConverters.ExcludeHidden()(source, field); Assert.Same(source, result); } @@ -202,9 +224,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_null_values_if_field_hidden() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData(); - var result = FieldConverters.ExcludeHidden()(source, stringLanguageField.Hide()); + var result = FieldConverters.ExcludeHidden()(source, field.Hide()); Assert.Null(result); } @@ -212,6 +236,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_resolve_languages_and_cleanup_old_languages() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData() .AddValue("en", "EN") @@ -221,7 +247,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("en", "EN"); - var result = FieldConverters.ResolveLanguages(languagesConfig)(source, stringLanguageField); + var result = FieldConverters.ResolveLanguages(languagesConfig)(source, field); Assert.Equal(expected, result); } @@ -229,6 +255,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_resolve_languages_and_resolve_master_language_from_invariant() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData() .AddValue("iv", "A") @@ -238,7 +266,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("en", "A"); - var result = FieldConverters.ResolveLanguages(languagesConfig)(source, stringLanguageField); + var result = FieldConverters.ResolveLanguages(languagesConfig)(source, field); Assert.Equal(expected, result); } @@ -246,9 +274,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_same_values_if_resolving_languages_from_invariant_field() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var source = new ContentFieldData(); - var result = FieldConverters.ResolveLanguages(languagesConfig)(source, stringInvariantField); + var result = FieldConverters.ResolveLanguages(languagesConfig)(source, field); Assert.Same(source, result); } @@ -256,6 +286,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_resolve_invariant_and_use_direct_value() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("iv", "A") @@ -265,7 +297,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", "A"); - var result = FieldConverters.ResolveInvariant(languagesConfig)(source, stringInvariantField); + var result = FieldConverters.ResolveInvariant(languagesConfig)(source, field); Assert.Equal(expected, result); } @@ -273,6 +305,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_resolve_invariant_and_resolve_invariant_from_master_language() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("de", "DE") @@ -282,7 +316,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", "EN"); - var result = FieldConverters.ResolveInvariant(languagesConfig)(source, stringInvariantField); + var result = FieldConverters.ResolveInvariant(languagesConfig)(source, field); Assert.Equal(expected, result); } @@ -290,6 +324,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_resolve_invariant_and_resolve_invariant_from_first_language() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("de", "DE") @@ -299,7 +335,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", "DE"); - var result = FieldConverters.ResolveInvariant(languagesConfig)(source, stringInvariantField); + var result = FieldConverters.ResolveInvariant(languagesConfig)(source, field); Assert.Equal(expected, result); } @@ -307,9 +343,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_same_values_if_resolving_invariant_from_language_field() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData(); - var result = FieldConverters.ResolveInvariant(languagesConfig)(source, stringLanguageField); + var result = FieldConverters.ResolveInvariant(languagesConfig)(source, field); Assert.Same(source, result); } @@ -317,6 +355,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_language_from_fallback_if_found() { + var field = Fields.String(1, "string", Partitioning.Language); + var config_1 = languagesConfig.Set(new LanguageConfig(Language.IT)); var config_2 = config_1.Set(new LanguageConfig(Language.ES, false, Language.IT)); @@ -332,7 +372,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent .AddValue("it", "IT") .AddValue("es", "IT"); - var result = FieldConverters.ResolveFallbackLanguages(config_2)(source, stringLanguageField); + var result = FieldConverters.ResolveFallbackLanguages(config_2)(source, field); Assert.Equal(expected, result); } @@ -340,6 +380,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_not_return_value_if_master_is_missing() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData() .AddValue("de", "DE"); @@ -348,7 +390,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("de", "DE"); - var result = FieldConverters.ResolveFallbackLanguages(languagesConfig)(source, stringLanguageField); + var result = FieldConverters.ResolveFallbackLanguages(languagesConfig)(source, field); Assert.Equal(expected, result); } @@ -356,6 +398,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_filter_languages() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData() .AddValue("en", "EN") @@ -365,7 +409,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("de", "DE"); - var result = FieldConverters.FilterLanguages(languagesConfig, new[] { Language.DE })(source, stringLanguageField); + var result = FieldConverters.FilterLanguages(languagesConfig, new[] { Language.DE })(source, field); Assert.Equal(expected, result); } @@ -373,6 +417,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_master_language_if_languages_to_filter_are_invalid() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData() .AddValue("en", "EN") @@ -382,7 +428,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("en", "EN"); - var result = FieldConverters.FilterLanguages(languagesConfig, new[] { Language.CA })(source, stringLanguageField); + var result = FieldConverters.FilterLanguages(languagesConfig, new[] { Language.CA })(source, field); Assert.Equal(expected, result); } @@ -390,9 +436,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_same_values_if_resolving_fallback_languages_from_invariant_field() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var source = new ContentFieldData(); - var result = FieldConverters.ResolveFallbackLanguages(languagesConfig)(source, stringInvariantField); + var result = FieldConverters.ResolveFallbackLanguages(languagesConfig)(source, field); Assert.Same(source, result); } @@ -400,9 +448,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_same_values_if_filtered_languages_is_empty() { + var field = Fields.String(1, "string", Partitioning.Language); + var source = new ContentFieldData(); - var result = FieldConverters.FilterLanguages(languagesConfig, Enumerable.Empty())(source, stringLanguageField); + var result = FieldConverters.FilterLanguages(languagesConfig, Enumerable.Empty())(source, field); Assert.Same(source, result); } @@ -410,9 +460,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_return_same_values_if_filtering_languages_from_invariant_field() { + var field = Fields.String(1, "string", Partitioning.Invariant); + var source = new ContentFieldData(); - var result = FieldConverters.FilterLanguages(languagesConfig, null)(source, stringInvariantField); + var result = FieldConverters.FilterLanguages(languagesConfig, null)(source, field); Assert.Same(source, result); } @@ -420,6 +472,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_asset_ids_to_urls() { + var field = Fields.Assets(1, "assets", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("iv", JsonValue.Array("1", "2")); @@ -428,7 +482,31 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", JsonValue.Array("url/to/1", "url/to/2")); - var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "1" }), assetUrlGenerator)(source, assetsField); + var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "assets" }), assetUrlGenerator)(source, field); + + Assert.Equal(expected, result); + } + + [Fact] + public void Should_convert_nested_asset_ids_to_urls() + { + var field = + Fields.Array(1, "array", Partitioning.Invariant, + Fields.Assets(1, "assets")); + + var source = + new ContentFieldData() + .AddValue("iv", JsonValue.Array( + JsonValue.Object() + .Add("assets", JsonValue.Array("1", "2")))); + + var expected = + new ContentFieldData() + .AddValue("iv", JsonValue.Array( + JsonValue.Object() + .Add("assets", JsonValue.Array("url/to/1", "url/to/2")))); + + var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "array.assets" }), assetUrlGenerator)(source, field); Assert.Equal(expected, result); } @@ -436,6 +514,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_convert_asset_ids_to_urls_for_wildcard_fields() { + var field = Fields.Assets(1, "assets", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("iv", JsonValue.Array("1", "2")); @@ -444,7 +524,31 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", JsonValue.Array("url/to/1", "url/to/2")); - var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "*" }), assetUrlGenerator)(source, assetsField); + var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "*" }), assetUrlGenerator)(source, field); + + Assert.Equal(expected, result); + } + + [Fact] + public void Should_convert_nested_asset_ids_to_urls_for_wildcard_fields() + { + var field = + Fields.Array(1, "array", Partitioning.Invariant, + Fields.Assets(1, "assets")); + + var source = + new ContentFieldData() + .AddValue("iv", JsonValue.Array( + JsonValue.Object() + .Add("assets", JsonValue.Array("1", "2")))); + + var expected = + new ContentFieldData() + .AddValue("iv", JsonValue.Array( + JsonValue.Object() + .Add("assets", JsonValue.Array("url/to/1", "url/to/2")))); + + var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "*" }), assetUrlGenerator)(source, field); Assert.Equal(expected, result); } @@ -452,6 +556,8 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent [Fact] public void Should_not_convert_asset_ids_to_urls_when_field_does_not_match() { + var field = Fields.Assets(1, "assets", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("iv", JsonValue.Array("1", "2")); @@ -460,14 +566,16 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", JsonValue.Array("1", "2")); - var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "2" }), assetUrlGenerator)(source, assetsField); + var result = FieldConverters.ResolveAssetUrls(new HashSet(new[] { "other" }), assetUrlGenerator)(source, field); Assert.Equal(expected, result); } [Fact] - public void Should_not_convert_asset_ids_to_urls_when_field_is_specified() + public void Should_not_convert_asset_ids_to_urls_when_fields_is_null() { + var field = Fields.Assets(1, "assets", Partitioning.Invariant); + var source = new ContentFieldData() .AddValue("iv", JsonValue.Array("1", "2")); @@ -476,7 +584,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent new ContentFieldData() .AddValue("iv", JsonValue.Array("1", "2")); - var result = FieldConverters.ResolveAssetUrls(null, assetUrlGenerator)(source, assetsField); + var result = FieldConverters.ResolveAssetUrls(null, assetUrlGenerator)(source, field); Assert.Equal(expected, result); }