mirror of https://github.com/abpframework/abp.git
5 changed files with 112 additions and 245 deletions
@ -1,95 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using System.IO; |
|
||||
using System.Linq; |
|
||||
using Microsoft.Extensions.Options; |
|
||||
using Newtonsoft.Json; |
|
||||
using Newtonsoft.Json.Linq; |
|
||||
using Volo.Abp.DependencyInjection; |
|
||||
using Volo.Abp.Validation.StringValues; |
|
||||
|
|
||||
namespace Volo.Abp.FeatureManagement.JsonConverters; |
|
||||
|
|
||||
public class NewtonsoftStringValueTypeJsonConverter : JsonConverter, ITransientDependency |
|
||||
{ |
|
||||
public override bool CanWrite => false; |
|
||||
|
|
||||
protected readonly AbpFeatureManagementApplicationContractsOptions Options; |
|
||||
|
|
||||
public NewtonsoftStringValueTypeJsonConverter(IOptions<AbpFeatureManagementApplicationContractsOptions> options) |
|
||||
{ |
|
||||
Options = options.Value; |
|
||||
} |
|
||||
|
|
||||
public override bool CanConvert(Type objectType) |
|
||||
{ |
|
||||
return objectType == typeof(IStringValueType); |
|
||||
} |
|
||||
|
|
||||
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) |
|
||||
{ |
|
||||
throw new NotImplementedException("This method should not be called to write (since CanWrite is false)."); |
|
||||
} |
|
||||
|
|
||||
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) |
|
||||
{ |
|
||||
if (reader.TokenType != JsonToken.StartObject) |
|
||||
{ |
|
||||
return null; |
|
||||
} |
|
||||
|
|
||||
var jsonObject = JObject.Load(reader); |
|
||||
|
|
||||
var stringValue = CreateStringValueTypeByName(jsonObject, jsonObject["name"].ToString()); |
|
||||
foreach (var o in serializer.Deserialize<Dictionary<string, object>>( |
|
||||
new JsonTextReader(new StringReader(jsonObject["properties"].ToString())))) |
|
||||
{ |
|
||||
stringValue[o.Key] = o.Value; |
|
||||
} |
|
||||
|
|
||||
stringValue.Validator = CreateValueValidatorByName(jsonObject["validator"], jsonObject["validator"]["name"].ToString()); |
|
||||
foreach (var o in serializer.Deserialize<Dictionary<string, object>>( |
|
||||
new JsonTextReader(new StringReader(jsonObject["validator"]["properties"].ToString())))) |
|
||||
{ |
|
||||
stringValue.Validator[o.Key] = o.Value; |
|
||||
} |
|
||||
|
|
||||
return stringValue; |
|
||||
} |
|
||||
|
|
||||
protected virtual IStringValueType CreateStringValueTypeByName(JObject jObject, string name) |
|
||||
{ |
|
||||
if (name == "SelectionStringValueType") |
|
||||
{ |
|
||||
var selectionStringValueType = new SelectionStringValueType(); |
|
||||
if (jObject["itemSource"].HasValues) |
|
||||
{ |
|
||||
selectionStringValueType.ItemSource = new StaticSelectionStringValueItemSource(jObject["itemSource"]["items"] |
|
||||
.Select(item => new LocalizableSelectionStringValueItem() |
|
||||
{ |
|
||||
Value = item["value"].ToString(), |
|
||||
DisplayText = new LocalizableStringInfo(item["displayText"]["resourceName"].ToString(), item["displayText"]["name"].ToString()) |
|
||||
}).ToArray()); |
|
||||
} |
|
||||
|
|
||||
return selectionStringValueType; |
|
||||
} |
|
||||
|
|
||||
return name switch |
|
||||
{ |
|
||||
"FreeTextStringValueType" => new FreeTextStringValueType(), |
|
||||
"ToggleStringValueType" => new ToggleStringValueType(), |
|
||||
_ => throw new ArgumentException($"{nameof(IStringValueType)} named {name} was not found!") |
|
||||
}; |
|
||||
} |
|
||||
|
|
||||
protected virtual IValueValidator CreateValueValidatorByName(JToken jObject, string name) |
|
||||
{ |
|
||||
foreach (var factory in Options.ValueValidatorFactory.Where(factory => factory.CanCreate(name))) |
|
||||
{ |
|
||||
return factory.Create(); |
|
||||
} |
|
||||
|
|
||||
throw new ArgumentException($"{nameof(IValueValidator)} named {name} was cannot be created!"); |
|
||||
} |
|
||||
} |
|
||||
@ -1,16 +0,0 @@ |
|||||
using Microsoft.Extensions.DependencyInjection; |
|
||||
using Volo.Abp.Json; |
|
||||
using Volo.Abp.Json.SystemTextJson; |
|
||||
|
|
||||
namespace Volo.Abp.FeatureManagement; |
|
||||
|
|
||||
public class NewtonsoftStringValueJsonConverter_Tests : StringValueJsonConverter_Tests |
|
||||
{ |
|
||||
protected override void AfterAddApplication(IServiceCollection services) |
|
||||
{ |
|
||||
services.PreConfigure<AbpJsonOptions>(options => |
|
||||
{ |
|
||||
options.Providers.Remove<AbpSystemTextJsonSerializerProvider>(); |
|
||||
}); |
|
||||
} |
|
||||
} |
|
||||
@ -1,122 +0,0 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
|
||||
using Microsoft.Extensions.DependencyInjection; |
|
||||
using Shouldly; |
|
||||
using Volo.Abp.FeatureManagement.JsonConverters; |
|
||||
using Volo.Abp.Json; |
|
||||
using Volo.Abp.Validation.StringValues; |
|
||||
using Xunit; |
|
||||
|
|
||||
namespace Volo.Abp.FeatureManagement; |
|
||||
|
|
||||
public abstract class StringValueJsonConverter_Tests : FeatureManagementApplicationTestBase |
|
||||
{ |
|
||||
private readonly IJsonSerializer _jsonSerializer; |
|
||||
|
|
||||
public StringValueJsonConverter_Tests() |
|
||||
{ |
|
||||
_jsonSerializer = GetRequiredService<IJsonSerializer>(); |
|
||||
} |
|
||||
|
|
||||
protected override void BeforeAddApplication(IServiceCollection services) |
|
||||
{ |
|
||||
services.PreConfigure<AbpFeatureManagementApplicationContractsOptions>(options => |
|
||||
{ |
|
||||
options.ValueValidatorFactory.Add(new ValueValidatorFactory<UrlValueValidator>("URL")); |
|
||||
}); |
|
||||
|
|
||||
base.BeforeAddApplication(services); |
|
||||
} |
|
||||
|
|
||||
[Fact] |
|
||||
public void Should_Serialize_And_Deserialize() |
|
||||
{ |
|
||||
var featureListDto = new GetFeatureListResultDto |
|
||||
{ |
|
||||
Groups = new List<FeatureGroupDto> |
|
||||
{ |
|
||||
new FeatureGroupDto |
|
||||
{ |
|
||||
Name = "MyGroup", |
|
||||
DisplayName = "MyGroup", |
|
||||
Features = new List<FeatureDto> |
|
||||
{ |
|
||||
new FeatureDto |
|
||||
{ |
|
||||
ValueType = new FreeTextStringValueType |
|
||||
{ |
|
||||
Validator = new BooleanValueValidator() |
|
||||
} |
|
||||
}, |
|
||||
new FeatureDto |
|
||||
{ |
|
||||
ValueType = new SelectionStringValueType |
|
||||
{ |
|
||||
ItemSource = new StaticSelectionStringValueItemSource( |
|
||||
new LocalizableSelectionStringValueItem |
|
||||
{ |
|
||||
Value = "TestValue", |
|
||||
DisplayText = new LocalizableStringInfo("TestResourceName", "TestName") |
|
||||
}), |
|
||||
Validator = new AlwaysValidValueValidator() |
|
||||
} |
|
||||
}, |
|
||||
new FeatureDto |
|
||||
{ |
|
||||
ValueType = new ToggleStringValueType |
|
||||
{ |
|
||||
Validator = new NumericValueValidator |
|
||||
{ |
|
||||
MaxValue = 1000, |
|
||||
MinValue = 10 |
|
||||
} |
|
||||
} |
|
||||
}, |
|
||||
new FeatureDto |
|
||||
{ |
|
||||
Provider = new FeatureProviderDto |
|
||||
{ |
|
||||
Name = "FeatureName", |
|
||||
Key = "FeatureKey" |
|
||||
} |
|
||||
}, |
|
||||
new FeatureDto |
|
||||
{ |
|
||||
ValueType = new FreeTextStringValueType |
|
||||
{ |
|
||||
Validator = new UrlValueValidator("https") |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
}; |
|
||||
|
|
||||
var serialized = _jsonSerializer.Serialize(featureListDto, indented: true); |
|
||||
|
|
||||
var featureListDto2 = _jsonSerializer.Deserialize<GetFeatureListResultDto>(serialized); |
|
||||
|
|
||||
featureListDto2.ShouldNotBeNull(); |
|
||||
featureListDto2.Groups[0].Features[0].ValueType.ShouldBeOfType<FreeTextStringValueType>(); |
|
||||
featureListDto2.Groups[0].Features[0].ValueType.Validator.ShouldBeOfType<BooleanValueValidator>(); |
|
||||
|
|
||||
featureListDto2.Groups[0].Features[1].ValueType.ShouldBeOfType<SelectionStringValueType>(); |
|
||||
featureListDto2.Groups[0].Features[1].ValueType.Validator.ShouldBeOfType<AlwaysValidValueValidator>(); |
|
||||
featureListDto2.Groups[0].Features[1].ValueType.As<SelectionStringValueType>().ItemSource.Items.ShouldBeOfType<LocalizableSelectionStringValueItem[]>(); |
|
||||
featureListDto2.Groups[0].Features[1].ValueType.As<SelectionStringValueType>().ItemSource.Items.ShouldContain(x => |
|
||||
x.Value == "TestValue" && x.DisplayText.ResourceName == "TestResourceName" && |
|
||||
x.DisplayText.Name == "TestName"); |
|
||||
|
|
||||
featureListDto2.Groups[0].Features[2].ValueType.ShouldBeOfType<ToggleStringValueType>(); |
|
||||
featureListDto2.Groups[0].Features[2].ValueType.Validator.ShouldBeOfType<NumericValueValidator>(); |
|
||||
featureListDto2.Groups[0].Features[2].ValueType.Validator.As<NumericValueValidator>().MaxValue.ShouldBe(1000); |
|
||||
featureListDto2.Groups[0].Features[2].ValueType.Validator.As<NumericValueValidator>().MinValue.ShouldBe(10); |
|
||||
|
|
||||
featureListDto2.Groups[0].Features[3].Provider.Name.ShouldBe("FeatureName"); |
|
||||
featureListDto2.Groups[0].Features[3].Provider.Key.ShouldBe("FeatureKey"); |
|
||||
|
|
||||
featureListDto2.Groups[0].Features[4].ValueType.ShouldBeOfType<FreeTextStringValueType>(); |
|
||||
featureListDto2.Groups[0].Features[4].ValueType.Validator.ShouldBeOfType<UrlValueValidator>(); |
|
||||
featureListDto2.Groups[0].Features[4].ValueType.Validator.As<UrlValueValidator>().Scheme.ShouldBe("https"); |
|
||||
} |
|
||||
} |
|
||||
@ -1,16 +1,122 @@ |
|||||
using Microsoft.Extensions.DependencyInjection; |
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.FeatureManagement.JsonConverters; |
||||
using Volo.Abp.Json; |
using Volo.Abp.Json; |
||||
using Volo.Abp.Json.Newtonsoft; |
using Volo.Abp.Validation.StringValues; |
||||
|
using Xunit; |
||||
|
|
||||
namespace Volo.Abp.FeatureManagement; |
namespace Volo.Abp.FeatureManagement; |
||||
|
|
||||
public class SystemTextJsonStringValueJsonConverter_Tests : StringValueJsonConverter_Tests |
public class SystemTextJsonStringValueJsonConverter_Tests : FeatureManagementApplicationTestBase |
||||
{ |
{ |
||||
protected override void AfterAddApplication(IServiceCollection services) |
private readonly IJsonSerializer _jsonSerializer; |
||||
|
|
||||
|
public SystemTextJsonStringValueJsonConverter_Tests() |
||||
|
{ |
||||
|
_jsonSerializer = GetRequiredService<IJsonSerializer>(); |
||||
|
} |
||||
|
|
||||
|
protected override void BeforeAddApplication(IServiceCollection services) |
||||
{ |
{ |
||||
services.PreConfigure<AbpJsonOptions>(options => |
services.PreConfigure<AbpFeatureManagementApplicationContractsOptions>(options => |
||||
{ |
{ |
||||
options.Providers.Remove<AbpNewtonsoftJsonSerializerProvider>(); |
options.ValueValidatorFactory.Add(new ValueValidatorFactory<UrlValueValidator>("URL")); |
||||
}); |
}); |
||||
|
|
||||
|
base.BeforeAddApplication(services); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public void Should_Serialize_And_Deserialize() |
||||
|
{ |
||||
|
var featureListDto = new GetFeatureListResultDto |
||||
|
{ |
||||
|
Groups = new List<FeatureGroupDto> |
||||
|
{ |
||||
|
new FeatureGroupDto |
||||
|
{ |
||||
|
Name = "MyGroup", |
||||
|
DisplayName = "MyGroup", |
||||
|
Features = new List<FeatureDto> |
||||
|
{ |
||||
|
new FeatureDto |
||||
|
{ |
||||
|
ValueType = new FreeTextStringValueType |
||||
|
{ |
||||
|
Validator = new BooleanValueValidator() |
||||
|
} |
||||
|
}, |
||||
|
new FeatureDto |
||||
|
{ |
||||
|
ValueType = new SelectionStringValueType |
||||
|
{ |
||||
|
ItemSource = new StaticSelectionStringValueItemSource( |
||||
|
new LocalizableSelectionStringValueItem |
||||
|
{ |
||||
|
Value = "TestValue", |
||||
|
DisplayText = new LocalizableStringInfo("TestResourceName", "TestName") |
||||
|
}), |
||||
|
Validator = new AlwaysValidValueValidator() |
||||
|
} |
||||
|
}, |
||||
|
new FeatureDto |
||||
|
{ |
||||
|
ValueType = new ToggleStringValueType |
||||
|
{ |
||||
|
Validator = new NumericValueValidator |
||||
|
{ |
||||
|
MaxValue = 1000, |
||||
|
MinValue = 10 |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
new FeatureDto |
||||
|
{ |
||||
|
Provider = new FeatureProviderDto |
||||
|
{ |
||||
|
Name = "FeatureName", |
||||
|
Key = "FeatureKey" |
||||
|
} |
||||
|
}, |
||||
|
new FeatureDto |
||||
|
{ |
||||
|
ValueType = new FreeTextStringValueType |
||||
|
{ |
||||
|
Validator = new UrlValueValidator("https") |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
var serialized = _jsonSerializer.Serialize(featureListDto, indented: true); |
||||
|
|
||||
|
var featureListDto2 = _jsonSerializer.Deserialize<GetFeatureListResultDto>(serialized); |
||||
|
|
||||
|
featureListDto2.ShouldNotBeNull(); |
||||
|
featureListDto2.Groups[0].Features[0].ValueType.ShouldBeOfType<FreeTextStringValueType>(); |
||||
|
featureListDto2.Groups[0].Features[0].ValueType.Validator.ShouldBeOfType<BooleanValueValidator>(); |
||||
|
|
||||
|
featureListDto2.Groups[0].Features[1].ValueType.ShouldBeOfType<SelectionStringValueType>(); |
||||
|
featureListDto2.Groups[0].Features[1].ValueType.Validator.ShouldBeOfType<AlwaysValidValueValidator>(); |
||||
|
featureListDto2.Groups[0].Features[1].ValueType.As<SelectionStringValueType>().ItemSource.Items.ShouldBeOfType<LocalizableSelectionStringValueItem[]>(); |
||||
|
featureListDto2.Groups[0].Features[1].ValueType.As<SelectionStringValueType>().ItemSource.Items.ShouldContain(x => |
||||
|
x.Value == "TestValue" && x.DisplayText.ResourceName == "TestResourceName" && |
||||
|
x.DisplayText.Name == "TestName"); |
||||
|
|
||||
|
featureListDto2.Groups[0].Features[2].ValueType.ShouldBeOfType<ToggleStringValueType>(); |
||||
|
featureListDto2.Groups[0].Features[2].ValueType.Validator.ShouldBeOfType<NumericValueValidator>(); |
||||
|
featureListDto2.Groups[0].Features[2].ValueType.Validator.As<NumericValueValidator>().MaxValue.ShouldBe(1000); |
||||
|
featureListDto2.Groups[0].Features[2].ValueType.Validator.As<NumericValueValidator>().MinValue.ShouldBe(10); |
||||
|
|
||||
|
featureListDto2.Groups[0].Features[3].Provider.Name.ShouldBe("FeatureName"); |
||||
|
featureListDto2.Groups[0].Features[3].Provider.Key.ShouldBe("FeatureKey"); |
||||
|
|
||||
|
featureListDto2.Groups[0].Features[4].ValueType.ShouldBeOfType<FreeTextStringValueType>(); |
||||
|
featureListDto2.Groups[0].Features[4].ValueType.Validator.ShouldBeOfType<UrlValueValidator>(); |
||||
|
featureListDto2.Groups[0].Features[4].ValueType.Validator.As<UrlValueValidator>().Scheme.ShouldBe("https"); |
||||
} |
} |
||||
} |
} |
||||
|
|||||
Loading…
Reference in new issue