Skip to content

Commit

Permalink
extract applyPrettier to the global scope
Browse files Browse the repository at this point in the history
rename getAsync to get
  • Loading branch information
Gabriel-Ladzaretti committed Oct 15, 2022
1 parent 2a3348a commit 64583a1
Show file tree
Hide file tree
Showing 11 changed files with 140 additions and 144 deletions.
@@ -1,4 +1,9 @@
{
"content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectPinVersions\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n",
"filename": "renovate.json",
"content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectPinVersions\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n"
"indent": {
"amount": 2,
"indent": " ",
"type": "space"
}
}
@@ -1,4 +1,9 @@
{
"content": "{\n extends: [\n ':separateMajorReleases',\n ':prImmediately',\n ':renovatePrefix',\n ':semanticPrefixFixDepsChoreOthers',\n ':updateNotScheduled',\n ':automergeDisabled',\n ':maintainLockFilesDisabled',\n ':autodetectPinVersions',\n 'group:monorepos',\n ],\n onboarding: false,\n rangeStrategy: 'replace',\n semanticCommits: 'enabled',\n timezone: 'US/Central',\n baseBranches: [\n 'main',\n ],\n}\n",
"filename": "renovate.json5",
"content": "{\n extends: [\n ':separateMajorReleases',\n ':prImmediately',\n ':renovatePrefix',\n ':semanticPrefixFixDepsChoreOthers',\n ':updateNotScheduled',\n ':automergeDisabled',\n ':maintainLockFilesDisabled',\n ':autodetectPinVersions',\n 'group:monorepos',\n ],\n onboarding: false,\n rangeStrategy: 'replace',\n semanticCommits: 'enabled',\n timezone: 'US/Central',\n baseBranches: [\n 'main',\n ],\n}\n"
"indent": {
"amount": 2,
"indent": " ",
"type": "space"
}
}
46 changes: 15 additions & 31 deletions lib/workers/repository/config-migration/branch/create.spec.ts
@@ -1,21 +1,24 @@
import type { Indent } from 'detect-indent';
import { Fixtures } from '../../../../../test/fixtures';
import { RenovateConfig, getConfig, platform } from '../../../../../test/util';
import {
RenovateConfig,
getConfig,
partial,
platform,
} from '../../../../../test/util';
import { checkoutBranch, commitFiles } from '../../../../util/git';
import { createConfigMigrationBranch } from './create';
import type { MigratedData } from './migrated-data';
import { MigratedDataFactory } from './migrated-data';
import * as MigratedDataModule from './migrated-data';

jest.mock('../../../../util/git');

const formattedMigratedData = Fixtures.getJson(
'./migrated-data-formatted.json'
);

describe('workers/repository/config-migration/branch/create', () => {
const raw = Fixtures.getJson('./renovate.json');
const indent = ' ';
const renovateConfig = JSON.stringify(raw, undefined, indent) + '\n';
const filename = 'renovate.json';
const prettierSpy = jest.spyOn(MigratedDataModule, 'applyPrettierFormatting');

let config: RenovateConfig;
let migratedConfigData: MigratedData;
Expand All @@ -25,15 +28,15 @@ describe('workers/repository/config-migration/branch/create', () => {
config = getConfig();
config.baseBranch = 'dev';
config.defaultBranch = 'master';
migratedConfigData = { content: renovateConfig, filename };
migratedConfigData = {
content: renovateConfig,
filename,
indent: partial<Indent>({}),
};
prettierSpy.mockResolvedValueOnce(migratedConfigData.content);
});

describe('createConfigMigrationBranch', () => {
const prettierSpy = jest.spyOn(
MigratedDataFactory,
'applyPrettierFormatting'
);

it('applies the default commit message', async () => {
await createConfigMigrationBranch(config, migratedConfigData);
expect(checkoutBranch).toHaveBeenCalledWith(config.defaultBranch);
Expand Down Expand Up @@ -188,25 +191,6 @@ describe('workers/repository/config-migration/branch/create', () => {
platformCommit: false,
});
});

it('applies prettier formatting to the committed content', async () => {
const formatted = formattedMigratedData.content;
prettierSpy.mockResolvedValueOnce(formattedMigratedData.content);
await createConfigMigrationBranch(config, migratedConfigData);
expect(checkoutBranch).toHaveBeenCalledWith(config.defaultBranch);
expect(commitFiles).toHaveBeenCalledWith({
branchName: 'renovate/migrate-config',
files: [
{
type: 'addition',
path: 'renovate.json',
contents: formatted,
},
],
message: 'Migrate config renovate.json',
platformCommit: false,
});
});
});
});
});
11 changes: 5 additions & 6 deletions lib/workers/repository/config-migration/branch/create.ts
@@ -1,11 +1,12 @@
import upath from 'upath';
import { GlobalConfig } from '../../../../config/global';
import type { RenovateConfig } from '../../../../config/types';
import { logger } from '../../../../logger';
import { commitAndPush } from '../../../../modules/platform/commit';
import { checkoutBranch } from '../../../../util/git';
import { getMigrationBranchName } from '../common';
import { ConfigMigrationCommitMessageFactory } from './commit-message';
import { MigratedDataFactory } from './migrated-data';
import { PrettierParser, applyPrettierFormatting } from './migrated-data';
import type { MigratedData } from './migrated-data';

export async function createConfigMigrationBranch(
Expand All @@ -30,11 +31,9 @@ export async function createConfigMigrationBranch(
}

await checkoutBranch(config.defaultBranch!);
let contents = migratedConfigData.content;
const prettified = await MigratedDataFactory.applyPrettierFormatting();
if (prettified) {
contents = prettified;
}
const { content, filename, indent } = migratedConfigData;
const parser = upath.extname(filename).replace('.', '') as PrettierParser;
const contents = await applyPrettierFormatting(content, parser, indent);
return commitAndPush({
branchName: getMigrationBranchName(config),
files: [
Expand Down
Expand Up @@ -7,7 +7,7 @@ import { logger } from '../../../../logger';
import { readLocalFile } from '../../../../util/fs';
import { getFileList } from '../../../../util/git';
import { detectRepoFileConfig } from '../../init/merge';
import { MigratedDataFactory } from './migrated-data';
import { MigratedDataFactory, applyPrettierFormatting } from './migrated-data';

jest.mock('../../../../config/migration');
jest.mock('../../../../util/git');
Expand Down Expand Up @@ -48,53 +48,49 @@ describe('workers/repository/config-migration/branch/migrated-data', () => {
isMigrated: false,
migratedConfig: {},
});
await expect(MigratedDataFactory.getAsync()).resolves.toBeNull();
await expect(MigratedDataFactory.get()).resolves.toBeNull();
});

it('Calls getAsync a first time to initialize the factory', async () => {
await expect(MigratedDataFactory.getAsync()).resolves.toEqual(
migratedData
);
await expect(MigratedDataFactory.get()).resolves.toEqual(migratedData);
expect(detectRepoFileConfig).toHaveBeenCalledTimes(1);
});

it('Calls getAsync a second time to get the saved data from before', async () => {
await expect(MigratedDataFactory.getAsync()).resolves.toEqual(
migratedData
);
await expect(MigratedDataFactory.get()).resolves.toEqual(migratedData);
expect(detectRepoFileConfig).toHaveBeenCalledTimes(0);
});

describe('MigratedData class', () => {
it('gets the filename from the class instance', async () => {
const data = await MigratedDataFactory.getAsync();
const data = await MigratedDataFactory.get();
expect(data?.filename).toBe('renovate.json');
});

it('gets the content from the class instance', async () => {
const data = await MigratedDataFactory.getAsync();
const data = await MigratedDataFactory.get();
expect(data?.content).toBe(migratedData.content);
});
});

it('Resets the factory and gets a new value', async () => {
MigratedDataFactory.reset();
await expect(MigratedDataFactory.getAsync()).resolves.toEqual(
migratedData
);
await expect(MigratedDataFactory.get()).resolves.toEqual(migratedData);
});

it('Resets the factory and gets a new value with default indentation', async () => {
mockedFunction(detectIndent).mockReturnValueOnce({
const indent = {
type: undefined,
amount: 0,
// TODO: incompatible types (#7154)
indent: null as never,
});
};
mockedFunction(detectIndent).mockReturnValueOnce(indent);
MigratedDataFactory.reset();
await expect(MigratedDataFactory.getAsync()).resolves.toEqual(
migratedData
);
await expect(MigratedDataFactory.get()).resolves.toEqual({
...migratedData,
indent,
});
});

it('Migrate a JSON5 config file', async () => {
Expand All @@ -103,7 +99,7 @@ describe('workers/repository/config-migration/branch/migrated-data', () => {
configFileRaw: rawNonMigratedJson5,
});
MigratedDataFactory.reset();
await expect(MigratedDataFactory.getAsync()).resolves.toEqual(
await expect(MigratedDataFactory.get()).resolves.toEqual(
migratedDataJson5
);
});
Expand All @@ -112,7 +108,7 @@ describe('workers/repository/config-migration/branch/migrated-data', () => {
const err = new Error('error-message');
mockedFunction(detectRepoFileConfig).mockRejectedValueOnce(err);
MigratedDataFactory.reset();
await expect(MigratedDataFactory.getAsync()).resolves.toBeNull();
await expect(MigratedDataFactory.get()).resolves.toBeNull();
expect(logger.debug).toHaveBeenCalledWith(
{ err },
'MigratedDataFactory.getAsync() Error initializing renovate MigratedData'
Expand Down Expand Up @@ -142,57 +138,59 @@ describe('workers/repository/config-migration/branch/migrated-data', () => {
mockedFunction(getFileList).mockResolvedValue([]);
});

it('returns null if invoked before factory is initialized', async () => {
await expect(
MigratedDataFactory.applyPrettierFormatting()
).resolves.toBeNull();
});

it('does not format when no prettier config is present', async () => {
const unformatted = migratedData.content;
const { content: unformatted, filename } = migratedData;
mockedFunction(readLocalFile).mockResolvedValueOnce(null);
await MigratedDataFactory.getAsync();
await MigratedDataFactory.get();
await expect(
MigratedDataFactory.applyPrettierFormatting()
applyPrettierFormatting(unformatted, filename)
).resolves.toEqual(unformatted);
});

it('does not format when failing to fetch package.json file', async () => {
const unformatted = migratedData.content;
const { content: unformatted, filename } = migratedData;
mockedFunction(readLocalFile).mockRejectedValueOnce(null);
await MigratedDataFactory.getAsync();
await MigratedDataFactory.get();
await expect(
MigratedDataFactory.applyPrettierFormatting()
applyPrettierFormatting(unformatted, filename)
).resolves.toEqual(unformatted);
});

it('does not format when there is an invalid package.json file', async () => {
const unformatted = migratedData.content;
const { content: unformatted, filename } = migratedData;
mockedFunction(readLocalFile).mockResolvedValueOnce('invalid json');
await MigratedDataFactory.getAsync();
await MigratedDataFactory.get();
await expect(
MigratedDataFactory.applyPrettierFormatting()
applyPrettierFormatting(unformatted, filename)
).resolves.toEqual(unformatted);
});

it('formats when prettier config file is found', async () => {
const { content, filename } = migratedData;
const formatted = formattedMigratedData.content;
mockedFunction(getFileList).mockResolvedValue(['.prettierrc']);
await MigratedDataFactory.getAsync();
await MigratedDataFactory.get();
await expect(
MigratedDataFactory.applyPrettierFormatting()
applyPrettierFormatting(
content,
filename.endsWith('json') ? 'json' : 'json5'
)
).resolves.toEqual(formatted);
});

it('formats when finds prettier config inside the package.json file', async () => {
const { content, filename } = migratedData;
const formatted = formattedMigratedData.content;
mockedFunction(detectRepoFileConfig).mockResolvedValueOnce({
configFileName: 'renovate.json',
});
mockedFunction(readLocalFile).mockResolvedValueOnce('{"prettier":{}}');
await MigratedDataFactory.getAsync();
await MigratedDataFactory.get();
await expect(
MigratedDataFactory.applyPrettierFormatting()
applyPrettierFormatting(
content,
filename.endsWith('json5') ? 'json5' : 'json'
)
).resolves.toEqual(formatted);
});
});
Expand Down

0 comments on commit 64583a1

Please sign in to comment.