Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed and improved tests for non-npm usage #29

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions packages/filter-by-workspace-path/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,14 @@ import * as path from 'path'
import { Auto, IExtendedCommit, ILogger, IPlugin, SEMVER, inFolder } from '@auto-it/core'
import { inc, ReleaseType } from 'semver'

function shouldOmitCommit(currentDir: string, currentWorkspace: string, commit: IExtendedCommit, logger: ILogger): boolean {
function shouldOmitCommit(currentWorkspace: string, commit: IExtendedCommit, logger: ILogger): boolean {
if (!commit.pullRequest) {
return true
}

// auto adds the current path to the file paths reported from git, so we need to undo this
const fixedFiles = commit.files.map((file) => path.relative(currentDir, file))
const wsDir = path.join(currentWorkspace, path.sep)

const atLeastOneFileInCurrentDir = fixedFiles.find((file) => inFolder(wsDir, file))
const atLeastOneFileInCurrentDir = commit.files.find((file) => inFolder(wsDir, file))

if (!atLeastOneFileInCurrentDir) {
logger.verbose.log(`All files are outside the current workspace directory ('${wsDir}'). Omitting commit '${commit.hash}'.`)
Expand All @@ -23,7 +21,9 @@ function shouldOmitCommit(currentDir: string, currentWorkspace: string, commit:
return true
}

logger.verbose.log(`At least one file is in the current workspace ('${wsDir}'). Including commit '${commit.hash}'.`)
logger.verbose.log(
`At least one file is in the current workspace ('${atLeastOneFileInCurrentDir}' in '${wsDir}'). Including commit '${commit.hash}'.`
)
return false
}
}
Expand Down Expand Up @@ -53,13 +53,15 @@ export default class FilterByWorkspacePathPlugin implements IPlugin {
const npmResult = execSync('npm ls --omit=dev --depth 1 -json', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'ignore'] })
const workspaceDeps: any = JSON.parse(npmResult).dependencies
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
currentWorkspace = workspaceDeps[Object.keys(workspaceDeps)[0] as any].resolved.substring(11)
const resolved = workspaceDeps[Object.keys(workspaceDeps)[0] as any].resolved
// 'resolved' var looks like 'file:../../packages/filter-by-workspace-path'
// eslint-disable-next-line @typescript-eslint/no-magic-numbers
const relativeWorkspacePath = String(resolved).split(':', 2)[1]
currentWorkspace = path.resolve(currentDir, relativeWorkspacePath)
}

auto.hooks.onCreateLogParse.tap(this.name, (logParse) => {
logParse.hooks.omitCommit.tap(this.name, (commit) =>
shouldOmitCommit(currentDir, currentWorkspace, commit, auto.logger) ? true : undefined
)
logParse.hooks.omitCommit.tap(this.name, (commit) => (shouldOmitCommit(currentWorkspace, commit, auto.logger) ? true : undefined))
})

auto.hooks.onCreateRelease.tap(this.name, (release) => {
Expand Down
110 changes: 91 additions & 19 deletions packages/filter-by-workspace-path/test/index.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@ import LogParse from '@auto-it/core/dist/log-parse'
import { makeHooks, makeLogParseHooks, makeReleaseHooks } from '@auto-it/core/dist/utils/make-hooks'
import createLog from '@auto-it/core/dist/utils/logger'
import Release from '@auto-it/core/dist/release'
import FilterByPathPlugin from '../src'
import FilterByWorkspacePathPlugin, { ProjectFilteringPluginOptions } from '../src'

const setup = () => {
const plugin = new FilterByPathPlugin()
const setup = (pluginOptions: ProjectFilteringPluginOptions) => {
const plugin = new FilterByWorkspacePathPlugin(pluginOptions)
const hooks = makeHooks()
const logger = createLog()
const logParseHooks = makeLogParseHooks()
Expand All @@ -24,69 +24,141 @@ const setup = () => {
return logParseHooks
}

describe('Omit Commits Plugin', () => {
describe('Test plugin omits commits when using NPM', () => {
const hooks = setup({ npm: true })

it('should not filter the commit single file', async () => {
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBeUndefined()
})

it('should filter the commit single file', async () => {
const commit = makeCommitFromMsg('foo', { pullRequest: { number: 1 }, files: ['/outside'] })
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should not filter the commit multi file', async () => {
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'src/index.ts'), '/outside'],
})
expect(await hooks.omitCommit.promise(commit)).toBeUndefined()
})

it('should filter the commit single file', async () => {
const commit = makeCommitFromMsg('foo', { pullRequest: { number: 1 }, files: ['/outside', '/anotheroutsider'] })
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commit labeled as skip-release', async () => {
const commit = makeCommitFromMsg('foo', {
labels: ['skip-release'],
pullRequest: { number: 1 },
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commit marked as skip-ci', async () => {
const commit = makeCommitFromMsg('foo [skip ci]', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should not skip commit in a sub-directory with the same prefix', async () => {
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'sub-dir/src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBeUndefined()
})

it('should skip commit in a sub-directory without same prefix', async () => {
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('..', 'sub-dir/src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commits without related pull request', async () => {
const commit = makeCommitFromMsg('foo', {
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})
})

describe('Test plugin omits commits without NPM', () => {
const hooks = setup({ npm: false })

it('should not filter the commit single file', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'packages/filter-by-workspace-path/src/index.ts')],
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBeUndefined()
})

it('should filter the commit single file', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo', { pullRequest: { number: 1 }, files: ['/outside'] })
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should not filter the commit multi file', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'packages/filter-by-workspace-path/src/index.ts'), '/outside'],
files: [path.resolve('.', 'src/index.ts'), '/outside'],
})
expect(await hooks.omitCommit.promise(commit)).toBeUndefined()
})

it('should filter the commit single file', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo', { pullRequest: { number: 1 }, files: ['/outside', '/anotheroutsider'] })
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commit labeled as skip-release', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo', {
labels: ['skip-release'],
pullRequest: { number: 1 },
files: [path.resolve('.', 'packages/filter-by-workspace-path/src/index.ts')],
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commit marked as skip-ci', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo [skip ci]', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'packages/filter-by-workspace-path/src/index.ts')],
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commit in a sub-directory with the same prefix', async () => {
const hooks = setup()
it('should not skip commit in a sub-directory with the same prefix', async () => {
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'sub-dir/src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBeUndefined()
})

it('should skip commit in a sub-directory without same prefix', async () => {
const commit = makeCommitFromMsg('foo', {
pullRequest: { number: 1 },
files: [path.resolve('.', 'packages/filter-by-workspace-path-sub-dir/src/index.ts')],
files: [path.resolve('..', 'sub-dir/src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})

it('should skip commits without related pull request', async () => {
const hooks = setup()
const commit = makeCommitFromMsg('foo', {
files: [path.resolve('.', 'packages/filter-by-workspace-path/src/index.ts')],
files: [path.resolve('.', 'src/index.ts')],
})
expect(await hooks.omitCommit.promise(commit)).toBe(true)
})
Expand Down
Loading