Skip to content

Commit

Permalink
Fix existing unit tests
Browse files Browse the repository at this point in the history
Cleaned up mocks and removed a few instances of `any` in the
process.
  • Loading branch information
Joe Portner committed Jun 2, 2022
1 parent 439e425 commit e895f78
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 75 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
* Side Public License, v 1.
*/

export const createOrUpgradeSavedConfigMock = jest.fn();
jest.doMock('./create_or_upgrade_saved_config', () => ({
createOrUpgradeSavedConfig: createOrUpgradeSavedConfigMock,
import type { getUpgradeableConfig } from './get_upgradeable_config';

export const mockGetUpgradeableConfig = jest.fn() as jest.MockedFunction<
typeof getUpgradeableConfig
>;
jest.mock('./get_upgradeable_config', () => ({
getUpgradeableConfig: mockGetUpgradeableConfig,
}));
Original file line number Diff line number Diff line change
Expand Up @@ -6,29 +6,25 @@
* Side Public License, v 1.
*/

import Chance from 'chance';

import { getUpgradeableConfigMock } from './get_upgradeable_config.test.mock';
import { mockGetUpgradeableConfig } from './create_or_upgrade_saved_config.test.mock';
import { SavedObjectsErrorHelpers } from '../../saved_objects';
import { savedObjectsClientMock } from '../../saved_objects/service/saved_objects_client.mock';
import { loggingSystemMock } from '../../logging/logging_system.mock';

import { createOrUpgradeSavedConfig } from './create_or_upgrade_saved_config';

const chance = new Chance();
describe('uiSettings/createOrUpgradeSavedConfig', function () {
afterEach(() => jest.resetAllMocks());

const version = '4.0.1';
const prevVersion = '4.0.0';
const buildNum = chance.integer({ min: 1000, max: 5000 });
const buildNum = 1337;

function setup() {
const logger = loggingSystemMock.create();
const getUpgradeableConfig = getUpgradeableConfigMock;
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.create.mockImplementation(
async (type, attributes, options = {}) =>
async (type, _, options = {}) =>
({
type,
id: options.id,
Expand All @@ -46,8 +42,8 @@ describe('uiSettings/createOrUpgradeSavedConfig', function () {
...options,
});

expect(getUpgradeableConfigMock).toHaveBeenCalledTimes(1);
expect(getUpgradeableConfig).toHaveBeenCalledWith({ savedObjectsClient, version });
expect(mockGetUpgradeableConfig).toHaveBeenCalledTimes(1);
expect(mockGetUpgradeableConfig).toHaveBeenCalledWith({ savedObjectsClient, version });

return resp;
}
Expand All @@ -58,7 +54,6 @@ describe('uiSettings/createOrUpgradeSavedConfig', function () {
run,
version,
savedObjectsClient,
getUpgradeableConfig,
};
}

Expand All @@ -83,25 +78,21 @@ describe('uiSettings/createOrUpgradeSavedConfig', function () {

describe('something is upgradeable', () => {
it('should merge upgraded attributes with current build number in new config', async () => {
const { run, getUpgradeableConfig, savedObjectsClient } = setup();
const { run, savedObjectsClient } = setup();

const savedAttributes = {
buildNum: buildNum - 100,
[chance.word()]: chance.sentence(),
[chance.word()]: chance.sentence(),
[chance.word()]: chance.sentence(),
defaultIndex: 'some-index',
};

getUpgradeableConfig.mockResolvedValue({
mockGetUpgradeableConfig.mockResolvedValue({
id: prevVersion,
attributes: savedAttributes,
type: '',
references: [],
});

await run();

expect(getUpgradeableConfig).toHaveBeenCalledTimes(1);
expect(mockGetUpgradeableConfig).toHaveBeenCalledTimes(1);
expect(savedObjectsClient.create).toHaveBeenCalledTimes(1);
expect(savedObjectsClient.create).toHaveBeenCalledWith(
'config',
Expand All @@ -116,13 +107,11 @@ describe('uiSettings/createOrUpgradeSavedConfig', function () {
});

it('should log a message for upgrades', async () => {
const { getUpgradeableConfig, logger, run } = setup();
const { logger, run } = setup();

getUpgradeableConfig.mockResolvedValue({
mockGetUpgradeableConfig.mockResolvedValue({
id: prevVersion,
attributes: { buildNum: buildNum - 100 },
type: '',
references: [],
});

await run();
Expand All @@ -144,13 +133,11 @@ describe('uiSettings/createOrUpgradeSavedConfig', function () {
});

it('does not log when upgrade fails', async () => {
const { getUpgradeableConfig, logger, run, savedObjectsClient } = setup();
const { logger, run, savedObjectsClient } = setup();

getUpgradeableConfig.mockResolvedValue({
mockGetUpgradeableConfig.mockResolvedValue({
id: prevVersion,
attributes: { buildNum: buildNum - 100 },
type: '',
references: [],
});

savedObjectsClient.create.mockRejectedValue(new Error('foo'));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,7 @@ export async function createOrUpgradeSavedConfig(
isDefaultIndexMigrated,
}),
},
upgradeableConfig ?? {
// We didn't find an upgradeable config, so this is a fresh one; mark the defaultIndex as migrated so we don't change it later!
isDefaultIndexMigrated: true,
}
upgradeableConfig?.attributes
);

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,69 +8,70 @@

import { getUpgradeableConfig } from './get_upgradeable_config';
import { savedObjectsClientMock } from '../../saved_objects/service/saved_objects_client.mock';
import { SavedObjectsFindResponse } from '../../saved_objects';

describe('getUpgradeableConfig', () => {
it('finds saved objects with type "config"', async () => {
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.find.mockResolvedValue({
saved_objects: [{ id: '7.5.0' }],
} as any);
saved_objects: [{ id: '7.5.0', attributes: 'foo' }],
} as SavedObjectsFindResponse);

await getUpgradeableConfig({ savedObjectsClient, version: '7.5.0' });
expect(savedObjectsClient.find.mock.calls[0][0].type).toBe('config');
});

it('finds saved config with version < than Kibana version', async () => {
const savedConfig = { id: '7.4.0' };
const savedConfig = { id: '7.4.0', attributes: 'foo' };
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.find.mockResolvedValue({
saved_objects: [savedConfig],
} as any);
} as SavedObjectsFindResponse);

const result = await getUpgradeableConfig({ savedObjectsClient, version: '7.5.0' });
expect(result).toBe(savedConfig);
expect(result).toEqual(savedConfig);
});

it('finds saved config with RC version === Kibana version', async () => {
const savedConfig = { id: '7.5.0-rc1' };
const savedConfig = { id: '7.5.0-rc1', attributes: 'foo' };
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.find.mockResolvedValue({
saved_objects: [savedConfig],
} as any);
} as SavedObjectsFindResponse);

const result = await getUpgradeableConfig({ savedObjectsClient, version: '7.5.0' });
expect(result).toBe(savedConfig);
expect(result).toEqual(savedConfig);
});

it('does not find saved config with version === Kibana version', async () => {
const savedConfig = { id: '7.5.0' };
const savedConfig = { id: '7.5.0', attributes: 'foo' };
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.find.mockResolvedValue({
saved_objects: [savedConfig],
} as any);
} as SavedObjectsFindResponse);

const result = await getUpgradeableConfig({ savedObjectsClient, version: '7.5.0' });
expect(result).toBe(undefined);
expect(result).toBe(null);
});

it('does not find saved config with version > Kibana version', async () => {
const savedConfig = { id: '7.6.0' };
const savedConfig = { id: '7.6.0', attributes: 'foo' };
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.find.mockResolvedValue({
saved_objects: [savedConfig],
} as any);
} as SavedObjectsFindResponse);

const result = await getUpgradeableConfig({ savedObjectsClient, version: '7.5.0' });
expect(result).toBe(undefined);
expect(result).toBe(null);
});

it('handles empty config', async () => {
const savedObjectsClient = savedObjectsClientMock.create();
savedObjectsClient.find.mockResolvedValue({
saved_objects: [],
} as any);
} as unknown as SavedObjectsFindResponse);

const result = await getUpgradeableConfig({ savedObjectsClient, version: '7.5.0' });
expect(result).toBe(undefined);
expect(result).toBe(null);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ import { isConfigVersionUpgradeable } from './is_config_version_upgradeable';
* This contains a subset of `config` object attributes that are relevant for upgrading it.
*/
export interface UpgradeableConfigType {
buildNum: string;
defaultIndex: string | undefined;
isDefaultIndexMigrated: boolean | undefined;
buildNum: number;
defaultIndex?: string;
isDefaultIndexMigrated?: boolean;
}

/**
Expand Down Expand Up @@ -43,5 +43,11 @@ export async function getUpgradeableConfig({
});

// try to find a config that we can upgrade
return savedConfigs.find((savedConfig) => isConfigVersionUpgradeable(savedConfig.id, version));
const findResult = savedConfigs.find((savedConfig) =>
isConfigVersionUpgradeable(savedConfig.id, version)
);
if (findResult) {
return { id: findResult.id, attributes: findResult.attributes };
}
return null;
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@
* Side Public License, v 1.
*/

export const getUpgradeableConfigMock = jest.fn();
jest.doMock('./get_upgradeable_config', () => ({
getUpgradeableConfig: getUpgradeableConfigMock,
import type { createOrUpgradeSavedConfig } from './create_or_upgrade_saved_config';

export const mockCreateOrUpgradeSavedConfig = jest.fn() as jest.MockedFunction<
typeof createOrUpgradeSavedConfig
>;
jest.mock('./create_or_upgrade_saved_config', () => ({
createOrUpgradeSavedConfig: mockCreateOrUpgradeSavedConfig,
}));
35 changes: 16 additions & 19 deletions src/core/server/ui_settings/ui_settings_client.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import Chance from 'chance';
import { schema } from '@kbn/config-schema';

import { loggingSystemMock } from '../logging/logging_system.mock';
import { createOrUpgradeSavedConfigMock } from './create_or_upgrade_saved_config/create_or_upgrade_saved_config.test.mock';
import { mockCreateOrUpgradeSavedConfig } from './ui_settings_client.test.mock';

import { SavedObjectsClient } from '../saved_objects';
import { savedObjectsClientMock } from '../saved_objects/service/saved_objects_client.mock';
Expand Down Expand Up @@ -47,12 +47,9 @@ describe('ui settings', () => {
log: logger,
});

const createOrUpgradeSavedConfig = createOrUpgradeSavedConfigMock;

return {
uiSettings,
savedObjectsClient,
createOrUpgradeSavedConfig,
};
}

Expand Down Expand Up @@ -84,22 +81,22 @@ describe('ui settings', () => {
});

it('automatically creates the savedConfig if it is missing', async () => {
const { uiSettings, savedObjectsClient, createOrUpgradeSavedConfig } = setup();
const { uiSettings, savedObjectsClient } = setup();
savedObjectsClient.update
.mockRejectedValueOnce(SavedObjectsClient.errors.createGenericNotFoundError())
.mockResolvedValueOnce({} as any);

await uiSettings.setMany({ foo: 'bar' });

expect(savedObjectsClient.update).toHaveBeenCalledTimes(2);
expect(createOrUpgradeSavedConfig).toHaveBeenCalledTimes(1);
expect(createOrUpgradeSavedConfig).toHaveBeenCalledWith(
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledTimes(1);
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledWith(
expect.objectContaining({ handleWriteErrors: false })
);
});

it('only tried to auto create once and throws NotFound', async () => {
const { uiSettings, savedObjectsClient, createOrUpgradeSavedConfig } = setup();
const { uiSettings, savedObjectsClient } = setup();
savedObjectsClient.update.mockRejectedValue(
SavedObjectsClient.errors.createGenericNotFoundError()
);
Expand All @@ -112,8 +109,8 @@ describe('ui settings', () => {
}

expect(savedObjectsClient.update).toHaveBeenCalledTimes(2);
expect(createOrUpgradeSavedConfig).toHaveBeenCalledTimes(1);
expect(createOrUpgradeSavedConfig).toHaveBeenCalledWith(
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledTimes(1);
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledWith(
expect.objectContaining({ handleWriteErrors: false })
);
});
Expand Down Expand Up @@ -374,7 +371,7 @@ describe('ui settings', () => {
});

it('automatically creates the savedConfig if it is missing and returns empty object', async () => {
const { uiSettings, savedObjectsClient, createOrUpgradeSavedConfig } = setup();
const { uiSettings, savedObjectsClient } = setup();
savedObjectsClient.get = jest
.fn()
.mockRejectedValueOnce(SavedObjectsClient.errors.createGenericNotFoundError())
Expand All @@ -384,15 +381,15 @@ describe('ui settings', () => {

expect(savedObjectsClient.get).toHaveBeenCalledTimes(2);

expect(createOrUpgradeSavedConfig).toHaveBeenCalledTimes(1);
expect(createOrUpgradeSavedConfig).toHaveBeenCalledWith(
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledTimes(1);
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledWith(
expect.objectContaining({ handleWriteErrors: true })
);
});

it('returns result of savedConfig creation in case of notFound error', async () => {
const { uiSettings, savedObjectsClient, createOrUpgradeSavedConfig } = setup();
createOrUpgradeSavedConfig.mockResolvedValue({ foo: 'bar ' });
const { uiSettings, savedObjectsClient } = setup();
mockCreateOrUpgradeSavedConfig.mockResolvedValue({ foo: 'bar ' });
savedObjectsClient.get.mockRejectedValue(
SavedObjectsClient.errors.createGenericNotFoundError()
);
Expand All @@ -401,23 +398,23 @@ describe('ui settings', () => {
});

it('returns an empty object on Forbidden responses', async () => {
const { uiSettings, savedObjectsClient, createOrUpgradeSavedConfig } = setup();
const { uiSettings, savedObjectsClient } = setup();

const error = SavedObjectsClient.errors.decorateForbiddenError(new Error());
savedObjectsClient.get.mockRejectedValue(error);

expect(await uiSettings.getUserProvided()).toStrictEqual({});
expect(createOrUpgradeSavedConfig).toHaveBeenCalledTimes(0);
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledTimes(0);
});

it('returns an empty object on EsUnavailable responses', async () => {
const { uiSettings, savedObjectsClient, createOrUpgradeSavedConfig } = setup();
const { uiSettings, savedObjectsClient } = setup();

const error = SavedObjectsClient.errors.decorateEsUnavailableError(new Error());
savedObjectsClient.get.mockRejectedValue(error);

expect(await uiSettings.getUserProvided()).toStrictEqual({});
expect(createOrUpgradeSavedConfig).toHaveBeenCalledTimes(0);
expect(mockCreateOrUpgradeSavedConfig).toHaveBeenCalledTimes(0);
});

it('throws Unauthorized errors', async () => {
Expand Down

0 comments on commit e895f78

Please sign in to comment.