From f531b9194c4b925d842fb41d553167d3099cb5ad Mon Sep 17 00:00:00 2001 From: Rhys Koedijk Date: Thu, 16 Jan 2025 02:13:35 +1300 Subject: [PATCH] Use pattern '*' when group pattern is not specified in config (#1535) * Use '*' if group pattern is not specified; filter out null dependency groups * Guard against empty arrays too * Unit tests --- .../DependabotJobBuilder.test.ts | 96 +++++++++++++++++++ .../dependabot-cli/DependabotJobBuilder.ts | 33 ++++--- 2 files changed, 115 insertions(+), 14 deletions(-) create mode 100644 extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.test.ts diff --git a/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.test.ts b/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.test.ts new file mode 100644 index 00000000..e9354ba0 --- /dev/null +++ b/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.test.ts @@ -0,0 +1,96 @@ +import { IDependabotGroup } from '../dependabot/interfaces/IDependabotConfig'; +import { mapGroupsFromDependabotConfigToJobConfig } from './DependabotJobBuilder'; + +describe('mapGroupsFromDependabotConfigToJobConfig', () => { + it('should return undefined if dependencyGroups is undefined', () => { + const result = mapGroupsFromDependabotConfigToJobConfig(undefined); + expect(result).toBeUndefined(); + }); + + it('should return an empty array if dependencyGroups is an empty object', () => { + const result = mapGroupsFromDependabotConfigToJobConfig({}); + expect(result).toEqual([]); + }); + + it('should filter out undefined groups', () => { + const dependencyGroups: Record = { + group1: undefined, + group2: { + patterns: ['pattern2'], + }, + }; + + const result = mapGroupsFromDependabotConfigToJobConfig(dependencyGroups); + expect(result).toEqual([ + { + name: 'group2', + rules: { + patterns: ['pattern2'], + }, + }, + ]); + }); + + it('should filter out null groups', () => { + const dependencyGroups: Record = { + group1: null, + group2: { + patterns: ['pattern2'], + }, + }; + + const result = mapGroupsFromDependabotConfigToJobConfig(dependencyGroups); + expect(result).toEqual([ + { + name: 'group2', + rules: { + patterns: ['pattern2'], + }, + }, + ]); + }); + + it('should map dependency group properties correctly', () => { + const dependencyGroups: Record = { + group: { + 'applies-to': 'all', + 'patterns': ['pattern1', 'pattern2'], + 'exclude-patterns': ['exclude1'], + 'dependency-type': 'direct', + 'update-types': ['security'], + }, + }; + + const result = mapGroupsFromDependabotConfigToJobConfig(dependencyGroups); + + expect(result).toEqual([ + { + 'name': 'group', + 'applies-to': 'all', + 'rules': { + 'patterns': ['pattern1', 'pattern2'], + 'exclude-patterns': ['exclude1'], + 'dependency-type': 'direct', + 'update-types': ['security'], + }, + }, + ]); + }); + + it('should use pattern "*" if no patterns are provided', () => { + const dependencyGroups: Record = { + group: {}, + }; + + const result = mapGroupsFromDependabotConfigToJobConfig(dependencyGroups); + + expect(result).toEqual([ + { + name: 'group', + rules: { + patterns: ['*'], + }, + }, + ]); + }); +}); diff --git a/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.ts b/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.ts index 79f0bd69..11bbcd1c 100644 --- a/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.ts +++ b/extension/tasks/dependabotV2/utils/dependabot-cli/DependabotJobBuilder.ts @@ -182,23 +182,28 @@ function mapSourceFromDependabotConfigToJobConfig(taskInputs: ISharedVariables, }; } -function mapGroupsFromDependabotConfigToJobConfig(dependencyGroups: Record): any[] { +export function mapGroupsFromDependabotConfigToJobConfig(dependencyGroups: Record): any[] { if (!dependencyGroups) { return undefined; } - return Object.keys(dependencyGroups).map((name) => { - const group = dependencyGroups[name]; - return { - 'name': name, - 'applies-to': group['applies-to'], - 'rules': { - 'patterns': group['patterns'], - 'exclude-patterns': group['exclude-patterns'], - 'dependency-type': group['dependency-type'], - 'update-types': group['update-types'], - }, - }; - }); + return Object.keys(dependencyGroups) + .map((name) => { + const group = dependencyGroups[name]; + if (!group) { + return; + } + return { + 'name': name, + 'applies-to': group['applies-to'], + 'rules': { + 'patterns': group['patterns']?.length ? group['patterns'] : ['*'], + 'exclude-patterns': group['exclude-patterns'], + 'dependency-type': group['dependency-type'], + 'update-types': group['update-types'], + }, + }; + }) + .filter((g) => g); } function mapAllowedUpdatesFromDependabotConfigToJobConfig(allowedUpdates: IDependabotAllowCondition[]): any[] {