Skip to content
Snippets Groups Projects
Select Git revision
  • 24a237c15bf3ce77b7cc55b44f80d5ebf3fdb0c4
  • main default protected
  • next
  • chore/update-static-data
  • renovate/main-redis-5.x
  • feat/gnupg
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • refactor/pin-new-value
  • feat/36219--git-x509-signing
  • feat/structured-logger
  • hotfix/39.264.1
  • feat/skip-dangling
  • gh-readonly-queue/next/pr-36034-7a061c4ca1024a19e2c295d773d9642625d1c2be
  • hotfix/39.238.3
  • refactor/gitlab-auto-approve
  • feat/template-strings
  • gh-readonly-queue/next/pr-35654-137d934242c784e0c45d4b957362214f0eade1d7
  • fix/32307-global-extends-merging
  • fix/32307-global-extends-repositories
  • gh-readonly-queue/next/pr-35009-046ebf7cb84ab859f7fefceb5fa53a54ce9736f8
  • 41.55.3
  • 41.55.2
  • 41.55.1
  • 41.55.0
  • 41.54.0
  • 41.53.1
  • 41.53.0
  • 41.52.3
  • 41.52.2
  • 41.52.1
  • 41.52.0
  • 41.51.2
  • 41.51.1
  • 41.51.0
  • 41.50.0
  • 41.49.1
  • 41.49.0
  • 41.48.1
  • 41.48.0
  • 41.47.1
41 results

buildpack.spec.ts

Blame
  • buildpack.spec.ts 5.09 KiB
    import { mocked } from '../../../test/util';
    import { GlobalConfig } from '../../config/global';
    import * as _datasource from '../../modules/datasource';
    import {
      generateInstallCommands,
      isDynamicInstall,
      resolveConstraint,
    } from './buildpack';
    import type { ToolConstraint } from './types';
    
    jest.mock('../../modules/datasource');
    
    const datasource = mocked(_datasource);
    
    describe('util/exec/buildpack', () => {
      describe('isDynamicInstall()', () => {
        beforeEach(() => {
          GlobalConfig.reset();
          delete process.env.BUILDPACK;
        });
    
        it('returns false if binarySource is not install', () => {
          expect(isDynamicInstall()).toBeFalse();
        });
    
        it('returns false if not buildpack', () => {
          GlobalConfig.set({ binarySource: 'install' });
          expect(isDynamicInstall()).toBeFalse();
        });
    
        it('returns false if any unsupported tools', () => {
          GlobalConfig.set({ binarySource: 'install' });
          process.env.BUILDPACK = 'true';
          const toolConstraints: ToolConstraint[] = [
            { toolName: 'node' },
            { toolName: 'npm' },
          ];
          expect(isDynamicInstall(toolConstraints)).toBeFalse();
        });
    
        it('returns false if supported tools', () => {
          GlobalConfig.set({ binarySource: 'install' });
          process.env.BUILDPACK = 'true';
          const toolConstraints: ToolConstraint[] = [{ toolName: 'npm' }];
          expect(isDynamicInstall(toolConstraints)).toBeTrue();
        });
      });
    
      describe('resolveConstraint()', () => {
        beforeEach(() => {
          datasource.getPkgReleases.mockResolvedValue({
            releases: [
              { version: '1.0.0' },
              { version: '1.1.0' },
              { version: '1.3.0' },
              { version: '2.0.14' },
              { version: '2.1.0' },
              { version: '2.2.0-pre.0' },
            ],
          });
        });
    
        it('returns from config', async () => {
          expect(
            await resolveConstraint({ toolName: 'composer', constraint: '1.1.0' })
          ).toBe('1.1.0');
        });
    
        it('returns highest stable', async () => {
          expect(await resolveConstraint({ toolName: 'composer' })).toBe('2.1.0');
        });
    
        it('returns highest unstable', async () => {
          datasource.getPkgReleases.mockResolvedValue({
            releases: [{ version: '2.0.14-b.1' }, { version: '2.1.0-a.1' }],
          });
          expect(await resolveConstraint({ toolName: 'composer' })).toBe(
            '2.1.0-a.1'
          );
        });
    
        it('respects latest', async () => {
          datasource.getPkgReleases.mockResolvedValue({
            tags: {
              latest: '2.0.14',
            },
            releases: [
              { version: '1.0.0' },
              { version: '1.1.0' },
              { version: '1.3.0' },
              { version: '2.0.14' },
              { version: '2.1.0' },
              { version: '2.2.0-pre.0' },
            ],
          });
          expect(await resolveConstraint({ toolName: 'composer' })).toBe('2.0.14');
        });
    
        it('throws for unknown tools', async () => {
          datasource.getPkgReleases.mockReset();
          datasource.getPkgReleases.mockResolvedValueOnce({
            releases: [],
          });
          await expect(resolveConstraint({ toolName: 'whoops' })).rejects.toThrow(
            'Invalid tool to install: whoops'
          );
        });
    
        it('throws no releases', async () => {
          datasource.getPkgReleases.mockReset();
          datasource.getPkgReleases.mockResolvedValueOnce({
            releases: [],
          });
          await expect(resolveConstraint({ toolName: 'composer' })).rejects.toThrow(
            'No tool releases found.'
          );
        });
    
        it('falls back to latest version if no compatible release', async () => {
          datasource.getPkgReleases.mockReset();
          datasource.getPkgReleases.mockResolvedValueOnce({
            releases: [{ version: '1.2.3' }],
          });
          expect(
            await resolveConstraint({ toolName: 'composer', constraint: '^3.1.0' })
          ).toBe('1.2.3');
        });
    
        it('falls back to latest version if invalid constraint', async () => {
          datasource.getPkgReleases.mockReset();
          datasource.getPkgReleases.mockResolvedValueOnce({
            releases: [{ version: '1.2.3' }],
          });
          expect(
            await resolveConstraint({ toolName: 'composer', constraint: 'whoops' })
          ).toBe('1.2.3');
        });
      });
    
      describe('generateInstallCommands()', () => {
        beforeEach(() => {
          datasource.getPkgReleases.mockResolvedValueOnce({
            releases: [
              { version: '1.0.0' },
              { version: '1.1.0' },
              { version: '1.3.0' },
              { version: '2.0.14' },
              { version: '2.1.0' },
            ],
          });
        });
    
        it('returns install commands', async () => {
          const toolConstraints: ToolConstraint[] = [
            {
              toolName: 'composer',
            },
          ];
          expect(await generateInstallCommands(toolConstraints))
            .toMatchInlineSnapshot(`
            Array [
              "install-tool composer 2.1.0",
            ]
          `);
        });
    
        it('hashes npm', async () => {
          const toolConstraints: ToolConstraint[] = [{ toolName: 'npm' }];
          const res = await generateInstallCommands(toolConstraints);
          expect(res).toHaveLength(2);
          expect(res[1]).toBe('hash -d npm 2>/dev/null || true');
        });
      });
    });