diff --git a/libraries/azure-app-configuration-importer/src/appConfigurationImporter.ts b/libraries/azure-app-configuration-importer/src/appConfigurationImporter.ts index 1ee950b..6abfe34 100644 --- a/libraries/azure-app-configuration-importer/src/appConfigurationImporter.ts +++ b/libraries/azure-app-configuration-importer/src/appConfigurationImporter.ts @@ -161,7 +161,7 @@ export class AppConfigurationImporter { // Remove from add list since it already exists toAddKeys.delete(composite); - if (!isConfigSettingEqual(incoming, existing)) { + if (!isConfigSettingEqual(incoming, existing, configSettingsSource.supportedFields)) { configurationChanges.push({ changeType: ChangeType.Update, currentValue: existing, diff --git a/libraries/azure-app-configuration-importer/src/internal/utils.ts b/libraries/azure-app-configuration-importer/src/internal/utils.ts index f505971..22ab484 100644 --- a/libraries/azure-app-configuration-importer/src/internal/utils.ts +++ b/libraries/azure-app-configuration-importer/src/internal/utils.ts @@ -8,7 +8,7 @@ import { featureFlagContentType, SecretReferenceValue } from "@azure/app-configuration"; import { isEmpty, isEqual } from "lodash"; -import { Tags, FeatureFlagClientFilters } from "../models"; +import { Tags, FeatureFlagClientFilters, ConfigurationSettingsFields } from "../models"; import { SourceOptions } from "../options"; import { ConfigurationFormat, ConfigurationProfile } from "../enums"; import { ArgumentError, ArgumentNullError } from "../errors"; @@ -41,19 +41,36 @@ export function isJsonContentType(contentType?: string): boolean { } /** @internal*/ -export function isConfigSettingEqual(settingA: SetConfigurationSettingParam, settingB: ConfigurationSetting) { - let valueIsEqual: boolean = settingA.value == settingB.value; - - if (settingA.contentType == featureFlagContentType && - settingB.contentType == featureFlagContentType && - settingA.value !== undefined && - settingB.value !== undefined) { - valueIsEqual = isFeatureFlagValueEqual(settingA.value as string | MsFeatureFlagValue, settingB.value); +export function isConfigSettingEqual(settingA: SetConfigurationSettingParam, settingB: ConfigurationSetting, supportedFields: ConfigurationSettingsFields): boolean { + + if ((supportedFields & ConfigurationSettingsFields.Value) === ConfigurationSettingsFields.Value) { + let valueIsEqual: boolean = settingA.value == settingB.value; + + if (settingA.contentType == featureFlagContentType && + settingB.contentType == featureFlagContentType && + settingA.value !== undefined && + settingB.value !== undefined) { + valueIsEqual = isFeatureFlagValueEqual(settingA.value as string | MsFeatureFlagValue, settingB.value); + } + + if (!valueIsEqual) { + return false; + } + } + + if ((supportedFields & ConfigurationSettingsFields.ContentType) === ConfigurationSettingsFields.ContentType && settingA.contentType != settingB.contentType) { + return false; } - return valueIsEqual && - settingA.contentType == settingB.contentType && - areTagsEqual(settingA.tags, settingB.tags); + if ((supportedFields & ConfigurationSettingsFields.Tags) === ConfigurationSettingsFields.Tags && !areTagsEqual(settingA.tags, settingB.tags)) { + return false; + } + + if ((supportedFields & ConfigurationSettingsFields.Description) === ConfigurationSettingsFields.Description && settingA.description != settingB.description) { + return false; + } + + return true; } /** @internal*/ diff --git a/libraries/azure-app-configuration-importer/src/models.ts b/libraries/azure-app-configuration-importer/src/models.ts index 5d106ec..ccb8353 100644 --- a/libraries/azure-app-configuration-importer/src/models.ts +++ b/libraries/azure-app-configuration-importer/src/models.ts @@ -59,4 +59,16 @@ export interface ConfigurationSettingChange { currentValue: ConfigurationSetting | null; /** The new value of the configuration setting */ newValue: SetConfigurationSettingParam | null; +} + +export enum ConfigurationSettingsFields { + None = 0, + Key = 1 << 0, + Value = 1 << 1, + Label = 1 << 2, + Description = 1 << 3, + ContentType = 1 << 4, + Tags = 1 << 5, + + All = Key | Value | Label | Description | ContentType | Tags } \ No newline at end of file diff --git a/libraries/azure-app-configuration-importer/src/settingsImport/configurationChangesSource.ts b/libraries/azure-app-configuration-importer/src/settingsImport/configurationChangesSource.ts index 1a18dc2..3974d1b 100644 --- a/libraries/azure-app-configuration-importer/src/settingsImport/configurationChangesSource.ts +++ b/libraries/azure-app-configuration-importer/src/settingsImport/configurationChangesSource.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. import { ConfigurationSettingsSource } from "./configurationSettingsSource"; -import { ConfigurationSettingChange } from "../models"; +import { ConfigurationSettingChange, ConfigurationSettingsFields } from "../models"; import { ListConfigurationSettingsOptions } from "@azure/app-configuration"; import { ArgumentError } from "../errors"; @@ -22,13 +22,15 @@ import { ArgumentError } from "../errors"; * ``` */ export class ConfigurationChangesSource implements ConfigurationSettingsSource { + public supportedFields: ConfigurationSettingsFields; private readonly configurationChanges: Array; - - constructor(configurationChanges: Array, filterOptions?: ListConfigurationSettingsOptions) { + + constructor(configurationChanges: Array, supportedFields?: ConfigurationSettingsFields, filterOptions?: ListConfigurationSettingsOptions) { if (filterOptions && Object.keys(filterOptions).length > 0) { throw new ArgumentError("FilterOptions are not supported for ConfigurationChangesSource."); } this.configurationChanges = configurationChanges; + this.supportedFields = supportedFields ?? ConfigurationSettingsFields.All; } /** diff --git a/libraries/azure-app-configuration-importer/src/settingsImport/configurationSettingsSource.ts b/libraries/azure-app-configuration-importer/src/settingsImport/configurationSettingsSource.ts index fc23ced..ada229a 100644 --- a/libraries/azure-app-configuration-importer/src/settingsImport/configurationSettingsSource.ts +++ b/libraries/azure-app-configuration-importer/src/settingsImport/configurationSettingsSource.ts @@ -7,7 +7,7 @@ import { SecretReferenceValue, SetConfigurationSettingParam } from "@azure/app-configuration"; -import { ConfigurationSettingChange } from "../models"; +import { ConfigurationSettingChange, ConfigurationSettingsFields } from "../models"; /** * Interface of all ConfigurationSettingsSource @@ -20,6 +20,12 @@ export interface ConfigurationSettingsSource { */ GetConfigurationSettings(): Promise> | Array>; + /** + * Fields supported in the configuration settings source + * + */ + supportedFields: ConfigurationSettingsFields; + /** * Get label and prefix filter * diff --git a/libraries/azure-app-configuration-importer/src/settingsImport/iterableConfigurationSettingsSource.ts b/libraries/azure-app-configuration-importer/src/settingsImport/iterableConfigurationSettingsSource.ts index 65916e9..889b02c 100644 --- a/libraries/azure-app-configuration-importer/src/settingsImport/iterableConfigurationSettingsSource.ts +++ b/libraries/azure-app-configuration-importer/src/settingsImport/iterableConfigurationSettingsSource.ts @@ -15,16 +15,18 @@ import { secretReferenceContentType} from "@azure/app-configuration"; import { IterableSourceOptions } from "../options"; import { ArgumentError } from "../errors"; +import { ConfigurationSettingsFields } from "../models"; export class IterableConfigurationSettingsSource implements ConfigurationSettingsSource { public FilterOptions: ListConfigurationSettingsOptions = {}; - + public supportedFields: ConfigurationSettingsFields; private data: PagedAsyncIterableIterator, ListConfigurationSettingPage, PageSettings>; private options: IterableSourceOptions; constructor(options: IterableSourceOptions) { this.data = options.data; this.options = options; + this.supportedFields = ConfigurationSettingsFields.All; this.FilterOptions = { keyFilter: options.prefix ? options.prefix + "*" : undefined, diff --git a/libraries/azure-app-configuration-importer/src/settingsImport/readableStreamConfigurationSettingsSource.ts b/libraries/azure-app-configuration-importer/src/settingsImport/readableStreamConfigurationSettingsSource.ts index 2d67619..4ba69a4 100644 --- a/libraries/azure-app-configuration-importer/src/settingsImport/readableStreamConfigurationSettingsSource.ts +++ b/libraries/azure-app-configuration-importer/src/settingsImport/readableStreamConfigurationSettingsSource.ts @@ -8,9 +8,11 @@ import { ConfigurationSettingsSource } from "./configurationSettingsSource"; import { ConfigurationProfile } from "../enums"; import { StringConfigurationSettingsSource } from "./stringConfigurationSettingsSource"; import { validateOptions} from "../internal/utils"; +import { ConfigurationSettingsFields } from "../models"; export class ReadableStreamConfigurationSettingsSource implements ConfigurationSettingsSource { public FilterOptions: ListConfigurationSettingsOptions = {}; + public supportedFields = ConfigurationSettingsFields.All; private options: SourceOptions; private data: ReadableStream | NodeJS.ReadableStream; @@ -24,12 +26,14 @@ export class ReadableStreamConfigurationSettingsSource implements ConfigurationS keyFilter: options.prefix ? options.prefix + "*" : undefined, labelFilter: options.label ? options.label : "\0" }; + this.supportedFields = ConfigurationSettingsFields.Key | ConfigurationSettingsFields.Label | ConfigurationSettingsFields.Value | ConfigurationSettingsFields.ContentType | ConfigurationSettingsFields.Tags; } else if (options.profile == ConfigurationProfile.KvSet) { this.FilterOptions = { keyFilter: "*", labelFilter: "*" }; + this.supportedFields = ConfigurationSettingsFields.All; } } diff --git a/libraries/azure-app-configuration-importer/src/settingsImport/stringConfigurationSettingsSource.ts b/libraries/azure-app-configuration-importer/src/settingsImport/stringConfigurationSettingsSource.ts index 40d489e..b6978c3 100644 --- a/libraries/azure-app-configuration-importer/src/settingsImport/stringConfigurationSettingsSource.ts +++ b/libraries/azure-app-configuration-importer/src/settingsImport/stringConfigurationSettingsSource.ts @@ -18,12 +18,14 @@ import { validateOptions } from "../internal/utils"; import { ConfigurationSettingsConverter } from "../internal/parsers/configurationSettingsConverter"; import { DefaultConfigurationSettingsConverter } from "../internal/parsers/defaultConfigurationSettingsConverter"; import { KvSetConfigurationSettingsConverter } from "../internal/parsers/kvSetConfigurationSettingsConverter"; +import { ConfigurationSettingsFields } from "../models"; /** * ConfigurationSettingsSource implementation of string data configuration source */ export class StringConfigurationSettingsSource implements ConfigurationSettingsSource { public FilterOptions: ListConfigurationSettingsOptions = {}; + public supportedFields: ConfigurationSettingsFields = ConfigurationSettingsFields.All; private options: SourceOptions; private data: string; @@ -37,12 +39,15 @@ export class StringConfigurationSettingsSource implements ConfigurationSettingsS keyFilter: options.prefix ? options.prefix + "*" : undefined, labelFilter: options.label ? options.label : "\0" }; + + this.supportedFields = ConfigurationSettingsFields.Key | ConfigurationSettingsFields.Label | ConfigurationSettingsFields.Value | ConfigurationSettingsFields.ContentType| ConfigurationSettingsFields.Tags; } else if (options.profile == ConfigurationProfile.KvSet) { this.FilterOptions = { keyFilter: "*", labelFilter: "*" }; + this.supportedFields = ConfigurationSettingsFields.All; } } diff --git a/libraries/azure-app-configuration-importer/tests/util.spec.ts b/libraries/azure-app-configuration-importer/tests/util.spec.ts index ea499a8..7931da1 100644 --- a/libraries/azure-app-configuration-importer/tests/util.spec.ts +++ b/libraries/azure-app-configuration-importer/tests/util.spec.ts @@ -5,6 +5,7 @@ import { assert } from "chai"; import { areTagsEqual, isJsonContentType, isConfigSettingEqual } from "../src/internal/utils"; import { ConfigurationSetting, FeatureFlagValue, SetConfigurationSettingParam } from "@azure/app-configuration"; import { MsFeatureFlagValue } from "../src/featureFlag"; +import { ConfigurationSettingsFields } from "../src/models"; describe("Test the utility methods", () => { it("Determine the content type is json contentType", async () => { @@ -47,14 +48,16 @@ describe("Test the utility methods", () => { const testKeyValue1: SetConfigurationSettingParam = { key: "key1", value: "value1", - label: "dev", + label: "dev", + description: "description", contentType:"application/json", tags:{tag1: "tag1"} }; const testKeyValue2: ConfigurationSetting = { key: "key1", value: "value2", - label: "dev", + label: "dev", + description: "description", contentType:"application/json", tags:{tag1: "tag1"}, isReadOnly: false @@ -62,14 +65,16 @@ describe("Test the utility methods", () => { const testKeyValue3: SetConfigurationSettingParam = { key: "key2", value: "value1", - label: "prod", + label: "prod", + description: "description", contentType:"application/json", tags:{tag1: "tag1"} }; const testKeyValue4: ConfigurationSetting = { key: "key2", value: "value1", - label: "prod", + label: "prod", + description: "description", contentType:"application/json", tags:{tag1: "tag2"}, isReadOnly: false @@ -77,14 +82,16 @@ describe("Test the utility methods", () => { const testKeyValue5: SetConfigurationSettingParam = { key: "key2", value: "value1", - label: "prod", + label: "prod", + description: "description", contentType:"application/json", tags:{tag1: "tag1"} }; const testKeyValue6: ConfigurationSetting = { key: "key2", value: "value1", - label: "prod", + label: "prod", + description: "description", contentType:"application/json", tags:{tag1: "tag2"}, isReadOnly: false @@ -93,7 +100,8 @@ describe("Test the utility methods", () => { const testKeyValue7: SetConfigurationSettingParam = { key: "FeatureA", value: "{\"id\":\"Beta\",\"description\":\"Beta feature\",\"enabled\":true,\"conditions\":{\"client_filters\":[]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; @@ -101,7 +109,8 @@ describe("Test the utility methods", () => { const testKeyValue8: ConfigurationSetting = { key: "FeatureB", value: "{\"id\":\"Beta\",\"description\":\"Beta feature updated description\",\"enabled\":true,\"conditions\":{\"client_filters\":[]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: false @@ -110,38 +119,60 @@ describe("Test the utility methods", () => { const testKeyValue9: SetConfigurationSettingParam = { key: "FeatureX", value: "{\"id\":\"Beta\",\"description\":\"Beta feature updated description\",\"enabled\":true,\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"50\"}}]}}", - label: "test", + label: "test", + description: "description", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; const testKeyValue10: ConfigurationSetting = { key: "FeatureY", value: "{\"id\":\"Beta\",\"description\":\"Beta feature updated description\",\"enabled\":true,\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"60\"}}]}}", - label: "test", + label: "test", + description: "description", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: false }; + const testKeyValue11: SetConfigurationSettingParam = { + key: "key2", + value: "value1", + label: "prod", + description: "description", + contentType:"application/json", + tags:{tag1: "tag1"} + }; + const testKeyValue12: ConfigurationSetting = { + key: "key2", + value: "value1", + label: "prod", + description: "description updated", + contentType:"application/json", + tags:{tag1: "tag1"}, + isReadOnly: false + }; - assert.isFalse(isConfigSettingEqual(testKeyValue1, testKeyValue2)); - assert.isFalse(isConfigSettingEqual(testKeyValue3, testKeyValue4)); - assert.isFalse(isConfigSettingEqual(testKeyValue5, testKeyValue6)); - assert.isFalse(isConfigSettingEqual(testKeyValue7, testKeyValue8)); - assert.isFalse(isConfigSettingEqual(testKeyValue9, testKeyValue10)); + assert.isFalse(isConfigSettingEqual(testKeyValue1, testKeyValue2, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue3, testKeyValue4, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue5, testKeyValue6, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue7, testKeyValue8, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue9, testKeyValue10, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue11, testKeyValue12, ConfigurationSettingsFields.All)); }); it("Determine if key-values with similar values are equal", async()=>{ const testKeyValue1: SetConfigurationSettingParam = { key: "key1", value: "value1", - label: "dev", + label: "dev", + description: "description", contentType:"application/json" }; const testKeyValue2: ConfigurationSetting = { key: "key1", value: "value1", - label: "dev", + label: "dev", + description: "description", contentType:"application/json", isReadOnly: false }; @@ -149,14 +180,16 @@ describe("Test the utility methods", () => { const testKeyValue3: SetConfigurationSettingParam = { key: "key2", value: "", - label: "", + label: "", + description: "description", contentType:"application/json", tags:{tag1: "tag1"} }; const testKeyValue4: ConfigurationSetting = { key: "key2", value: "", - label: "", + label: "", + description: "description", contentType:"application/json", tags:{tag1: "tag1"}, isReadOnly: false @@ -164,27 +197,30 @@ describe("Test the utility methods", () => { const testKeyValue5: SetConfigurationSettingParam = { key: "key3", value: "value1", - label: "prod", + label: "prod", + description: "description", tags:{tag1: "tag1"} }; const testKeyValue6: ConfigurationSetting = { key: "key3", value: "value1", - label: "prod", + label: "prod", + description: "description", tags:{tag1: "tag1"}, isReadOnly: false }; - assert.isTrue(isConfigSettingEqual(testKeyValue1, testKeyValue2)); - assert.isTrue(isConfigSettingEqual(testKeyValue3, testKeyValue4)); - assert.isTrue(isConfigSettingEqual(testKeyValue5, testKeyValue6)); + assert.isTrue(isConfigSettingEqual(testKeyValue1, testKeyValue2, ConfigurationSettingsFields.All)); + assert.isTrue(isConfigSettingEqual(testKeyValue3, testKeyValue4, ConfigurationSettingsFields.All)); + assert.isTrue(isConfigSettingEqual(testKeyValue5, testKeyValue6, ConfigurationSettingsFields.All)); }); it("Determine if feature flag values with same values are equal", async()=> { const testKeyValue1: SetConfigurationSettingParam = { key: "FeatureA", value: "{\"id\":\"Beta\",\"description\":\"Beta feature\",\"enabled\":true,\"conditions\":{\"client_filters\":[]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; @@ -192,7 +228,8 @@ describe("Test the utility methods", () => { const testKeyValue2: ConfigurationSetting = { key: "FeatureA", value: "{\"id\":\"Beta\",\"enabled\":true,\"description\":\"Beta feature\",\"conditions\":{}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -201,14 +238,16 @@ describe("Test the utility methods", () => { const testKeyValue3: SetConfigurationSettingParam = { key: "FeatureX", value: "{\"id\":\"Beta\",\"description\":\"Beta feature updated description\",\"enabled\":true,\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"50\"}}]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; const testKeyValue4: ConfigurationSetting = { key: "FeatureX", value: "{\"id\":\"Beta\",\"enabled\":true,\"description\":\"Beta feature updated description\",\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"50\"}}]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -216,7 +255,8 @@ describe("Test the utility methods", () => { const testKeyValue5: SetConfigurationSettingParam = { key: "FeatureX", - label: "test", + label: "test", + description: "", value: { id: "Beta", description: "Beta feature updated description", @@ -239,7 +279,8 @@ describe("Test the utility methods", () => { const testKeyValue6: ConfigurationSetting = { key: "FeatureX", value: "{\"id\":\"Beta\",\"enabled\":true,\"description\":\"Beta feature updated description\",\"conditions\":{\"client_filters\":[{\"name\": \"Microsoft.TimeWindow\",\"parameters\": {\"End\": \"Wed, 06 Sep 2023 21:00:00 GMT\"}}]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -248,6 +289,7 @@ describe("Test the utility methods", () => { const testKeyValue7: SetConfigurationSettingParam = { key: "FeatureX", label: "test", + description: "", value: { id: "time001", enabled: true, @@ -320,6 +362,7 @@ describe("Test the utility methods", () => { const testKeyValue8: ConfigurationSetting = { key: "FeatureX", label: "test", + description: "", value: "{\"id\":\"time001\",\"enabled\":true,\"description\":\"\",\"conditions\":{\"client_filters\":[]},\"allocation\":{\"percentile\":[{\"variant\":\"Off\",\"from\":0,\"to\":23},{\"variant\":\"On\",\"from\":23,\"to\":100}],\"group\":[{\"variant\":\"On\",\"groups\":[\"m1\"]},{\"variant\":\"Off\",\"groups\":[\"m2\",\"m3\"]}],\"user\":[{\"variant\":\"Off\",\"users\":[\"user1\",\"user3\"]},{\"variant\":\"On\",\"users\":[\"user2\"]}],\"seed\":\"bcngrfgnfgn\",\"default_when_enabled\":\"On\",\"default_when_disabled\":\"On\"},\"variants\":[{\"name\":\"Off\",\"configuration_value\":false},{\"name\":\"On\",\"configuration_value\":true}]}", contentType: "application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags: {tag1: "tag1"}, @@ -327,17 +370,18 @@ describe("Test the utility methods", () => { }; - assert.isTrue(isConfigSettingEqual(testKeyValue1, testKeyValue2)); - assert.isTrue(isConfigSettingEqual(testKeyValue3, testKeyValue4)); - assert.isTrue(isConfigSettingEqual(testKeyValue5, testKeyValue6)); - assert.isTrue(isConfigSettingEqual(testKeyValue7, testKeyValue8)); + assert.isTrue(isConfigSettingEqual(testKeyValue1, testKeyValue2, ConfigurationSettingsFields.All)); + assert.isTrue(isConfigSettingEqual(testKeyValue3, testKeyValue4, ConfigurationSettingsFields.All)); + assert.isTrue(isConfigSettingEqual(testKeyValue5, testKeyValue6, ConfigurationSettingsFields.All)); + assert.isTrue(isConfigSettingEqual(testKeyValue7, testKeyValue8, ConfigurationSettingsFields.All)); }); it("Determine if feature flag values with different values are not equal", async()=> { const testKeyValue1: SetConfigurationSettingParam = { key: "FeatureA", value: "{\"id\":\"Beta\",\"description\":\"Beta feature\",\"enabled\":true,\"conditions\":{\"client_filters\":[]}}", - label: "test", + label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; @@ -346,6 +390,7 @@ describe("Test the utility methods", () => { key: "FeatureA", value: "{\"id\":\"Beta\",\"enabled\":true,\"description\":\"Beta feature description\",\"conditions\":{}}", label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -355,6 +400,7 @@ describe("Test the utility methods", () => { key: "FeatureX", value: "{\"id\":\"Beta\",\"description\":\"Beta feature updated description\",\"enabled\":true,\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"40\"}}]}}", label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; @@ -362,6 +408,7 @@ describe("Test the utility methods", () => { key: "FeatureX", value: "{\"id\":\"Beta\",\"enabled\":true,\"description\":\"Beta feature updated description\",\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"50\"}}]}}", label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -379,6 +426,7 @@ describe("Test the utility methods", () => { ] } }, + description: "", label: "test", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} @@ -388,6 +436,7 @@ describe("Test the utility methods", () => { key: "FeatureX", value: "{\"id\":\"Dev\",\"enabled\":true,\"description\":\"Beta feature updated description\",\"conditions\":{\"client_filters\":[{\"name\": \"Percentage\",\"parameters\": {\"PercentageFilterSetting\": \"50\"}}]}}", label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -410,6 +459,7 @@ describe("Test the utility methods", () => { ] } }, + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"} }; @@ -418,6 +468,7 @@ describe("Test the utility methods", () => { key: "FeatureX", value: "{\"id\":\"Beta\",\"enabled\":true,\"description\":\"Beta feature updated description\",\"conditions\":{\"client_filters\":[{\"name\": \"Microsoft.TimeWindow\",\"parameters\": {\"End\": \"Wed, 06 Sep 2023 21:00:00 GMT\"}}]}}", label: "test", + description: "", contentType:"application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags:{tag1: "tag1"}, isReadOnly: true @@ -491,6 +542,7 @@ describe("Test the utility methods", () => { } ] }, + description: "", contentType: "application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags: { tag1: "tag1" } }; @@ -498,16 +550,40 @@ describe("Test the utility methods", () => { const testKeyValue10: ConfigurationSetting = { key: "FeatureX", label: "test", + description: "", value: "{\"id\":\"time001\",\"enabled\":true,\"description\":\"\",\"conditions\":{\"client_filters\":[]},\"allocation\":{\"percentile\":[{\"variant\":\"Off\",\"from\":0,\"to\":23},{\"variant\":\"On\",\"from\":23,\"to\":100}],\"group\":[{\"variant\":\"On\",\"groups\":[\"m1\"]},{\"variant\":\"Off\",\"groups\":[\"m2\",\"m3\"]}],\"user\":[{\"variant\":\"Off\",\"users\":[\"user1\",\"user3\"]},{\"variant\":\"On\",\"users\":[\"user2\"]}],\"seed\":\"bcngrfgnfgn\",\"default_when_enabled\":\"On\",\"default_when_disabled\":\"On\"},\"variants\":[{\"name\":\"Off\",\"configuration_value\":false},{\"name\":\"On\",\"configuration_value\":true,\"status_override\":\"None\"}]}", contentType: "application/vnd.microsoft.appconfig.ff+json;charset=utf-8", tags: {}, isReadOnly: true }; - assert.isFalse(isConfigSettingEqual(testKeyValue1, testKeyValue2)); - assert.isFalse(isConfigSettingEqual(testKeyValue3, testKeyValue4)); - assert.isFalse(isConfigSettingEqual(testKeyValue5, testKeyValue6)); - assert.isFalse(isConfigSettingEqual(testKeyValue7, testKeyValue8)); - assert.isFalse(isConfigSettingEqual(testKeyValue9, testKeyValue10)); + assert.isFalse(isConfigSettingEqual(testKeyValue1, testKeyValue2, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue3, testKeyValue4, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue5, testKeyValue6, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue7, testKeyValue8, ConfigurationSettingsFields.All)); + assert.isFalse(isConfigSettingEqual(testKeyValue9, testKeyValue10, ConfigurationSettingsFields.All)); + }); + + it("Determine the description field is ignored when its not included in the supported fields", async()=> { + const testKeyValue1: SetConfigurationSettingParam = { + key: "key2", + value: "value1", + label: "prod", + description: "description", + contentType:"application/json", + tags:{tag1: "tag1"} + }; + + const testKeyValue2: ConfigurationSetting = { + key: "key2", + value: "value1", + label: "prod", + description: "description updated", + contentType:"application/json", + tags:{tag1: "tag1"}, + isReadOnly: false + }; + + assert.isTrue(isConfigSettingEqual(testKeyValue1, testKeyValue2, ConfigurationSettingsFields.Key| ConfigurationSettingsFields.Label| ConfigurationSettingsFields.Value| ConfigurationSettingsFields.ContentType| ConfigurationSettingsFields.Tags)); }); });