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 }