winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit bdd2cabbe07725e4ab8f8ecbb673bc1cebff36cb
parent 3eca881edb4eb25b58a849a03023b8bfd7eb361a
Author: AmirMS <104940545+AmelBawa-msft@users.noreply.github.com>
Date:   Thu,  8 May 2025 21:00:06 -0700

Make partial the default for user-settings-file (#5442)

### ☝🏻 Input `Action` is `Partial` by default
### ✌🏻 Output `Action` is ~always~ somtimes `Partial`

###### Microsoft Reviewers: [Open in
CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/microsoft/winget-cli/pull/5442)
Diffstat:
Msrc/AppInstallerCLICore/Commands/DscUserSettingsFileResource.cpp | 8+++++---
Msrc/AppInstallerCLIE2ETests/DSCv3UserSettingsFileResourceCommand.cs | 60++++++++++++++++++++++++++++++++++++++++++------------------
2 files changed, 47 insertions(+), 21 deletions(-)

diff --git a/src/AppInstallerCLICore/Commands/DscUserSettingsFileResource.cpp b/src/AppInstallerCLICore/Commands/DscUserSettingsFileResource.cpp @@ -4,6 +4,7 @@ #include "DscUserSettingsFileResource.h" #include "DscComposableObject.h" #include "Resources.h" +#include "AppInstallerStrings.h" using namespace AppInstaller::Utility::literals; using namespace AppInstaller::Settings; @@ -16,7 +17,7 @@ namespace AppInstaller::CLI namespace { WINGET_DSC_DEFINE_COMPOSABLE_PROPERTY_FLAGS(SettingsProperty, Json::Value, Settings, "settings", DscComposablePropertyFlag::Required | DscComposablePropertyFlag::CopyToOutput, Resource::String::DscResourcePropertyDescriptionUserSettingsFileSettings); - WINGET_DSC_DEFINE_COMPOSABLE_PROPERTY_ENUM(ActionProperty, std::string, Action, "action", Resource::String::DscResourcePropertyDescriptionUserSettingsFileAction, ({ ACTION_PARTIAL, ACTION_FULL }), ACTION_FULL); + WINGET_DSC_DEFINE_COMPOSABLE_PROPERTY_ENUM(ActionProperty, std::string, Action, "action", Resource::String::DscResourcePropertyDescriptionUserSettingsFileAction, ({ ACTION_PARTIAL, ACTION_FULL }), ACTION_PARTIAL); using UserSettingsFileResourceObject = DscComposableObject<StandardInDesiredStateProperty, SettingsProperty, ActionProperty>; @@ -38,7 +39,6 @@ namespace AppInstaller::CLI void Get() { - Output.Action(ACTION_FULL); Output.Settings(GetUserSettings()); } @@ -64,12 +64,14 @@ namespace AppInstaller::CLI THROW_HR_IF(E_UNEXPECTED, !Input.Settings().has_value()); if (!_resolvedInputUserSettings) { - if(Input.Action() == ACTION_FULL) + if(Input.Action().has_value() && Utility::CaseInsensitiveEquals(Input.Action().value(), ACTION_FULL)) { + Output.Action(ACTION_FULL); _resolvedInputUserSettings = Input.Settings(); } else { + Output.Action(ACTION_PARTIAL); _resolvedInputUserSettings = MergeUserSettingsFiles(*Input.Settings()); } } diff --git a/src/AppInstallerCLIE2ETests/DSCv3UserSettingsFileResourceCommand.cs b/src/AppInstallerCLIE2ETests/DSCv3UserSettingsFileResourceCommand.cs @@ -61,7 +61,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase } /// <summary> - /// Calls `get` on the `user-settings` resource. + /// Calls `get` on the `user-settings-file` resource. /// </summary> [Test] public void UserSettingsFile_Get() @@ -70,12 +70,12 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase var getOutput = Get(new ()); Assert.IsNotNull(getOutput); - Assert.AreEqual(ActionPropertyValueFull, getOutput.Action); + Assert.IsNull(getOutput.Action); AssertSettingsAreEqual(expected, getOutput.Settings); } /// <summary> - /// Calls `set` on the `user-settings` resource with no diff. + /// Calls `set` on the `user-settings-file` resource with no diff. /// </summary> /// <param name="action">The action value.</param> [Test] @@ -90,13 +90,13 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase var expected = GetCurrentUserSettings(); Assert.IsNotNull(setOutput); - Assert.AreEqual(ActionPropertyValueFull, setOutput.Action); + Assert.AreEqual(action, setOutput.Action); AssertSettingsAreEqual(expected, setOutput.Settings); AssertDiffState(setDiff, []); } /// <summary> - /// Calls `set` on the `user-settings` resource to add fields. + /// Calls `set` on the `user-settings-file` resource to add fields. /// </summary> /// <param name="action">The action value.</param> [Test] @@ -114,14 +114,37 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase // Assert that the settings are added Assert.IsNotNull(setOutput); - Assert.AreEqual(ActionPropertyValueFull, setOutput.Action); + Assert.AreEqual(action, setOutput.Action); AssertMockProperties(setOutput.Settings, "mock"); AssertSettingsAreEqual(expected, setOutput.Settings); AssertDiffState(setDiff, [ SettingsPropertyName ]); } /// <summary> - /// Calls `set` on the `user-settings` resource to update fields. + /// Calls `set` on the `user-settings-file` resource to ensure action is partial by default. + /// </summary> + [Test] + public void UserSettingsFile_Set_ActionIsPartialByDefault() + { + // Call `set` to add mock properties to the settings + var setSettings = GetSettingsArg(ActionPropertyValuePartial); + AddOrModifyMockProperties(setSettings, "mock"); + + var expected = GetCurrentUserSettings(); + AddOrModifyMockProperties(expected, "mock"); + + (var setOutput, var setDiff) = Set(new () { Settings = setSettings }); + + // Assert that the settings are added + Assert.IsNotNull(setOutput); + Assert.AreEqual(setOutput.Action, ActionPropertyValuePartial); + AssertMockProperties(setOutput.Settings, "mock"); + AssertSettingsAreEqual(expected, setOutput.Settings); + AssertDiffState(setDiff, [ SettingsPropertyName ]); + } + + /// <summary> + /// Calls `set` on the `user-settings-file` resource to update fields. /// </summary> /// <param name="action">The action value.</param> [Test] @@ -144,14 +167,14 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase // Assert that the settings are updated Assert.IsNotNull(setOutput); - Assert.AreEqual(ActionPropertyValueFull, setOutput.Action); + Assert.AreEqual(action, setOutput.Action); AssertMockProperties(setOutput.Settings, "mock_new"); AssertSettingsAreEqual(expected, setOutput.Settings); AssertDiffState(setDiff, [ SettingsPropertyName ]); } /// <summary> - /// Calls `test` on the `user-settings` resource to check if the settings are in desired state. + /// Calls `test` on the `user-settings-file` resource to check if the settings are in desired state. /// </summary> /// <param name="action">The action value.</param> [Test] @@ -174,7 +197,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase // Assert that the settings are in desired state Assert.IsNotNull(testOutput); - Assert.AreEqual(ActionPropertyValueFull, testOutput.Action); + Assert.AreEqual(action, testOutput.Action); AssertMockProperties(testOutput.Settings, "mock"); AssertSettingsAreEqual(expected, testOutput.Settings); Assert.IsTrue(testOutput.InDesiredState); @@ -182,7 +205,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase } /// <summary> - /// Calls `test` on the `user-settings` resource to check if the settings are not in desired state. + /// Calls `test` on the `user-settings-file` resource to check if the settings are not in desired state. /// </summary> /// <param name="action">The action value.</param> [Test] @@ -205,7 +228,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase // Assert that the settings are not in desired state Assert.IsNotNull(testOutput); - Assert.AreEqual(ActionPropertyValueFull, testOutput.Action); + Assert.AreEqual(action, testOutput.Action); AssertMockProperties(testOutput.Settings, "mock_set"); AssertSettingsAreEqual(expected, testOutput.Settings); Assert.IsFalse(testOutput.InDesiredState); @@ -213,7 +236,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase } /// <summary> - /// Calls `export` on the `user-settings` resource to export the settings. + /// Calls `export` on the `user-settings-file` resource to export the settings. /// </summary> [Test] public void UserSettingsFile_Export() @@ -222,12 +245,12 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase var exportOutput = Export(new ()); Assert.IsNotNull(exportOutput); - Assert.AreEqual(ActionPropertyValueFull, exportOutput.Action); + Assert.IsNull(exportOutput.Action); AssertSettingsAreEqual(expected, exportOutput.Settings); } /// <summary> - /// Calls `get` on the `user-settings` resource. + /// Calls `get` on the `user-settings-file` resource. /// </summary> /// <param name="resourceData">The input resource data.</param> /// <returns>The output resource data.</returns> @@ -239,7 +262,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase } /// <summary> - /// Calls `set` on the `user-settings` resource. + /// Calls `set` on the `user-settings-file` resource. /// </summary> /// <param name="resourceData">The input resource data.</param> /// <returns>The output resource data and the diff.</returns> @@ -251,7 +274,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase } /// <summary> - /// Calls `test` on the `user-settings` resource. + /// Calls `test` on the `user-settings-file` resource. /// </summary> /// <param name="resourceData">The input resource data.</param> /// <returns>The output resource data and the diff.</returns> @@ -263,7 +286,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase } /// <summary> - /// Calls `export` on the `user-settings` resource. + /// Calls `export` on the `user-settings-file` resource. /// </summary> /// <param name="resourceData">The input resource data.</param> /// <returns>The output resource data.</returns> @@ -333,6 +356,7 @@ public class DSCv3UserSettingsFileResourceCommand : DSCv3ResourceTestBase [JsonPropertyName(InDesiredStatePropertyName)] public bool? InDesiredState { get; set; } + [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] public string Action { get; set; } public JsonObject Settings { get; set; }