import { codeBlock } from 'common-tags'; import type { PackageDependency } from '../types.ts'; import { extractPackageFile } from './index.ts'; describe('modules/manager/buildkite/extract', () => { describe('extractPackageFile()', () => { it('returns null for empty', () => { expect(extractPackageFile('nothing here')).toBeNull(); }); it('extracts simple single plugin', () => { const fileContent = codeBlock` steps: - plugins: abc/detect-clowns#v2.0.0: ~ `; const res = extractPackageFile(fileContent)?.deps; expect(res).toEqual([ { currentValue: 'v2.0.0', datasource: 'github-tags', depName: 'abc/detect-clowns', packageName: 'abc/detect-clowns-buildkite-plugin', }, ]); }); it('extracts multiple plugins in same file', () => { const fileContent = codeBlock` steps: # Prebuild the app image, upload it to a registry for later steps - name: "Docker Build" plugins: docker-compose#v1.3.2: # Comment at the end.... build: app image-repository: index.docker.io/org/repo - wait # Use the app image built above to run concurrent tests - name: "Docker Test %n" command: test.sh parallelism: 25 plugins: docker-compose#v1.3.2: run: app `; const res = extractPackageFile(fileContent)?.deps; expect(res).toEqual([ { currentValue: 'v1.3.2', datasource: 'github-tags', depName: 'docker-compose', packageName: 'buildkite-plugins/docker-compose-buildkite-plugin', }, { currentValue: 'v1.3.2', datasource: 'github-tags', depName: 'docker-compose', packageName: 'buildkite-plugins/docker-compose-buildkite-plugin', }, ]); }); it('adds skipReason', () => { const fileContent = codeBlock` steps: - name: "Docker Build" plugins: namespace/docker-compose#v1.3.2.5: build: app image-repository: index.docker.io/org/repo - wait - name: "wrong" command: test.sh parallelism: 25 plugins: github.com/buildkite/plugin-docker-compose#v1.3.2: run: app `; const res = extractPackageFile(fileContent)?.deps; expect(res).toEqual([ { currentValue: 'v1.3.2.5', depName: 'namespace/docker-compose', skipReason: 'invalid-version', }, { currentValue: 'v1.3.2', depName: 'github.com/buildkite/plugin-docker-compose', skipReason: 'invalid-dependency-specification', }, ]); }); it('extracts arrays of plugins', () => { const fileContent = codeBlock` steps: - plugins: - docker-login#v2.0.1: username: xyz - docker-compose#v2.5.1: build: app image-repository: index.docker.io/myorg/myrepo - wait - command: test.sh plugins: - docker-login#v2.0.1: username: xyz - docker-compose#v2.5.1: run: app `; const res = extractPackageFile(fileContent)?.deps; expect(res).toEqual([ { currentValue: 'v2.0.1', datasource: 'github-tags', depName: 'docker-login', packageName: 'buildkite-plugins/docker-login-buildkite-plugin', }, { currentValue: 'v2.5.1', datasource: 'github-tags', depName: 'docker-compose', packageName: 'buildkite-plugins/docker-compose-buildkite-plugin', }, { currentValue: 'v2.0.1', datasource: 'github-tags', depName: 'docker-login', packageName: 'buildkite-plugins/docker-login-buildkite-plugin', }, { currentValue: 'v2.5.1', datasource: 'github-tags', depName: 'docker-compose', packageName: 'buildkite-plugins/docker-compose-buildkite-plugin', }, ]); }); it('extracts git-based plugins', () => { const fileContent = codeBlock` steps: - ssh://git@github.company.com/some-org/some-plugin#v3.2.7: username: abc - https://github.company.com/some-third-org/some-third-plugin#v0.0.1: build: app `; const res = extractPackageFile(fileContent)?.deps; expect(res).toEqual([ { currentValue: 'v3.2.7', datasource: 'github-tags', depName: 'some-org/some-plugin', registryUrls: ['https://github.company.com'], }, { currentValue: 'v0.0.1', datasource: 'github-tags', depName: 'some-third-org/some-third-plugin', registryUrls: ['https://github.company.com'], }, ]); }); it('extracts git-based plugin with .git at the end of its name', () => { const expectedPackageDependency: PackageDependency = { currentValue: 'v3.2.7', datasource: 'github-tags', depName: 'some-org/some-plugin', registryUrls: ['https://github.company.com'], }; const fileContent = codeBlock` steps: - ssh://git@github.company.com/some-org/some-plugin.git#v3.2.7: `; const res = extractPackageFile(fileContent)?.deps; expect(res).toHaveLength(1); expect(res).toEqual([expectedPackageDependency]); }); it('extracts plugins outside plugins sections', () => { const fileContent = codeBlock` .docker-options: &some-options copy-checkout: true .python3-container: &python3-container ssh://git@github.some-domain.com/some-org/some-plugin#v3.2.7: some-config: some-value <<: *some-options `; const res = extractPackageFile(fileContent)?.deps; const expectedPackageDependency: PackageDependency = { currentValue: 'v3.2.7', datasource: 'github-tags', depName: 'some-org/some-plugin', registryUrls: ['https://github.some-domain.com'], }; expect(res).toEqual([expectedPackageDependency]); }); it('extracts plugin with preceding ?', () => { const fileContent = codeBlock` steps: - ? ssh://git@github.company.com/some-org/some-plugin.git#v3.2.7 `; const res = extractPackageFile(fileContent)?.deps; const expectedPackageDependency: PackageDependency = { currentValue: 'v3.2.7', datasource: 'github-tags', depName: 'some-org/some-plugin', registryUrls: ['https://github.company.com'], }; expect(res).toEqual([expectedPackageDependency]); }); it('extracts plugin tags from bitbucket', () => { const fileContent = codeBlock` steps: - plugins: - ssh://git@bitbucket.org/some-org/some-plugin.git#v3.2.7: - docker-compose#v1.3.2: `; const res = extractPackageFile(fileContent)?.deps; const githubDependency: PackageDependency = { currentValue: 'v1.3.2', datasource: 'github-tags', depName: 'docker-compose', packageName: 'buildkite-plugins/docker-compose-buildkite-plugin', }; const bitbucketDependency: PackageDependency = { currentValue: 'v3.2.7', datasource: 'bitbucket-tags', depName: 'some-org/some-plugin', registryUrls: ['https://bitbucket.org'], }; expect(res).toEqual([bitbucketDependency, githubDependency]); }); it('extracts plugin tags with quotes', () => { const fileContent = codeBlock` steps: - name: "When single quoted" command: true plugins: - 'test-collector#v1.8.0': files: junit.xml format: junit - name: "Docker Test %n" command: test.sh parallelism: 25 plugins: "docker-compose#v1.3.2": run: app `; const res = extractPackageFile(fileContent)?.deps; const singleQuotesDependency: PackageDependency = { currentValue: 'v1.8.0', datasource: 'github-tags', depName: 'test-collector', packageName: 'buildkite-plugins/test-collector-buildkite-plugin', }; const doubleQuotesDependency: PackageDependency = { currentValue: 'v1.3.2', datasource: 'github-tags', depName: 'docker-compose', packageName: 'buildkite-plugins/docker-compose-buildkite-plugin', }; expect(res).toEqual([singleQuotesDependency, doubleQuotesDependency]); }); }); });