Skip to content

Commit

Permalink
馃敤 fix: loadConfiguration - replace arrays instead of merging (#9)
Browse files Browse the repository at this point in the history
* 馃敤 fix: loadConfiguration - replace arrays instead of merging

* 馃摝 bumped package version
  • Loading branch information
thecarlo committed Jan 3, 2024
1 parent 50cf650 commit ad2d5bf
Show file tree
Hide file tree
Showing 4 changed files with 109 additions and 3 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@humankode/git-inject-jira-ticket",
"version": "0.0.8",
"version": "0.0.9",
"private": false,
"description": "A script for the prepare-commit-msg git hook that automatically injects a Jira ticket based off the jira ticket in the branch name",
"repository": "github:thecarlo/git-inject-jira-ticket",
Expand Down
9 changes: 9 additions & 0 deletions src/configuration/customMerge.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { isArray } from 'lodash';

// Custom merge function that replaces arrays instead of merging them
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const customMerge = (objValue: any, srcValue: any): any => {
if (isArray(objValue)) {
return srcValue;
}
};
91 changes: 91 additions & 0 deletions src/configuration/loadConfiguration.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
import * as configModule from 'lilconfig';

import { createDefaultConfiguration } from './createDefaultConfiguration';
import { loadConfiguration } from './loadConfiguration';

jest.mock('lilconfig');

describe('loadConfiguration', () => {
const mockLilconfig = configModule.lilconfig as jest.MockedFunction<
typeof configModule.lilconfig
>;

const mockSearch = jest.fn();

beforeEach(() => {
jest.clearAllMocks();

mockLilconfig.mockReturnValue({ search: mockSearch } as any);
});

it('returns default configuration if no config found', async () => {
mockSearch.mockResolvedValue(null);

const defaultConfiguration = createDefaultConfiguration({});

const result = await loadConfiguration();

expect(result).toEqual(defaultConfiguration);
});

it('returns default configuration if found config is empty', async () => {
mockSearch.mockResolvedValue({ config: {} });

const defaultConfiguration = createDefaultConfiguration({});

const result = await loadConfiguration();

expect(result).toEqual(defaultConfiguration);
});

it('returns merged configuration if found config has values', async () => {
const customConfig = {
jiraIssuePrefix: 'CUSTOM',
branchConfiguration: { branchTypes: ['custom'] },
messageConfiguration: { capitalizeMessage: false },
};

mockSearch.mockResolvedValue({ config: customConfig });

const result = await loadConfiguration();

expect(result.jiraIssuePrefix).toEqual('CUSTOM');

expect(result.branchConfiguration.branchTypes).toEqual(['custom']);

expect(result.messageConfiguration.capitalizeMessage).toEqual(false);
});

it('handles conditional defaults when specific config properties are provided', async () => {
const customConfig = {
jiraIssuePrefix: 'FOO',
jiraTicketExample: 'FOO-1234',
};

mockSearch.mockResolvedValue({ config: customConfig });

const result = await loadConfiguration();

expect(result.jiraIssuePrefix).toEqual('FOO');

expect(result.jiraTicketExample).toEqual('FOO-1234');
});

it('handles conditional defaults when no specific config properties are provided', async () => {
const customConfig = {};

mockSearch.mockResolvedValue({ config: customConfig });

const defaultConfiguration = createDefaultConfiguration({});

const result = await loadConfiguration();

expect(result.jiraIssuePrefix).toEqual(
defaultConfiguration.jiraIssuePrefix,
);

expect(result.jiraTicketExample).toEqual(
defaultConfiguration.jiraTicketExample,
);
});
});
10 changes: 8 additions & 2 deletions src/configuration/loadConfiguration.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { merge } from 'lodash';
import { mergeWith } from 'lodash';

import { lilconfig } from 'lilconfig';

import { Configuration } from '@interfaces/configuration';
import { ConfigurationDefaults } from '@interfaces/configurationDefaults';

import { createDefaultConfiguration } from './createDefaultConfiguration';
import { customMerge } from './customMerge';

export const loadConfiguration = async (): Promise<Configuration> => {
const explorer = lilconfig('git-inject-jira-ticket', {
Expand Down Expand Up @@ -48,7 +49,12 @@ export const loadConfiguration = async (): Promise<Configuration> => {
return defaultConfiguration;
}

const mergedConfig = merge({}, defaultConfiguration, configuration);
const mergedConfig = mergeWith(
{},
defaultConfiguration,
configuration,
customMerge,
);

return mergedConfig;
};

0 comments on commit ad2d5bf

Please sign in to comment.