artifactory 2.5.2 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|