Browse Source

Null fix for type converter.

pull/666/head
Sebastian 5 years ago
parent
commit
16c6f62795
  1. 2
      backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueGenerator.cs
  2. 5
      backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs
  3. 20
      backend/src/Squidex.Infrastructure.MongoDb/MongoDb/TypeConverterStringSerializer.cs
  4. 112
      backend/tests/Squidex.Infrastructure.Tests/MongoDb/TypeConverterStringSerializerTests.cs

2
backend/src/Squidex.Domain.Apps.Core.Operations/DefaultValues/DefaultValueGenerator.cs

@ -64,7 +64,7 @@ namespace Squidex.Domain.Apps.Core.DefaultValues
return;
}
if (!fieldData.TryGetValue(partitionKey, out var value))
if (!fieldData.ContainsKey(partitionKey))
{
fieldData.AddLocalized(partitionKey, defaultValue);
}

5
backend/src/Squidex.Domain.Apps.Entities.MongoDb/Contents/MongoContentRepository_SnapshotStore.cs

@ -6,6 +6,7 @@
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Squidex.Domain.Apps.Core.Contents;
@ -120,6 +121,10 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Contents
{
content.ReferencedIds = content.Data.GetReferencedIds(schema.SchemaDef);
}
else
{
content.ReferencedIds = new HashSet<DomainId>();
}
return content;
}

20
backend/src/Squidex.Infrastructure.MongoDb/MongoDb/TypeConverterStringSerializer.cs

@ -34,15 +34,33 @@ namespace Squidex.Infrastructure.MongoDb
}
public override T Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
if (context.Reader.CurrentBsonType == BsonType.Null)
{
context.Reader.ReadNull();
return default!;
}
else
{
var value = context.Reader.ReadString();
return (T)typeConverter.ConvertFromInvariantString(value);
}
}
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, T value)
{
context.Writer.WriteString(value!.ToString());
var text = value?.ToString();
if (text != null)
{
context.Writer.WriteString(text);
}
else
{
context.Writer.WriteNull();
}
}
}
}

112
backend/tests/Squidex.Infrastructure.Tests/MongoDb/TypeConverterStringSerializerTests.cs

@ -0,0 +1,112 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using MongoDB.Bson;
using MongoDB.Bson.IO;
using MongoDB.Bson.Serialization;
using Xunit;
namespace Squidex.Infrastructure.MongoDb
{
public class TypeConverterStringSerializerTests
{
public sealed record ValueHolder<T>
{
public T Value { get; set; }
}
public TypeConverterStringSerializerTests()
{
TypeConverterStringSerializer<DomainId>.Register();
TypeConverterStringSerializer<RefToken>.Register();
}
[Fact]
public void Should_serialize_struct()
{
var source = new ValueHolder<DomainId>
{
Value = DomainId.NewGuid()
};
var deserialized = SerializeAndDeserializeBson(source);
Assert.Equal(source, deserialized);
}
[Fact]
public void Should_serialize_nullable_struct()
{
var source = new ValueHolder<DomainId?>
{
Value = DomainId.NewGuid()
};
var deserialized = SerializeAndDeserializeBson(source);
Assert.Equal(source, deserialized);
}
[Fact]
public void Should_serialize_nullable_null_struct()
{
var source = new ValueHolder<DomainId?>
{
Value = null
};
var deserialized = SerializeAndDeserializeBson(source);
Assert.Equal(source, deserialized);
}
[Fact]
public void Should_serialize_class()
{
var source = new ValueHolder<RefToken>
{
Value = RefToken.Client("client")
};
var deserialized = SerializeAndDeserializeBson(source);
Assert.Equal(source, deserialized);
}
[Fact]
public void Should_serialize_null_class()
{
var source = new ValueHolder<RefToken?>
{
Value = null
};
var deserialized = SerializeAndDeserializeBson(source);
Assert.Equal(source, deserialized);
}
private static T SerializeAndDeserializeBson<T>(T value)
{
var document = new BsonDocument();
using (var writer = new BsonDocumentWriter(document))
{
BsonSerializer.Serialize(writer, value);
writer.Flush();
}
using (var reader = new BsonDocumentReader(document))
{
var result = BsonSerializer.Deserialize<T>(reader);
return result;
}
}
}
}
Loading…
Cancel
Save