Skip to content

Commit 2e081f5

Browse files
authored
Adding ability to control auto-validation (#15)
1 parent 3296693 commit 2e081f5

2 files changed

Lines changed: 61 additions & 7 deletions

File tree

V.Udodov.Json.Tests/EntityTests.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,5 +203,30 @@ public void WhenTryingToGetFlexibleDataEntityItemItShouldThrow()
203203

204204
result.Should().Be(12);
205205
}
206+
207+
[Fact]
208+
public void WhenSettingEntityFlexibleDataWithSchemaAndAutoValidationIsEnabledAndDataIsInvalidItShouldThrow()
209+
{
210+
const string schema = @"{
211+
'type': 'object',
212+
'properties': {
213+
'shoe_size': { 'type': 'number', 'minimum': 5, 'maximum': 12, 'multipleOf': 1.0 }
214+
}
215+
}";
216+
217+
var entityMock = new EntityMock
218+
{
219+
AutoValidate = false,
220+
ExtensionDataJsonSchema = schema
221+
};
222+
Action action = () => entityMock["shoe_size"] = 15;
223+
Action validation = () => entityMock.Validate();
224+
225+
action.Should().NotThrow<JsonEntityValidationException>();
226+
validation
227+
.Should().Throw<JsonEntityValidationException>()
228+
.And.Errors
229+
.Should().HaveCount(1);
230+
}
206231
}
207232
}

V.Udodov.Json/Entity.cs

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,16 @@ public class Entity
1313
[JsonIgnore] private JSchema _extensionDataJsonSchema;
1414
[JsonExtensionData] private readonly IDictionary<string, JToken> _data = new Dictionary<string, JToken>();
1515

16+
/// <summary>
17+
/// Enables auto-validation of object against JsonSchema on add attempt.
18+
/// </summary>
19+
[JsonIgnore] public bool AutoValidate { get; set; }
20+
21+
public Entity()
22+
{
23+
AutoValidate = true;
24+
}
25+
1626
/// <summary>
1727
/// Get Full JSON Schema including class properties and configured flexible data schema.
1828
/// </summary>
@@ -93,15 +103,18 @@ private void Set(string key, object value)
93103
{
94104
var token = JToken.FromObject(value);
95105

96-
if (_extensionDataJsonSchema != null)
106+
if (AutoValidate)
97107
{
98-
var obj = JObject.FromObject(_data);
99-
obj[key] = token;
108+
if (_extensionDataJsonSchema != null)
109+
{
110+
var obj = JObject.FromObject(_data);
111+
obj[key] = token;
100112

101-
if (!obj.IsValid(_extensionDataJsonSchema, out IList<ValidationError> errors))
102-
throw new JsonEntityValidationException(
103-
$"Validation for value {token} failed against JSON schema {_extensionDataJsonSchema}.",
104-
errors);
113+
if (!obj.IsValid(_extensionDataJsonSchema, out IList<ValidationError> errors))
114+
throw new JsonEntityValidationException(
115+
$"Validation for value {token} failed against JSON schema {_extensionDataJsonSchema}.",
116+
errors);
117+
}
105118
}
106119

107120
_data[key] = token;
@@ -132,5 +145,21 @@ object JTokenToObject(JToken source)
132145
value = null;
133146
return false;
134147
}
148+
149+
/// <summary>
150+
/// Validates if current entity state is valid against JsonSchema.
151+
/// </summary>
152+
/// <exception cref="JsonEntityValidationException"></exception>
153+
public void Validate()
154+
{
155+
if (_extensionDataJsonSchema == null) return;
156+
157+
var obj = JObject.FromObject(_data);
158+
159+
if (!obj.IsValid(_extensionDataJsonSchema, out IList<ValidationError> errors))
160+
throw new JsonEntityValidationException(
161+
$"Validation failed against JSON schema {_extensionDataJsonSchema}.",
162+
errors);
163+
}
135164
}
136165
}

0 commit comments

Comments
 (0)