Browse Source

ModuleSetting UT covered

Dalibor Votruba 3 years ago
parent
commit
93b5f2507b

+ 1 - 0
Common/qdr.app.qlbrc.common/Settings/ModuleSetting.cs

@@ -33,5 +33,6 @@ namespace Quadarax.Application.QLiberace.Common.Settings
             return result;
         }
 
+
     }
 }

+ 1 - 1
Common/qdr.fnd.core.business/AbstractService.cs

@@ -36,7 +36,7 @@ namespace Quadarax.Foundation.Core.Business
         {
             if (fnc == null)
                 return null;
-            var result = default(TResult);
+            var result = Activator.CreateInstance<TResult>();
 
             try
             {

+ 1 - 4
Common/qdr.fnd.core.data.itfc/Entity/Dto/ResultDto.cs

@@ -38,10 +38,7 @@ namespace Quadarax.Foundation.Core.Data.Interface.Entity.Dto
         public void AppendException(Exception e)
         {
             if (e == null) throw new ArgumentNullException(nameof(e));
-            if (e is CodeException)
-            {
-                Errors = Errors.Append(new ErrorMessageDto(e));
-            }
+            Errors = Errors.Append(new ErrorMessageDto(e));
         }
 
         public AggregateException ToAggregateException()

+ 2 - 0
Common/qdr.fnd.core.data/Repository/EntityRepository.cs

@@ -31,6 +31,8 @@ namespace Quadarax.Foundation.Core.Data.Repository
 
         public virtual IQueryable<TEntity> Query(IPaging paging,bool usingUncommited=false)
         {
+            if (paging == null) throw new ArgumentNullException(nameof(paging));
+
             var local = DbSetInstance.Local.Page(paging.IsDisabled ? (int?) null : paging.Page, paging.PageSize).AsQueryable();
             if (local.Any() && usingUncommited)
             {

+ 16 - 0
Common/qdr.fnd.core.test/Repositories/GeneralRepositoryTest.cs

@@ -159,6 +159,22 @@ namespace qdr.fnd.core.test.Repositories
                 Assert.That(list[0].Name, Is.EqualTo(DaoName2));
             }
         }
+
+        [Test]
+        public void QueryPagingFail()
+        {
+            
+            // read check outside UOW
+            using (var uow = new UnitOfWork<TestDbContext>(_dbcResolver))
+            {
+                var repo = new TestRepo(uow.As<IDataDomain>());
+                Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                            repo.Query(null))
+                        .ParamName,
+                    Is.EqualTo("paging"));
+            }
+        }
+
         [Test]
         public void RollbackEntity()
         {

+ 0 - 1
Modules/qdr.app.qlbrc.base/Entities/Setting.cs

@@ -32,7 +32,6 @@ public class Setting : QlbrcEntityTrackedWithoutId, IStructSetting
     [Required(AllowEmptyStrings = false)]
     public string ValueTypeQualified { get; set; } = null!;
     [MaxLength(5000)]
-    [Required]
     public string? Value { get; set; }
     [Required]
     [DefaultValue(false)]

+ 33 - 14
Modules/qdr.app.qlbrc.base/Services/SettingsService.cs

@@ -24,7 +24,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
 
         #region *** Public Operations ***
 
-        public ResultDto CreateSettings<TSettings>(ModuleSetting settings) where TSettings : ModuleSetting
+        public ResultPlain CreateSettings<TSettings>(ModuleSetting settings) where TSettings : ModuleSetting
         {
             if (settings == null)
                 throw new ArgumentNullException(nameof(settings));
@@ -66,7 +66,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
                 if (!Repository.QueryModule(moduleCode, Paging.NoPaging()).Any()) 
                     throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundForModuleCode, moduleCode);
                 
-                var settingDto = default(TSettings);
+                var settingDto = Activator.CreateInstance<TSettings>();
                 if (settingDto == null) throw new ArgumentNullException(nameof(settingDto));
 
                 var settings = Repository.QueryModule(moduleCode,Paging.NoPaging());
@@ -118,15 +118,15 @@ namespace Quadarax.Application.QLiberace.Base.Services
             });
         }
 
-        public ResultDto AddSettingsValue(string moduleCode, string valueCode, string valueDescription, object value)
+        public ResultPlain AddSettingsValue<TValue>(string moduleCode, string valueCode, string valueDescription, object value)
         {
             if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
             if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
 
-            return TryCatchBlock(() =>
+            return TryCatchBlock<ResultPlain>(() =>
             {
                 var exists = ExistsSettingsValue(moduleCode, valueCode);
-                if (!exists.IsSuccess) return (ResultDto)exists;
+                if (!exists.IsSuccess) return new ResultPlain(exists.Errors);
 
                 if (exists.Value)
                     throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsAlreadyExistsCode, valueCode, moduleCode);
@@ -137,13 +137,15 @@ namespace Quadarax.Application.QLiberace.Base.Services
                 settings.Code = valueCode;
                 settings.Description = valueDescription;
                 settings.Value = value?.ToString();
+                var settingsValueTypeQualified = typeof(TValue).FullName;
+                if (settingsValueTypeQualified != null) settings.ValueTypeQualified = settingsValueTypeQualified;
                 settings.IsEnabled = true;
                 //Repository.Commit();
                 return new ResultPlain();
             });
         }
 
-        public ResultDto UpdateSettings<TSettings>(ModuleSetting settings) where TSettings : ModuleSetting
+        public ResultPlain UpdateSettings<TSettings>(ModuleSetting settings) where TSettings : ModuleSetting
         {
             if (settings == null)
                 throw new ArgumentNullException(nameof(settings));
@@ -158,6 +160,9 @@ namespace Quadarax.Application.QLiberace.Base.Services
                     throw new InvalidOperationException(
                         "ModuleAttribute is defined on more than one ModuleSetting class.");
 
+                if (!ExistsSettings(attrs[0].ModuleCode).Value)
+                    throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundForModuleCode, attrs[0].ModuleCode);
+
                 var settingsFlat = settings.GetData();
                 foreach (var flat in settingsFlat)
                 {
@@ -165,6 +170,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
 
                     if (setting == null)
                         throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, flat.Item1, attrs[0].ModuleCode);
+                    setting.Value = GetSettingValueAsString(flat.Item3);
                     Repository.Set(setting);
                 }
 
@@ -173,7 +179,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
             });
         }
 
-        public ResultDto UpdateSettingsValue(string moduleCode, string valueCode, object value)
+        public ResultPlain UpdateSettingsValue(string moduleCode, string valueCode, object value)
         {
             if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
             if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
@@ -181,7 +187,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
             return TryCatchBlock(() =>
             {
                 var exists = ExistsSettingsValue(moduleCode, valueCode);
-                if (!exists.IsSuccess) return (ResultDto)exists;
+                if (!exists.IsSuccess) return new ResultPlain(exists.Errors);
 
                 if (!exists.Value)
                     throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, valueCode, moduleCode);
@@ -190,7 +196,8 @@ namespace Quadarax.Application.QLiberace.Base.Services
                 if (settings==null)
                     throw ExceptionFactory.CreateException(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode, valueCode, moduleCode);
 
-                settings.Value = value?.ToString();
+                settings.Value = GetSettingValueAsString(value);
+                Repository.Set(settings);
                 //Repository.Commit();
                 
                 return new ResultPlain();
@@ -198,12 +205,12 @@ namespace Quadarax.Application.QLiberace.Base.Services
 
         }
 
-        public ResultDto AddOrUpdateSettingsValue(string moduleCode, string valueCode, object value)
+        public ResultPlain AddOrUpdateSettingsValue<TValue>(string moduleCode, string valueCode, object value)
         {
-            return AddOrUpdateSettingsValue(moduleCode, valueCode, value, string.Empty);
+            return AddOrUpdateSettingsValue<TValue>(moduleCode, valueCode, value, string.Empty);
         }
 
-        public ResultDto AddOrUpdateSettingsValue(string moduleCode, string valueCode, object value, string valueDescription)
+        public ResultPlain AddOrUpdateSettingsValue<TValue>(string moduleCode, string valueCode, object value, string valueDescription)
         {
             if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
             if (string.IsNullOrEmpty(valueCode)) throw new ArgumentNullException(nameof(valueCode));
@@ -211,7 +218,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
             return TryCatchBlock(() =>
             {
                 var exists = ExistsSettingsValue(moduleCode, valueCode);
-                if (!exists.IsSuccess) return (ResultDto)exists;
+                if (!exists.IsSuccess) return new ResultPlain(exists.Errors);
 
                 if (exists.Value)
                 {
@@ -219,7 +226,7 @@ namespace Quadarax.Application.QLiberace.Base.Services
                 }
                 else
                 {
-                    return AddSettingsValue(moduleCode, valueCode, valueDescription, value);
+                    return AddSettingsValue<TValue>(moduleCode, valueCode, valueDescription, value);
                 }
             });
         }
@@ -247,6 +254,18 @@ namespace Quadarax.Application.QLiberace.Base.Services
             return settings;
         }
 
+        private string? GetSettingValueAsString(object? value)
+        {
+            if (value == null) return null;
+
+            if (value is DateTime time)
+            {
+                return time.ToString("O");
+            }
+
+            return value.ToString();
+        }
+
         #endregion
         
     }

+ 1 - 1
Tests/qdr.app.qlbrc.base.Tests/Entities/SettingTest.cs

@@ -38,7 +38,7 @@ namespace Quadarax.Application.QLiberace.Base.Tests.Entities
         public void ColumnMappingsOK()
         {
             CheckColumnFKMappings(nameof(Setting.ParentId), string.Empty,"FK_Setting_Parent_Id", false);
-            CheckColumnMappings(nameof(Setting.Value), string.Empty,true, 5000);
+            CheckColumnMappings(nameof(Setting.Value), string.Empty,false, 5000);
             CheckColumnCode(null);
             CheckColumnDescription(null);
             CheckColumnModuleCode(null);

+ 86 - 0
Tests/qdr.app.qlbrc.base.Tests/Services/Fakes/ModuleSettingFake.cs

@@ -0,0 +1,86 @@
+using Quadarax.Application.QLiberace.Common.Attributes;
+using Quadarax.Application.QLiberace.Common.Settings;
+
+namespace Quadarax.Application.QLiberace.Base.Tests.Services.Fakes
+{
+    [Module("test")]
+    internal class ModuleSettingFake : ModuleSetting, IEquatable<ModuleSettingFake>
+    {
+
+        public const string DefPropertyString1 = "test1";
+        public const string? DefPropertyString2 = null;
+        public const string DefPropertyDateTime1String = "12.3.2022 13:02:54";
+        public const string? DefPropertyDateTime2String = null;
+
+        public const string DefPropertyTimeSpanString = "00:00:35";
+        public const int DefPropertyInt = 35;
+        public const bool DefPropertyBool = true;
+
+
+        public string PropertyString1 { get; set; }
+        public string? PropertyString2 { get; set; }
+        public DateTime PropertyDateTime1 { get; set; }
+        public DateTime? PropertyDateTime2 { get; set; }
+        public DateTime? PropertyDateTimeNow { get; set; }
+
+        public TimeSpan? PropertyTimeSpan { get; set; }
+        public int? PropertyInt { get; set; }
+        public bool PropertyBool { get; set; }
+
+        private bool InvisiblePropertyBool { get; set; }
+
+        public ModuleSettingFake()
+        {
+            PropertyString1 = string.Empty;
+            PropertyDateTimeNow = DateTime.Now;
+            Reset();
+        }
+
+        public void Clear()
+        {
+            PropertyString1 = string.Empty;
+            PropertyString2 = null;
+            PropertyDateTime1 = DateTime.MinValue;
+            PropertyDateTime2 = null;
+            PropertyTimeSpan = null;
+            PropertyInt = null;
+            PropertyBool = false;
+            InvisiblePropertyBool = true;
+        }
+        public void Reset()
+        {
+            PropertyString1 = DefPropertyString1;
+            PropertyString2 = DefPropertyString2;
+            PropertyDateTime1 = DateTime.Parse(DefPropertyDateTime1String);
+            PropertyDateTime2 = string.IsNullOrEmpty(DefPropertyDateTime2String)
+                ? (DateTime?)null
+                : DateTime.Parse(DefPropertyDateTime2String!);
+            PropertyTimeSpan = string.IsNullOrEmpty(DefPropertyTimeSpanString)
+                ? (TimeSpan?)null
+                : TimeSpan.Parse(DefPropertyTimeSpanString);
+            PropertyInt = DefPropertyInt;
+            PropertyBool = DefPropertyBool;
+            InvisiblePropertyBool = true;
+        }
+
+        public bool Equals(ModuleSettingFake? other)
+        {
+            if (ReferenceEquals(null, other)) return false;
+            if (ReferenceEquals(this, other)) return true;
+            return PropertyString1 == other.PropertyString1 && PropertyString2 == other.PropertyString2 && PropertyDateTime1.Equals(other.PropertyDateTime1) && Nullable.Equals(PropertyDateTime2, other.PropertyDateTime2) && Nullable.Equals(PropertyTimeSpan, other.PropertyTimeSpan) && PropertyInt == other.PropertyInt && PropertyBool == other.PropertyBool && InvisiblePropertyBool == other.InvisiblePropertyBool;
+        }
+
+        public override bool Equals(object? obj)
+        {
+            if (ReferenceEquals(null, obj)) return false;
+            if (ReferenceEquals(this, obj)) return true;
+            if (obj.GetType() != this.GetType()) return false;
+            return Equals((ModuleSettingFake)obj);
+        }
+
+        public override int GetHashCode()
+        {
+            return HashCode.Combine(PropertyString1, PropertyString2, PropertyDateTime1, PropertyDateTime2, PropertyTimeSpan, PropertyInt, PropertyBool, InvisiblePropertyBool);
+        }
+    }
+}

+ 25 - 0
Tests/qdr.app.qlbrc.base.Tests/Services/Fakes/ModuleSettingWoAttributeFake.cs

@@ -0,0 +1,25 @@
+using Quadarax.Application.QLiberace.Common.Settings;
+
+namespace Quadarax.Application.QLiberace.Base.Tests.Services.Fakes
+{
+    public class ModuleSettingWoAttributeFake : ModuleSetting, IEquatable<ModuleSettingWoAttributeFake>
+    {
+        public bool Equals(ModuleSettingWoAttributeFake? other)
+        {
+            return true;
+        }
+
+        public override bool Equals(object? obj)
+        {
+            if (ReferenceEquals(null, obj)) return false;
+            if (ReferenceEquals(this, obj)) return true;
+            if (obj.GetType() != this.GetType()) return false;
+            return Equals((ModuleSettingWoAttributeFake)obj);
+        }
+
+        public override int GetHashCode()
+        {
+            return 0;
+        }
+    }
+}

+ 354 - 8
Tests/qdr.app.qlbrc.base.Tests/Services/SettingsServiceTest.cs

@@ -1,8 +1,12 @@
-using qdr.fnd.core.test;
+using System.Globalization;
+using qdr.fnd.core.test;
 using Quadarax.Application.QLiberace.Base.Repositories;
 using Quadarax.Application.QLiberace.Base.Services;
 using Quadarax.Application.QLiberace.Base.Tests.Services.Fakes;
+using Quadarax.Application.QLiberace.Common;
+using Quadarax.Foundation.Core.Data;
 using Quadarax.Foundation.Core.Data.Domain;
+using Quadarax.Foundation.Core.Value.Extensions;
 
 namespace Quadarax.Application.QLiberace.Base.Tests.Services
 {
@@ -24,36 +28,122 @@ namespace Quadarax.Application.QLiberace.Base.Tests.Services
         [Test]
         public void CreateSettingsOK()
         {
+            var service = GetService();
+            var settings = new ModuleSettingFake();
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+            
+            //check if stored in database
+            Uow.Commit();
+            var repo = GetRepository();
+            var value = repo.Get("test", nameof(settings.PropertyString1));
+            Assert.That(value, Is.Not.Null);
+            Assert.That(value.Value, Is.EqualTo(settings.PropertyString1));
+            Assert.That(value.IsEnabled, Is.True);
+            Assert.That(value.ValueTypeQualified, Is.EqualTo(typeof(string).FullName));
 
         }
 
         [Test]
         public void CreateSettingsFail()
         {
-
+            var service = GetService();
+
+            // no module attribute
+            var settings = new ModuleSettingWoAttributeFake();
+            var result =  service.CreateSettings<ModuleSettingWoAttributeFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.False);
+            Assert.That(result.Errors.Count(), Is.GreaterThan(0));
+            Assert.That(result.Errors.First().Message.StartsWith("ModuleAttribute"), Is.True);
         }
 
         [Test]
         public void GetSettingsOK()
         {
+            var service = GetService();
+
+            var settings = new ModuleSettingFake();
+            settings.PropertyString2 = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            // gets the settings as dto
+            var resultSettings = service.GetSettings<ModuleSettingFake>("test");
+            Assert.That(resultSettings, Is.Not.Null);
+            Assert.That(resultSettings.IsSuccess, Is.True);
+            Assert.That(resultSettings.Errors.Count(), Is.EqualTo(0));
+            Assert.That(resultSettings.Value, Is.Not.Null);
+            Assert.That(resultSettings.Value.PropertyString2, Is.EquivalentTo(settings.PropertyString2));
+
 
         }
 
         [Test]
         public void GetSettingsFail()
         {
-
+            var service = GetService();
+
+            // invalid module code
+            var resultSettings = service.GetSettings<ModuleSettingFake>("testx");
+            Assert.That(resultSettings, Is.Not.Null);
+            Assert.That(resultSettings.IsSuccess, Is.False);
+            Assert.That(resultSettings.Errors.Count(), Is.GreaterThan(0));
+            Assert.That(resultSettings.Errors.First().Code, Is.EqualTo(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundForModuleCode));
+
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.GetSettings<ModuleSettingFake>(string.Empty))
+                    ?.ParamName,
+                    Is.EqualTo("moduleCode"));
         }
 
         [Test]
         public void GetSettingsValueOK()
         {
-
+            var service = GetService();
+
+            // create one settings
+            var settings = new ModuleSettingFake();
+            settings.PropertyString2 = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            var settingGot = service.GetSettingsValues("test", Paging.NoPaging());
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(settingGot.Values.Count, Is.EqualTo(8));
+            Assert.That(((DateTime?)settingGot.Values["PropertyDateTimeNow"])?.ToFileShortDateTimeString(), Is.EqualTo(settings.PropertyDateTimeNow?.ToFileShortDateTimeString()));
         }
 
         [Test]
         public void GetSettingsValueFail()
         {
+            var service = GetService();
+
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.GetSettingsValues(string.Empty, Paging.NoPaging()))
+                    ?.ParamName,
+                Is.EqualTo("moduleCode"));
+
+            // not existing module
+            var settings = service.GetSettingsValues("testx", Paging.NoPaging());
+            Assert.That(settings, Is.Not.Null);
+            Assert.That(settings.IsSuccess, Is.True);
+            Assert.That(settings.Errors.Count(), Is.EqualTo(0));
+            Assert.That(settings.Values.Count, Is.EqualTo(0));
 
         }
 
@@ -61,72 +151,328 @@ namespace Quadarax.Application.QLiberace.Base.Tests.Services
         [Test]
         public void ExistsSettingsValueOK()
         {
-
+            var service = GetService();
+
+            
+            // create one settings
+            var settings = new ModuleSettingFake();
+            settings.PropertyString2 = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            var value =  service.GetSettingsValue<DateTime?>("test","PropertyDateTimeNow");
+            Assert.That(value, Is.Not.Null);
+            Assert.That(value.IsSuccess, Is.True);
+            Assert.That(value.Errors.Count(), Is.EqualTo(0));  
+            Assert.That(((DateTime?)value.Value)?.ToFileShortDateTimeString(), Is.EqualTo(settings.PropertyDateTimeNow?.ToFileShortDateTimeString()));
         }
 
         [Test]
         public void ExistsSettingsValueFail()
         {
+            var service = GetService();
+
+            
+            // create one settings
+            var settings = new ModuleSettingFake();
+            settings.PropertyString2 = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.GetSettingsValue<DateTime?>(string.Empty, "PropertyDateTimeNow"))
+                    ?.ParamName,
+                Is.EqualTo("moduleCode"));
+
+            // not empty value code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.GetSettingsValue<DateTime?>("test", string.Empty))
+                    ?.ParamName,
+                Is.EqualTo("valueCode"));
+
+            // not existing value code
+            var fail = service.GetSettingsValue<DateTime?>("test", "PropertyDateTimeNow2");
+            Assert.That(fail, Is.Not.Null);
+            Assert.That(fail.IsSuccess, Is.False);
+            Assert.That(fail.Errors.Count(), Is.EqualTo(1));
+            Assert.That(fail.Errors.First().Code, Is.EqualTo(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode));
 
         }
 
         [Test]
         public void AddSettingsValueOK()
         {
-
+            var service = GetService();
+
+            // add new value
+            var result = service.AddSettingsValue<string>("test", "foo", "this is a foo", "value");
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            // read new created value
+            var resultValue = service.GetSettingsValue<string>("test", "foo");
+            Assert.That(resultValue, Is.Not.Null);
+            Assert.That(resultValue.IsSuccess, Is.True);
+            Assert.That(resultValue.Errors.Count(), Is.EqualTo(0));
+            Assert.That(resultValue.Value, Is.EqualTo("value"));
         }
 
         [Test]
         public void AddSettingsValueFail()
         {
+            var service = GetService();
+
+            // add new value correct
+            var result = service.AddSettingsValue<string>("test", "foo", "this is a foo", "value");
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            // add duplicit value
+            var fail = service.AddSettingsValue<string>("test", "foo", "this is a foo", "value");
+            Assert.That(fail, Is.Not.Null);
+            Assert.That(fail.IsSuccess, Is.False);
+            Assert.That(fail.Errors.Count(), Is.EqualTo(1));
+            Assert.That(fail.Errors.First().Code, Is.EqualTo(ExceptionLibrary.ExceptionsCodes.SettingsAlreadyExistsCode));
+
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.AddSettingsValue<string>(string.Empty, "foo", "this is a foo", "value"))
+                    ?.ParamName,
+                Is.EqualTo("moduleCode"));
+
+            // not empty value code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.AddSettingsValue<string>("test", string.Empty, "this is a foo", "value"))
+                    ?.ParamName,
+                Is.EqualTo("valueCode"));
 
         }
 
         [Test]
         public void UpdateSettingsOK()
         {
+            var service = GetService();
+            
+            // create one settings
+            var settings = new ModuleSettingFake();
+            settings.PropertyString2 = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            settings.PropertyBool = !settings.PropertyBool;
+            settings.PropertyDateTime1 = DateTime.Now;
+            settings.PropertyDateTime2 = DateTime.Now;
+            settings.PropertyInt = null;
+
+            result = service.UpdateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+            var settingGot = service.GetSettings<ModuleSettingFake>("test");
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(settingGot.Value.PropertyDateTimeNow?.ToFileShortDateTimeString(), Is.EqualTo(settings.PropertyDateTimeNow?.ToFileShortDateTimeString()));
+            Assert.That(settingGot.Value.PropertyDateTime1.ToFileShortDateTimeString(), Is.EqualTo(settings.PropertyDateTime1.ToFileShortDateTimeString()));
+
+
 
         }
 
         [Test]
         public void UpdateSettingsFail()
         {
+            var service = GetService();
+            
+            // create one settings
+            var settings = new ModuleSettingFake();
+            
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.UpdateSettings<ModuleSettingFake>(null))?.ParamName,
+                Is.EqualTo("settings"));
+
+            var fail = service.UpdateSettings<ModuleSettingFake>(settings);
+            Assert.That(fail, Is.Not.Null);
+            Assert.That(fail.IsSuccess, Is.False);
+            Assert.That(fail.Errors.Count(), Is.EqualTo(1));
+            Assert.That(fail.Errors.First().Code, Is.EqualTo(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundForModuleCode));
+
+            // include test for attributes
+            //Assert.That(Assert.Throws<InvalidOperationException>(() =>
+            //        service.UpdateSettings<ModuleSettingWoAttributeFake>(new ModuleSettingWoAttributeFake()))?.Message.StartsWith("ModuleAttribute"),
+            //    Is.True);
+            
 
         }
 
         [Test]
         public void UpdateSettingsValueOK()
         {
+            var service = GetService();
+            
+            // create one settings
+            var settings = new ModuleSettingFake();
+            settings.PropertyString2 = DateTime.Now.ToOADate().ToString(CultureInfo.InvariantCulture);
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+            var now = DateTime.Now;
+            result = service.UpdateSettingsValue("test", "PropertyDateTime1", now);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+            var settingGot = service.GetSettingsValue<DateTime>("test","PropertyDateTime1");
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(((DateTime)settingGot.Value).ToFileShortDateTimeString(), Is.EqualTo(now.ToFileShortDateTimeString()));
+
+            result = service.UpdateSettingsValue("test", "PropertyInt", null);
 
         }
 
         [Test]
         public void UpdateSettingsValueFail()
         {
+            var service = GetService();
+
+            // add duplicit value
+            var fail = service.UpdateSettingsValue("test", "foo", "value");
+            Assert.That(fail, Is.Not.Null);
+            Assert.That(fail.IsSuccess, Is.False);
+            Assert.That(fail.Errors.Count(), Is.EqualTo(1));
+            Assert.That(fail.Errors.First().Code, Is.EqualTo(ExceptionLibrary.ExceptionsCodes.SettingsNotFoundCode));
+
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.UpdateSettingsValue(string.Empty, "foo", "value"))
+                    ?.ParamName,
+                Is.EqualTo("moduleCode"));
+
+            // not empty value code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.UpdateSettingsValue("test", string.Empty, "value"))
+                    ?.ParamName,
+                Is.EqualTo("valueCode"));
 
         }
 
         [Test]
         public void AddOrUpdateSettingsValueOK()
         {
+            var service = GetService();
+
+            var now = DateTime.Now;
+            var result = service.AddOrUpdateSettingsValue<DateTime>("test", "PropertyDateTime1", now);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+            var settingGot = service.GetSettingsValue<DateTime>("test","PropertyDateTime1");
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(((DateTime)settingGot.Value).ToFileShortDateTimeString(), Is.EqualTo(now.ToFileShortDateTimeString()));
+
+            now = DateTime.Now.AddHours(1);
+            result = service.AddOrUpdateSettingsValue<DateTime>("test", "PropertyDateTime1", now);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+            Uow.Commit();
+
+            settingGot = service.GetSettingsValue<DateTime>("test","PropertyDateTime1");
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(((DateTime)settingGot.Value).ToFileShortDateTimeString(), Is.EqualTo(now.ToFileShortDateTimeString()));
 
         }
 
         [Test]
         public void AddOrUpdateSettingsValueFail()
         {
-
+            var service = GetService();
+
+            
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.AddOrUpdateSettingsValue<DateTime>(string.Empty, "foo", "value"))
+                    ?.ParamName,
+                Is.EqualTo("moduleCode"));
+
+            // not empty value code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.AddOrUpdateSettingsValue<DateTime>("test", string.Empty, "value"))
+                    ?.ParamName,
+                Is.EqualTo("valueCode"));
         }
 
         [Test]
         public void GetSettingsValuesOK()
         {
+            var service = GetService();
+
+            // create one settings
+            var settings = new ModuleSettingFake();
+            var result =  service.CreateSettings<ModuleSettingFake>(settings);
+            Assert.That(result, Is.Not.Null);
+            Assert.That(result.IsSuccess, Is.True);
+            Assert.That(result.Errors.Count(), Is.EqualTo(0));
+
+            Uow.Commit();
+
+            var settingGot = service.GetSettingsValues("test", Paging.NoPaging());
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(settingGot.Values.Count, Is.EqualTo(8));
 
         }
         [Test]
         public void GetSettingsValuesFail()
         {
-
+            var service = GetService();
+
+            
+            // empty module code
+            Assert.That(Assert.Throws<ArgumentNullException>(() =>
+                        service.GetSettingsValues(string.Empty, null))
+                    ?.ParamName,
+                Is.EqualTo("moduleCode"));
+
+            var settingGot = service.GetSettingsValues("testx", Paging.NoPaging());
+            Assert.That(settingGot, Is.Not.Null);
+            Assert.That(settingGot.IsSuccess, Is.True);
+            Assert.That(settingGot.Errors.Count(), Is.EqualTo(0));
+            Assert.That(settingGot.Values.Count, Is.EqualTo(0));
         }
 
     }

+ 4 - 2
Tests/qdr.app.qlbrc.common.Tests/Settings/Fakes/ModuleSettingFake.cs

@@ -1,8 +1,10 @@
-using Quadarax.Application.QLiberace.Common.Settings;
+using Quadarax.Application.QLiberace.Common.Attributes;
+using Quadarax.Application.QLiberace.Common.Settings;
 
 namespace Quadarax.Application.QLiberace.Common.Tests.Settings.Fakes
 {
-    internal class ModuleSettingFake : ModuleSetting, IEquatable<ModuleSettingFake>
+    [Module("test")]
+    public class ModuleSettingFake : ModuleSetting, IEquatable<ModuleSettingFake>
     {
 
         public const string DefPropertyString1 = "test1";

+ 22 - 0
Tests/qdr.app.qlbrc.common.Tests/Settings/ModuleSettingsTest.cs

@@ -67,5 +67,27 @@ namespace Quadarax.Application.QLiberace.Common.Tests.Settings
             var newSettings = new ModuleSettingFake();
             Assert.That(_setting,Is.EqualTo(newSettings));
         }
+
+
+        [Test(TestOf = typeof(ModuleSetting))]
+        public void GetSetIntegrityOk()
+        {
+            var now = DateTime.Now;
+            var intv = 22;
+            var stringv = "this is a test";
+            _setting.PropertyDateTime2 = now;
+            _setting.PropertyDateTime1 = now;
+            _setting.PropertyInt = intv;
+            _setting.PropertyString2 = stringv;
+
+            var data = _setting.GetData();
+
+            var settings = new ModuleSettingFake();
+            settings.SetData(data);
+            Assert.That(settings.PropertyDateTime2,Is.EqualTo(_setting.PropertyDateTime2));
+            Assert.That(settings.PropertyDateTime1,Is.EqualTo(_setting.PropertyDateTime1));
+            Assert.That(settings.PropertyInt,Is.EqualTo(_setting.PropertyInt));
+            Assert.That(settings.PropertyString2,Is.EqualTo(_setting.PropertyString2));
+        }
     }
 }