Browse Source

Value conversion finalized.

pull/297/head
Sebastian 8 years ago
parent
commit
fbded84b4f
  1. 38
      src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs
  2. 56
      src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs
  3. 6
      src/Squidex.Domain.Apps.Core.Operations/ConvertContent/Value.cs
  4. 14
      src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs
  5. 2
      src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ValueReferencesConverter.cs
  6. 14
      src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Extensions.cs
  7. 6
      src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs
  8. 1
      src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs
  9. 40
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionTests.cs
  10. 131
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs
  11. 104
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs
  12. 4
      tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs
  13. 2
      tests/Squidex.Domain.Apps.Core.Tests/TestData.cs

38
src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ContentConverter.cs

@ -7,53 +7,51 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Core.Contents; using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Schemas; using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure; using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Core.ConvertContent namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
public delegate ContentFieldData FieldConverter(ContentFieldData data, IRootField field);
public delegate JToken ValueConverter(JToken value, IRootField field);
public static class ContentConverter public static class ContentConverter
{ {
public static NamedContentData ToNameModel(this IdContentData content, Schema schema, params FieldConverter[] converters) private static readonly Func<IRootField, string> KeyNameResolver = f => f.Name;
private static readonly Func<IRootField, long> KeyIdResolver = f => f.Id;
public static NamedContentData ConvertId2Name(this IdContentData content, Schema schema, params FieldConverter[] converters)
{ {
Guard.NotNull(schema, nameof(schema)); Guard.NotNull(schema, nameof(schema));
var result = new NamedContentData(content.Count); var result = new NamedContentData(content.Count);
return ConvertInternal(content, result, schema.FieldsById, x => x.Name, converters); return ConvertInternal(content, result, schema.FieldsById, KeyNameResolver, converters);
} }
public static IdContentData ToIdModel(this NamedContentData content, Schema schema, params FieldConverter[] converters) public static IdContentData ConvertId2Id(this IdContentData content, Schema schema, params FieldConverter[] converters)
{ {
Guard.NotNull(schema, nameof(schema)); Guard.NotNull(schema, nameof(schema));
var result = new IdContentData(content.Count); var result = new IdContentData(content.Count);
return ConvertInternal(content, result, schema.FieldsByName, x => x.Id, converters); return ConvertInternal(content, result, schema.FieldsById, KeyIdResolver, converters);
} }
public static IdContentData Convert(this IdContentData content, Schema schema, params FieldConverter[] converters) public static NamedContentData ConvertName2Name(this NamedContentData content, Schema schema, params FieldConverter[] converters)
{ {
Guard.NotNull(schema, nameof(schema)); Guard.NotNull(schema, nameof(schema));
var result = new IdContentData(content.Count); var result = new NamedContentData(content.Count);
return ConvertInternal(content, result, schema.FieldsById, x => x.Id, converters); return ConvertInternal(content, result, schema.FieldsByName, KeyNameResolver, converters);
} }
public static NamedContentData Convert(this NamedContentData content, Schema schema, params FieldConverter[] converters) public static IdContentData ConvertName2Id(this NamedContentData content, Schema schema, params FieldConverter[] converters)
{ {
Guard.NotNull(schema, nameof(schema)); Guard.NotNull(schema, nameof(schema));
var result = new NamedContentData(content.Count); var result = new IdContentData(content.Count);
return ConvertInternal(content, result, schema.FieldsByName, x => x.Name, converters); return ConvertInternal(content, result, schema.FieldsByName, KeyIdResolver, converters);
} }
private static TDict2 ConvertInternal<TKey1, TKey2, TDict1, TDict2>( private static TDict2 ConvertInternal<TKey1, TKey2, TDict1, TDict2>(
@ -71,24 +69,24 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
continue; continue;
} }
var fieldValue = fieldKvp.Value; var newvalue = fieldKvp.Value;
if (converters != null) if (converters != null)
{ {
foreach (var converter in converters) foreach (var converter in converters)
{ {
fieldValue = converter(fieldValue, field); newvalue = converter(newvalue, field);
if (fieldValue == null) if (newvalue == null)
{ {
break; break;
} }
} }
} }
if (fieldValue != null) if (newvalue != null)
{ {
target.Add(targetKey(field), fieldValue); target.Add(targetKey(field), newvalue);
} }
} }

56
src/Squidex.Domain.Apps.Core.Operations/ConvertContent/FieldConverters.cs

@ -20,8 +20,17 @@ using Squidex.Infrastructure.Json;
namespace Squidex.Domain.Apps.Core.ConvertContent namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
public delegate ContentFieldData FieldConverter(ContentFieldData data, IRootField field);
public static class FieldConverters public static class FieldConverters
{ {
private static readonly Func<IField, string> KeyNameResolver = f => f.Name;
private static readonly Func<IField, string> KeyIdResolver = f => f.Id.ToString();
private static readonly Func<IArrayField, string, IField> FieldByIdResolver =
(f, k) => long.TryParse(k, out var id) ? f.FieldsById.GetOrDefault(id) : null;
private static readonly Func<IArrayField, string, IField> FieldByNameResolver =
(f, k) => f.FieldsByName.GetOrDefault(k);
public static FieldConverter ExcludeHidden() public static FieldConverter ExcludeHidden()
{ {
return (data, field) => return (data, field) =>
@ -195,7 +204,30 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
}; };
} }
private static FieldConverter ForNested(params ValueConverter[] converters) public static FieldConverter ForNestedName2Name(params ValueConverter[] converters)
{
return ForNested(FieldByNameResolver, KeyNameResolver, converters);
}
public static FieldConverter ForNestedName2Id(params ValueConverter[] converters)
{
return ForNested(FieldByNameResolver, KeyIdResolver, converters);
}
public static FieldConverter ForNestedId2Name(params ValueConverter[] converters)
{
return ForNested(FieldByIdResolver, KeyNameResolver, converters);
}
public static FieldConverter ForNestedId2Id(params ValueConverter[] converters)
{
return ForNested(FieldByIdResolver, KeyIdResolver, converters);
}
private static FieldConverter ForNested(
Func<IArrayField, string, IField> fieldResolver,
Func<IField, string> keyResolver,
params ValueConverter[] converters)
{ {
return (data, field) => return (data, field) =>
{ {
@ -213,33 +245,38 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
foreach (var kvp in item) foreach (var kvp in item)
{ {
if (!arrayField.FieldsByName.TryGetValue(kvp.Key, out var nestedField)) var nestedField = fieldResolver(arrayField, kvp.Key);
if (nestedField == null)
{ {
continue; continue;
} }
var newValue = kvp.Value; var newValue = kvp.Value;
var isUnset = false;
if (converters != null) if (converters != null)
{ {
foreach (var converter in converters) foreach (var converter in converters)
{ {
newValue = converter(newValue, field); newValue = converter(newValue, nestedField);
if (ReferenceEquals(newValue, Value.Unset)) if (ReferenceEquals(newValue, Value.Unset))
{ {
isUnset = true;
break; break;
} }
} }
} }
if (!ReferenceEquals(newValue, Value.Unset)) if (!isUnset)
{ {
result.Add(field.Id.ToString(), newValue); result.Add(keyResolver(nestedField), newValue);
} }
} }
jArray[i] = item; jArray[i] = result;
} }
} }
} }
@ -262,6 +299,8 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
var newValue = partition.Value; var newValue = partition.Value;
var isUnset = false;
if (converters != null) if (converters != null)
{ {
foreach (var converter in converters) foreach (var converter in converters)
@ -270,19 +309,20 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
if (ReferenceEquals(newValue, Value.Unset)) if (ReferenceEquals(newValue, Value.Unset))
{ {
isUnset = true;
break; break;
} }
} }
} }
if (result != null || !ReferenceEquals(newValue, partition.Value)) if (result != null || isUnset || !ReferenceEquals(newValue, partition.Value))
{ {
if (result == null) if (result == null)
{ {
result = new ContentFieldData(); result = new ContentFieldData();
} }
if (!ReferenceEquals(newValue, Value.Unset)) if (!isUnset)
{ {
result.Add(partition.Key, newValue); result.Add(partition.Key, newValue);
} }

6
src/Squidex.Domain.Apps.Core.Operations/ConvertContent/Value.cs

@ -9,12 +9,8 @@ using Newtonsoft.Json.Linq;
namespace Squidex.Domain.Apps.Core.ConvertContent namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
public sealed class Value public static class Value
{ {
public static readonly JToken Unset = JValue.CreateUndefined(); public static readonly JToken Unset = JValue.CreateUndefined();
private Value()
{
}
} }
} }

14
src/Squidex.Domain.Apps.Core.Operations/ConvertContent/ValueConverters.cs

@ -14,6 +14,8 @@ using Squidex.Infrastructure.Json;
namespace Squidex.Domain.Apps.Core.ConvertContent namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
public delegate JToken ValueConverter(JToken value, IField field);
public static class ValueConverters public static class ValueConverters
{ {
public static ValueConverter DecodeJson() public static ValueConverter DecodeJson()
@ -50,7 +52,7 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
return (value, field) => return (value, field) =>
{ {
return field.IsHidden ? null : value; return field.IsHidden ? Value.Unset : value;
}; };
} }
@ -58,16 +60,18 @@ namespace Squidex.Domain.Apps.Core.ConvertContent
{ {
return (value, field) => return (value, field) =>
{ {
try if (value.IsNull())
{ {
if (!value.IsNull()) return value;
}
try
{ {
JsonValueConverter.ConvertValue(field, value); JsonValueConverter.ConvertValue(field, value);
} }
}
catch catch
{ {
return null; return Value.Unset;
} }
return value; return value;

2
src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/FieldReferencesConverter.cs → src/Squidex.Domain.Apps.Core.Operations/ExtractReferenceIds/ValueReferencesConverter.cs

@ -12,7 +12,7 @@ using Squidex.Infrastructure.Json;
namespace Squidex.Domain.Apps.Core.ExtractReferenceIds namespace Squidex.Domain.Apps.Core.ExtractReferenceIds
{ {
public static class FieldReferencesConverter public static class ValueReferencesConverter
{ {
public static ValueConverter CleanReferences(IEnumerable<Guid> deletedReferencedIds) public static ValueConverter CleanReferences(IEnumerable<Guid> deletedReferencedIds)
{ {

14
src/Squidex.Domain.Apps.Entities.MongoDb/Contents/Extensions.cs

@ -28,12 +28,22 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
public static NamedContentData FromMongoModel(this IdContentData result, Schema schema, List<Guid> deletedIds) public static NamedContentData FromMongoModel(this IdContentData result, Schema schema, List<Guid> deletedIds)
{ {
return result.ToNameModel(schema, FieldConverters.DecodeJson(), FieldReferencesConverter.CleanReferences(deletedIds)); return result.ConvertId2Name(schema,
FieldConverters.ForValues(
ValueConverters.DecodeJson(),
ValueReferencesConverter.CleanReferences(deletedIds)),
FieldConverters.ForNestedId2Name(
ValueConverters.DecodeJson(),
ValueReferencesConverter.CleanReferences(deletedIds)));
} }
public static IdContentData ToMongoModel(this NamedContentData result, Schema schema) public static IdContentData ToMongoModel(this NamedContentData result, Schema schema)
{ {
return result.ToIdModel(schema, FieldConverters.EncodeJson()); return result.ConvertName2Id(schema,
FieldConverters.ForValues(
ValueConverters.EncodeJson()),
FieldConverters.ForNestedId2Name(
ValueConverters.EncodeJson()));
} }
public static string ToFullText<T>(this ContentData<T> data) public static string ToFullText<T>(this ContentData<T> data)

6
src/Squidex.Domain.Apps.Entities/Contents/ContentQueryService.cs

@ -154,12 +154,12 @@ namespace Squidex.Domain.Apps.Entities.Contents
result.Data = scriptEngine.Transform(new ScriptContext { User = context.User, Data = content.Data, ContentId = content.Id }, scriptText); result.Data = scriptEngine.Transform(new ScriptContext { User = context.User, Data = content.Data, ContentId = content.Id }, scriptText);
} }
result.Data = result.Data.Convert(schema.SchemaDef, converters); result.Data = result.Data.ConvertName2Name(schema.SchemaDef, converters);
} }
if (result.DataDraft != null) if (result.DataDraft != null)
{ {
result.DataDraft = result.DataDraft.Convert(schema.SchemaDef, converters); result.DataDraft = result.DataDraft.ConvertName2Name(schema.SchemaDef, converters);
} }
yield return result; yield return result;
@ -172,11 +172,13 @@ namespace Squidex.Domain.Apps.Entities.Contents
if (!context.IsFrontendClient) if (!context.IsFrontendClient)
{ {
yield return FieldConverters.ExcludeHidden(); yield return FieldConverters.ExcludeHidden();
yield return FieldConverters.ForNestedName2Name(ValueConverters.ExcludeHidden());
} }
if (checkType) if (checkType)
{ {
yield return FieldConverters.ExcludeChangedTypes(); yield return FieldConverters.ExcludeChangedTypes();
yield return FieldConverters.ForNestedName2Name(ValueConverters.ExcludeChangedTypes());
} }
yield return FieldConverters.ResolveInvariant(context.App.LanguagesConfig); yield return FieldConverters.ResolveInvariant(context.App.LanguagesConfig);

1
src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs

@ -28,7 +28,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL
{ {
public sealed class GraphQLModel : IGraphModel public sealed class GraphQLModel : IGraphModel
{ {
private readonly QueryGraphTypeVisitor schemaTypes;
private readonly Dictionary<ISchemaEntity, ContentGraphType> contentTypes = new Dictionary<ISchemaEntity, ContentGraphType>(); private readonly Dictionary<ISchemaEntity, ContentGraphType> contentTypes = new Dictionary<ISchemaEntity, ContentGraphType>();
private readonly Dictionary<ISchemaEntity, ContentDataGraphType> contentDataTypes = new Dictionary<ISchemaEntity, ContentDataGraphType>(); private readonly Dictionary<ISchemaEntity, ContentDataGraphType> contentDataTypes = new Dictionary<ISchemaEntity, ContentDataGraphType>();
private readonly Dictionary<Guid, ISchemaEntity> schemasById; private readonly Dictionary<Guid, ISchemaEntity> schemasById;

40
tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ContentConversionTests.cs

@ -30,7 +30,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
} }
[Fact] [Fact]
public void Should_convert_to_id_model() public void Should_convert_name_to_id()
{ {
var input = var input =
new NamedContentData() new NamedContentData()
@ -44,7 +44,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 2)); .AddValue("iv", 2));
var actual = input.ToIdModel(schema, (data, field) => field.Name == "field2" ? null : data); var actual = input.ConvertName2Id(schema, (data, field) => field.Name == "field2" ? null : data);
var expected = var expected =
new IdContentData() new IdContentData()
@ -56,25 +56,25 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
} }
[Fact] [Fact]
public void Should_convert_id_model() public void Should_convert_name_to_name()
{ {
var input = var input =
new IdContentData() new NamedContentData()
.AddField(1, .AddField("field1",
new ContentFieldData() new ContentFieldData()
.AddValue("en", "EN")) .AddValue("en", "EN"))
.AddField(2, .AddField("field2",
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 1)) .AddValue("iv", 1))
.AddField(99, .AddField("invalid",
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 2)); .AddValue("iv", 2));
var actual = input.Convert(schema, (data, field) => field.Name == "field2" ? null : data); var actual = input.ConvertName2Name(schema, (data, field) => field.Name == "field2" ? null : data);
var expected = var expected =
new IdContentData() new NamedContentData()
.AddField(1, .AddField("field1",
new ContentFieldData() new ContentFieldData()
.AddValue("en", "EN")); .AddValue("en", "EN"));
@ -82,7 +82,7 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
} }
[Fact] [Fact]
public void Should_convert_to_name_model() public void Should_convert_id_to_id()
{ {
var input = var input =
new IdContentData() new IdContentData()
@ -96,11 +96,11 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 2)); .AddValue("iv", 2));
var actual = input.ToNameModel(schema, (data, field) => field.Name == "field2" ? null : data); var actual = input.ConvertId2Id(schema, (data, field) => field.Name == "field2" ? null : data);
var expected = var expected =
new NamedContentData() new IdContentData()
.AddField("field1", .AddField(1,
new ContentFieldData() new ContentFieldData()
.AddValue("en", "EN")); .AddValue("en", "EN"));
@ -108,21 +108,21 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
} }
[Fact] [Fact]
public void Should_convert_name_model() public void Should_convert_id_to_name()
{ {
var input = var input =
new NamedContentData() new IdContentData()
.AddField("field1", .AddField(1,
new ContentFieldData() new ContentFieldData()
.AddValue("en", "EN")) .AddValue("en", "EN"))
.AddField("field2", .AddField(2,
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 1)) .AddValue("iv", 1))
.AddField("invalid", .AddField(99,
new ContentFieldData() new ContentFieldData()
.AddValue("iv", 2)); .AddValue("iv", 2));
var actual = input.Convert(schema, (data, field) => field.Name == "field2" ? null : data); var actual = input.ConvertId2Name(schema, (data, field) => field.Name == "field2" ? null : data);
var expected = var expected =
new NamedContentData() new NamedContentData()

131
tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/FieldConvertersTests.cs

@ -19,69 +19,150 @@ namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
public class FieldConvertersTests public class FieldConvertersTests
{ {
private readonly LanguagesConfig languagesConfig = LanguagesConfig.Build(Language.EN, Language.DE); private readonly LanguagesConfig languagesConfig = LanguagesConfig.Build(Language.EN, Language.DE);
private readonly RootField<NumberFieldProperties> numberField = Fields.Number(1, "1", Partitioning.Invariant);
private readonly RootField<StringFieldProperties> stringLanguageField = Fields.String(1, "1", Partitioning.Language); private readonly RootField<StringFieldProperties> stringLanguageField = Fields.String(1, "1", Partitioning.Language);
private readonly RootField<StringFieldProperties> stringInvariantField = Fields.String(1, "1", Partitioning.Invariant); private readonly RootField<StringFieldProperties> stringInvariantField = Fields.String(1, "1", Partitioning.Invariant);
private readonly RootField<JsonFieldProperties> jsonField = Fields.Json(1, "1", Partitioning.Invariant); private readonly RootField<JsonFieldProperties> jsonField = Fields.Json(1, "1", Partitioning.Invariant);
private readonly RootField<NumberFieldProperties> numberField = Fields.Number(1, "1", Partitioning.Invariant); private readonly RootField<ArrayFieldProperties> arrayField = Fields.Array(1, "1", Partitioning.Invariant,
Fields.Number(1, "field1"),
Fields.Number(2, "field2").Hide());
[Fact] [Fact]
public void Should_encode_json_value() public void Should_return_same_object_for_value_conversion_if_nothing_converted()
{ {
var source = JToken.FromObject(new { Value = 1 }); var input =
new ContentFieldData()
.AddValue("iv", new JObject());
var result = ValueConverters.EncodeJson()(source, jsonField); var actual = FieldConverters.ForValues()(input, stringInvariantField);
Assert.True(result.Type == JTokenType.String); Assert.Same(input, actual);
} }
[Fact] [Fact]
public void Should_return_same_value_if_encoding_null_value() public void Should_filter_for_value_conversion()
{ {
var source = JValue.CreateNull(); var input =
new ContentFieldData()
.AddValue("iv", new JObject());
var result = ValueConverters.EncodeJson()(source, jsonField); var actual = FieldConverters.ForValues((f, i) => Value.Unset)(input, stringInvariantField);
Assert.Same(source, result); var expected = new ContentFieldData();
Assert.Equal(expected, actual);
} }
[Fact] [Fact]
public void Should_return_same_value_if_encoding_non_json_field() public void Should_convert_for_value_conversion()
{ {
var source = (JToken)"NO-JSON"; var input =
new ContentFieldData()
.AddValue("iv", new JObject());
var result = ValueConverters.EncodeJson()(source, stringLanguageField); var actual = FieldConverters.ForValues(ValueConverters.EncodeJson())(input, jsonField);
Assert.Same(source, result); var expected =
new ContentFieldData()
.AddValue("iv", "e30=");
Assert.Equal(expected, actual);
} }
[Fact] [Fact]
public void Should_decode_json_values() public void Should_convert_name_to_id()
{ {
var source = "e30="; var input =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("field1", 100),
new JProperty("field2", 200),
new JProperty("invalid", 300))));
var result = ValueConverters.DecodeJson()(source, jsonField); var actual = FieldConverters.ForNestedName2Id(ValueConverters.ExcludeHidden())(input, arrayField);
Assert.True(result is JObject); var expected =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("1", 100))));
Assert.Equal(expected, actual);
} }
[Fact] [Fact]
public void Should_return_same_value_if_decoding_null_value() public void Should_convert_name_to_name()
{ {
var source = JValue.CreateNull(); var input =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("field1", 100),
new JProperty("field2", 200),
new JProperty("invalid", 300))));
var result = ValueConverters.DecodeJson()(source, jsonField); var actual = FieldConverters.ForNestedName2Name(ValueConverters.ExcludeHidden())(input, arrayField);
Assert.Same(source, result); var expected =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("field1", 100))));
Assert.Equal(expected, actual);
} }
[Fact] [Fact]
public void Should_return_same_value_if_decoding_non_json_field() public void Should_convert_id_to_id()
{ {
var source = JValue.CreateNull(); var input =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("1", 100),
new JProperty("2", 200),
new JProperty("99", 300))));
var result = ValueConverters.EncodeJson()(source, stringLanguageField); var actual = FieldConverters.ForNestedId2Id(ValueConverters.ExcludeHidden())(input, arrayField);
Assert.Same(source, result); var expected =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("1", 100))));
Assert.Equal(expected, actual);
}
[Fact]
public void Should_convert_id_to_name()
{
var input =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("1", 100),
new JProperty("2", 200),
new JProperty("99", 300))));
var actual = FieldConverters.ForNestedId2Name(ValueConverters.ExcludeHidden())(input, arrayField);
var expected =
new ContentFieldData()
.AddValue("iv",
new JArray(
new JObject(
new JProperty("field1", 100))));
Assert.Equal(expected, actual);
} }
[Fact] [Fact]

104
tests/Squidex.Domain.Apps.Core.Tests/Operations/ConvertContent/ValueConvertersTests.cs

@ -0,0 +1,104 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Core.Apps;
using Squidex.Domain.Apps.Core.ConvertContent;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Infrastructure;
using Xunit;
namespace Squidex.Domain.Apps.Core.Operations.ConvertContent
{
public class ValueConvertersTests
{
private readonly LanguagesConfig languagesConfig = LanguagesConfig.Build(Language.EN, Language.DE);
private readonly RootField<StringFieldProperties> stringField = Fields.String(1, "1", Partitioning.Invariant);
private readonly RootField<JsonFieldProperties> jsonField = Fields.Json(1, "1", Partitioning.Invariant);
private readonly RootField<NumberFieldProperties> numberField = Fields.Number(1, "1", Partitioning.Invariant);
[Fact]
public void Should_encode_json_value()
{
var source = new JObject();
var result = ValueConverters.EncodeJson()(source, jsonField);
Assert.Equal("e30=", result);
}
[Fact]
public void Should_return_same_value_if_encoding_null_value()
{
var source = JValue.CreateNull();
var result = ValueConverters.EncodeJson()(source, jsonField);
Assert.Same(source, result);
}
[Fact]
public void Should_return_same_value_if_encoding_non_json_field()
{
var source = (JToken)"NO-JSON";
var result = ValueConverters.EncodeJson()(source, stringField);
Assert.Same(source, result);
}
[Fact]
public void Should_decode_json_values()
{
var source = "e30=";
var result = ValueConverters.DecodeJson()(source, jsonField);
Assert.Equal(new JObject(), result);
}
[Fact]
public void Should_return_same_value_if_decoding_null_value()
{
var source = JValue.CreateNull();
var result = ValueConverters.DecodeJson()(source, jsonField);
Assert.Same(source, result);
}
[Fact]
public void Should_return_same_value_if_decoding_non_json_field()
{
var source = JValue.CreateNull();
var result = ValueConverters.EncodeJson()(source, stringField);
Assert.Same(source, result);
}
[Fact]
public void Should_return_unset_if_field_hidden()
{
var source = 123;
var result = ValueConverters.ExcludeHidden()(source, stringField.Hide());
Assert.Same(Value.Unset, result);
}
[Fact]
public void Should_return_unset_if_field_has_wrong_type()
{
var source = "invalid";
var result = ValueConverters.ExcludeChangedTypes()(source, numberField);
Assert.Same(Value.Unset, result);
}
}
}

4
tests/Squidex.Domain.Apps.Core.Tests/Operations/ExtractReferenceIds/ReferenceExtractionTests.cs

@ -69,9 +69,9 @@ namespace Squidex.Domain.Apps.Core.Operations.ExtractReferenceIds
new ContentFieldData() new ContentFieldData()
.AddValue("iv", new JArray(id1.ToString(), id2.ToString()))); .AddValue("iv", new JArray(id1.ToString(), id2.ToString())));
var converter = FieldConverters.ForValues(FieldReferencesConverter.CleanReferences(new[] { id2 })); var converter = FieldConverters.ForValues(ValueReferencesConverter.CleanReferences(new[] { id2 }));
var actual = input.Convert(schema, converter); var actual = input.ConvertId2Id(schema, converter);
var cleanedValue = (JArray)actual[5]["iv"]; var cleanedValue = (JArray)actual[5]["iv"];

2
tests/Squidex.Domain.Apps.Core.Tests/TestData.cs

@ -89,7 +89,7 @@ namespace Squidex.Domain.Apps.Core
.AddTags(112, "root-tags", Partitioning.Language, .AddTags(112, "root-tags", Partitioning.Language,
new TagsFieldProperties()) new TagsFieldProperties())
.Update(new SchemaProperties { Hints = "The User" }) .Update(new SchemaProperties { Hints = "The User" })
.UpdateField(107, f => f.Hide()) .UpdateField(104, f => f.Hide())
.UpdateField(108, f => f.Lock()) .UpdateField(108, f => f.Lock())
.UpdateField(109, f => f.Disable()); .UpdateField(109, f => f.Disable());

Loading…
Cancel
Save