Skip to content

Commit 6881ab3

Browse files
authored
test(config): refactor tests (#28574)
1 parent abd3649 commit 6881ab3

File tree

4 files changed

+219
-190
lines changed

4 files changed

+219
-190
lines changed

lib/config/__snapshots__/decrypt.spec.ts.snap

Lines changed: 0 additions & 7 deletions
This file was deleted.

lib/config/decrypt.spec.ts

Lines changed: 0 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
import { Fixtures } from '../../test/fixtures';
2-
import { CONFIG_VALIDATION } from '../constants/error-messages';
31
import { decryptConfig } from './decrypt';
42
import { GlobalConfig } from './global';
53
import type { RenovateConfig } from './types';
64

7-
const privateKey = Fixtures.get('private.pem');
8-
const privateKeyPgp = Fixtures.get('private-pgp.pem');
95
const repository = 'abc/def';
106

117
describe('config/decrypt', () => {
@@ -29,184 +25,5 @@ describe('config/decrypt', () => {
2925
expect(res.encrypted).toBeUndefined();
3026
expect(res.a).toBeUndefined();
3127
});
32-
33-
it('handles invalid encrypted type', async () => {
34-
config.encrypted = 1;
35-
GlobalConfig.set({ privateKey });
36-
const res = await decryptConfig(config, repository);
37-
expect(res.encrypted).toBeUndefined();
38-
});
39-
40-
it('handles invalid encrypted value', async () => {
41-
config.encrypted = { a: 1 };
42-
GlobalConfig.set({ privateKey, privateKeyOld: 'invalid-key' });
43-
await expect(decryptConfig(config, repository)).rejects.toThrow(
44-
CONFIG_VALIDATION,
45-
);
46-
});
47-
48-
it('replaces npm token placeholder in npmrc', async () => {
49-
GlobalConfig.set({
50-
privateKey: 'invalid-key',
51-
privateKeyOld: privateKey,
52-
}); // test old key failover
53-
config.npmrc =
54-
'//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n';
55-
config.encrypted = {
56-
npmToken:
57-
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
58-
};
59-
const res = await decryptConfig(config, repository);
60-
expect(res.encrypted).toBeUndefined();
61-
expect(res.npmToken).toBeUndefined();
62-
expect(res.npmrc).toBe(
63-
'//registry.npmjs.org/:_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n//registry.npmjs.org/:_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n',
64-
);
65-
});
66-
67-
it('appends npm token in npmrc', async () => {
68-
GlobalConfig.set({ privateKey });
69-
config.npmrc = 'foo=bar\n';
70-
config.encrypted = {
71-
npmToken:
72-
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
73-
};
74-
const res = await decryptConfig(config, repository);
75-
expect(res.encrypted).toBeUndefined();
76-
expect(res.npmToken).toBeUndefined();
77-
expect(res.npmrc).toMatchSnapshot();
78-
});
79-
80-
it('decrypts nested', async () => {
81-
GlobalConfig.set({ privateKey });
82-
config.packageFiles = [
83-
{
84-
packageFile: 'package.json',
85-
devDependencies: {
86-
encrypted: {
87-
branchPrefix:
88-
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
89-
npmToken:
90-
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
91-
},
92-
},
93-
},
94-
'backend/package.json',
95-
];
96-
// TODO: fix types #22198
97-
const res = (await decryptConfig(config, repository)) as any;
98-
expect(res.encrypted).toBeUndefined();
99-
expect(res.packageFiles[0].devDependencies.encrypted).toBeUndefined();
100-
expect(res.packageFiles[0].devDependencies.branchPrefix).toBe(
101-
'abcdef-ghijklm-nopqf-stuvwxyz',
102-
);
103-
expect(res.packageFiles[0].devDependencies.npmToken).toBeUndefined();
104-
expect(res.packageFiles[0].devDependencies.npmrc).toBe(
105-
'//registry.npmjs.org/:_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n',
106-
);
107-
});
108-
109-
it('rejects invalid PGP message', async () => {
110-
GlobalConfig.set({ privateKey: privateKeyPgp });
111-
config.encrypted = {
112-
token:
113-
'long-but-wrong-wcFMAw+4H7SgaqGOAQ//ZNPgHJ4RQBdfFoDX8Ywe9UxqMlc8k6VasCszQ2JULh/BpEdKdgRUGNaKaeZ+oBKYDBmDwAD5V5FEMlsg+KO2gykp/p2BAwvKGtYK0MtxLh4h9yJbN7TrVnGO3/cC+Inp8exQt0gD6f1Qo/9yQ9NE4/BIbaSs2b2DgeIK7Ed8N675AuSo73UOa6o7t+9pKeAAK5TQwgSvolihbUs8zjnScrLZD+nhvL3y5gpAqK9y//a+bTu6xPA1jdLjsswoCUq/lfVeVsB2GWV2h6eex/0fRKgN7xxNgdMn0a7msrvumhTawP8mPisPY2AAsHRIgQ9vdU5HbOPdGoIwI9n9rMdIRn9Dy7/gcX9Ic+RP2WwS/KnPHLu/CveY4W5bYqYoikWtJs9HsBCyWFiHIRrJF+FnXwtKdoptRfxTfJIkBoLrV6fDIyKo79iL+xxzgrzWs77KEJUJfexZBEGBCnrV2o7mo3SU197S0qx7HNvqrmeCj8CLxq8opXC71TNa+XE6BQUVyhMFxtW9LNxZUHRiNzrTSikArT4hzjyr3f9cb0kZVcs6XJQsm1EskU3WXo7ETD7nsukS9GfbwMn7tfYidB/yHSHl09ih871BcgByDmEKKdmamcNilW2bmTAqB5JmtaYT5/H8jRQWo/VGrEqlmiA4KmwSv7SZPlDnaDFrmzmMZZDSRgHe5KWl283XLmSeE8J0NPqwFH3PeOv4fIbOjJrnbnFBwSAsgsMe2K4OyFDh2COfrho7s8EP1Kl5lBkYJ+VRreGRerdSu24',
114-
};
115-
await expect(decryptConfig(config, repository)).rejects.toThrow(
116-
CONFIG_VALIDATION,
117-
);
118-
config.encrypted = {
119-
// Missing value
120-
token:
121-
'wcFMAw+4H7SgaqGOAQ//ZNPgHJ4RQBdfFoDX8Ywe9UxqMlc8k6VasCszQ2JULh/BpEdKdgRUGNaKaeZ+oBKYDBmDwAD5V5FEMlsg+KO2gykp/p2BAwvKGtYK0MtxLh4h9yJbN7TrVnGO3/cC+Inp8exQt0gD6f1Qo/9yQ9NE4/BIbaSs2b2DgeIK7Ed8N675AuSo73UOa6o7t+9pKeAAK5TQwgSvolihbUs8zjnScrLZD+nhvL3y5gpAqK9y//a+bTu6xPA1jdLjsswoCUq/lfVeVsB2GWV2h6eex/0fRKgN7xxNgdMn0a7msrvumhTawP8mPisPY2AAsHRIgQ9vdU5HbOPdGoIwI9n9rMdIRn9Dy7/gcX9Ic+RP2WwS/KnPHLu/CveY4W5bYqYoikWtJs9HsBCyWFiHIRrJF+FnXwtKdoptRfxTfJIkBoLrV6fDIyKo79iL+xxzgrzWs77KEJUJfexZBEGBCnrV2o7mo3SU197S0qx7HNvqrmeCj8CLxq8opXC71TNa+XE6BQUVyhMFxtW9LNxZUHRiNzrTSikArT4hzjyr3f9cb0kZVcs6XJQsm1EskU3WXo7ETD7nsukS9GfbwMn7tfYidB/yHSHl09ih871BcgByDmEKKdmamcNilW2bmTAqB5JmtaYT5/H8jRQWo/VGrEqlmiA4KmwSv7SZPlDnaDFrmzmMZZDSRgHe5KWl283XLmSeE8J0NPqwFH3PeOv4fIbOjJrnbnFBwSAsgsMe2K4OyFDh2COfrho7s8EP1Kl5lBkYJ+VRreGRerdSu24',
122-
};
123-
await expect(decryptConfig(config, repository)).rejects.toThrow(
124-
CONFIG_VALIDATION,
125-
);
126-
config.encrypted = {
127-
// Missing org scope
128-
token:
129-
'wcFMAw+4H7SgaqGOAQ//W38A3PmaZnE9XTCHGDQFD52Kz78UYnaiYeAT13cEqYWTwEvQ57B7D7I6i4jCLe7KwkUCS90kyoqd7twD75W/sO70MyIveKnMlqqnpkagQkFgmzMaXXNHaJXEkjzsflTELZu6UsUs/kZYmab7r14YLl9HbH/pqN9exil/9s3ym9URCPOyw/l04KWntdMAy0D+c5M4mE+obv6fz6nDb8tkdeT5Rt2uU+qw3gH1OsB2yu+zTWpI/xTGwDt5nB5txnNTsVrQ/ZK85MSktacGVcYuU9hsEDmSrShmtqlg6Myq+Hjb7cYAp2g4n13C/I3gGGaczl0PZaHD7ALMjI7p6O1q+Ix7vMxipiKMVjS3omJoqBCz3FKc6DVhyX4tfhxgLxFo0DpixNwGbBRbMBO8qZfUk7bicAl/oCRc2Ijmay5DDYuvtkw3G3Ou+sZTe6DNpWUFy6VA4ai7hhcLvcAuiYmLdwPISRR/X4ePa8ZrmSVPyVOvbmmwLhcDYSDlC9Mw4++7ELomlve5kvjVSHvPv9BPVb5sJF7gX4vOT4FrcKalQRPmhNCZrE8tY2lvlrXwV2EEhya8EYv4QTd3JUYEYW5FXiJrORK5KDTnISw+U02nFZjFlnoz9+R6h+aIT1crS3/+YjCHE/EIKvSftOnieYb02Gk7M9nqU19EYL9ApYw4+IjSRgFM3DShIrvuDwDkAwUfaq8mKtr9Vjg/r+yox//GKS3u3r4I3+dfCljA3OwskTPfbSD+huBk4mylIvaL5v8Fngxo979wiLw',
130-
};
131-
await expect(decryptConfig(config, repository)).rejects.toThrow(
132-
CONFIG_VALIDATION,
133-
);
134-
config.encrypted = {
135-
// Impossible to parse
136-
token:
137-
'wcFMAw+4H7SgaqGOAQ//Wa/gHgQdH7tj3LQdW6rWKjzmkYVKZW9EbexJExu4WLaMgEKodlRMilcqCKfQZpjzoiC31J8Ly/x6Soury+lQnLVbtIQ4KWa/uCIz4lXCpPpGNgN2jPfOmdwWBMOcXIT+BgAMxRu3rAmvTtunrkACJ3J92eYNwJhTzp2Azn9LpT7kHnZ64z2SPhbdUgMMhCBwBG5BPArPzF5fdaqa8uUSbKhY0GMiqPXq6Zeq+EBNoPc/RJp2urpYTknO+nRb39avKjihd9MCZ/1d3QYymbRj7SZC3LJhenVF0hil3Uk8TBASnGQiDmBcIXQFhJ0cxavXqKjx+AEALq+kTdwGu5vuE2+2B820/o3lAXR9OnJHr8GodJ2ZBpzOaPrQe5zvxL0gLEeUUPatSOwuLhdo/6+bRCl2wNz23jIjDEFFTmsLqfEHcdVYVTH2QqvLjnUYcCRRuM32vS4rCMOEe0l6p0CV2rk22UZDIPcxqXjKucxse2Sow8ATWiPoIw7zWj7XBLqUKHFnMpPV2dCIKFKBsOKYgLjF4BvKzZJyhmVEPgMcKQLYqeT/2uWDR77NSWH0Cyiwk9M3KbOIMmV3pWh9PiXk6CvumECELbJHYH0Mc+P//BnbDq2Ie9dHdmKhFgRyHU7gWvkPhic9BX36xyldPcnhTgr1XWRoVe0ETGLDPCcqrQ/SUQGrLiujSOgxGu2K/6LDJhi4IKz1/nf7FUSj5eTIDqQiSPP5pXDjlH7oYxXXrHI/aYOCZ5sBx7mOzlEcENIrYblCHO/CYMTWdCJ4Wrftqk7K/A=',
138-
};
139-
await expect(decryptConfig(config, repository)).rejects.toThrow(
140-
CONFIG_VALIDATION,
141-
);
142-
config.encrypted = {
143-
token: 'too-short',
144-
};
145-
await expect(decryptConfig(config, repository)).rejects.toThrow(
146-
CONFIG_VALIDATION,
147-
);
148-
});
149-
150-
it('handles PGP org constraint', async () => {
151-
GlobalConfig.set({ privateKey: privateKeyPgp });
152-
config.encrypted = {
153-
token:
154-
'wcFMAw+4H7SgaqGOAQ/+Lz6RlbEymbnmMhrktuaGiDPWRNPEQFuMRwwYM6/B/r0JMZa9tskAA5RpyYKxGmJJeuRtlA8GkTw02GoZomlJf/KXJZ95FwSbkXMSRJRD8LJ2402Hw2TaOTaSvfamESnm8zhNo8cok627nkKQkyrpk64heVlU5LIbO2+UgYgbiSQjuXZiW+QuJ1hVRjx011FQgEYc59+22yuKYqd8rrni7TrVqhGRlHCAqvNAGjBI4H7uTFh0sP4auunT/JjxTeTkJoNu8KgS/LdrvISpO67TkQziZo9XD5FOzSN7N3e4f8vO4N4fpjgkIDH/9wyEYe0zYz34xMAFlnhZzqrHycRqzBJuMxGqlFQcKWp9IisLMoVJhLrnvbDLuwwcjeqYkhvODjSs7UDKwTE4X4WmvZr0x4kOclOeAAz/pM6oNVnjgWJd9SnYtoa67bZVkne0k6mYjVhosie8v8icijmJ4OyLZUGWnjZCRd/TPkzQUw+B0yvsop9FYGidhCI+4MVx6W5w7SRtCctxVfCjLpmU4kWaBUUJ5YIQ5xm55yxEYuAsQkxOAYDCMFlV8ntWStYwIG1FsBgJX6VPevXuPPMjWiPNedIpJwBH2PLB4blxMfzDYuCeaIqU4daDaEWxxpuFTTK9fLdJKuipwFG6rwE3OuijeSN+2SLszi834DXtUjQdikHSTQG392+oTmZCFPeffLk/OiV2VpdXF3gGL7sr5M9hOWIZ783q0vW1l6nAElZ7UA//kW+L6QRxbnBVTJK5eCmMY6RJmL76zjqC1jQ0FC10',
155-
};
156-
const res = await decryptConfig(config, repository);
157-
expect(res.encrypted).toBeUndefined();
158-
expect(res.token).toBe('123');
159-
await expect(decryptConfig(config, 'wrong/org')).rejects.toThrow(
160-
CONFIG_VALIDATION,
161-
);
162-
});
163-
164-
it('handles PGP multi-org constraint', async () => {
165-
GlobalConfig.set({ privateKey: privateKeyPgp });
166-
config.encrypted = {
167-
token:
168-
'wcFMAw+4H7SgaqGOAQ//Yk4RTQoLEhO0TKxN2IUBrCi88ts+CG1SXKeL06sJ2qikN/3n2JYAGGKgkHRICfu5dOnsjyFdLJ1XWUrbsM3XgVWikMbrmzD1Xe7N5DsoZXlt4Wa9pZ+IkZuE6XcKKu9whIJ22ciEwCzFwDmk/CBshdCCVVQ3IYuM6uibEHn/AHQ8K15XhraiSzF6DbJpevs5Cy7b5YHFyE936H25CVnouUQnMPsirpQq3pYeMq/oOtV/m4mfRUUQ7MUxvtrwE4lq4hLjFu5n9rwlcqaFPl7I7BEM++1c9LFpYsP5mTS7hHCZ9wXBqER8fa3fKYx0bK1ihCpjP4zUkR7P/uhWDArXamv7gHX2Kj/Qsbegn7KjTdZlggAmaJl/CuSgCbhySy+E55g3Z1QFajiLRpQ5+RsWFDbbI08YEgzyQ0yNCaRvrkgo7kZ1D95rEGRfY96duOQbjzOEqtvYmFChdemZ2+f9Kh/JH1+X9ynxY/zYe/0p/U7WD3QNTYN18loc4aXiB1adXD5Ka2QfNroLudQBmLaJpJB6wASFfuxddsD5yRnO32NSdRaqIWC1x6ti3ZYJZ2RsNwJExPDzjpQTuMOH2jtpu3q7NHmW3snRKy2YAL2UjI0YdeKIlhc/qLCJt9MRcOxWYvujTMD/yGprhG44qf0jjMkJBu7NjuVIMONujabl9b7SUQGfO/t+3rMuC68bQdCGLlO8gf3hvtD99utzXphi6idjC0HKSW/9KzuMkm+syGmIAYq/0L3EFvpZ38uq7z8KzwFFQHI3sBA34bNEr5zpU5OMWg',
169-
};
170-
let res = await decryptConfig(config, repository);
171-
expect(res.encrypted).toBeUndefined();
172-
expect(res.token).toBe('123');
173-
res = await decryptConfig(config, 'def/ghi');
174-
expect(res.encrypted).toBeUndefined();
175-
expect(res.token).toBe('123');
176-
await expect(decryptConfig(config, 'wrong/org')).rejects.toThrow(
177-
CONFIG_VALIDATION,
178-
);
179-
});
180-
181-
it('handles PGP org/repo constraint', async () => {
182-
GlobalConfig.set({ privateKey: privateKeyPgp });
183-
config.encrypted = {
184-
token:
185-
'wcFMAw+4H7SgaqGOAQ//Wp7N0PaDZp0uOdwsc1CuqAq0UPcq+IQdHyKpJs3tHiCecXBHogy4P+rY9nGaUrVneCr4HexuKGuyJf1yl0ZqFffAUac5PjF8eDvjukQGOUq4aBlOogJCEefnuuVxVJx+NRR5iF1P6v57bmI1c+zoqZI/EQB30KU6O1BsdGPLUA/+R3dwCZd5Mbd36s34eYBasqcY9/QbqFcpElXMEPMse3kMCsVXPbZ+UMjtPJiBPUmtJq+ifnu1LzDrfshusSQMwgd/QNk7nEsijiYKllkWhHTP6g7zigvJ46x0h6AYS108YiuK3B9XUhXN9m05Ac6KTEEUdRI3E/dK2dQuRkLjXC8wceQm4A19Gm0uHoMIJYOCbiVoBCH6ayvKbZWZV5lZ4D1JbDNGmKeIj6OX9XWEMKiwTx0Xe89V7BdJzwIGrL0TCLtXuYWZ/R2k+UuBqtgzr44BsBqMpKUA0pcGBoqsEou1M05Ae9fJMF6ADezF5UQZPxT1hrMldiTp3p9iHGfWN2tKHeoW/8CqlIqg9JEkTc+Pl/L9E6ndy5Zjf097PvcmSGhxUQBE7XlrZoIlGhiEU/1HPMen0UUIs0LUu1ywpjCex2yTWnU2YmEwy0MQI1sekSr96QFxDDz9JcynYOYbqR/X9pdxEWyzQ+NJ3n6K97nE1Dj9Sgwu7mFGiUdNkf/SUAF0eZi/eXg71qumpMGBd4eWPtgkeMPLHjvMSYw9vBUfcoKFz6RJ4woG0dw5HOFkPnIjXKWllnl/o01EoBp/o8uswsIS9Nb8i+bp27U6tAHE',
186-
};
187-
const res = await decryptConfig(config, repository);
188-
expect(res.encrypted).toBeUndefined();
189-
expect(res.token).toBe('123');
190-
await expect(decryptConfig(config, 'abc/defg')).rejects.toThrow(
191-
CONFIG_VALIDATION,
192-
);
193-
});
194-
195-
it('handles PGP multi-org/repo constraint', async () => {
196-
GlobalConfig.set({ privateKey: privateKeyPgp });
197-
config.encrypted = {
198-
token:
199-
'wcFMAw+4H7SgaqGOARAAibXL3zr0KZawiND868UGdPpGRo1aVZfn0NUBHpm8mXfgB1rBHaLsP7qa8vxDHpwH9DRD1IyB4vvPUwtu7wmuv1Vtr596tD40CCcCZYB5JjZLWRF0O0xaZFCOi7Z9SqqdaOQoMScyvPO+3/lJkS7zmLllJFH0mQoX5Cr+owUAMSWqbeCQ9r/KAXpnhmpraDjTav48WulcdTMc8iQ/DHimcdzHErLOAjtiQi4OUe1GnDCcN76KQ+c+ZHySnkXrYi/DhOOu9qB4glJ5n68NueFja+8iR39z/wqCI6V6TIUiOyjFN86iVyNPQ4Otem3KuNwrnwSABLDqP491eUNjT8DUDffsyhNC9lnjQLmtViK0EN2yLVpMdHq9cq8lszBChB7gobD9rm8nUHnTuLf6yJvZOj6toD5Yqj8Ibj58wN90Q8CUsBp9/qp0J+hBVUPOx4sT6kM2p6YarlgX3mrIW5c1U+q1eDbCddLjHiU5cW7ja7o+cqlA6mbDRu3HthjBweiXTicXZcRu1o/wy/+laQQ95x5FzAXDnOwQUHBmpTDI3tUJvQ+oy8XyBBbyC0LsBye2c2SLkPJ4Ai3IMR+Mh8puSzVywTbneiAQNBzJHlj5l85nCF2tUjvNo3dWC+9mU5sfXg11iEC6LRbg+icjpqRtTjmQURtciKDUbibWacwU5T/SVAGPXnW7adBOS0PZPIZQcSwjchOdOl0IjzBy6ofu7ODdn2CXZXi8zbevTICXsHvjnW4MAj5oXrStxK3LkWyM3YBOLe7sOfWvWz7n9TM3dHg032navQ',
200-
};
201-
let res = await decryptConfig(config, repository);
202-
expect(res.encrypted).toBeUndefined();
203-
expect(res.token).toBe('123');
204-
res = await decryptConfig(config, 'def/def');
205-
expect(res.encrypted).toBeUndefined();
206-
expect(res.token).toBe('123');
207-
await expect(decryptConfig(config, 'abc/defg')).rejects.toThrow(
208-
CONFIG_VALIDATION,
209-
);
210-
});
21128
});
21229
});

lib/config/decrypt/legacy.spec.ts

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import { Fixtures } from '../../../test/fixtures';
2+
import { CONFIG_VALIDATION } from '../../constants/error-messages';
3+
import { decryptConfig } from '../decrypt';
4+
import { GlobalConfig } from '../global';
5+
import type { RenovateConfig } from '../types';
6+
7+
const privateKey = Fixtures.get('private.pem', '..');
8+
const repository = 'abc/def';
9+
10+
describe('config/decrypt/legacy', () => {
11+
describe('decryptConfig()', () => {
12+
let config: RenovateConfig;
13+
14+
beforeEach(() => {
15+
config = {};
16+
GlobalConfig.reset();
17+
});
18+
19+
it('handles invalid encrypted type', async () => {
20+
config.encrypted = 1;
21+
GlobalConfig.set({ privateKey });
22+
const res = await decryptConfig(config, repository);
23+
expect(res.encrypted).toBeUndefined();
24+
});
25+
26+
it('handles invalid encrypted value', async () => {
27+
config.encrypted = { a: 1 };
28+
GlobalConfig.set({ privateKey, privateKeyOld: 'invalid-key' });
29+
await expect(decryptConfig(config, repository)).rejects.toThrow(
30+
CONFIG_VALIDATION,
31+
);
32+
});
33+
34+
it('replaces npm token placeholder in npmrc', async () => {
35+
GlobalConfig.set({
36+
privateKey: 'invalid-key',
37+
privateKeyOld: privateKey,
38+
}); // test old key failover
39+
config.npmrc =
40+
'//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n//registry.npmjs.org/:_authToken=${NPM_TOKEN}\n';
41+
config.encrypted = {
42+
npmToken:
43+
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
44+
};
45+
const res = await decryptConfig(config, repository);
46+
expect(res.encrypted).toBeUndefined();
47+
expect(res.npmToken).toBeUndefined();
48+
expect(res.npmrc).toBe(
49+
'//registry.npmjs.org/:_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n//registry.npmjs.org/:_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n',
50+
);
51+
});
52+
53+
it('appends npm token in npmrc', async () => {
54+
GlobalConfig.set({ privateKey });
55+
config.npmrc = 'foo=bar\n';
56+
config.encrypted = {
57+
npmToken:
58+
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
59+
};
60+
const res = await decryptConfig(config, repository);
61+
expect(res.encrypted).toBeUndefined();
62+
expect(res.npmToken).toBeUndefined();
63+
expect(res.npmrc).toBe(
64+
`foo=bar\n_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n`,
65+
);
66+
});
67+
68+
it('decrypts nested', async () => {
69+
GlobalConfig.set({ privateKey });
70+
config.packageFiles = [
71+
{
72+
packageFile: 'package.json',
73+
devDependencies: {
74+
encrypted: {
75+
branchPrefix:
76+
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
77+
npmToken:
78+
'FLA9YHIzpE7YetAg/P0X46npGRCMqn7hgyzwX5ZQ9wYgu9BRRbTiBVsUIFTyM5BuP1Q22slT2GkWvFvum7GU236Y6QiT7Nr8SLvtsJn2XUuq8H7REFKzdy3+wqyyWbCErYTFyY1dcPM7Ht+CaGDWdd8u/FsoX7AdMRs/X1jNUo6iSmlUiyGlYDKF+QMnCJom1VPVgZXWsGKdjI2MLny991QMaiv0VajmFIh4ENv4CtXOl/1twvIl/6XTXAaqpJJKDTPZEuydi+PHDZmal2RAOfrkH4m0UURa7SlfpUlIg+EaqbNGp85hCYXLwRcEET1OnYr3rH1oYkcYJ40any1tvQ==',
79+
},
80+
},
81+
},
82+
'backend/package.json',
83+
];
84+
// TODO: fix types #22198
85+
const res = (await decryptConfig(config, repository)) as any;
86+
expect(res.encrypted).toBeUndefined();
87+
expect(res.packageFiles[0].devDependencies.encrypted).toBeUndefined();
88+
expect(res.packageFiles[0].devDependencies.branchPrefix).toBe(
89+
'abcdef-ghijklm-nopqf-stuvwxyz',
90+
);
91+
expect(res.packageFiles[0].devDependencies.npmToken).toBeUndefined();
92+
expect(res.packageFiles[0].devDependencies.npmrc).toBe(
93+
'//registry.npmjs.org/:_authToken=abcdef-ghijklm-nopqf-stuvwxyz\n',
94+
);
95+
});
96+
});
97+
});

0 commit comments

Comments
 (0)