/ src / settings-ui / Settings.UI.UnitTests / ModelsTests / SettingsUtilsTests.cs
SettingsUtilsTests.cs
  1  // Copyright (c) Microsoft Corporation
  2  // The Microsoft Corporation licenses this file to you under the MIT license.
  3  // See the LICENSE file in the project root for more information.
  4  
  5  using System;
  6  using System.IO.Abstractions.TestingHelpers;
  7  using System.Linq;
  8  using System.Text.Json;
  9  
 10  using Microsoft.PowerToys.Settings.UI.Library;
 11  using Microsoft.PowerToys.Settings.UI.Library.Interfaces;
 12  using Microsoft.PowerToys.Settings.UI.UnitTests;
 13  using Microsoft.PowerToys.Settings.UnitTest;
 14  using Microsoft.VisualStudio.TestTools.UnitTesting;
 15  
 16  namespace CommonLibTest
 17  {
 18      [TestClass]
 19      public class SettingsUtilsTests
 20      {
 21          [TestMethod]
 22          public void SaveSettingsSaveSettingsToFileWhenFilePathExists()
 23          {
 24              // Arrange
 25              var mockFileSystem = new MockFileSystem();
 26              var testSerializerOptions = new JsonSerializerOptions
 27              {
 28                  MaxDepth = 0,
 29                  IncludeFields = true,
 30                  TypeInfoResolver = TestSettingsSerializationContext.Default,
 31              };
 32              var settingsUtils = new SettingsUtils(mockFileSystem, testSerializerOptions);
 33  
 34              string file_name = "\\test";
 35              string file_contents_correct_json_content = "{\"name\":\"powertoy module name\",\"version\":\"powertoy version\"}";
 36  
 37              BasePTSettingsTest expected_json = JsonSerializer.Deserialize<BasePTSettingsTest>(file_contents_correct_json_content);
 38  
 39              // Act
 40              settingsUtils.SaveSettings(file_contents_correct_json_content, file_name);
 41              BasePTSettingsTest actual_json = settingsUtils.GetSettingsOrDefault<BasePTSettingsTest>(file_name);
 42  
 43              // Assert
 44              Assert.AreEqual(expected_json.ToJsonString(), actual_json.ToJsonString());
 45          }
 46  
 47          [TestMethod]
 48          public void SaveSettingsShouldCreateFileWhenFilePathIsNotFound()
 49          {
 50              // Arrange
 51              var mockFileSystem = new MockFileSystem();
 52              var testSerializerOptions = new JsonSerializerOptions
 53              {
 54                  MaxDepth = 0,
 55                  IncludeFields = true,
 56                  TypeInfoResolver = TestSettingsSerializationContext.Default,
 57              };
 58              var settingsUtils = new SettingsUtils(mockFileSystem, testSerializerOptions);
 59              string file_name = "test\\Test Folder";
 60              string file_contents_correct_json_content = "{\"name\":\"powertoy module name\",\"version\":\"powertoy version\"}";
 61  
 62              BasePTSettingsTest expected_json = JsonSerializer.Deserialize<BasePTSettingsTest>(file_contents_correct_json_content);
 63  
 64              settingsUtils.SaveSettings(file_contents_correct_json_content, file_name);
 65              BasePTSettingsTest actual_json = settingsUtils.GetSettingsOrDefault<BasePTSettingsTest>(file_name);
 66  
 67              // Assert
 68              Assert.AreEqual(expected_json.ToJsonString(), actual_json.ToJsonString());
 69          }
 70  
 71          [TestMethod]
 72          public void SettingsFolderExistsShouldReturnFalseWhenFilePathIsNotFound()
 73          {
 74              // Arrange
 75              var mockFileSystem = new MockFileSystem();
 76              var settingsUtils = new SettingsUtils(mockFileSystem);
 77              string file_name_random = "test\\" + RandomString();
 78              string file_name_exists = "test\\exists";
 79              string file_contents_correct_json_content = "{\"name\":\"powertoy module name\",\"version\":\"powertoy version\"}";
 80  
 81              // Act
 82              bool pathNotFound = settingsUtils.SettingsExists(file_name_random);
 83  
 84              settingsUtils.SaveSettings(file_contents_correct_json_content, file_name_exists);
 85              bool pathFound = settingsUtils.SettingsExists(file_name_exists);
 86  
 87              // Assert
 88              Assert.IsFalse(pathNotFound);
 89              Assert.IsTrue(pathFound);
 90          }
 91  
 92          [TestMethod]
 93          public void SettingsUtilsMustReturnDefaultItemWhenFileIsCorrupt()
 94          {
 95              // Arrange
 96              var mockFileSystem = new MockFileSystem();
 97              var mockSettingsUtils = new SettingsUtils(mockFileSystem);
 98  
 99              // Act
100              TestClass settings = mockSettingsUtils.GetSettingsOrDefault<TestClass>(string.Empty);
101  
102              // Assert
103              Assert.AreEqual(settings.TestInt, 100);
104              Assert.AreEqual(settings.TestString, "test");
105          }
106  
107          public static string RandomString()
108          {
109              Random random = new Random();
110              int length = 20;
111              const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
112  
113              return new string(Enumerable.Repeat(chars, length)
114                .Select(s => s[random.Next(s.Length)]).ToArray());
115          }
116  
117          private sealed partial class TestClass : ISettingsConfig
118          {
119              public int TestInt { get; set; } = 100;
120  
121              public string TestString { get; set; } = "test";
122  
123              public string GetModuleName()
124              {
125                  throw new NotImplementedException();
126              }
127  
128              public string ToJsonString()
129              {
130                  return JsonSerializer.Serialize(this);
131              }
132  
133              public bool UpgradeSettingsConfiguration()
134              {
135                  throw new NotImplementedException();
136              }
137          }
138      }
139  }