forked from renovatebot/renovate
/
extract.spec.ts
149 lines (131 loc) · 5.94 KB
/
extract.spec.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import { Fixtures } from '../../../../test/fixtures';
import { fs as fsutil } from '../../../../test/util';
import { extractPackageFile } from '.';
jest.mock('../../../util/fs');
const pipfile1 = Fixtures.get('Pipfile1');
const pipfile2 = Fixtures.get('Pipfile2');
const pipfile3 = Fixtures.get('Pipfile3');
const pipfile4 = Fixtures.get('Pipfile4');
const pipfile5 = Fixtures.get('Pipfile5');
describe('modules/manager/pipenv/extract', () => {
describe('extractPackageFile()', () => {
it('returns null for empty', async () => {
expect(await extractPackageFile('[packages]\r\n', 'Pipfile')).toBeNull();
});
it('returns null for invalid toml file', async () => {
expect(await extractPackageFile('nothing here', 'Pipfile')).toBeNull();
});
it('extracts dependencies', async () => {
fsutil.localPathExists.mockResolvedValueOnce(true);
const res = await extractPackageFile(pipfile1, 'Pipfile');
expect(res).toMatchSnapshot();
expect(res?.deps).toHaveLength(6);
expect(res?.deps.filter((dep) => !dep.skipReason)).toHaveLength(4);
});
it('marks packages with "extras" as skipReason === unspecified-version', async () => {
const res = await extractPackageFile(pipfile3, 'Pipfile');
expect(res?.deps.filter((r) => !r.skipReason)).toHaveLength(0);
expect(res?.deps.filter((r) => r.skipReason)).toHaveLength(6);
});
it('extracts multiple dependencies', async () => {
fsutil.localPathExists.mockResolvedValueOnce(true);
const res = await extractPackageFile(pipfile2, 'Pipfile');
expect(res).toMatchSnapshot();
expect(res?.deps).toHaveLength(5);
});
it('ignores git dependencies', async () => {
const content =
'[packages]\r\nflask = {git = "https://github.com/pallets/flask.git"}\r\nwerkzeug = ">=0.14"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.deps.filter((r) => !r.skipReason)).toHaveLength(1);
});
it('ignores invalid package names', async () => {
const content = '[packages]\r\nfoo = "==1.0.0"\r\n_invalid = "==1.0.0"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.deps).toHaveLength(2);
expect(res?.deps.filter((dep) => !dep.skipReason)).toHaveLength(1);
});
it('ignores relative path dependencies', async () => {
const content = '[packages]\r\nfoo = "==1.0.0"\r\ntest = {path = "."}';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.deps.filter((r) => !r.skipReason)).toHaveLength(1);
});
it('ignores invalid versions', async () => {
const content = '[packages]\r\nfoo = "==1.0.0"\r\nsome-package = "==0 0"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.deps).toHaveLength(2);
expect(res?.deps.filter((dep) => !dep.skipReason)).toHaveLength(1);
});
it('extracts all sources', async () => {
const content =
'[[source]]\r\nurl = "source-url"\r\n' +
'[[source]]\r\nurl = "other-source-url"\r\n' +
'[packages]\r\nfoo = "==1.0.0"\r\n';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.registryUrls).toEqual(['source-url', 'other-source-url']);
});
it('extracts example pipfile', async () => {
fsutil.localPathExists.mockResolvedValueOnce(true);
const res = await extractPackageFile(pipfile4, 'Pipfile');
expect(res).toMatchSnapshot({
extractedConstraints: { python: '== 2.7.*' },
deps: [
{ depName: 'requests', skipReason: 'unspecified-version' },
{
currentValue: '>0.5.0',
datasource: 'pypi',
depName: 'records',
depType: 'packages',
},
{ depName: 'django', skipReason: 'git-dependency' },
{ depName: 'e682b37', skipReason: 'file-dependency' },
{ depName: 'e1839a8', skipReason: 'local-dependency' },
{ depName: 'pywinusb', skipReason: 'unspecified-version' },
{ currentValue: '*', skipReason: 'unspecified-version' },
{
currentValue: '>=1.0,<3.0',
datasource: 'pypi',
depName: 'unittest2',
depType: 'dev-packages',
managerData: { nestedVersion: true },
},
],
lockFiles: ['Pipfile.lock'],
registryUrls: ['https://pypi.python.org/simple'],
});
});
it('supports custom index', async () => {
fsutil.localPathExists.mockResolvedValueOnce(true);
const res = await extractPackageFile(pipfile5, 'Pipfile');
expect(res).toMatchSnapshot();
expect(res?.registryUrls).toBeDefined();
expect(res?.registryUrls).toHaveLength(2);
expect(res?.deps[0].registryUrls).toBeDefined();
expect(res?.deps[0].registryUrls).toHaveLength(1);
});
it('gets python constraint from python_version', async () => {
const content =
'[packages]\r\nfoo = "==1.0.0"\r\n' +
'[requires]\r\npython_version = "3.8"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.extractedConstraints?.python).toBe('== 3.8.*');
});
it('gets python constraint from python_full_version', async () => {
const content =
'[packages]\r\nfoo = "==1.0.0"\r\n' +
'[requires]\r\npython_full_version = "3.8.6"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.extractedConstraints?.python).toBe('== 3.8.6');
});
it('gets pipenv constraint from packages', async () => {
const content = '[packages]\r\npipenv = "==2020.8.13"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.extractedConstraints?.pipenv).toBe('==2020.8.13');
});
it('gets pipenv constraint from dev-packages', async () => {
const content = '[dev-packages]\r\npipenv = "==2020.8.13"';
const res = await extractPackageFile(content, 'Pipfile');
expect(res?.extractedConstraints?.pipenv).toBe('==2020.8.13');
});
});
});