jenkins_api_client 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -90,6 +90,7 @@ module JenkinsApi
90
90
  #
91
91
  def initialize(client)
92
92
  @client = client
93
+ @logger = @client.logger
93
94
  end
94
95
 
95
96
  # Gives the string representation of the Object
@@ -121,16 +122,13 @@ module JenkinsApi
121
122
  # )
122
123
  #
123
124
  def create_dump_slave(params)
124
-
125
- if list.include?(params[:name])
126
- raise "The specified slave '#{params[:name]}' already exists."
127
- end
128
-
129
125
  unless params[:name] && params[:slave_host] && params[:private_key_file]
130
- raise "Name, slave host, and private key file are required for" +
131
- " creating a slave."
126
+ raise ArgumentError, "Name, slave host, and private key file are" +
127
+ " required for creating a slave."
132
128
  end
133
129
 
130
+ @logger.info "Creating a dump slave '#{params[:name]}'"
131
+ @logger.debug "Creating a dump slave with params: #{params.inspect}"
134
132
  default_params = {
135
133
  :description => "Automatically created through jenkins_api_client",
136
134
  :executors => 2,
@@ -170,7 +168,8 @@ module JenkinsApi
170
168
  }
171
169
  }.to_json
172
170
  }
173
-
171
+ @logger.debug "Modified params posted to create slave:" +
172
+ " #{post_params.inspect}"
174
173
  @client.api_post_request("/computer/doCreateItem", post_params)
175
174
  end
176
175
 
@@ -179,6 +178,7 @@ module JenkinsApi
179
178
  # @param [String] node_name Name of the node to delete
180
179
  #
181
180
  def delete(node_name)
181
+ @logger.info "Deleting node '#{node_name}'"
182
182
  if list.include?(node_name)
183
183
  @client.api_post_request("/computer/#{node_name}/doDelete")
184
184
  else
@@ -193,6 +193,7 @@ module JenkinsApi
193
193
  # caution.
194
194
  #
195
195
  def delete_all!
196
+ @logger.info "Deleting all nodes (except master) from jenkins"
196
197
  list.each { |node| delete(node) unless node == "master" }
197
198
  end
198
199
 
@@ -202,6 +203,7 @@ module JenkinsApi
202
203
  # @param [Bool] ignorecase whether to be case sensitive or not
203
204
  #
204
205
  def list(filter = nil, ignorecase = true)
206
+ @logger.info "Obtaining nodes from jenkins matching filter '#{filter}'"
205
207
  node_names = []
206
208
  response_json = @client.api_get_request("/computer")
207
209
  response_json["computer"].each do |computer|
@@ -227,6 +229,7 @@ module JenkinsApi
227
229
  #
228
230
  GENERAL_ATTRIBUTES.each do |meth_suffix|
229
231
  define_method("get_#{meth_suffix}") do
232
+ @logger.info "Obtaining '#{meth_suffix}' attribute from jenkins"
230
233
  response_json = @client.api_get_request("/computer")
231
234
  response_json["#{meth_suffix}"]
232
235
  end
@@ -236,6 +239,7 @@ module JenkinsApi
236
239
  #
237
240
  NODE_PROPERTIES.each do |meth_suffix|
238
241
  define_method("is_#{meth_suffix}?") do |node_name|
242
+ @logger.info "Obtaining '#{meth_suffix}' property of '#{node_name}'"
239
243
  response_json = @client.api_get_request("/computer")
240
244
  resp = response_json["computer"][index(node_name)]["#{meth_suffix}"]
241
245
  resp =~ /False/i ? false : true
@@ -245,6 +249,7 @@ module JenkinsApi
245
249
  # Defines methods for node specific attributes.
246
250
  NODE_ATTRIBUTES.each do |meth_suffix|
247
251
  define_method("get_node_#{meth_suffix}") do |node_name|
252
+ @logger.info "Obtaining '#{meth_suffix}' attribute of '#{node_name}'"
248
253
  response_json = @client.api_get_request("/computer")
249
254
  response_json["computer"][index(node_name)]["#{meth_suffix}"]
250
255
  end
@@ -256,6 +261,7 @@ module JenkinsApi
256
261
  # @param [String] mode mode to change to
257
262
  #
258
263
  def change_mode(node_name, mode)
264
+ @logger.info "Changing the mode of '#{node_name}' to '#{mode}'"
259
265
  mode = mode.upcase
260
266
  xml = get_config(node_name)
261
267
  n_xml = Nokogiri::XML(xml)
@@ -270,6 +276,7 @@ module JenkinsApi
270
276
  # @param [String] node_name name of the node
271
277
  #
272
278
  def get_config(node_name)
279
+ @logger.info "Obtaining the config.xml of node '#{node_name}'"
273
280
  node_name = "(master)" if node_name == "master"
274
281
  @client.get_config("/computer/#{node_name}")
275
282
  end
@@ -280,6 +287,7 @@ module JenkinsApi
280
287
  # @param [String] xml Config.xml of the node
281
288
  #
282
289
  def post_config(node_name, xml)
290
+ @logger.info "Posting the config.xml of node '#{node_name}'"
283
291
  node_name = "(master)" if node_name == "master"
284
292
  @client.post_config("/computer/#{node_name}/config.xml", xml)
285
293
  end
@@ -35,6 +35,8 @@ module JenkinsApi
35
35
  #
36
36
  def initialize(client)
37
37
  @client = client
38
+ @logger = @client.logger
39
+ @timeout = @client.timeout
38
40
  end
39
41
 
40
42
  # Returns a string representation of System class.
@@ -46,12 +48,14 @@ module JenkinsApi
46
48
  # Sends a quiet down request to the server.
47
49
  #
48
50
  def quiet_down
51
+ @logger.info "Performing a quiet down of jenkins..."
49
52
  @client.api_post_request("/quietDown")
50
53
  end
51
54
 
52
55
  # Cancels the quiet doen request sent to the server.
53
56
  #
54
57
  def cancel_quiet_down
58
+ @logger.info "Cancelling jenkins form quiet down..."
55
59
  @client.api_post_request("/cancelQuietDown")
56
60
  end
57
61
 
@@ -62,8 +66,10 @@ module JenkinsApi
62
66
  #
63
67
  def restart(force = false)
64
68
  if force
69
+ @logger.info "Performing a force restart of jenkins..."
65
70
  @client.api_post_request("/restart")
66
71
  else
72
+ @logger.info "Performing a safe restart of jenkins..."
67
73
  @client.api_post_request("/safeRestart")
68
74
  end
69
75
  end
@@ -71,17 +77,30 @@ module JenkinsApi
71
77
  # Reload the Jenkins server
72
78
  #
73
79
  def reload
80
+ @logger.info "Reloading jenkins..."
74
81
  @client.api_post_request("/reload")
75
82
  end
76
83
 
84
+ # List all users known to Jenkins by their Full Name
85
+ #
86
+ def list_users
87
+ @logger.info "Obtaining the list of users from jenkins"
88
+ users = @client.api_get_request("/asynchPeople")
89
+ names = []
90
+ users['users'].each { |user|
91
+ names << user['user']['fullName']
92
+ } unless users.nil?
93
+ return names
94
+ end
95
+
77
96
  # This method waits till the server becomes ready after a start
78
97
  # or restart.
79
98
  #
80
99
  def wait_for_ready
81
- Timeout::timeout(@client.timeout) do
100
+ Timeout::timeout(@timeout) do
82
101
  while true do
83
102
  response = @client.get_root
84
- puts "[INFO] Waiting for jenkins to restart..." if @client.debug
103
+ @logger.info "Waiting for jenkins to restart..."
85
104
  if (response.body =~ /Please wait while Jenkins is restarting/ ||
86
105
  response.body =~ /Please wait while Jenkins is getting ready to work/)
87
106
  sleep 30
@@ -25,9 +25,9 @@ module JenkinsApi
25
25
  # Major version of the gem
26
26
  MAJOR = 0
27
27
  # Minor version of the gem
28
- MINOR = 12
28
+ MINOR = 13
29
29
  # Tiny version of the gem used for patches
30
- TINY = 1
30
+ TINY = 0
31
31
  # Used for pre-releases
32
32
  PRE = nil
33
33
  # Version String of Jenkins API Client.
@@ -34,6 +34,7 @@ module JenkinsApi
34
34
  #
35
35
  def initialize(client)
36
36
  @client = client
37
+ @logger = @client.logger
37
38
  end
38
39
 
39
40
  # Return a string representation of the object
@@ -49,6 +50,7 @@ module JenkinsApi
49
50
  # listview, myview. Default: listview
50
51
  #
51
52
  def create(view_name, type = "listview")
53
+ @logger.info "Creating a view '#{view_name}' of type '#{type}'"
52
54
  mode = case type
53
55
  when "listview"
54
56
  "hudson.model.ListView"
@@ -81,8 +83,15 @@ module JenkinsApi
81
83
  # @option params [String] :regex Regular expression to filter jobs that
82
84
  # are to be added to the view
83
85
  #
86
+ # @raise [ArgumentError] if the required parameter +:name+ is not
87
+ # specified
88
+ #
84
89
  def create_list_view(params)
90
+ # Name is a required parameter. Raise an error if not specified
91
+ raise ArgumentError, "Name is required for creating view" \
92
+ unless params.is_a?(Hash) && params[:name]
85
93
  create(params[:name], "listview")
94
+ @logger.debug "Creating a list view with params: #{params.inspect}"
86
95
  status_filter = case params[:status_filter]
87
96
  when "all_selected_jobs"
88
97
  ""
@@ -148,6 +157,7 @@ module JenkinsApi
148
157
  # @param [String] view_name
149
158
  #
150
159
  def delete(view_name)
160
+ @logger.info "Deleting view '#{view_name}'"
151
161
  @client.api_post_request("/view/#{view_name}/doDelete")
152
162
  end
153
163
 
@@ -157,6 +167,7 @@ module JenkinsApi
157
167
  # in Jenkins. Please use with caution.
158
168
  #
159
169
  def delete_all!
170
+ @logger.info "Deleting all views from jenkins"
160
171
  list.each { |view| delete(view) unless view == "All"}
161
172
  end
162
173
 
@@ -166,8 +177,9 @@ module JenkinsApi
166
177
  # @param [Bool] ignorecase whether to be case sensitive or not
167
178
  #
168
179
  def list(filter = "", ignorecase = true)
180
+ @logger.info "Obtaining views based on filter '#{filter}'"
169
181
  view_names = []
170
- response_json = @client.api_get_request("/")
182
+ response_json = @client.api_get_request("")
171
183
  response_json["views"].each { |view|
172
184
  if ignorecase
173
185
  view_names << view["name"] if view["name"] =~ /#{filter}/i
@@ -193,6 +205,7 @@ module JenkinsApi
193
205
  # @return [Array] job_names list of jobs in the specified view
194
206
  #
195
207
  def list_jobs(view_name)
208
+ @logger.info "Obtaining the jobs present in view '#{view_name}'"
196
209
  job_names = []
197
210
  raise "The view #{view_name} doesn't exists on the server"\
198
211
  unless exists?(view_name)
@@ -209,6 +222,7 @@ module JenkinsApi
209
222
  # @param [String] job_name
210
223
  #
211
224
  def add_job(view_name, job_name)
225
+ @logger.info "Adding job '#{job_name}' to view '#{view_name}'"
212
226
  post_msg = "/view/#{view_name}/addJobToView?name=#{job_name}"
213
227
  @client.api_post_request(post_msg)
214
228
  end
@@ -219,6 +233,7 @@ module JenkinsApi
219
233
  # @param [String] job_name
220
234
  #
221
235
  def remove_job(view_name, job_name)
236
+ @logger.info "Removing job '#{job_name}' from view '#{view_name}'"
222
237
  post_msg = "/view/#{view_name}/removeJobFromView?name=#{job_name}"
223
238
  @client.api_post_request(post_msg)
224
239
  end
@@ -228,6 +243,7 @@ module JenkinsApi
228
243
  # @param [String] view_name
229
244
  #
230
245
  def get_config(view_name)
246
+ @logger.info "Obtaining the configuration of view '#{view_name}'"
231
247
  @client.get_config("/view/#{view_name}")
232
248
  end
233
249
 
@@ -237,6 +253,7 @@ module JenkinsApi
237
253
  # @param [String] xml
238
254
  #
239
255
  def post_config(view_name, xml)
256
+ @logger.info "Posting the configuration of view '#{view_name}'"
240
257
  @client.post_config("/view/#{view_name}/config.xml", xml)
241
258
  end
242
259
 
@@ -27,13 +27,6 @@ describe JenkinsApi::Client do
27
27
 
28
28
  describe "InstanceMethods" do
29
29
 
30
- describe "#debug" do
31
- it "Should be able to toggle the debug value" do
32
- value = @client.debug
33
- @client.toggle_debug.should_not == value
34
- end
35
- end
36
-
37
30
  describe "#initialize" do
38
31
  it "Should be able to initialize with valid credentials" do
39
32
  client1 = JenkinsApi::Client.new(
@@ -50,14 +43,15 @@ describe JenkinsApi::Client do
50
43
  end
51
44
 
52
45
  it "Should fail if wrong credentials are given" do
53
- begin
54
- client2 = JenkinsApi::Client.new(:server_ip => @server_ip,
55
- :username => 'stranger',
56
- :password => 'hacked')
57
- client2.job.list_all
58
- rescue Exception => e
59
- e.class.should == JenkinsApi::Exceptions::UnautherizedException
60
- end
46
+ client2 = JenkinsApi::Client.new(
47
+ :server_ip => @server_ip,
48
+ :username => 'stranger',
49
+ :password => 'hacked',
50
+ :log_location => '/dev/null'
51
+ )
52
+ expect(
53
+ lambda { client2.job.list_all }
54
+ ).to raise_error(JenkinsApi::Exceptions::Unauthorized)
61
55
  end
62
56
  end
63
57
  describe "#get_jenkins_version" do
@@ -11,13 +11,13 @@ describe JenkinsApi::Client::Job do
11
11
  before(:all) do
12
12
  @helper = JenkinsApiSpecHelper::Helper.new
13
13
  @creds_file = '~/.jenkins_api_client/spec.yml'
14
+ @creds = YAML.load_file(File.expand_path(@creds_file, __FILE__))
14
15
  @job_name_prefix = 'awesome_rspec_test_job'
15
16
  @filter = "^#{@job_name_prefix}.*"
16
17
  @job_name = ''
18
+ @valid_post_responses = [200, 201, 302]
17
19
  begin
18
- @client = JenkinsApi::Client.new(
19
- YAML.load_file(File.expand_path(@creds_file, __FILE__))
20
- )
20
+ @client = JenkinsApi::Client.new(@creds)
21
21
  rescue Exception => e
22
22
  puts "WARNING: Credentials are not set properly."
23
23
  puts e.message
@@ -54,36 +54,66 @@ describe JenkinsApi::Client::Job do
54
54
  it "Should be able to create a job by getting an xml" do
55
55
  xml = @helper.create_job_xml
56
56
  name = "qwerty_nonexistent_job"
57
- @client.job.create(name, xml).to_i.should == 200
57
+ @valid_post_responses.should include(
58
+ @client.job.create(name, xml).to_i
59
+ )
60
+ @client.job.list(name).include?(name).should be_true
61
+ end
62
+ it "Should raise proper exception when the job already exists" do
63
+ xml = @helper.create_job_xml
64
+ name = "the_duplicate_job"
65
+ @valid_post_responses.should include(
66
+ @client.job.create(name, xml).to_i
67
+ )
58
68
  @client.job.list(name).include?(name).should be_true
69
+ expect(
70
+ lambda { @client.job.create(name, xml) }
71
+ ).to raise_error(JenkinsApi::Exceptions::JobAlreadyExists)
72
+ @valid_post_responses.should include(
73
+ @client.job.delete(name).to_i
74
+ )
59
75
  end
60
76
  end
61
77
 
62
78
  describe "#create_freestyle" do
63
79
 
64
- def test_and_validate(name, params)
65
- @client.job.create_freestyle(params).to_i.should == 200
80
+ def test_and_validate(name, params, config_line = nil)
81
+ @valid_post_responses.should include(
82
+ @client.job.create_freestyle(params).to_i
83
+ )
66
84
  @client.job.list(name).include?(name).should be_true
67
- @client.job.delete(name).to_i.should == 302
85
+ # Test for the existense of the given line in the config.xml of the
86
+ # job created
87
+ unless config_line.nil?
88
+ config = @client.job.get_config(name)
89
+ config.should =~ /#{config_line}/
90
+ end
91
+ @valid_post_responses.should include(
92
+ @client.job.delete(name).to_i
93
+ )
68
94
  @client.job.list(name).include?(name).should be_false
69
95
  end
70
96
 
71
- it "Should be able to create a simple freestyle job" do
97
+ it "Should create a freestyle job with just name" do
72
98
  name = "test_job_name_using_params"
73
99
  params = {
74
100
  :name => name
75
101
  }
76
102
  test_and_validate(name, params)
77
103
  end
78
- it "Should be able to create a freestyle job with shell command" do
104
+ it "Should create a freestyle job with shell command" do
79
105
  name = "test_job_using_params_shell"
80
106
  params = {
81
107
  :name => name,
82
108
  :shell_command => "echo this is a free style project"
83
109
  }
84
- test_and_validate(name, params)
110
+ test_and_validate(
111
+ name,
112
+ params,
113
+ "<command>echo this is a free style project</command>"
114
+ )
85
115
  end
86
- it "Should accept Git SCM provider" do
116
+ it "Should create a freestyle job with Git SCM provider" do
87
117
  name = "test_job_with_git_scm"
88
118
  params = {
89
119
  :name => name,
@@ -91,9 +121,13 @@ describe JenkinsApi::Client::Job do
91
121
  :scm_url => "git://github.com./arangamani/jenkins_api_client.git",
92
122
  :scm_branch => "master"
93
123
  }
94
- test_and_validate(name, params)
124
+ test_and_validate(
125
+ name,
126
+ params,
127
+ "<url>git://github.com./arangamani/jenkins_api_client.git</url>"
128
+ )
95
129
  end
96
- it "Should accept subversion SCM provider" do
130
+ it "Should create a freestyle job with SVN SCM provider" do
97
131
  name = "test_job_with_subversion_scm"
98
132
  params = {
99
133
  :name => name,
@@ -101,9 +135,13 @@ describe JenkinsApi::Client::Job do
101
135
  :scm_url => "http://svn.freebsd.org/base/",
102
136
  :scm_branch => "master"
103
137
  }
104
- test_and_validate(name, params)
138
+ test_and_validate(
139
+ name,
140
+ params,
141
+ "<remote>http://svn.freebsd.org/base/</remote>"
142
+ )
105
143
  end
106
- it "Should accept CVS SCM provider with branch" do
144
+ it "Should create a freestyle job with CVS SCM provider with branch" do
107
145
  name = "test_job_with_cvs_scm_branch"
108
146
  params = {
109
147
  :name => name,
@@ -112,9 +150,13 @@ describe JenkinsApi::Client::Job do
112
150
  :scm_module => "src",
113
151
  :scm_branch => "MAIN"
114
152
  }
115
- test_and_validate(name, params)
153
+ test_and_validate(
154
+ name,
155
+ params,
156
+ "<cvsroot>http://cvs.NetBSD.org</cvsroot>"
157
+ )
116
158
  end
117
- it "Should accept CVS SCM provider with tag" do
159
+ it "Should create a freestyle job with CVS SCM provider with tag" do
118
160
  name = "test_job_with_cvs_scm_tag"
119
161
  params = {
120
162
  :name => name,
@@ -123,9 +165,13 @@ describe JenkinsApi::Client::Job do
123
165
  :scm_module => "src",
124
166
  :scm_tag => "MAIN"
125
167
  }
126
- test_and_validate(name, params)
168
+ test_and_validate(
169
+ name,
170
+ params,
171
+ "<cvsroot>http://cvs.NetBSD.org</cvsroot>"
172
+ )
127
173
  end
128
- it "Should fail if unsupported SCM is specified" do
174
+ it "Should raise an error if unsupported SCM is specified" do
129
175
  name = "test_job_unsupported_scm"
130
176
  params = {
131
177
  :name => name,
@@ -137,7 +183,7 @@ describe JenkinsApi::Client::Job do
137
183
  lambda{ @client.job.create_freestyle(params) }
138
184
  ).to raise_error
139
185
  end
140
- it "Should accept restricted_node option" do
186
+ it "Should create a freestyle job with restricted_node option" do
141
187
  name = "test_job_restricted_node"
142
188
  params = {
143
189
  :name => name,
@@ -145,7 +191,8 @@ describe JenkinsApi::Client::Job do
145
191
  }
146
192
  test_and_validate(name, params)
147
193
  end
148
- it "Should accept block_build_when_downstream_building option" do
194
+ it "Should create a freestyle job with" +
195
+ " block_build_when_downstream_building option" do
149
196
  name = "test_job_block_build_when_downstream_building"
150
197
  params = {
151
198
  :name => name,
@@ -153,7 +200,8 @@ describe JenkinsApi::Client::Job do
153
200
  }
154
201
  test_and_validate(name, params)
155
202
  end
156
- it "Should accept block_build_when_upstream_building option" do
203
+ it "Should create a freestyle job with" +
204
+ " block_build_when_upstream_building option" do
157
205
  name = "test_job_block_build_when_upstream_building"
158
206
  params = {
159
207
  :name => name,
@@ -161,7 +209,7 @@ describe JenkinsApi::Client::Job do
161
209
  }
162
210
  test_and_validate(name, params)
163
211
  end
164
- it "Should accept concurrent_build option" do
212
+ it "Should create a freestyle job with concurrent_build option" do
165
213
  name = "test_job_concurrent_build"
166
214
  params = {
167
215
  :name => name,
@@ -169,7 +217,7 @@ describe JenkinsApi::Client::Job do
169
217
  }
170
218
  test_and_validate(name, params)
171
219
  end
172
- it "Should accept the timer option" do
220
+ it "Should create a freestyle job with timer option" do
173
221
  name = "test_job_using_timer"
174
222
  params = {
175
223
  :name => name,
@@ -177,7 +225,7 @@ describe JenkinsApi::Client::Job do
177
225
  }
178
226
  test_and_validate(name, params)
179
227
  end
180
- it "Should accept child projects option" do
228
+ it "Should create a freestyle job with child projects option" do
181
229
  name = "test_job_child_projects"
182
230
  params = {
183
231
  :name => name,
@@ -186,7 +234,7 @@ describe JenkinsApi::Client::Job do
186
234
  }
187
235
  test_and_validate(name, params)
188
236
  end
189
- it "Should accept notification_email option" do
237
+ it "Should create a freestyle job with notification_email option" do
190
238
  name = "test_job_notification_email"
191
239
  params = {
192
240
  :name => name,
@@ -194,7 +242,8 @@ describe JenkinsApi::Client::Job do
194
242
  }
195
243
  test_and_validate(name, params)
196
244
  end
197
- it "Should accept notification for individual skype targets" do
245
+ it "Should create a freestyle job with notification for" +
246
+ " individual skype targets" do
198
247
  name = "test_job_with_individual_skype_targets"
199
248
  params = {
200
249
  :name => name,
@@ -202,7 +251,8 @@ describe JenkinsApi::Client::Job do
202
251
  }
203
252
  test_and_validate(name, params)
204
253
  end
205
- it "Should accept notification for group skype targets" do
254
+ it "Should create a freestyle job with notification for" +
255
+ " group skype targets" do
206
256
  name = "test_job_with_group_skype_targets"
207
257
  params = {
208
258
  :name => name,
@@ -210,7 +260,8 @@ describe JenkinsApi::Client::Job do
210
260
  }
211
261
  test_and_validate(name, params)
212
262
  end
213
- it "Should accept complex skype configuration" do
263
+ it "Should create a freestyle job with complex skype" +
264
+ " configuration" do
214
265
  name = "test_job_with_complex_skype_configuration"
215
266
  params = {
216
267
  :name => name,
@@ -225,31 +276,83 @@ describe JenkinsApi::Client::Job do
225
276
  }
226
277
  test_and_validate(name, params)
227
278
  end
279
+ it "Should raise an error if the input parameters is not a Hash" do
280
+ expect(
281
+ lambda {
282
+ @client.job.create_freestyle("a_string")
283
+ }
284
+ ).to raise_error(ArgumentError)
285
+ end
286
+ it "Should raise an error if the required name paremeter is missing" do
287
+ expect(
288
+ lambda {
289
+ @client.job.create_freestyle(:shell_command => "sleep 60")
290
+ }
291
+ ).to raise_error(ArgumentError)
292
+ end
293
+ end
294
+
295
+ describe "#copy" do
296
+ it "accepts the from and to job name and copies the job" do
297
+ xml = @helper.create_job_xml
298
+ @client.job.create("from_job_copy_test", xml)
299
+ @client.job.copy("from_job_copy_test", "to_job_copy_test")
300
+ @client.job.list(".*_job_copy_test").should == [
301
+ "from_job_copy_test", "to_job_copy_test"
302
+ ]
303
+ @client.job.delete("from_job_copy_test")
304
+ @client.job.delete("to_job_copy_test")
305
+ end
306
+ it "accepts the from job name and copies the from job to the" +
307
+ " copy_of_from job" do
308
+ xml = @helper.create_job_xml
309
+ @client.job.create("from_job_copy_test", xml)
310
+ @client.job.copy("from_job_copy_test")
311
+ @client.job.list(".*_job_copy_test").should == [
312
+ "copy_of_from_job_copy_test", "from_job_copy_test"
313
+ ]
314
+ @client.job.delete("from_job_copy_test")
315
+ @client.job.delete("copy_of_from_job_copy_test")
316
+ end
228
317
  end
229
318
 
230
319
  describe "#add_email_notification" do
231
320
  it "Should accept email address and add to existing job" do
232
321
  name = "email_notification_test_job"
233
322
  params = {:name => name}
234
- @client.job.create_freestyle(params).to_i.should == 200
235
- @client.job.add_email_notification(
236
- :name => name,
237
- :notification_email => "testuser@testdomain.com"
238
- ).to_i.should == 200
239
- @client.job.delete(name).to_i.should == 302
323
+ @valid_post_responses.should include(
324
+ @client.job.create_freestyle(params).to_i
325
+ )
326
+ @valid_post_responses.should include(
327
+ @client.job.add_email_notification(
328
+ :name => name,
329
+ :notification_email => "testuser@testdomain.com"
330
+ ).to_i
331
+ )
332
+ @valid_post_responses.should include(
333
+ @client.job.delete(name).to_i
334
+ )
240
335
  end
241
336
  end
242
337
 
243
338
  describe "#add_skype_notification" do
244
339
  it "Should accept skype configuration and add to existing job" do
245
340
  name = "skype_notification_test_job"
246
- params = {:name => name}
247
- @client.job.create_freestyle(params).to_i.should == 200
248
- @client.job.add_skype_notification(
249
- :name => name,
250
- :skype_targets => "testuser"
251
- ).to_i.should == 200
252
- @client.job.delete(name).to_i.should == 302
341
+ params = {
342
+ :name => name
343
+ }
344
+ @valid_post_responses.should include(
345
+ @client.job.create_freestyle(params).to_i
346
+ )
347
+ @valid_post_responses.should include(
348
+ @client.job.add_skype_notification(
349
+ :name => name,
350
+ :skype_targets => "testuser"
351
+ ).to_i
352
+ )
353
+ @valid_post_responses.should include(
354
+ @client.job.delete(name).to_i
355
+ )
253
356
  end
254
357
  end
255
358
 
@@ -268,21 +371,37 @@ describe JenkinsApi::Client::Job do
268
371
 
269
372
  describe "#recreate" do
270
373
  it "Should be able to re-create a job" do
271
- @client.job.recreate("qwerty_nonexistent_job").to_i.should == 200
374
+ @valid_post_responses.should include(
375
+ @client.job.recreate("qwerty_nonexistent_job").to_i
376
+ )
272
377
  end
273
378
  end
274
379
 
275
380
  describe "#change_description" do
276
381
  it "Should be able to change the description of a job" do
277
- @client.job.change_description("qwerty_nonexistent_job",
278
- "The description has been changed by the spec test"
279
- ).to_i.should == 200
382
+ @valid_post_responses.should include(
383
+ @client.job.change_description("qwerty_nonexistent_job",
384
+ "The description has been changed by the spec test").to_i
385
+ )
280
386
  end
281
387
  end
282
388
 
283
389
  describe "#delete" do
284
390
  it "Should be able to delete a job" do
285
- @client.job.delete("qwerty_nonexistent_job").to_i.should == 302
391
+ @valid_post_responses.should include(
392
+ @client.job.delete("qwerty_nonexistent_job").to_i
393
+ )
394
+ end
395
+ end
396
+
397
+ describe "#wipe_out_workspace" do
398
+ it "Should be able to wipe out the workspace of a job" do
399
+ xml = @helper.create_job_xml
400
+ @client.job.create("wipeout_job_test", xml)
401
+ @valid_post_responses.should include(
402
+ @client.job.wipe_out_workspace("wipeout_job_test").to_i
403
+ )
404
+ @client.job.delete("wipeout_job_test")
286
405
  end
287
406
  end
288
407
 
@@ -369,7 +488,7 @@ describe JenkinsApi::Client::Job do
369
488
  response = @client.job.build(@job_name)
370
489
  # As of Jenkins version 1.519 the job build responds with a 201
371
490
  # status code.
372
- [201, 302].should include(response.to_i)
491
+ @valid_post_responses.should include(response.to_i)
373
492
  # Sleep for 6 seconds so we don't hit the Jenkins quiet period (5
374
493
  # seconds)
375
494
  sleep 6
@@ -381,6 +500,20 @@ describe JenkinsApi::Client::Job do
381
500
  end
382
501
  end
383
502
 
503
+ describe "#disable" do
504
+ it "Should disable the specified job and then enable it again" do
505
+ @client.job.list_details(@job_name)['buildable'].should == true
506
+ response = @client.job.disable(@job_name)
507
+ response.to_i.should == 302
508
+ sleep 3
509
+ @client.job.list_details(@job_name)['buildable'].should == false
510
+ response = @client.job.enable(@job_name)
511
+ response.to_i.should == 302
512
+ sleep 3
513
+ @client.job.list_details(@job_name)['buildable'].should == true
514
+ end
515
+ end
516
+
384
517
  describe "#stop" do
385
518
  it "Should be able to abort a recent build of a running job" do
386
519
  @client.job.get_current_build_status(
@@ -390,7 +523,9 @@ describe JenkinsApi::Client::Job do
390
523
  sleep 6
391
524
  @client.job.get_current_build_status(@job_name).should == "running"
392
525
  sleep 5
393
- @client.job.stop_build(@job_name).to_i.should == 302
526
+ @valid_post_responses.should include(
527
+ @client.job.stop_build(@job_name).to_i
528
+ )
394
529
  sleep 5
395
530
  @client.job.get_current_build_status(@job_name).should == "aborted"
396
531
  end
@@ -398,9 +533,13 @@ describe JenkinsApi::Client::Job do
398
533
 
399
534
  describe "#restrict_to_node" do
400
535
  it "Should be able to restrict a job to a node" do
401
- @client.job.restrict_to_node(@job_name, 'master').to_i.should == 200
536
+ @valid_post_responses.should include(
537
+ @client.job.restrict_to_node(@job_name, 'master').to_i
538
+ )
402
539
  # Run it again to make sure that the replace existing node works
403
- @client.job.restrict_to_node(@job_name, 'master').to_i.should == 200
540
+ @valid_post_responses.should include(
541
+ @client.job.restrict_to_node(@job_name, 'master').to_i
542
+ )
404
543
  end
405
544
  end
406
545