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.Newtonsoft; |
|||
using Volo.Abp.Validation.StringValues; |
|||
using Xunit; |
|||
|
|||
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