artifactory 2.5.2 → 2.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -2
- data/CHANGELOG.md +6 -0
- data/Gemfile +9 -13
- data/README.md +10 -1
- data/Rakefile +16 -7
- data/appveyor.yml +4 -2
- data/artifactory.gemspec +14 -14
- data/lib/artifactory.rb +26 -26
- data/lib/artifactory/client.rb +25 -23
- data/lib/artifactory/configurable.rb +1 -0
- data/lib/artifactory/defaults.rb +24 -15
- data/lib/artifactory/errors.rb +2 -2
- data/lib/artifactory/resources/artifact.rb +34 -33
- data/lib/artifactory/resources/backup.rb +5 -5
- data/lib/artifactory/resources/base.rb +7 -7
- data/lib/artifactory/resources/build.rb +15 -15
- data/lib/artifactory/resources/build_component.rb +4 -4
- data/lib/artifactory/resources/group.rb +4 -4
- data/lib/artifactory/resources/layout.rb +3 -3
- data/lib/artifactory/resources/ldap_setting.rb +7 -6
- data/lib/artifactory/resources/mail_server.rb +3 -3
- data/lib/artifactory/resources/permission_target.rb +20 -20
- data/lib/artifactory/resources/plugin.rb +1 -1
- data/lib/artifactory/resources/repository.rb +20 -20
- data/lib/artifactory/resources/system.rb +6 -6
- data/lib/artifactory/resources/url_base.rb +4 -3
- data/lib/artifactory/resources/user.rb +4 -4
- data/lib/artifactory/util.rb +10 -10
- data/lib/artifactory/version.rb +1 -1
- data/spec/integration/resources/artifact_spec.rb +31 -31
- data/spec/integration/resources/backup.rb +7 -7
- data/spec/integration/resources/build_component_spec.rb +18 -18
- data/spec/integration/resources/build_spec.rb +15 -15
- data/spec/integration/resources/group_spec.rb +16 -16
- data/spec/integration/resources/layout_spec.rb +7 -7
- data/spec/integration/resources/ldap_setting_spec.rb +7 -7
- data/spec/integration/resources/mail_server_spec.rb +7 -7
- data/spec/integration/resources/permission_target_spec.rb +35 -35
- data/spec/integration/resources/repository_spec.rb +14 -14
- data/spec/integration/resources/system_spec.rb +20 -21
- data/spec/integration/resources/url_base_spec.rb +7 -7
- data/spec/integration/resources/user_spec.rb +16 -16
- data/spec/spec_helper.rb +11 -11
- data/spec/support/api_server.rb +13 -13
- data/spec/support/api_server/artifact_endpoints.rb +94 -94
- data/spec/support/api_server/build_component_endpoints.rb +18 -18
- data/spec/support/api_server/build_endpoints.rb +76 -76
- data/spec/support/api_server/group_endpoints.rb +24 -24
- data/spec/support/api_server/permission_target_endpoints.rb +24 -24
- data/spec/support/api_server/repository_endpoints.rb +82 -82
- data/spec/support/api_server/status_endpoints.rb +5 -5
- data/spec/support/api_server/system_endpoints.rb +17 -18
- data/spec/support/api_server/user_endpoints.rb +30 -30
- data/spec/unit/artifactory_spec.rb +17 -17
- data/spec/unit/client_spec.rb +43 -43
- data/spec/unit/resources/artifact_spec.rb +256 -256
- data/spec/unit/resources/backup_spec.rb +8 -8
- data/spec/unit/resources/base_spec.rb +51 -51
- data/spec/unit/resources/build_component_spec.rb +45 -45
- data/spec/unit/resources/build_spec.rb +98 -98
- data/spec/unit/resources/defaults_spec.rb +4 -4
- data/spec/unit/resources/group_spec.rb +36 -36
- data/spec/unit/resources/layout_spec.rb +8 -8
- data/spec/unit/resources/ldap_setting_spec.rb +8 -8
- data/spec/unit/resources/mail_server_spec.rb +8 -8
- data/spec/unit/resources/permission_target_spec.rb +79 -79
- data/spec/unit/resources/plugin_spec.rb +7 -7
- data/spec/unit/resources/repository_spec.rb +98 -98
- data/spec/unit/resources/system_spec.rb +30 -30
- data/spec/unit/resources/url_base_spec.rb +8 -8
- data/spec/unit/resources/user_spec.rb +40 -40
- metadata +3 -3
@@ -1,9 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
module Artifactory
|
4
4
|
describe Resource::Artifact do
|
5
5
|
let(:client) { double(:client) }
|
6
|
-
let(:endpoint_host) {
|
6
|
+
let(:endpoint_host) { "http://33.33.33.11" }
|
7
7
|
let(:endpoint) { "#{endpoint_host}/" }
|
8
8
|
|
9
9
|
before(:each) do
|
@@ -11,34 +11,34 @@ module Artifactory
|
|
11
11
|
allow(client).to receive(:get).and_return(response) if defined?(response)
|
12
12
|
end
|
13
13
|
|
14
|
-
describe
|
15
|
-
let(:response) { {
|
14
|
+
describe ".search" do
|
15
|
+
let(:response) { { "results" => [] } }
|
16
16
|
|
17
|
-
it
|
18
|
-
expect(client).to receive(:get).with(
|
17
|
+
it "calls /api/search/artifact" do
|
18
|
+
expect(client).to receive(:get).with("/api/search/artifact", {}).once
|
19
19
|
described_class.search
|
20
20
|
end
|
21
21
|
|
22
|
-
it
|
23
|
-
expect(client).to receive(:get).with(
|
24
|
-
name:
|
25
|
-
repos:
|
22
|
+
it "slices the correct parameters" do
|
23
|
+
expect(client).to receive(:get).with("/api/search/artifact",
|
24
|
+
name: "name",
|
25
|
+
repos: "repo"
|
26
26
|
).once
|
27
27
|
described_class.search(
|
28
|
-
name:
|
29
|
-
repos:
|
30
|
-
fizz:
|
28
|
+
name: "name",
|
29
|
+
repos: "repo",
|
30
|
+
fizz: "foo"
|
31
31
|
)
|
32
32
|
end
|
33
33
|
|
34
|
-
it
|
34
|
+
it "returns an array of objects" do
|
35
35
|
expect(described_class.search).to be_a(Array)
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
describe
|
39
|
+
describe "#upload" do
|
40
40
|
let(:client) { double(put: {}) }
|
41
|
-
let(:local_path) {
|
41
|
+
let(:local_path) { "/local/path" }
|
42
42
|
let(:file) { double(File) }
|
43
43
|
|
44
44
|
subject { described_class.new(client: client, local_path: local_path) }
|
@@ -47,303 +47,303 @@ module Artifactory
|
|
47
47
|
allow(File).to receive(:new).with(/\A(\w:)?#{local_path}\z/).and_return(file)
|
48
48
|
end
|
49
49
|
|
50
|
-
context
|
51
|
-
it
|
52
|
-
expect(client).to receive(:put).with(
|
53
|
-
subject.upload(
|
50
|
+
context "when the artifact is a file path" do
|
51
|
+
it "PUTs the file at the path to the server" do
|
52
|
+
expect(client).to receive(:put).with("libs-release-local/remote/path", file, {})
|
53
|
+
subject.upload("libs-release-local", "/remote/path")
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
57
|
-
context
|
58
|
-
subject { described_class.new(client: client, local_path: local_path, checksums: {
|
57
|
+
context "when the md5 is available" do
|
58
|
+
subject { described_class.new(client: client, local_path: local_path, checksums: { "md5" => "ABCDEF123456" } ) }
|
59
59
|
|
60
|
-
it
|
61
|
-
expect(client).to receive(:put).with(
|
62
|
-
subject.upload(
|
60
|
+
it "PUTs the file with the checksum headers set" do
|
61
|
+
expect(client).to receive(:put).with("libs-release-local/remote/path", file, { "X-Checksum-Md5" => "ABCDEF123456" } )
|
62
|
+
subject.upload("libs-release-local", "/remote/path")
|
63
63
|
end
|
64
64
|
end
|
65
65
|
|
66
|
-
context
|
67
|
-
subject { described_class.new(client: client, local_path: local_path, checksums: {
|
66
|
+
context "when the sha1 is available" do
|
67
|
+
subject { described_class.new(client: client, local_path: local_path, checksums: { "sha1" => "SHA1" } ) }
|
68
68
|
|
69
|
-
it
|
70
|
-
expect(client).to receive(:put).with(
|
71
|
-
subject.upload(
|
69
|
+
it "PUTs the file with the checksum headers set" do
|
70
|
+
expect(client).to receive(:put).with("libs-release-local/remote/path", file, { "X-Checksum-Sha1" => "SHA1" } )
|
71
|
+
subject.upload("libs-release-local", "/remote/path")
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
context
|
76
|
-
it
|
77
|
-
expect(client).to receive(:put).with(
|
75
|
+
context "when matrix properties are given" do
|
76
|
+
it "converts the hash into matrix properties" do
|
77
|
+
expect(client).to receive(:put).with("libs-release-local;branch=master;user=Seth/remote/path", file, {})
|
78
78
|
|
79
|
-
subject.upload(
|
80
|
-
branch:
|
81
|
-
user:
|
79
|
+
subject.upload("libs-release-local", "/remote/path",
|
80
|
+
branch: "master",
|
81
|
+
user: "Seth"
|
82
82
|
)
|
83
83
|
end
|
84
84
|
|
85
85
|
it 'converts spaces to "+" characters' do
|
86
|
-
expect(client).to receive(:put).with(
|
86
|
+
expect(client).to receive(:put).with("libs-release-local;user=Seth+Vargo/remote/path", file, {})
|
87
87
|
|
88
|
-
subject.upload(
|
89
|
-
user:
|
88
|
+
subject.upload("libs-release-local", "/remote/path",
|
89
|
+
user: "Seth Vargo"
|
90
90
|
)
|
91
91
|
end
|
92
92
|
|
93
93
|
it 'converts "+" to "%2B"' do
|
94
|
-
expect(client).to receive(:put).with(
|
94
|
+
expect(client).to receive(:put).with("libs-release-local;version=12.0.0-alpha.1%2B20140826080510.git.50.f5ff271/remote/path", file, {})
|
95
95
|
|
96
|
-
subject.upload(
|
97
|
-
version:
|
96
|
+
subject.upload("libs-release-local", "/remote/path",
|
97
|
+
version: "12.0.0-alpha.1+20140826080510.git.50.f5ff271"
|
98
98
|
)
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
context
|
103
|
-
it
|
104
|
-
headers = {
|
105
|
-
expect(client).to receive(:put).with(
|
102
|
+
context "when custom headers are given" do
|
103
|
+
it "passes the headers to the client" do
|
104
|
+
headers = { "Content-Type" => "text/plain" }
|
105
|
+
expect(client).to receive(:put).with("libs-release-local/remote/path", file, headers)
|
106
106
|
|
107
|
-
subject.upload(
|
107
|
+
subject.upload("libs-release-local", "/remote/path", {}, headers)
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
111
111
|
|
112
|
-
describe
|
113
|
-
it
|
114
|
-
value =
|
112
|
+
describe "#upload_checksum" do
|
113
|
+
it "uploads checksum.sha1" do
|
114
|
+
value = "ABCD1234"
|
115
115
|
|
116
|
-
tempfile = double(
|
117
|
-
expect(Tempfile).to receive(:new).with(
|
116
|
+
tempfile = double("Tempfile").as_null_object
|
117
|
+
expect(Tempfile).to receive(:new).with("checksum.sha1") { tempfile }
|
118
118
|
expect(tempfile).to receive(:write).with(value).once
|
119
119
|
expect(client).to receive(:put).with(
|
120
120
|
"libs-release-local/remote/path.sha1",
|
121
121
|
tempfile
|
122
122
|
)
|
123
|
-
subject.upload_checksum(
|
123
|
+
subject.upload_checksum("libs-release-local", "/remote/path", "sha1", value)
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
127
|
-
describe
|
128
|
-
it
|
127
|
+
describe "#upload_with_checksum" do
|
128
|
+
it "delegates to #upload" do
|
129
129
|
expect(subject).to receive(:upload).with(
|
130
|
-
|
131
|
-
|
132
|
-
{ branch:
|
130
|
+
"libs-release-local",
|
131
|
+
"/remote/path",
|
132
|
+
{ branch: "master" },
|
133
133
|
{
|
134
|
-
|
135
|
-
|
136
|
-
}
|
134
|
+
"X-Checksum-Deploy" => true,
|
135
|
+
"X-Checksum-Sha1" => "ABCD1234",
|
136
|
+
}
|
137
137
|
)
|
138
|
-
subject.upload_with_checksum(
|
139
|
-
{ branch:
|
138
|
+
subject.upload_with_checksum("libs-release-local", "/remote/path", "ABCD1234",
|
139
|
+
{ branch: "master" }
|
140
140
|
)
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
-
describe
|
145
|
-
it
|
144
|
+
describe "#upload_from_archive" do
|
145
|
+
it "delegates to #upload" do
|
146
146
|
expect(subject).to receive(:upload).with(
|
147
|
-
|
148
|
-
|
147
|
+
"libs-release-local",
|
148
|
+
"/remote/path",
|
149
149
|
{},
|
150
|
-
{
|
150
|
+
{ "X-Explode-Archive" => true }
|
151
151
|
)
|
152
|
-
subject.upload_from_archive(
|
152
|
+
subject.upload_from_archive("libs-release-local", "/remote/path")
|
153
153
|
end
|
154
154
|
|
155
|
-
it
|
155
|
+
it "receives empty response" do
|
156
156
|
file = double(File)
|
157
157
|
allow(File).to receive(:new).and_return( file )
|
158
158
|
expect(client).to receive(:put).with(
|
159
159
|
"libs-release-local/remote/path",
|
160
160
|
file,
|
161
|
-
{
|
161
|
+
{ "X-Explode-Archive" => true }
|
162
162
|
)
|
163
|
-
subject.local_path =
|
164
|
-
subject.upload_from_archive(
|
163
|
+
subject.local_path = "/local/path"
|
164
|
+
subject.upload_from_archive("libs-release-local", "/remote/path")
|
165
165
|
end
|
166
166
|
|
167
167
|
end
|
168
168
|
|
169
|
-
describe
|
170
|
-
let(:response) { {
|
169
|
+
describe ".gavc_search" do
|
170
|
+
let(:response) { { "results" => [] } }
|
171
171
|
|
172
|
-
it
|
173
|
-
expect(client).to receive(:get).with(
|
172
|
+
it "calls /api/search/gavc" do
|
173
|
+
expect(client).to receive(:get).with("/api/search/gavc", {}).once
|
174
174
|
described_class.gavc_search
|
175
175
|
end
|
176
176
|
|
177
|
-
it
|
178
|
-
expect(client).to receive(:get).with(
|
179
|
-
g:
|
180
|
-
a:
|
181
|
-
v:
|
182
|
-
c:
|
177
|
+
it "renames the parameters" do
|
178
|
+
expect(client).to receive(:get).with("/api/search/gavc",
|
179
|
+
g: "group",
|
180
|
+
a: "name",
|
181
|
+
v: "version",
|
182
|
+
c: "classifier"
|
183
183
|
).once
|
184
184
|
described_class.gavc_search(
|
185
|
-
group:
|
186
|
-
name:
|
187
|
-
version:
|
188
|
-
classifier:
|
185
|
+
group: "group",
|
186
|
+
name: "name",
|
187
|
+
version: "version",
|
188
|
+
classifier: "classifier"
|
189
189
|
)
|
190
190
|
end
|
191
191
|
|
192
|
-
it
|
193
|
-
expect(client).to receive(:get).with(
|
194
|
-
g:
|
195
|
-
a:
|
192
|
+
it "slices the correct parameters" do
|
193
|
+
expect(client).to receive(:get).with("/api/search/gavc",
|
194
|
+
g: "group",
|
195
|
+
a: "name"
|
196
196
|
).once
|
197
197
|
described_class.gavc_search(
|
198
|
-
group:
|
199
|
-
name:
|
200
|
-
fizz:
|
198
|
+
group: "group",
|
199
|
+
name: "name",
|
200
|
+
fizz: "foo"
|
201
201
|
)
|
202
202
|
end
|
203
203
|
|
204
|
-
it
|
204
|
+
it "returns an array of objects" do
|
205
205
|
expect(described_class.gavc_search).to be_a(Array)
|
206
206
|
end
|
207
207
|
end
|
208
208
|
|
209
|
-
describe
|
210
|
-
let(:response) { {
|
209
|
+
describe ".property_search" do
|
210
|
+
let(:response) { { "results" => [] } }
|
211
211
|
|
212
|
-
it
|
213
|
-
expect(client).to receive(:get).with(
|
212
|
+
it "calls /api/search/prop" do
|
213
|
+
expect(client).to receive(:get).with("/api/search/prop", {}).once
|
214
214
|
described_class.property_search
|
215
215
|
end
|
216
216
|
|
217
|
-
it
|
218
|
-
expect(client).to receive(:get).with(
|
219
|
-
p1:
|
220
|
-
p2:
|
217
|
+
it "passes all the parameters" do
|
218
|
+
expect(client).to receive(:get).with("/api/search/prop",
|
219
|
+
p1: "v1",
|
220
|
+
p2: "v2"
|
221
221
|
).once
|
222
222
|
described_class.property_search(
|
223
|
-
p1:
|
224
|
-
p2:
|
223
|
+
p1: "v1",
|
224
|
+
p2: "v2"
|
225
225
|
)
|
226
226
|
end
|
227
227
|
|
228
|
-
it
|
228
|
+
it "returns an array of objects" do
|
229
229
|
expect(described_class.property_search).to be_a(Array)
|
230
230
|
end
|
231
231
|
end
|
232
232
|
|
233
|
-
describe
|
234
|
-
let(:response) { {
|
233
|
+
describe ".checksum_search" do
|
234
|
+
let(:response) { { "results" => [] } }
|
235
235
|
|
236
|
-
it
|
237
|
-
expect(client).to receive(:get).with(
|
236
|
+
it "calls /api/search/checksum" do
|
237
|
+
expect(client).to receive(:get).with("/api/search/checksum", {}).once
|
238
238
|
described_class.checksum_search
|
239
239
|
end
|
240
240
|
|
241
|
-
it
|
242
|
-
expect(client).to receive(:get).with(
|
243
|
-
md5:
|
244
|
-
sha1:
|
241
|
+
it "slices the correct parameters" do
|
242
|
+
expect(client).to receive(:get).with("/api/search/checksum",
|
243
|
+
md5: "MD5123",
|
244
|
+
sha1: "SHA456"
|
245
245
|
).once
|
246
246
|
described_class.checksum_search(
|
247
|
-
md5:
|
248
|
-
sha1:
|
249
|
-
fizz:
|
247
|
+
md5: "MD5123",
|
248
|
+
sha1: "SHA456",
|
249
|
+
fizz: "foo"
|
250
250
|
)
|
251
251
|
end
|
252
252
|
|
253
|
-
it
|
253
|
+
it "returns an array of objects" do
|
254
254
|
expect(described_class.checksum_search).to be_a(Array)
|
255
255
|
end
|
256
256
|
end
|
257
257
|
|
258
|
-
describe
|
259
|
-
let(:response) { {
|
258
|
+
describe ".usage_search" do
|
259
|
+
let(:response) { { "results" => [] } }
|
260
260
|
|
261
|
-
it
|
262
|
-
expect(client).to receive(:get).with(
|
261
|
+
it "calls /api/search/usage" do
|
262
|
+
expect(client).to receive(:get).with("/api/search/usage", {}).once
|
263
263
|
described_class.usage_search
|
264
264
|
end
|
265
265
|
|
266
|
-
it
|
267
|
-
expect(client).to receive(:get).with(
|
266
|
+
it "slices the correct parameters" do
|
267
|
+
expect(client).to receive(:get).with("/api/search/usage",
|
268
268
|
notUsedSince: 1414800000000,
|
269
|
-
createdBefore: 1414871200000
|
269
|
+
createdBefore: 1414871200000
|
270
270
|
).once
|
271
271
|
described_class.usage_search(
|
272
272
|
notUsedSince: 1414800000000,
|
273
273
|
createdBefore: 1414871200000,
|
274
|
-
fizz:
|
274
|
+
fizz: "foo"
|
275
275
|
)
|
276
276
|
end
|
277
277
|
|
278
|
-
it
|
278
|
+
it "returns an array of objects" do
|
279
279
|
expect(described_class.usage_search).to be_a(Array)
|
280
280
|
end
|
281
281
|
end
|
282
282
|
|
283
|
-
describe
|
284
|
-
let(:response) { {
|
283
|
+
describe ".creation_search" do
|
284
|
+
let(:response) { { "results" => [] } }
|
285
285
|
|
286
|
-
it
|
287
|
-
expect(client).to receive(:get).with(
|
286
|
+
it "calls /api/search/creation" do
|
287
|
+
expect(client).to receive(:get).with("/api/search/creation", {}).once
|
288
288
|
described_class.creation_search
|
289
289
|
end
|
290
290
|
|
291
|
-
it
|
292
|
-
expect(client).to receive(:get).with(
|
291
|
+
it "slices the correct parameters" do
|
292
|
+
expect(client).to receive(:get).with("/api/search/creation",
|
293
293
|
from: 1414800000000,
|
294
|
-
to: 1414871200000
|
294
|
+
to: 1414871200000
|
295
295
|
).once
|
296
296
|
described_class.creation_search(
|
297
297
|
from: 1414800000000,
|
298
298
|
to: 1414871200000,
|
299
|
-
fizz:
|
299
|
+
fizz: "foo"
|
300
300
|
)
|
301
301
|
end
|
302
302
|
|
303
|
-
it
|
303
|
+
it "returns an array of objects" do
|
304
304
|
expect(described_class.creation_search).to be_a(Array)
|
305
305
|
end
|
306
306
|
end
|
307
307
|
|
308
|
-
describe
|
309
|
-
let(:response) { {
|
308
|
+
describe ".versions" do
|
309
|
+
let(:response) { { "results" => [] } }
|
310
310
|
|
311
|
-
it
|
312
|
-
expect(client).to receive(:get).with(
|
311
|
+
it "calls /api/search/versions" do
|
312
|
+
expect(client).to receive(:get).with("/api/search/versions", {}).once
|
313
313
|
described_class.versions
|
314
314
|
end
|
315
315
|
|
316
|
-
it
|
317
|
-
expect(client).to receive(:get).with(
|
318
|
-
g:
|
319
|
-
a:
|
320
|
-
v:
|
316
|
+
it "renames the parameters" do
|
317
|
+
expect(client).to receive(:get).with("/api/search/versions",
|
318
|
+
g: "group",
|
319
|
+
a: "name",
|
320
|
+
v: "version"
|
321
321
|
).once
|
322
322
|
described_class.versions(
|
323
|
-
group:
|
324
|
-
name:
|
325
|
-
version:
|
323
|
+
group: "group",
|
324
|
+
name: "name",
|
325
|
+
version: "version"
|
326
326
|
)
|
327
327
|
end
|
328
328
|
|
329
|
-
it
|
330
|
-
expect(client).to receive(:get).with(
|
331
|
-
g:
|
332
|
-
a:
|
329
|
+
it "slices the correct parameters" do
|
330
|
+
expect(client).to receive(:get).with("/api/search/versions",
|
331
|
+
g: "group",
|
332
|
+
a: "name"
|
333
333
|
).once
|
334
334
|
described_class.versions(
|
335
|
-
group:
|
336
|
-
name:
|
337
|
-
fizz:
|
335
|
+
group: "group",
|
336
|
+
name: "name",
|
337
|
+
fizz: "foo"
|
338
338
|
)
|
339
339
|
end
|
340
340
|
|
341
|
-
it
|
341
|
+
it "returns an array of objects" do
|
342
342
|
expect(described_class.versions).to be_a(Array)
|
343
343
|
end
|
344
344
|
|
345
|
-
it
|
346
|
-
allow(client).to receive(:get).and_raise(Error::HTTPError.new(
|
345
|
+
it "returns an empty array when the server responses with a 404" do
|
346
|
+
allow(client).to receive(:get).and_raise(Error::HTTPError.new("status" => 404))
|
347
347
|
|
348
348
|
result = described_class.versions
|
349
349
|
expect(result).to be_a(Array)
|
@@ -351,228 +351,228 @@ module Artifactory
|
|
351
351
|
end
|
352
352
|
end
|
353
353
|
|
354
|
-
describe
|
355
|
-
let(:response) {
|
354
|
+
describe ".latest_version" do
|
355
|
+
let(:response) { "1.2-SNAPSHOT" }
|
356
356
|
|
357
|
-
it
|
358
|
-
expect(client).to receive(:get).with(
|
357
|
+
it "calls /api/search/latestVersion" do
|
358
|
+
expect(client).to receive(:get).with("/api/search/latestVersion", {}).once
|
359
359
|
described_class.latest_version
|
360
360
|
end
|
361
361
|
|
362
|
-
it
|
363
|
-
expect(client).to receive(:get).with(
|
364
|
-
g:
|
365
|
-
a:
|
366
|
-
v:
|
362
|
+
it "renames the parameters" do
|
363
|
+
expect(client).to receive(:get).with("/api/search/latestVersion",
|
364
|
+
g: "group",
|
365
|
+
a: "name",
|
366
|
+
v: "version"
|
367
367
|
).once
|
368
368
|
described_class.latest_version(
|
369
|
-
group:
|
370
|
-
name:
|
371
|
-
version:
|
369
|
+
group: "group",
|
370
|
+
name: "name",
|
371
|
+
version: "version"
|
372
372
|
)
|
373
373
|
end
|
374
374
|
|
375
|
-
it
|
376
|
-
expect(client).to receive(:get).with(
|
377
|
-
g:
|
378
|
-
a:
|
375
|
+
it "slices the correct parameters" do
|
376
|
+
expect(client).to receive(:get).with("/api/search/latestVersion",
|
377
|
+
g: "group",
|
378
|
+
a: "name"
|
379
379
|
).once
|
380
380
|
described_class.latest_version(
|
381
|
-
group:
|
382
|
-
name:
|
383
|
-
fizz:
|
381
|
+
group: "group",
|
382
|
+
name: "name",
|
383
|
+
fizz: "foo"
|
384
384
|
)
|
385
385
|
end
|
386
386
|
|
387
|
-
it
|
388
|
-
expect(described_class.latest_version).to eq(
|
387
|
+
it "returns the latest version" do
|
388
|
+
expect(described_class.latest_version).to eq("1.2-SNAPSHOT")
|
389
389
|
end
|
390
390
|
|
391
|
-
it
|
392
|
-
allow(client).to receive(:get).and_raise(Error::HTTPError.new(
|
391
|
+
it "returns an nil when the server responses with a 404" do
|
392
|
+
allow(client).to receive(:get).and_raise(Error::HTTPError.new("status" => 404))
|
393
393
|
|
394
394
|
expect(described_class.latest_version).to be_nil
|
395
395
|
end
|
396
396
|
end
|
397
397
|
|
398
|
-
describe
|
398
|
+
describe ".from_url" do
|
399
399
|
let(:response) { {} }
|
400
400
|
|
401
|
-
it
|
401
|
+
it "constructs a new instance from the result" do
|
402
402
|
expect(client).to receive(:endpoint).and_return(endpoint)
|
403
403
|
expect(described_class).to receive(:from_hash).once
|
404
|
-
described_class.from_url(
|
404
|
+
described_class.from_url("/some/artifact/path.deb")
|
405
405
|
end
|
406
406
|
end
|
407
407
|
|
408
|
-
describe
|
408
|
+
describe ".from_hash" do
|
409
409
|
let(:hash) do
|
410
410
|
{
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
|
411
|
+
"uri" => "http://localhost:8080/artifactory/api/storage/libs-release-local/org/acme/lib/ver/lib-ver.pom",
|
412
|
+
"downloadUri" => "http://localhost:8080/artifactory/libs-release-local/org/acme/lib/ver/lib-ver.pom",
|
413
|
+
"repo" => "libs-release-local",
|
414
|
+
"path" => "/org/acme/lib/ver/lib-ver.pom",
|
415
|
+
"remoteUrl" => "http://some-remote-repo/mvn/org/acme/lib/ver/lib-ver.pom",
|
416
|
+
"created" => "2014-01-01 10:00 UTC",
|
417
|
+
"createdBy" => "userY",
|
418
|
+
"lastModified" => "2014-01-01 11:00 UTC",
|
419
|
+
"modifiedBy" => "userX",
|
420
|
+
"lastUpdated" => "2014-01-01 12:00 UTC",
|
421
|
+
"size" => "1024",
|
422
|
+
"mimeType" => "application/pom+xml",
|
423
|
+
"checksums" => { "md5" => "MD5123", "sha1" => "SHA456" },
|
424
|
+
"originalChecksums" => { "md5" => "MD5123", "sha1" => "SHA456" },
|
425
425
|
}
|
426
426
|
end
|
427
427
|
|
428
|
-
it
|
428
|
+
it "creates a new instance" do
|
429
429
|
instance = described_class.from_hash(hash)
|
430
430
|
expect(instance).to be_a(described_class)
|
431
|
-
expect(instance.uri).to eq(
|
431
|
+
expect(instance.uri).to eq("http://localhost:8080/artifactory/api/storage/libs-release-local/org/acme/lib/ver/lib-ver.pom")
|
432
432
|
expect(instance.client).to be(client)
|
433
|
-
expect(instance.created).to eq(Time.parse(
|
434
|
-
expect(instance.download_uri).to eq(
|
435
|
-
expect(instance.last_modified).to eq(Time.parse(
|
436
|
-
expect(instance.last_updated).to eq(Time.parse(
|
437
|
-
expect(instance.md5).to eq(
|
438
|
-
expect(instance.mime_type).to eq(
|
439
|
-
expect(instance.sha1).to eq(
|
433
|
+
expect(instance.created).to eq(Time.parse("2014-01-01 10:00 UTC"))
|
434
|
+
expect(instance.download_uri).to eq("http://localhost:8080/artifactory/libs-release-local/org/acme/lib/ver/lib-ver.pom")
|
435
|
+
expect(instance.last_modified).to eq(Time.parse("2014-01-01 11:00 UTC"))
|
436
|
+
expect(instance.last_updated).to eq(Time.parse("2014-01-01 12:00 UTC"))
|
437
|
+
expect(instance.md5).to eq("MD5123")
|
438
|
+
expect(instance.mime_type).to eq("application/pom+xml")
|
439
|
+
expect(instance.sha1).to eq("SHA456")
|
440
440
|
expect(instance.size).to eq(1024)
|
441
441
|
end
|
442
442
|
end
|
443
443
|
|
444
|
-
describe
|
445
|
-
let(:destination) {
|
444
|
+
describe "#copy" do
|
445
|
+
let(:destination) { "/to/here" }
|
446
446
|
let(:options) { Hash.new }
|
447
447
|
before { allow(subject).to receive(:copy_or_move) }
|
448
448
|
|
449
|
-
it
|
449
|
+
it "delegates to #copy_or_move" do
|
450
450
|
expect(subject).to receive(:copy_or_move).with(:copy, destination, options)
|
451
451
|
subject.copy(destination, options)
|
452
452
|
end
|
453
453
|
end
|
454
454
|
|
455
|
-
describe
|
455
|
+
describe "#delete" do
|
456
456
|
let(:client) { double }
|
457
457
|
|
458
|
-
it
|
458
|
+
it "sends DELETE to the client" do
|
459
459
|
subject.client = client
|
460
|
-
subject.download_uri =
|
460
|
+
subject.download_uri = "/artifact.deb"
|
461
461
|
|
462
462
|
expect(client).to receive(:delete)
|
463
463
|
subject.delete
|
464
464
|
end
|
465
465
|
end
|
466
466
|
|
467
|
-
describe
|
468
|
-
let(:destination) {
|
467
|
+
describe "#move" do
|
468
|
+
let(:destination) { "/to/here" }
|
469
469
|
let(:options) { Hash.new }
|
470
470
|
before { allow(subject).to receive(:copy_or_move) }
|
471
471
|
|
472
|
-
it
|
472
|
+
it "delegates to #copy_or_move" do
|
473
473
|
expect(subject).to receive(:copy_or_move).with(:move, destination, options)
|
474
474
|
subject.move(destination, options)
|
475
475
|
end
|
476
476
|
end
|
477
477
|
|
478
|
-
describe
|
478
|
+
describe "#properties" do
|
479
479
|
let(:properties) do
|
480
|
-
{
|
480
|
+
{ "artifactory.licenses" => ["Apache-2.0"] }
|
481
481
|
end
|
482
482
|
let(:response) do
|
483
|
-
{
|
483
|
+
{ "properties" => properties }
|
484
484
|
end
|
485
485
|
let(:client) { double(get: response) }
|
486
|
-
let(:relative_path) {
|
487
|
-
let(:artifact_uri) { File.join(
|
486
|
+
let(:relative_path) { "/api/storage/some-repo/path/artifact.deb" }
|
487
|
+
let(:artifact_uri) { File.join("http://33.33.33.11", relative_path) }
|
488
488
|
|
489
489
|
before do
|
490
490
|
subject.client = client
|
491
491
|
subject.uri = artifact_uri
|
492
492
|
end
|
493
493
|
|
494
|
-
it
|
494
|
+
it "gets the properties from the server" do
|
495
495
|
expect(client).to receive(:get).with(relative_path, properties: nil).once
|
496
496
|
expect(subject.properties).to eq(properties)
|
497
497
|
end
|
498
498
|
|
499
|
-
it
|
499
|
+
it "caches the response" do
|
500
500
|
subject.properties
|
501
501
|
expect(subject.instance_variable_get(:@properties)).to eq(properties)
|
502
502
|
end
|
503
503
|
end
|
504
504
|
|
505
|
-
describe
|
505
|
+
describe "#compliance" do
|
506
506
|
let(:compliance) do
|
507
|
-
{
|
507
|
+
{ "licenses" => [{ "name" => "LGPL v3" }] }
|
508
508
|
end
|
509
509
|
let(:client) { double(get: compliance) }
|
510
|
-
let(:uri) {
|
510
|
+
let(:uri) { "/artifact.deb" }
|
511
511
|
|
512
512
|
before do
|
513
|
-
subject.client
|
513
|
+
subject.client = client
|
514
514
|
subject.uri = uri
|
515
515
|
end
|
516
516
|
|
517
|
-
it
|
518
|
-
expect(client).to receive(:get).with(
|
517
|
+
it "gets the compliance from the server" do
|
518
|
+
expect(client).to receive(:get).with("/api/compliance/artifact.deb").once
|
519
519
|
expect(subject.compliance).to eq(compliance)
|
520
520
|
end
|
521
521
|
|
522
|
-
it
|
522
|
+
it "caches the response" do
|
523
523
|
subject.compliance
|
524
524
|
expect(subject.instance_variable_get(:@compliance)).to eq(compliance)
|
525
525
|
end
|
526
526
|
end
|
527
527
|
|
528
|
-
describe
|
529
|
-
it
|
530
|
-
Dir.mktmpdir(
|
531
|
-
subject.download_uri =
|
528
|
+
describe "#download" do
|
529
|
+
it "download content to directory" do
|
530
|
+
Dir.mktmpdir("artifact_download") do |tmpdir|
|
531
|
+
subject.download_uri = "/artifact.deb"
|
532
532
|
|
533
|
-
expect(client).to receive(:get) {
|
533
|
+
expect(client).to receive(:get) { "some content" }
|
534
534
|
subject.download(tmpdir)
|
535
|
-
expect(Dir.entries(tmpdir)).to include(
|
535
|
+
expect(Dir.entries(tmpdir)).to include("artifact.deb")
|
536
536
|
end
|
537
537
|
end
|
538
538
|
|
539
|
-
it
|
540
|
-
Dir.mktmpdir(
|
541
|
-
subject.download_uri =
|
539
|
+
it "download content to directory with filename" do
|
540
|
+
Dir.mktmpdir("artifact_download") do |tmpdir|
|
541
|
+
subject.download_uri = "/artifact.deb"
|
542
542
|
|
543
|
-
expect(client).to receive(:get) {
|
544
|
-
subject.download(tmpdir, {filename:
|
545
|
-
expect(Dir.entries(tmpdir)).to include(
|
543
|
+
expect(client).to receive(:get) { "some content" }
|
544
|
+
subject.download(tmpdir, { filename: "foobar.deb" })
|
545
|
+
expect(Dir.entries(tmpdir)).to include("foobar.deb")
|
546
546
|
end
|
547
547
|
end
|
548
548
|
end
|
549
549
|
|
550
|
-
describe
|
550
|
+
describe "#relative_path" do
|
551
551
|
before { described_class.send(:public, :relative_path) }
|
552
552
|
|
553
|
-
it
|
554
|
-
subject.uri =
|
555
|
-
expect(subject.relative_path).to eq(
|
553
|
+
it "parses the relative path" do
|
554
|
+
subject.uri = "/api/storage/foo/bar/zip"
|
555
|
+
expect(subject.relative_path).to eq("/foo/bar/zip")
|
556
556
|
end
|
557
557
|
end
|
558
558
|
|
559
|
-
describe
|
559
|
+
describe "#copy_or_move" do
|
560
560
|
let(:client) { double }
|
561
561
|
before do
|
562
562
|
described_class.send(:public, :copy_or_move)
|
563
563
|
|
564
|
-
subject.client
|
565
|
-
subject.uri =
|
564
|
+
subject.client = client
|
565
|
+
subject.uri = "/api/storage/foo/bar/artifact.deb"
|
566
566
|
end
|
567
567
|
|
568
|
-
it
|
569
|
-
expect(client).to receive(:post).with(
|
570
|
-
subject.copy_or_move(:move,
|
568
|
+
it "sends POST to the client with parsed params" do
|
569
|
+
expect(client).to receive(:post).with("/api/move/foo/bar/artifact.deb?to=/to/path", {})
|
570
|
+
subject.copy_or_move(:move, "/to/path")
|
571
571
|
end
|
572
572
|
|
573
|
-
it
|
574
|
-
expect(client).to receive(:post).with(
|
575
|
-
subject.copy_or_move(:move,
|
573
|
+
it "adds the correct parameters to the request" do
|
574
|
+
expect(client).to receive(:post).with("/api/move/foo/bar/artifact.deb?to=/to/path&failFast=1&dry=1", {})
|
575
|
+
subject.copy_or_move(:move, "/to/path", fail_fast: true, dry_run: true)
|
576
576
|
end
|
577
577
|
end
|
578
578
|
end
|