using System; using System.Linq; using Microsoft.AspNetCore.Mvc.ModelBinding; namespace AMWD.Common.AspNetCore.Tests.Extensions { [TestClass] public class ModelStateDictionaryExtensionsTest { private TestModel _testModel; [TestInitialize] public void InitializeTests() { _testModel = new TestModel { ValueA = "A", ValueB = "B", SubModel = new TestSubModel { SubValueA = "a", SubValueB = "b" } }; } [TestMethod] public void ShouldAddNormalModelError() { // arrange var modelState = new ModelStateDictionary(); // act modelState.AddModelError(_testModel, m => m.ValueA, "ShitHappens"); // assert Assert.AreEqual(1, modelState.Count); Assert.AreEqual("ValueA", modelState.Keys.First()); Assert.AreEqual("ShitHappens", modelState.Values.First().Errors.First().ErrorMessage); } [TestMethod] public void ShouldAddExtendedModelError() { // arrange var modelState = new ModelStateDictionary(); // act modelState.AddModelError(_testModel, m => m.SubModel.SubValueB, "ShitHappens"); // assert Assert.AreEqual(1, modelState.Count); Assert.AreEqual("SubModel.SubValueB", modelState.Keys.First()); Assert.AreEqual("ShitHappens", modelState.Values.First().Errors.First().ErrorMessage); } [TestMethod] public void ShouldThrowArgumentNull() { // arrange ModelStateDictionary modelState = null; // act & assert Assert.ThrowsExactly(() => modelState.AddModelError(_testModel, m => m.SubModel.SubValueB, "ShitHappens")); } [TestMethod] public void ShouldThrowInvalidOperation() { // arrange var modelState = new ModelStateDictionary(); // act Assert.ThrowsExactly(() => modelState.AddModelError(_testModel, m => m, "ShitHappens")); } internal class TestModel { public string ValueA { get; set; } public string ValueB { get; set; } public TestSubModel SubModel { get; set; } } internal class TestSubModel { public string SubValueA { get; set; } public string SubValueB { get; set; } } } }