< Summary - Helper.Tests

Information
Class: Configuration.Helper.ConfigFileHelper
Assembly: Configuration.Helper
File(s): D:\a\NuGetPackages\NuGetPackages\src\Helper\Configuration.Helper\ConfigFileHelper.cs
Tag: 3_8508158812
Line coverage
100%
Covered lines: 73
Uncovered lines: 0
Coverable lines: 73
Total lines: 191
Line coverage: 100%
Branch coverage
96%
Covered branches: 27
Total branches: 28
Branch coverage: 96.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_ConfigFile()100%11100%
set_ConfigFile(...)100%11100%
get_Arguments()100%11100%
get_Settings()100%11100%
.ctor(...)100%11100%
Initialize(...)100%11100%
GetSetting(...)75%44100%
GetSetting(...)100%66100%
GetArgument(...)100%44100%
GetConfiguration(...)100%44100%
ConvertToSecureString(...)100%44100%
GetSecureSetting(...)100%66100%

File(s)

D:\a\NuGetPackages\NuGetPackages\src\Helper\Configuration.Helper\ConfigFileHelper.cs

#LineLine coverage
 1using System.Reflection;
 2using System.Security;
 3
 4namespace Configuration.Helper;
 5
 6/// <summary>Base helper class to access configuration file information.</summary>
 7public abstract class ConfigFileHelper
 8{
 9  #region Properties and Constants
 10
 11  /// <summary>Gets or sets the configuration file name.</summary>
 12  protected string ConfigFile
 13  {
 914    get { return _configFile; }
 4215    set { Initialize( ref value ); }
 16  }
 17
 18  /// <summary>Gets the collection of program arguments.</summary>
 319  public IDictionary<string, string> Arguments { get; }
 20
 21  /// <summary>Gets the current settings.</summary>
 2122  public ISettingsStore? Settings { get; private set; }
 23
 24  /// <summary>Configuration file extension (suffix) including the period.</summary>
 25  public const string cExtension = ".config";
 26
 27  /// <summary>JSON configuration file extension (suffix) including the period.</summary>
 28  public const string cJsonExtension = ".json";
 29
 30  #endregion
 31
 32  #region Instance Variables
 33
 34  /// <summary>Configuration file information.</summary>
 1435  private string _configFile = string.Empty;
 36
 37  #endregion
 38
 39  #region Constructor and Initialization
 40
 41  /// <summary>Initializes a new instance of the class using a configuration file name.</summary>
 42  /// <param name="configFile">Configuration filename.</param>
 1443  protected ConfigFileHelper( string configFile )
 1444  {
 1445    ConfigFile = configFile; // This triggers the initialization
 1446    Arguments = new Dictionary<string, string>( StringComparer.OrdinalIgnoreCase );
 1447  }
 48
 49  /// <summary>Initializes the configuration file settings.</summary>
 50  /// <param name="configFile">Configuration file name.</param>
 51  protected virtual void Initialize( ref string configFile )
 1452  {
 1453    _configFile = IOHelper.GetFullPath( configFile );
 1454    Settings = GetConfiguration( _configFile );
 1455  }
 56
 57  #endregion
 58
 59  #region Protected Methods
 60
 61  /// <summary>Returns the setting value in the configuration file for a given key.</summary>
 62  /// <param name="settingKey">Key of the setting.</param>
 63  /// <returns><see langword="null"/> is returned if the setting is not found.</returns>
 64  protected string? GetSetting( string settingKey )
 665  {
 66    // Check the required parameter is supplied
 667    if( string.IsNullOrWhiteSpace( settingKey ) )
 168    {
 169      return string.Empty;
 70    }
 71
 72    // Return the setting value
 573    settingKey = settingKey.Trim();
 574    return Settings?.AppSettings.GetSetting( settingKey );
 675  }
 76
 77  /// <summary>Returns the setting value in the configuration file for a given key and prefix.</summary>
 78  /// <param name="settingKey">Key of the setting.</param>
 79  /// <param name="prefix">Prefix for the setting.</param>
 80  /// <returns><see langword="null"/> is returned if the setting is not found.</returns>
 81  protected string? GetSetting( string settingKey, string prefix )
 482  {
 83    // Check the required parameter is supplied
 484    if( string.IsNullOrEmpty( settingKey ) )
 185    {
 186      return string.Empty;
 87    }
 88
 89    // Return the setting value
 390    string? retValue = null;
 391    if( !string.IsNullOrWhiteSpace( prefix ) )
 292    {
 293      retValue = GetSetting( prefix.Trim() + settingKey );
 294    }
 95
 396    return retValue ?? GetSetting( settingKey );
 497  }
 98
 99  #endregion
 100
 101  #region Public Methods
 102
 103  /// <summary>Returns the argument value in the configuration file for a given key.</summary>
 104  /// <param name="argumentKey">Key of the argument.</param>
 105  /// <returns>An empty string is returned if the argument key is not found.</returns>
 106  public string GetArgument( string argumentKey )
 3107  {
 108    // Check the required parameter is supplied
 3109    if( string.IsNullOrWhiteSpace( argumentKey ) )
 1110    {
 1111      return string.Empty;
 112    }
 113
 114    // Return the setting value
 2115    argumentKey = argumentKey.Trim();
 2116    return Arguments.TryGetValue( argumentKey, out string? value ) ? value : string.Empty;
 3117  }
 118
 119  #endregion
 120
 121  #region Public Static Functions
 122
 123  /// <summary>Gets a Setting Store object.</summary>
 124  /// <param name="configFile">Configuration file name.</param>
 125  /// <returns>ISettingsStore object.</returns>
 126  /// <exception cref="ArgumentNullException">Thrown if the parameter is <see langword="null"/>.</exception>
 127  public static ISettingsStore GetConfiguration( string configFile )
 31128  {
 129    // Check the required parameter is supplied
 31130    ArgumentNullException.ThrowIfNull( configFile );
 131
 31132    bool exists = IOHelper.DoesFileExist( configFile );
 31133    if( !exists )
 14134    {
 135      // No path so try using current location
 14136      string path = IOHelper.Combine( Assembly.GetExecutingAssembly().Location, IOHelper.GetFileName( configFile ) );
 14137      if( configFile != path )
 14138      {
 14139        configFile = IOHelper.GetFullPath( configFile );
 14140      }
 14141    }
 142
 31143    return FileSettingsStore.Create( configFile );
 31144  }
 145
 146  /// <summary>Converts a string to a secure string.</summary>
 147  /// <param name="strValue">Value to secure - this will be empty on return.</param>
 148  /// <returns>If the string value is <see langword="null"/>, empty, or whitespace, then the
 149  /// return value will have a length of zero.</returns>
 150  public static SecureString ConvertToSecureString( ref string strValue )
 3151  {
 152    // Set the return value
 3153    SecureString retValue = new();
 154
 155    // Check the required parameter is supplied
 3156    if( string.IsNullOrWhiteSpace( strValue ) || strValue.Length == 0 )
 1157    {
 1158      retValue.MakeReadOnly();
 1159      return retValue;
 160    }
 161
 162    // Populate the secure string and clear the parameter value
 2163    Array.ForEach( strValue.ToCharArray(), retValue.AppendChar );
 2164    strValue = string.Empty;
 165
 166    // Return the secure string as read-only
 2167    retValue.MakeReadOnly();
 2168    return retValue;
 3169  }
 170
 171  /// <summary>Gets a secure string value of a configuration file key.</summary>
 172  /// <param name="configFile">Full path and name of the configuration file.</param>
 173  /// <param name="sectionName">Name of the section containing the key.</param>
 174  /// <param name="key">Key of the value to return.</param>
 175  /// <returns>If the key cannot be retrieved then the return value will have a length of zero.</returns>
 176  /// <exception cref="ArgumentException">Thrown when the <paramref name="sectionName"/> parameter is empty.</exception>
 177  public static SecureString GetSecureSetting( string configFile, string sectionName, string key )
 2178  {
 2179    string? str = null;
 2180    if( IOHelper.DoesFileExist( configFile ) )
 2181    {
 2182      ISettingsStore config = GetConfiguration( configFile );
 2183      ISettingsSection section = config.GetSection( sectionName );
 2184      str = section.Settings.Count > 0 ? section.GetSetting( key ) : string.Empty;
 2185    }
 186
 2187    return !string.IsNullOrEmpty( str ) ? ConvertToSecureString( ref str ) : new SecureString();
 2188  }
 189
 190  #endregion
 191}