artifactory 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/Gemfile +1 -1
  4. data/lib/artifactory.rb +13 -9
  5. data/lib/artifactory/client.rb +16 -3
  6. data/lib/artifactory/errors.rb +1 -2
  7. data/lib/artifactory/resources/artifact.rb +56 -27
  8. data/lib/artifactory/resources/backup.rb +104 -0
  9. data/lib/artifactory/resources/base.rb +47 -0
  10. data/lib/artifactory/resources/layout.rb +1 -50
  11. data/lib/artifactory/resources/ldap_setting.rb +105 -0
  12. data/lib/artifactory/resources/mail_server.rb +61 -0
  13. data/lib/artifactory/resources/repository.rb +11 -14
  14. data/lib/artifactory/resources/url_base.rb +74 -0
  15. data/lib/artifactory/util.rb +41 -0
  16. data/lib/artifactory/version.rb +1 -1
  17. data/spec/integration/resources/backup.rb +22 -0
  18. data/spec/integration/resources/build_spec.rb +1 -3
  19. data/spec/integration/resources/group_spec.rb +2 -2
  20. data/spec/integration/resources/ldap_setting_spec.rb +22 -0
  21. data/spec/integration/resources/mail_server_spec.rb +22 -0
  22. data/spec/integration/resources/repository_spec.rb +1 -1
  23. data/spec/integration/resources/system_spec.rb +1 -1
  24. data/spec/integration/resources/url_base_spec.rb +22 -0
  25. data/spec/integration/resources/user_spec.rb +2 -2
  26. data/spec/spec_helper.rb +0 -1
  27. data/spec/support/api_server/system_endpoints.rb +44 -1
  28. data/spec/unit/artifactory_spec.rb +3 -3
  29. data/spec/unit/client_spec.rb +1 -1
  30. data/spec/unit/resources/artifact_spec.rb +18 -36
  31. data/spec/unit/resources/backup_spec.rb +61 -0
  32. data/spec/unit/resources/base_spec.rb +3 -3
  33. data/spec/unit/resources/build_spec.rb +3 -3
  34. data/spec/unit/resources/group_spec.rb +6 -6
  35. data/spec/unit/resources/layout_spec.rb +4 -4
  36. data/spec/unit/resources/ldap_setting_spec.rb +65 -0
  37. data/spec/unit/resources/mail_server_spec.rb +57 -0
  38. data/spec/unit/resources/plugin_spec.rb +2 -2
  39. data/spec/unit/resources/repository_spec.rb +19 -27
  40. data/spec/unit/resources/system_spec.rb +6 -6
  41. data/spec/unit/resources/url_base_spec.rb +53 -0
  42. data/spec/unit/resources/user_spec.rb +8 -8
  43. metadata +23 -3
@@ -10,7 +10,7 @@ module Artifactory
10
10
 
11
11
  describe '.ping' do
12
12
  it 'returns ok' do
13
- expect(described_class.ping).to be_true
13
+ expect(described_class.ping).to be_truthy
14
14
  end
15
15
  end
16
16
 
@@ -0,0 +1,22 @@
1
+ require 'spec_helper'
2
+
3
+ module Artifactory
4
+ describe Resource::URLBase, :integration do
5
+ describe '.all' do
6
+ it 'returns an array of UrlBases' do
7
+ results = described_class.all
8
+ expect(results).to be_a(Array)
9
+ expect(results.first).to be_a(described_class)
10
+ end
11
+ end
12
+
13
+ describe '.find' do
14
+ it 'finds a urlBase by url' do
15
+ base = described_class.find('http://33.33.33.20/artifactory')
16
+
17
+ expect(base).to be_a(described_class)
18
+ expect(base.url_base).to eq('http://33.33.33.20/artifactory')
19
+ end
20
+ end
21
+ end
22
+ end
@@ -31,14 +31,14 @@ module Artifactory
31
31
  describe '#delete' do
32
32
  it 'deletes the user from the server' do
33
33
  sethvargo = described_class.find('sethvargo')
34
- expect(sethvargo.delete).to be_true
34
+ expect(sethvargo.delete).to be_truthy
35
35
  end
36
36
  end
37
37
 
38
38
  describe '#save' do
39
39
  it 'saves the user to the server' do
40
40
  user = described_class.new(name: 'schisamo')
41
- expect(user.save).to be_true
41
+ expect(user.save).to be_truthy
42
42
  end
43
43
  end
44
44
  end
@@ -20,7 +20,6 @@ RSpec.configure do |config|
20
20
  # is focused, then all tests are executed.
21
21
  config.filter_run(focus: true)
22
22
  config.run_all_when_everything_filtered = true
23
- config.treat_symbols_as_metadata_keys_with_true_values = true
24
23
 
25
24
  # Stuff to do on each run
26
25
  config.before(:each) { Artifactory.reset! }
@@ -35,7 +35,50 @@ module Artifactory
35
35
  <fileIntegrationRevisionRegExp>SNAPSHOT|(?:(?:[0-9]{8}.[0-9]{6})-(?:[0-9]+))</fileIntegrationRevisionRegExp>
36
36
  </repoLayout>
37
37
  </repoLayouts>
38
- </config>
38
+ <urlBase>http://33.33.33.20/artifactory</urlBase>
39
+ <mailServer>
40
+ <enabled>true</enabled>
41
+ <host>smtp.gmail.com</host>
42
+ <port>25</port>
43
+ <username>us@example.com</username>
44
+ <password>ihopethisisnotyourpassword</password>
45
+ <from>artifactory@example.com</from>
46
+ <subjectPrefix>[Artifactory]</subjectPrefix>
47
+ <tls>true</tls>
48
+ <ssl>false</ssl>
49
+ <artifactoryUrl>http://33.33.33.20/artifactory</artifactoryUrl>
50
+ </mailServer>
51
+ <security>
52
+ <ldapSettings>
53
+ <ldapSetting>
54
+ <key>example-ldap</key>
55
+ <enabled>true</enabled>
56
+ <ldapUrl>ldap://localhost/DC=examplecorp,DC=com</ldapUrl>
57
+ <search>
58
+ <searchFilter>sAMAccountName={0}</searchFilter>
59
+ <searchBase>OU=Domain Users</searchBase>
60
+ <searchSubTree>true</searchSubTree>
61
+ <managerDn>CN=ldapbind,OU=Employees,OU=Domain Users,DC=examplecorp,DC=com</managerDn>
62
+ <managerPassword>ldappassword</managerPassword>
63
+ </search>
64
+ <autoCreateUser>false</autoCreateUser>
65
+ <emailAttribute>mail</emailAttribute>
66
+ </ldapSetting>
67
+ </ldapSettings>
68
+ </security>
69
+ <backups>
70
+ <backup>
71
+ <key>backup-daily</key>
72
+ <enabled>true</enabled>
73
+ <cronExp>0 0 2 ? * MON-FRI</cronExp>
74
+ <retentionPeriodHours>0</retentionPeriodHours>
75
+ <createArchive>false</createArchive>
76
+ <excludedRepositories/>
77
+ <sendMailOnError>true</sendMailOnError>
78
+ <excludeBuilds>false</excludeBuilds>
79
+ </backup>
80
+ </backups>
81
+ </config>
39
82
  EOH
40
83
  end
41
84
 
@@ -47,10 +47,10 @@ describe Artifactory do
47
47
  describe '.method_missing' do
48
48
  context 'when the client responds to the method' do
49
49
  let(:client) { double(:client) }
50
- before { Artifactory.stub(:client).and_return(client) }
50
+ before { allow(Artifactory).to receive(:client).and_return(client) }
51
51
 
52
52
  it 'delegates the method to the client' do
53
- client.stub(bacon: 'awesome')
53
+ allow(client).to receive(:bacon).and_return('awesome')
54
54
  expect { Artifactory.bacon }.to_not raise_error
55
55
  end
56
56
  end
@@ -64,7 +64,7 @@ describe Artifactory do
64
64
 
65
65
  describe '.respond_to_missing?' do
66
66
  let(:client) { double(:client) }
67
- before { Artifactory.stub(:client).and_return(client) }
67
+ before { allow(Artifactory).to receive(:client).and_return(client) }
68
68
 
69
69
  it 'delegates to the client' do
70
70
  expect { Artifactory.respond_to_missing?(:foo) }.to_not raise_error
@@ -35,7 +35,7 @@ module Artifactory
35
35
  end
36
36
 
37
37
  it 'delegates to the class, injecting the client' do
38
- Resource::Artifact.stub(:search)
38
+ allow(Resource::Artifact).to receive(:search)
39
39
  expect(Resource::Artifact).to receive(:search).with(client: subject)
40
40
  subject.artifact_search
41
41
  end
@@ -5,8 +5,8 @@ module Artifactory
5
5
  let(:client) { double(:client) }
6
6
 
7
7
  before(:each) do
8
- Artifactory.stub(:client).and_return(client)
9
- client.stub(:get).and_return(response) if defined?(response)
8
+ allow(Artifactory).to receive(:client).and_return(client)
9
+ allow(client).to receive(:get).and_return(response) if defined?(response)
10
10
  end
11
11
 
12
12
  describe '.search' do
@@ -35,39 +35,28 @@ module Artifactory
35
35
  end
36
36
 
37
37
  describe '#upload' do
38
- let(:client) { double(put: {}) }
39
- before do
40
- subject.client = client
41
- end
38
+ let(:client) { double(put: {}) }
39
+ let(:local_path) { '/local/path' }
40
+ let(:file) { double(File) }
42
41
 
43
- context 'when the artifact is a File' do
44
- it 'PUTs the file to the server' do
45
- file = double(file)
46
- File.stub(:new).and_return(file)
47
- expect(client).to receive(:put).with('libs-release-local/remote/path', file, {})
42
+ subject { described_class.new(client: client, local_path: local_path) }
48
43
 
49
- subject.upload('libs-release-local', file, '/remote/path')
50
- end
44
+ before do
45
+ allow(File).to receive(:new).with(local_path).and_return(file)
51
46
  end
52
47
 
53
48
  context 'when the artifact is a file path' do
54
49
  it 'PUTs the file at the path to the server' do
55
- file = double(file)
56
- path = '/fake/path'
57
- File.stub(:new).with('/fake/path').and_return(file)
58
50
  expect(client).to receive(:put).with('libs-release-local/remote/path', file, {})
59
-
60
- subject.upload('libs-release-local', path, '/remote/path')
51
+ subject.upload('libs-release-local', '/remote/path')
61
52
  end
62
53
  end
63
54
 
64
55
  context 'when matrix properties are given' do
65
56
  it 'converts the hash into matrix properties' do
66
- file = double(file)
67
- File.stub(:new).and_return(file)
68
57
  expect(client).to receive(:put).with('libs-release-local;branch=master;user=Seth%20Vargo/remote/path', file, {})
69
58
 
70
- subject.upload('libs-release-local', file, '/remote/path',
59
+ subject.upload('libs-release-local', '/remote/path',
71
60
  branch: 'master',
72
61
  user: 'Seth Vargo',
73
62
  )
@@ -77,11 +66,9 @@ module Artifactory
77
66
  context 'when custom headers are given' do
78
67
  it 'passes the headers to the client' do
79
68
  headers = { 'Content-Type' => 'text/plain' }
80
- file = double(file)
81
- File.stub(:new).and_return(file)
82
69
  expect(client).to receive(:put).with('libs-release-local/remote/path', file, headers)
83
70
 
84
- subject.upload('libs-release-local', file, '/remote/path', {}, headers)
71
+ subject.upload('libs-release-local', '/remote/path', {}, headers)
85
72
  end
86
73
  end
87
74
  end
@@ -90,7 +77,6 @@ module Artifactory
90
77
  it 'delegates to #upload' do
91
78
  expect(subject).to receive(:upload).with(
92
79
  'libs-release-local',
93
- '/local/file',
94
80
  '/remote/path',
95
81
  { branch: 'master' },
96
82
  {
@@ -98,8 +84,7 @@ module Artifactory
98
84
  'X-Checksum-Sha1' => 'ABCD1234',
99
85
  },
100
86
  )
101
- subject.upload_with_checksum('libs-release-local', '/local/file', '/remote/path',
102
- 'ABCD1234',
87
+ subject.upload_with_checksum('libs-release-local', '/remote/path', 'ABCD1234',
103
88
  { branch: 'master' },
104
89
  )
105
90
  end
@@ -109,14 +94,11 @@ module Artifactory
109
94
  it 'delegates to #upload' do
110
95
  expect(subject).to receive(:upload).with(
111
96
  'libs-release-local',
112
- '/local/file',
113
97
  '/remote/path',
114
98
  {},
115
- {
116
- 'X-Explode-Archive' => true,
117
- },
99
+ { 'X-Explode-Archive' => true },
118
100
  )
119
- subject.upload_from_archive('libs-release-local', '/local/file', '/remote/path')
101
+ subject.upload_from_archive('libs-release-local', '/remote/path')
120
102
  end
121
103
  end
122
104
 
@@ -247,7 +229,7 @@ module Artifactory
247
229
  end
248
230
 
249
231
  it 'returns an empty array when the server responses with a 404' do
250
- client.stub(:get).and_raise(Error::HTTPError.new('status' => 404))
232
+ allow(client).to receive(:get).and_raise(Error::HTTPError.new('status' => 404))
251
233
 
252
234
  result = described_class.versions
253
235
  expect(result).to be_a(Array)
@@ -293,7 +275,7 @@ module Artifactory
293
275
  end
294
276
 
295
277
  it 'returns an nil when the server responses with a 404' do
296
- client.stub(:get).and_raise(Error::HTTPError.new('status' => 404))
278
+ allow(client).to receive(:get).and_raise(Error::HTTPError.new('status' => 404))
297
279
 
298
280
  expect(described_class.latest_version).to be_nil
299
281
  end
@@ -347,7 +329,7 @@ module Artifactory
347
329
  describe '#copy' do
348
330
  let(:destination) { '/to/here' }
349
331
  let(:options) { Hash.new }
350
- before { subject.stub(:copy_or_move) }
332
+ before { allow(subject).to receive(:copy_or_move) }
351
333
 
352
334
  it 'delegates to #copy_or_move' do
353
335
  expect(subject).to receive(:copy_or_move).with(:copy, destination, options)
@@ -370,7 +352,7 @@ module Artifactory
370
352
  describe '#move' do
371
353
  let(:destination) { '/to/here' }
372
354
  let(:options) { Hash.new }
373
- before { subject.stub(:copy_or_move) }
355
+ before { allow(subject).to receive(:copy_or_move) }
374
356
 
375
357
  it 'delegates to #copy_or_move' do
376
358
  expect(subject).to receive(:copy_or_move).with(:move, destination, options)
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ module Artifactory
4
+ describe Resource::Backup do
5
+ let(:client) { double(:client) }
6
+
7
+ before(:each) do
8
+ allow(Artifactory).to receive(:client).and_return(client)
9
+ allow(client).to receive(:get).and_return(response) if defined?(response)
10
+ end
11
+
12
+ describe '.all' do
13
+ doc = <<-XML
14
+ <config>
15
+ <backups>
16
+ <backup>
17
+ <key>backup-daily</key>
18
+ </backup>
19
+ </backups>
20
+ </config>
21
+ XML
22
+ let(:xml) do
23
+ REXML::Document.new(doc)
24
+ end
25
+
26
+ before do
27
+ allow(Resource::System).to receive(:configuration).and_return(xml)
28
+ end
29
+
30
+ it 'returns the backup settings' do
31
+ expect(described_class.all).to be_a(Array)
32
+ expect(described_class.all.first).to be_a(described_class)
33
+ expect(described_class.all.first.key).to eq('backup-daily')
34
+ end
35
+ end
36
+
37
+ describe '.find' do
38
+ doc = <<-XML
39
+ <config>
40
+ <backups>
41
+ <backup>
42
+ <key>backup-weekly</key>
43
+ </backup>
44
+ </backups>
45
+ </config>
46
+ XML
47
+ let(:xml) do
48
+ REXML::Document.new(doc)
49
+ end
50
+
51
+ before do
52
+ allow(Resource::System).to receive(:configuration).and_return(xml)
53
+ end
54
+
55
+ it 'returns the found backup setting' do
56
+ expect(described_class.find('backup-weekly')).to be_a(described_class)
57
+ expect(described_class.find('backup-weekly').key).to eq('backup-weekly')
58
+ end
59
+ end
60
+ end
61
+ end
@@ -36,7 +36,7 @@ module Artifactory
36
36
 
37
37
  context 'when the :client key is not present' do
38
38
  let(:client) { double }
39
- before { Artifactory.stub(:client).and_return(client) }
39
+ before { allow(Artifactory).to receive(:client).and_return(client) }
40
40
 
41
41
  it 'uses Artifactory.client' do
42
42
  expect(described_class.extract_client!({})).to be(client)
@@ -97,7 +97,7 @@ module Artifactory
97
97
 
98
98
  it 'defaults to the Artifactory.client' do
99
99
  client = double
100
- Artifactory.stub(:client).and_return(client)
100
+ allow(Artifactory).to receive(:client).and_return(client)
101
101
 
102
102
  expect(subject.client).to be(client)
103
103
  end
@@ -132,7 +132,7 @@ module Artifactory
132
132
 
133
133
  describe '#inspect' do
134
134
  it 'includes all the attributes' do
135
- subject.stub(:attributes) do
135
+ allow(subject).to receive(:attributes) do
136
136
  { foo: 'bar' }
137
137
  end
138
138
 
@@ -5,8 +5,8 @@ module Artifactory
5
5
  let(:client) { double(:client) }
6
6
 
7
7
  before(:each) do
8
- Artifactory.stub(:client).and_return(client)
9
- client.stub(:get).and_return(response) if defined?(response)
8
+ allow(Artifactory).to receive(:client).and_return(client)
9
+ allow(client).to receive(:get).and_return(response) if defined?(response)
10
10
  end
11
11
 
12
12
  describe '.all' do
@@ -25,7 +25,7 @@ module Artifactory
25
25
 
26
26
  context 'when the system has no builds' do
27
27
  it 'returns an empty array' do
28
- client.stub(:get).and_raise(Error::HTTPError.new('status' => 404))
28
+ allow(client).to receive(:get).and_raise(Error::HTTPError.new('status' => 404))
29
29
  expect(described_class.all).to be_empty
30
30
  end
31
31
  end
@@ -5,8 +5,8 @@ module Artifactory
5
5
  let(:client) { double(:client) }
6
6
 
7
7
  before(:each) do
8
- Artifactory.stub(:client).and_return(client)
9
- client.stub(:get).and_return(response) if defined?(response)
8
+ allow(Artifactory).to receive(:client).and_return(client)
9
+ allow(client).to receive(:get).and_return(response) if defined?(response)
10
10
  end
11
11
 
12
12
  describe '.all' do
@@ -18,9 +18,9 @@ module Artifactory
18
18
  ]
19
19
  end
20
20
  before do
21
- described_class.stub(:from_url).with('a', client: client).and_return('a')
22
- described_class.stub(:from_url).with('b', client: client).and_return('b')
23
- described_class.stub(:from_url).with('c', client: client).and_return('c')
21
+ allow(described_class).to receive(:from_url).with('a', client: client).and_return('a')
22
+ allow(described_class).to receive(:from_url).with('b', client: client).and_return('b')
23
+ allow(described_class).to receive(:from_url).with('c', client: client).and_return('c')
24
24
  end
25
25
 
26
26
  it 'gets /api/security/groups' do
@@ -66,7 +66,7 @@ module Artifactory
66
66
  instance = described_class.from_hash(hash)
67
67
  expect(instance.name).to eq('readers')
68
68
  expect(instance.description).to eq('This list of read-only users')
69
- expect(instance.auto_join).to be_true
69
+ expect(instance.auto_join).to be_truthy
70
70
  expect(instance.realm).to eq('artifactory')
71
71
  expect(instance.realm_attributes).to be_nil
72
72
  end
@@ -5,8 +5,8 @@ module Artifactory
5
5
  let(:client) { double(:client) }
6
6
 
7
7
  before(:each) do
8
- Artifactory.stub(:client).and_return(client)
9
- client.stub(:get).and_return(response) if defined?(response)
8
+ allow(Artifactory).to receive(:client).and_return(client)
9
+ allow(client).to receive(:get).and_return(response) if defined?(response)
10
10
  end
11
11
 
12
12
  describe '.all' do
@@ -24,7 +24,7 @@ module Artifactory
24
24
  end
25
25
 
26
26
  before do
27
- Resource::System.stub(:configuration).and_return(xml)
27
+ allow(Resource::System).to receive(:configuration).and_return(xml)
28
28
  end
29
29
 
30
30
  it 'returns the layouts' do
@@ -49,7 +49,7 @@ module Artifactory
49
49
  end
50
50
 
51
51
  before do
52
- Resource::System.stub(:configuration).and_return(xml)
52
+ allow(Resource::System).to receive(:configuration).and_return(xml)
53
53
  end
54
54
 
55
55
  it 'returns the found layout' do