Skip to content

Commit 82f0b6a

Browse files
DaniilShmelevTatyana Kostromskaya (Akvelon)Tatyana Kostromskayadenis-tikhomirovAnatoly Bolshakov
authored
[FtpUploadV2] Resolve dependabot alert about shelljs (#15881)
* fix dependencies * fix build build error are caused by tasklib 3.x return types change from "<type>" to "<type> | undefined" functionally, these method calls should be identical * bump task version * Add simple unit tests to check getting input parameters and start of task * Delete debug * Fix EOL * Updated task version to 201 * Added test for successful execution Co-authored-by: Tatyana Kostromskaya (Akvelon) <[email protected]> Co-authored-by: Tatyana Kostromskaya <[email protected]> Co-authored-by: Denis Tikhomirov <[email protected]> Co-authored-by: Denis Tikhomirov <[email protected]> Co-authored-by: Anatoly Bolshakov <[email protected]>
1 parent 81594a9 commit 82f0b6a

19 files changed

+1031
-37
lines changed

Tasks/FtpUploadV2/Tests/L0.ts

Lines changed: 128 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,140 @@
11
import fs = require('fs');
22
import assert = require('assert');
33
import path = require('path');
4+
import * as ttm from 'azure-pipelines-task-lib/mock-test';
45

56
describe('FtpUploadV2 Suite', function () {
6-
before(() => {
7+
this.timeout(parseInt(process.env.TASK_TEST_TIMEOUT!) || 20000);
8+
9+
it('check args: no serverEndpoint', (done: Mocha.Done) => {
10+
const tp = path.join(__dirname, 'L0NoServerEndpoint.js');
11+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
12+
13+
tr.run();
14+
15+
assert(tr.stdOutContained('Input required: serverEndpoint'), 'Should have printed: Input required: serverEndpoint');
16+
assert(tr.failed, 'task should have failed');
17+
18+
done();
19+
});
20+
21+
it('check args: no rootFolder', (done: Mocha.Done) => {
22+
const tp = path.join(__dirname, 'L0NoRootFolder.js');
23+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
24+
25+
tr.run();
26+
27+
assert(tr.stdOutContained('Input required: rootFolder'), 'Should have printed: Input required: rootFolder');
28+
assert(tr.failed, 'task should have failed');
29+
30+
done();
31+
});
32+
33+
it('check args: no filePatterns', (done: Mocha.Done) => {
34+
const tp = path.join(__dirname, 'L0NoFilePatterns.js');
35+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
36+
37+
tr.run();
38+
39+
assert(tr.stdOutContained('Input required: filePatterns'), 'Should have printed: Input required: filePatterns');
40+
assert(tr.failed, 'task should have failed');
41+
42+
done();
743
});
844

9-
after(() => {
45+
it('check args: no remotePath', (done: Mocha.Done) => {
46+
const tp = path.join(__dirname, 'L0NoRemotePath.js');
47+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
48+
49+
tr.run();
50+
51+
assert(tr.stdOutContained('Input required: remotePath'), 'Should have printed: Input required: remotePath');
52+
assert(tr.failed, 'task should have failed');
53+
54+
done();
1055
});
1156

12-
it('Does a basic hello world test', function(done: MochaDone) {
13-
// TODO - add real tests
57+
it('check args: no clean', (done: Mocha.Done) => {
58+
const tp = path.join(__dirname, 'L0NoClean.js');
59+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
60+
61+
tr.run();
62+
63+
assert(tr.stdOutContained('Input required: clean'), 'Should have printed: Input required: clean');
64+
assert(tr.failed, 'task should have failed');
65+
66+
done();
67+
});
68+
69+
it('check args: no preservePaths', (done: Mocha.Done) => {
70+
const tp = path.join(__dirname, 'L0NoPreservePaths.js');
71+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
72+
73+
tr.run();
74+
75+
assert(tr.stdOutContained('Input required: preservePaths'), 'Should have printed: Input required: preservePaths');
76+
assert(tr.failed, 'task should have failed');
77+
78+
done();
79+
});
80+
81+
it('check args: no trustSSL', (done: Mocha.Done) => {
82+
const tp = path.join(__dirname, 'L0NoTrustSSL.js');
83+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
84+
85+
tr.run();
86+
87+
assert(tr.invokedToolCount === 0, 'should not run anything');
88+
assert(tr.stdOutContained('Input required: trustSSL'), 'Should have printed: Input required: trustSSL');
89+
assert(tr.failed, 'task should have failed');
90+
91+
done();
92+
});
93+
94+
it('check args: no protocol on server URL (ftp:// or ftps://)', (done: Mocha.Done) => {
95+
const tp = path.join(__dirname, 'L0NoProtocol.js');
96+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
97+
98+
tr.run();
99+
100+
assert(tr.stdOutContained('loc_mock_FTPNoProtocolSpecified'), 'Should have printed: loc_mock_FTPNoProtocolSpecified');
101+
assert(tr.failed, 'task should have failed');
102+
103+
done();
104+
});
105+
106+
it('check args: no host name on server URL', (done: Mocha.Done) => {
107+
const tp = path.join(__dirname, 'L0NoHostName.js');
108+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
109+
110+
tr.run();
111+
112+
assert(tr.stdOutContained('loc_mock_FTPNoHostSpecified'), 'Should have printed: loc_mock_FTPNoHostSpecified');
113+
assert(tr.failed, 'task should have failed');
114+
115+
done();
116+
});
117+
118+
it('check args: no files found', (done: Mocha.Done) => {
119+
const tp = path.join(__dirname, 'L0NoFilesFound.js');
120+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
121+
122+
tr.run();
123+
124+
assert(tr.stdOutContained('loc_mock_NoFilesFound'), 'Should have printed: loc_mock_NoFilesFound');
125+
assert(tr.failed, 'task should have failed');
126+
127+
done();
128+
});
129+
130+
it('task should complete successfully', (done: Mocha.Done) => {
131+
const tp = path.join(__dirname, 'L0Successful.js');
132+
const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp);
133+
134+
tr.run();
135+
console.info(tr.stdout);
136+
assert(tr.succeeded, 'task should succeed');
137+
14138
done();
15139
});
16140
});
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import ma = require('azure-pipelines-task-lib/mock-answer');
2+
import tmrm = require('azure-pipelines-task-lib/mock-run');
3+
import path = require('path');
4+
5+
let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js');
6+
let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
7+
8+
tr.setInput('serverEndpoint', 'ID1');
9+
tr.setInput('credsType', 'serviceEndpoint');
10+
process.env["ENDPOINT_URL_ID1"] = "ftp://valid.microsoft.com";
11+
process.env["ENDPOINT_AUTH_ID1"] = "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}";
12+
process.env["build.sourcesDirectory"] = "/";
13+
tr.setInput('rootFolder', 'rootFolder');
14+
tr.setInput('filePatterns', '**');
15+
tr.setInput('remotePath', '/upload/');
16+
17+
// provide answers for task mock
18+
let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
19+
"exist": {
20+
"rootFolder": true
21+
},
22+
"find": {
23+
"rootFolder": [
24+
"rootFolder/a",
25+
"rootFolder/b",
26+
"rootFolder/c"
27+
]
28+
},
29+
"match": {
30+
"*": [
31+
"rootFolder/a",
32+
"rootFolder/b",
33+
"rootFolder/c"
34+
]
35+
}
36+
};
37+
tr.setAnswers(a);
38+
39+
tr.run();
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
import ma = require('azure-pipelines-task-lib/mock-answer');
2+
import tmrm = require('azure-pipelines-task-lib/mock-run');
3+
import path = require('path');
4+
5+
let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js');
6+
let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
7+
8+
tr.setInput('serverEndpoint', 'ID1');
9+
tr.setInput('rootFolder', 'rootFolder');
10+
tr.setInput('credsType', 'serviceEndpoint');
11+
process.env["ENDPOINT_URL_ID1"] = "ftp://valid.microsoft.com";
12+
process.env["ENDPOINT_AUTH_ID1"] = "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}";
13+
process.env["build.sourcesDirectory"] = "/";
14+
15+
// provide answers for task mock
16+
let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
17+
"exist": {
18+
"rootFolder": true
19+
},
20+
"find": {
21+
"rootFolder": [
22+
"rootFolder/a",
23+
"rootFolder/b",
24+
"rootFolder/c"
25+
]
26+
},
27+
"match": {
28+
"*": [
29+
"rootFolder/a",
30+
"rootFolder/b",
31+
"rootFolder/c"
32+
]
33+
}
34+
};
35+
tr.setAnswers(a);
36+
37+
tr.run();
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import ma = require('azure-pipelines-task-lib/mock-answer');
2+
import tmrm = require('azure-pipelines-task-lib/mock-run');
3+
import path = require('path');
4+
5+
let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js');
6+
let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
7+
8+
tr.setInput('credsType', 'inputs');
9+
tr.setInput('serverUrl', 'ftps://');
10+
tr.setInput('username', 'username');
11+
tr.setInput('password', 'password');
12+
tr.setInput('rootFolder', 'rootFolder');
13+
tr.setInput('filePatterns', '**');
14+
tr.setInput('remotePath', '/upload/');
15+
tr.setInput('clean', 'true');
16+
tr.setInput('overwrite', 'true');
17+
tr.setInput('preservePaths', 'true');
18+
tr.setInput('trustSSL', 'true');
19+
process.env["ENDPOINT_URL_ID1"] = "ftp://valid.microsoft.com";
20+
process.env["ENDPOINT_AUTH_ID1"] = "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}";
21+
process.env["build.sourcesDirectory"] = "/";
22+
23+
// provide answers for task mock
24+
let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
25+
"exist": {
26+
"rootFolder": true
27+
},
28+
"find": {
29+
"rootFolder": [
30+
]
31+
},
32+
"match": {
33+
"*": [
34+
]
35+
}
36+
};
37+
tr.setAnswers(a);
38+
39+
tr.run();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import ma = require('azure-pipelines-task-lib/mock-answer');
2+
import tmrm = require('azure-pipelines-task-lib/mock-run');
3+
import path = require('path');
4+
5+
let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js');
6+
let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
7+
8+
tr.setInput('credsType', 'inputs');
9+
tr.setInput('serverUrl', 'ftps://');
10+
tr.setInput('username', 'username');
11+
tr.setInput('password', 'password');
12+
tr.setInput('rootFolder', 'rootFolder');
13+
tr.setInput('filePatterns', '**');
14+
tr.setInput('remotePath', '/upload/');
15+
tr.setInput('clean', 'true');
16+
tr.setInput('overwrite', 'true');
17+
tr.setInput('preservePaths', 'true');
18+
tr.setInput('trustSSL', 'true');
19+
process.env["ENDPOINT_URL_ID1"] = "ftp://valid.microsoft.com";
20+
process.env["ENDPOINT_AUTH_ID1"] = "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}";
21+
process.env["build.sourcesDirectory"] = "/";
22+
23+
// provide answers for task mock
24+
let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
25+
"exist": {
26+
"rootFolder": true
27+
},
28+
"find": {
29+
"rootFolder": [
30+
"rootFolder/a",
31+
"rootFolder/b",
32+
"rootFolder/c"
33+
]
34+
},
35+
"match": {
36+
"*": [
37+
"rootFolder/a",
38+
"rootFolder/b",
39+
"rootFolder/c"
40+
]
41+
}
42+
};
43+
tr.setAnswers(a);
44+
45+
tr.run();
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import ma = require('azure-pipelines-task-lib/mock-answer');
2+
import tmrm = require('azure-pipelines-task-lib/mock-run');
3+
import path = require('path');
4+
5+
let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js');
6+
let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
7+
8+
tr.setInput('serverEndpoint', 'ID1');
9+
tr.setInput('credsType', 'serviceEndpoint');
10+
process.env["ENDPOINT_URL_ID1"] = "ftp://valid.microsoft.com";
11+
process.env["ENDPOINT_AUTH_ID1"] = "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}";
12+
process.env["build.sourcesDirectory"] = "/";
13+
tr.setInput('rootFolder', 'rootFolder');
14+
tr.setInput('filePatterns', '**');
15+
tr.setInput('remotePath', '/upload/');
16+
tr.setInput('clean', 'true');
17+
tr.setInput('overwrite', 'true');
18+
19+
// provide answers for task mock
20+
let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
21+
"exist": {
22+
"rootFolder": true
23+
},
24+
"find": {
25+
"rootFolder": [
26+
"rootFolder/a",
27+
"rootFolder/b",
28+
"rootFolder/c"
29+
]
30+
},
31+
"match": {
32+
"*": [
33+
"rootFolder/a",
34+
"rootFolder/b",
35+
"rootFolder/c"
36+
]
37+
}
38+
};
39+
tr.setAnswers(a);
40+
41+
tr.run();
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import ma = require('azure-pipelines-task-lib/mock-answer');
2+
import tmrm = require('azure-pipelines-task-lib/mock-run');
3+
import path = require('path');
4+
5+
let taskPath = path.join(__dirname, '..', 'ftpuploadtask.js');
6+
let tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath);
7+
8+
tr.setInput('credsType', 'inputs');
9+
tr.setInput('serverUrl', 'noprotocol.microsoft.com');
10+
tr.setInput('username', 'myUsername');
11+
tr.setInput('password', 'myPassword');
12+
tr.setInput('rootFolder', 'rootFolder');
13+
tr.setInput('filePatterns', '**');
14+
tr.setInput('remotePath', '/upload/');
15+
tr.setInput('clean', 'true');
16+
tr.setInput('overwrite', 'true');
17+
tr.setInput('preservePaths', 'true');
18+
tr.setInput('trustSSL', 'true');
19+
process.env["ENDPOINT_URL_ID1"] = "ftp://valid.microsoft.com";
20+
process.env["ENDPOINT_AUTH_ID1"] = "{\"scheme\":\"UsernamePassword\", \"parameters\": {\"username\": \"uname\", \"password\": \"pword\"}}";
21+
process.env["build.sourcesDirectory"] = "/";
22+
23+
// provide answers for task mock
24+
let a: ma.TaskLibAnswers = <ma.TaskLibAnswers>{
25+
"exist": {
26+
"rootFolder": true
27+
},
28+
"find": {
29+
"rootFolder": [
30+
"rootFolder/a",
31+
"rootFolder/b",
32+
"rootFolder/c"
33+
]
34+
},
35+
"match": {
36+
"*": [
37+
"rootFolder/a",
38+
"rootFolder/b",
39+
"rootFolder/c"
40+
]
41+
}
42+
};
43+
tr.setAnswers(a);
44+
45+
tr.run();

0 commit comments

Comments
 (0)