Skip to content
Snippets Groups Projects
Select Git revision
  • b69416ce1745f67c9fc1d149738e2f52feb4f732
  • main default protected
  • renovate/main-zod-3.x
  • renovate/main-ghcr.io-renovatebot-base-image-10.x
  • renovate/main-ghcr.io-containerbase-devcontainer-13.x
  • next
  • revert-31645-feat/rename-gradle-wrapper-validation-action
  • renovate/main-redis-5.x
  • fix/36615b-branch-reuse-no-cache
  • chore/punycode
  • fix/36615-branch-reuse-bug
  • 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
  • 41.28.2
  • 41.28.1
  • 41.28.0
  • 41.27.1
  • 41.27.0
  • 41.26.2
  • 41.26.1
  • 41.26.0
  • 41.25.1
  • 41.25.0
  • 41.24.0
  • 41.23.5
  • 41.23.4
  • 41.23.3
  • 41.23.2
  • 41.23.1
  • 41.23.0
  • 41.22.0
  • 41.21.4
  • 41.21.3
41 results

error-config.ts

Blame
  • error-config.spec.ts 4.22 KiB
    import { mock } from 'jest-mock-extended';
    import { RenovateConfig, partial, platform } from '../../../test/util';
    import { GlobalConfig } from '../../config/global';
    import { CONFIG_VALIDATION } from '../../constants/error-messages';
    import { logger } from '../../logger';
    import type { Pr } from '../../modules/platform';
    import {
      raiseConfigWarningIssue,
      raiseCredentialsWarningIssue,
    } from './error-config';
    
    jest.mock('../../modules/platform');
    
    let config: RenovateConfig;
    
    beforeEach(() => {
      // default values
      config = partial<RenovateConfig>({
        onboardingBranch: 'configure/renovate',
        suppressNotifications: ['deprecationWarningIssues'],
        configWarningReuseIssue: true,
        confidential: false,
      });
    });
    
    describe('workers/repository/error-config', () => {
      describe('raiseConfigWarningIssue()', () => {
        beforeEach(() => {
          GlobalConfig.reset();
        });
    
        it('creates issues', async () => {
          const expectedBody = `There are missing credentials for the authentication-required feature. As a precaution, Renovate will pause PRs until it is resolved.
    
    Location: \`package.json\`
    Error type: some-error
    Message: some-message
    `;
          const error = new Error(CONFIG_VALIDATION);
          error.validationSource = 'package.json';
          error.validationMessage = 'some-message';
          error.validationError = 'some-error';
          platform.ensureIssue.mockResolvedValueOnce('created');
    
          const res = await raiseCredentialsWarningIssue(config, error);
    
          expect(res).toBeUndefined();
          expect(logger.warn).toHaveBeenCalledWith(
            { configError: error, res: 'created' },
            'Configuration Warning',
          );
          expect(platform.ensureIssue).toHaveBeenCalledWith(
            expect.objectContaining({ body: expectedBody }),
          );
        });
    
        it('creates issues (dryRun)', async () => {
          const error = new Error(CONFIG_VALIDATION);
          error.validationSource = 'package.json';
          error.validationMessage = 'some-message';
          platform.ensureIssue.mockResolvedValueOnce('created');
          GlobalConfig.set({ dryRun: 'full' });
    
          const res = await raiseConfigWarningIssue(config, error);
    
          expect(res).toBeUndefined();
          expect(logger.info).toHaveBeenCalledWith(
            { configError: error },
            'DRY-RUN: Would ensure configuration error issue',
          );
        });
    
        it('handles onboarding', async () => {
          const error = new Error(CONFIG_VALIDATION);
          error.validationSource = 'package.json';
          error.validationMessage = 'some-message';
          const pr = partial<Pr>({
            title: 'onboarding',
            number: 1,
            state: 'open',
          });
          platform.getBranchPr.mockResolvedValue(pr);
    
          const res = await raiseConfigWarningIssue(config, error);
    
          expect(res).toBeUndefined();
          expect(platform.updatePr).toHaveBeenCalledWith(
            expect.objectContaining({ prTitle: pr.title, number: pr.number }),
          );
        });
    
        it('handles onboarding (dryRun)', async () => {
          const error = new Error(CONFIG_VALIDATION);
          error.validationSource = 'package.json';
          error.validationMessage = 'some-message';
          const pr = partial<Pr>({
            number: 1,
            state: 'open',
          });
          platform.getBranchPr.mockResolvedValue(pr);
          GlobalConfig.set({ dryRun: 'full' });
    
          const res = await raiseConfigWarningIssue(config, error);
    
          expect(res).toBeUndefined();
          expect(logger.info).toHaveBeenCalledWith(
            `DRY-RUN: Would update PR #${pr.number}`,
          );
        });
    
        it('disable issue creation on config failure', async () => {
          const notificationName = 'configErrorIssue';
          const error = new Error(CONFIG_VALIDATION);
          error.validationSource = 'package.json';
          error.validationMessage = 'some-message';
          // config.suppressNotifications = ['deprecationWarningIssues']
          config.suppressNotifications = [notificationName];
          platform.getBranchPr.mockResolvedValueOnce({
            ...mock<Pr>(),
            number: 1,
            state: '!open',
          });
    
          const res = await raiseConfigWarningIssue(config, error);
    
          expect(res).toBeUndefined();
          expect(logger.info).toHaveBeenCalledWith(
            { notificationName },
            'Configuration failure, issues will be suppressed',
          );
        });
      });
    });