gooddata 0.6.12 → 0.6.13
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 +11 -12
- data/CHANGELOG.md +10 -1
- data/gooddata.gemspec +3 -3
- data/lib/gooddata/commands/datawarehouse.rb +4 -6
- data/lib/gooddata/core/rest.rb +1 -3
- data/lib/gooddata/models/domain.rb +1 -1
- data/lib/gooddata/models/from_wire.rb +4 -4
- data/lib/gooddata/models/invitation.rb +0 -4
- data/lib/gooddata/models/membership.rb +0 -7
- data/lib/gooddata/models/metadata/attribute.rb +29 -1
- data/lib/gooddata/models/metadata/dataset.rb +62 -0
- data/lib/gooddata/models/metadata/metric.rb +16 -4
- data/lib/gooddata/models/metadata/report_definition.rb +2 -0
- data/lib/gooddata/models/process.rb +1 -1
- data/lib/gooddata/models/project.rb +12 -9
- data/lib/gooddata/models/project_blueprint.rb +3 -14
- data/lib/gooddata/models/user_filters/variable_user_filter.rb +2 -0
- data/lib/gooddata/rest/client.rb +4 -8
- data/lib/gooddata/rest/connection.rb +7 -5
- data/lib/gooddata/version.rb +1 -1
- data/spec/helpers/project_helper.rb +1 -1
- data/spec/integration/full_process_schedule_spec.rb +83 -42
- data/spec/integration/full_project_spec.rb +12 -0
- data/spec/logging_in_logging_out_spec.rb +8 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/unit/models/domain_spec.rb +2 -1
- data/spec/unit/models/params_spec.rb +36 -18
- data/spec/unit/models/project_role_spec.rb +8 -7
- data/spec/unit/models/schedule_spec.rb +267 -290
- metadata +32 -4
- data/lib/gooddata/core/connection.rb +0 -376
data/lib/gooddata/rest/client.rb
CHANGED
@@ -330,17 +330,13 @@ module GoodData
|
|
330
330
|
end
|
331
331
|
|
332
332
|
def download_from_user_webdav(source_relative_path, target_file_path, options = { :client => GoodData.client, :project => project })
|
333
|
-
download(source_relative_path, target_file_path, options.merge(
|
334
|
-
|
335
|
-
:staging_url => get_user_webdav_url(options)
|
336
|
-
))
|
333
|
+
download(source_relative_path, target_file_path, options.merge(:directory => options[:directory],
|
334
|
+
:staging_url => get_user_webdav_url(options)))
|
337
335
|
end
|
338
336
|
|
339
337
|
def upload_to_user_webdav(file, options = {})
|
340
|
-
upload(file, options.merge(
|
341
|
-
|
342
|
-
:staging_url => get_user_webdav_url(options)
|
343
|
-
))
|
338
|
+
upload(file, options.merge(:directory => options[:directory],
|
339
|
+
:staging_url => get_user_webdav_url(options)))
|
344
340
|
end
|
345
341
|
|
346
342
|
def with_project(pid, &block)
|
@@ -20,7 +20,8 @@ module GoodData
|
|
20
20
|
}
|
21
21
|
|
22
22
|
DEFAULT_LOGIN_PAYLOAD = {
|
23
|
-
:headers => DEFAULT_HEADERS
|
23
|
+
:headers => DEFAULT_HEADERS,
|
24
|
+
:verify_ssl => OpenSSL::SSL::VERIFY_NONE
|
24
25
|
}
|
25
26
|
|
26
27
|
RETRYABLE_ERRORS = [
|
@@ -58,9 +59,10 @@ module GoodData
|
|
58
59
|
retry_time = 1
|
59
60
|
begin
|
60
61
|
return yield
|
61
|
-
rescue RestClient::Forbidden => e # , RestClient::Unauthorized => e
|
62
|
+
rescue RestClient::Unauthorized, RestClient::Forbidden => e # , RestClient::Unauthorized => e
|
62
63
|
raise e unless options[:refresh_token]
|
63
|
-
options[:
|
64
|
+
raise e if options[:dont_reauth]
|
65
|
+
options[:refresh_token].call # (dont_reauth: true)
|
64
66
|
retry if (retries -= 1) > 0
|
65
67
|
rescue RestClient::TooManyRequests
|
66
68
|
GoodData.logger.warn "Too many requests, retrying in #{retry_time} seconds"
|
@@ -122,7 +124,7 @@ module GoodData
|
|
122
124
|
refresh_token :dont_reauth => true
|
123
125
|
else
|
124
126
|
credentials = Connection.construct_login_payload(username, password)
|
125
|
-
@auth = post(LOGIN_PATH, credentials
|
127
|
+
@auth = post(LOGIN_PATH, credentials)['userLogin']
|
126
128
|
|
127
129
|
refresh_token :dont_reauth => true
|
128
130
|
@user = get(@auth['profile'])
|
@@ -401,7 +403,7 @@ module GoodData
|
|
401
403
|
# end
|
402
404
|
# end
|
403
405
|
|
404
|
-
response = GoodData::Rest::Connection.retryable(:tries => 2, :refresh_token => proc { refresh_token }) do
|
406
|
+
response = GoodData::Rest::Connection.retryable(:tries => 2, :refresh_token => proc { refresh_token unless options[:dont_reauth] }) do
|
405
407
|
block.call
|
406
408
|
end
|
407
409
|
|
data/lib/gooddata/version.rb
CHANGED
@@ -24,14 +24,22 @@ describe "Full process and schedule exercise", :constraint => 'slow' do
|
|
24
24
|
@client = ConnectionHelper::create_default_connection
|
25
25
|
@project = @client.create_project(title: 'Project for schedule testing', auth_token: ConnectionHelper::GD_PROJECT_TOKEN)
|
26
26
|
@process = @project.deploy_process('./spec/data/ruby_process',
|
27
|
-
|
28
|
-
|
27
|
+
type: 'RUBY',
|
28
|
+
name: 'Test ETL Process (Ruby)')
|
29
|
+
|
30
|
+
@process_cc = @project.deploy_process('./spec/data/cc',
|
31
|
+
type: 'graph',
|
32
|
+
name: 'Test ETL Process (CC)')
|
29
33
|
|
30
34
|
end
|
31
35
|
|
32
36
|
after(:all) do
|
33
|
-
|
34
|
-
|
37
|
+
ScheduleHelper.remove_old_schedules(@project)
|
38
|
+
ProcessHelper.remove_old_processes(@project)
|
39
|
+
|
40
|
+
# @process.delete if @process
|
41
|
+
# @project.delete if @project
|
42
|
+
|
35
43
|
@client.disconnect
|
36
44
|
end
|
37
45
|
|
@@ -58,52 +66,68 @@ describe "Full process and schedule exercise", :constraint => 'slow' do
|
|
58
66
|
end
|
59
67
|
|
60
68
|
it "should be able to create schedule triggered by another schedule" do
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
69
|
+
begin
|
70
|
+
schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
71
|
+
schedule = @process.create_schedule(schedule_first, @process.executables.first)
|
72
|
+
res = @process.schedules
|
73
|
+
expect(res.count).to eq 2
|
74
|
+
expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
|
75
|
+
ensure
|
76
|
+
schedule && schedule.delete
|
77
|
+
schedule_first && schedule_first.delete
|
78
|
+
end
|
68
79
|
end
|
69
80
|
|
70
81
|
it "should be able to create schedule triggered by another schedule specified by ID" do
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
82
|
+
begin
|
83
|
+
schedule_first = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
84
|
+
schedule = @process.create_schedule(schedule_first.obj_id, @process.executables.first)
|
85
|
+
res = @process.schedules
|
86
|
+
expect(res.count).to eq 2
|
87
|
+
expect(@process.schedules.map(&:uri)).to include(schedule_first.uri, schedule.uri)
|
88
|
+
ensure
|
89
|
+
schedule && schedule.delete
|
90
|
+
schedule_first && schedule_first.delete
|
91
|
+
end
|
78
92
|
end
|
79
93
|
|
80
94
|
it "should be able to delete schedule" do
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
95
|
+
begin
|
96
|
+
schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
97
|
+
res = @process.schedules
|
98
|
+
expect(res.count).to eq 1
|
99
|
+
expect(@process.schedules).to eq [schedule]
|
100
|
+
ensure
|
101
|
+
schedule && schedule.delete
|
102
|
+
end
|
86
103
|
end
|
87
104
|
|
88
105
|
it "should be possible to read status of schedule" do
|
89
|
-
|
90
|
-
|
91
|
-
|
106
|
+
begin
|
107
|
+
schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
108
|
+
expect(schedule.state).to eq 'ENABLED'
|
109
|
+
ensure
|
110
|
+
schedule && schedule.delete
|
111
|
+
end
|
92
112
|
end
|
93
113
|
|
94
114
|
it "should be possible to execute schedule" do
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
115
|
+
begin
|
116
|
+
schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
117
|
+
result = schedule.execute
|
118
|
+
expect(result.status).to eq :ok
|
119
|
+
log = result.log
|
120
|
+
expect(log.index('Hello Ruby executors')).not_to eq nil
|
121
|
+
expect(log.index('Hello Ruby from the deep')).not_to eq nil
|
122
|
+
ensure
|
123
|
+
schedule && schedule.delete
|
124
|
+
end
|
101
125
|
end
|
102
126
|
|
103
127
|
it "should be possible to deploy only a single file" do
|
104
128
|
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.rb',
|
105
|
-
|
106
|
-
|
129
|
+
type: 'RUBY',
|
130
|
+
name: 'Test ETL one file Process')
|
107
131
|
begin
|
108
132
|
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
109
133
|
result = schedule.execute
|
@@ -126,8 +150,8 @@ describe "Full process and schedule exercise", :constraint => 'slow' do
|
|
126
150
|
|
127
151
|
it "should be possible to deploy already zipped file" do
|
128
152
|
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
129
|
-
|
130
|
-
|
153
|
+
type: 'RUBY',
|
154
|
+
name: 'Test ETL zipped file Process')
|
131
155
|
begin
|
132
156
|
expect(process.schedules.count).to eq 0
|
133
157
|
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
@@ -199,8 +223,8 @@ describe "Full process and schedule exercise", :constraint => 'slow' do
|
|
199
223
|
it "should be possible to download deployed process" do
|
200
224
|
size = File.size('./spec/data/hello_world_process/hello_world.zip')
|
201
225
|
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
202
|
-
|
203
|
-
|
226
|
+
type: 'RUBY',
|
227
|
+
name: 'Test ETL zipped file Process')
|
204
228
|
begin
|
205
229
|
Tempfile.open('downloaded-process') do |temp|
|
206
230
|
temp << process.download
|
@@ -213,9 +237,26 @@ describe "Full process and schedule exercise", :constraint => 'slow' do
|
|
213
237
|
end
|
214
238
|
|
215
239
|
it "should be able to redeploy via project" do
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
240
|
+
begin
|
241
|
+
process = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
242
|
+
type: 'RUBY',
|
243
|
+
name: 'Test ETL zipped file Process',
|
244
|
+
process_id: @process.obj_id)
|
245
|
+
ensure
|
246
|
+
process && process.delete
|
247
|
+
end
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should be able to redeploy directly" do
|
251
|
+
begin
|
252
|
+
process1 = @project.deploy_process('./spec/data/hello_world_process/hello_world.zip',
|
253
|
+
type: 'RUBY',
|
254
|
+
name: 'Test ETL zipped file Process')
|
255
|
+
|
256
|
+
process2 = process1.deploy('./spec/data/ruby_process/process.rb')
|
257
|
+
expect(process1.executables).not_to eq process2.executables
|
258
|
+
ensure
|
259
|
+
process1 && process1.delete
|
260
|
+
end
|
220
261
|
end
|
221
262
|
end
|
@@ -27,6 +27,11 @@ describe "Full project implementation", :constraint => 'slow' do
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
it "should contain metadata datasets" do
|
31
|
+
expect(@project.datasets.count).to eq 4
|
32
|
+
expect(@project.datasets.select(&:date_dimension?).count).to eq 1
|
33
|
+
end
|
34
|
+
|
30
35
|
it "should be able to rename a project" do
|
31
36
|
former_title = @project.title
|
32
37
|
a_title = (0...8).map { (65 + rand(26)).chr }.join
|
@@ -413,4 +418,11 @@ describe "Full project implementation", :constraint => 'slow' do
|
|
413
418
|
r.delete
|
414
419
|
expect { def_uris.each {|uri| @client.get(uri)} }.to raise_error(RestClient::ResourceNotFound)
|
415
420
|
end
|
421
|
+
|
422
|
+
it 'should be apossible to delete data from a dataset' do
|
423
|
+
dataset = @project.datasets('dataset.devs')
|
424
|
+
expect(dataset.attributes.first.create_metric.execute).to be > 0
|
425
|
+
dataset.delete_data
|
426
|
+
expect(dataset.attributes.first.create_metric.execute).to be_nil
|
427
|
+
end
|
416
428
|
end
|
@@ -24,4 +24,12 @@ describe GoodData::Rest::Connection, :constraint => 'slow' do
|
|
24
24
|
|
25
25
|
regular_client.disconnect
|
26
26
|
end
|
27
|
+
|
28
|
+
it "should be able to regenerate TT" do
|
29
|
+
regular_client = ConnectionHelper::create_default_connection
|
30
|
+
projects = regular_client.projects
|
31
|
+
regular_client.connection.cookies[:cookies].delete('GDCAuthTT')
|
32
|
+
regular_client.get('/gdc/md')
|
33
|
+
expect(regular_client.connection.cookies[:cookies]).to have_key 'GDCAuthTT'
|
34
|
+
end
|
27
35
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -82,11 +82,12 @@ describe GoodData::Domain do
|
|
82
82
|
|
83
83
|
describe '#create_users' do
|
84
84
|
it 'Creates new users from list' do
|
85
|
-
list = (0
|
85
|
+
list = (0..1).to_a.map { |i| ProjectHelper.create_random_user(@client) }
|
86
86
|
res = @domain.create_users(list)
|
87
87
|
|
88
88
|
# no errors
|
89
89
|
expect(res.select { |x| x[:type] == :user_added_to_domain }.count).to eq res.count
|
90
|
+
|
90
91
|
expect(@domain.members?(list.map(&:login)).all?).to be_truthy
|
91
92
|
|
92
93
|
res.map { |r| r[:user] }.each do |r|
|
@@ -28,9 +28,12 @@ describe 'GoodData::Schedule::Params' do
|
|
28
28
|
:test => '1234'
|
29
29
|
}
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
begin
|
32
|
+
schedule = @process.create_schedule("0 12 * * *", @graph_path, params: params)
|
33
|
+
expect(schedule).to be_truthy
|
34
|
+
ensure
|
35
|
+
schedule && schedule.delete
|
36
|
+
end
|
34
37
|
end
|
35
38
|
|
36
39
|
it 'Works with nested params' do
|
@@ -41,9 +44,12 @@ describe 'GoodData::Schedule::Params' do
|
|
41
44
|
}
|
42
45
|
}
|
43
46
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
begin
|
48
|
+
schedule = @process.create_schedule("0 12 * * *", @graph_path, params: params)
|
49
|
+
expect(schedule).to be_truthy
|
50
|
+
ensure
|
51
|
+
schedule && schedule.delete
|
52
|
+
end
|
47
53
|
end
|
48
54
|
|
49
55
|
it 'Works with array in params' do
|
@@ -52,9 +58,12 @@ describe 'GoodData::Schedule::Params' do
|
|
52
58
|
:array => [1, 2, 3, 4, 5]
|
53
59
|
}
|
54
60
|
|
55
|
-
|
56
|
-
|
57
|
-
|
61
|
+
begin
|
62
|
+
schedule = @process.create_schedule("0 12 * * *", @graph_path, params: params)
|
63
|
+
expect(schedule).to be_truthy
|
64
|
+
ensure
|
65
|
+
schedule && schedule.delete
|
66
|
+
end
|
58
67
|
end
|
59
68
|
end
|
60
69
|
|
@@ -64,9 +73,12 @@ describe 'GoodData::Schedule::Params' do
|
|
64
73
|
:test => '1234'
|
65
74
|
}
|
66
75
|
|
67
|
-
|
68
|
-
|
69
|
-
|
76
|
+
begin
|
77
|
+
schedule = @process.create_schedule("0 12 * * *", @graph_path, hiddenParams: params)
|
78
|
+
expect(schedule).to be_truthy
|
79
|
+
ensure
|
80
|
+
schedule && schedule.delete
|
81
|
+
end
|
70
82
|
end
|
71
83
|
|
72
84
|
it 'Works with nested hiddenParams' do
|
@@ -77,9 +89,12 @@ describe 'GoodData::Schedule::Params' do
|
|
77
89
|
}
|
78
90
|
}
|
79
91
|
|
80
|
-
|
81
|
-
|
82
|
-
|
92
|
+
begin
|
93
|
+
schedule = @process.create_schedule("0 12 * * *", @graph_path, hiddenParams: params)
|
94
|
+
expect(schedule).to be_truthy
|
95
|
+
ensure
|
96
|
+
schedule && schedule.delete
|
97
|
+
end
|
83
98
|
end
|
84
99
|
|
85
100
|
it 'Works with array in hiddenParams' do
|
@@ -88,9 +103,12 @@ describe 'GoodData::Schedule::Params' do
|
|
88
103
|
:array => [1, 2, 3, 4, 5]
|
89
104
|
}
|
90
105
|
|
91
|
-
|
92
|
-
|
93
|
-
|
106
|
+
begin
|
107
|
+
schedule = @process.create_schedule("0 12 * * *", @graph_path, hiddenParams: params)
|
108
|
+
expect(schedule).to be_truthy
|
109
|
+
ensure
|
110
|
+
schedule && schedule.delete
|
111
|
+
end
|
94
112
|
end
|
95
113
|
end
|
96
114
|
end
|
@@ -79,12 +79,13 @@ describe GoodData::ProjectRole do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
describe '#users' do
|
82
|
-
it 'Returns users as Array<GoodData::Profile>'
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
end
|
82
|
+
it 'Returns users as Array<GoodData::Profile>'
|
83
|
+
# it 'Returns users as Array<GoodData::Profile>' do
|
84
|
+
# res = @role.users
|
85
|
+
# expect(res).to be_an_instance_of(Array)
|
86
|
+
# res.each do |user|
|
87
|
+
# expect(user).to be_an_instance_of(GoodData::Profile)
|
88
|
+
# end
|
89
|
+
# end
|
89
90
|
end
|
90
91
|
end
|
@@ -17,7 +17,7 @@ describe GoodData::Schedule do
|
|
17
17
|
|
18
18
|
before(:each) do
|
19
19
|
@client = ConnectionHelper.create_default_connection
|
20
|
-
|
20
|
+
|
21
21
|
@project = ProjectHelper.get_default_project(:client => @client)
|
22
22
|
@project_executable = 'graph/graph.grf'
|
23
23
|
@test_data = {
|
@@ -26,7 +26,7 @@ describe GoodData::Schedule do
|
|
26
26
|
:client => @client,
|
27
27
|
:project => @project
|
28
28
|
}
|
29
|
-
|
29
|
+
|
30
30
|
@test_data_with_optional_param = {
|
31
31
|
:timezone => 'UTC',
|
32
32
|
:cron => '2 2 2 2 *',
|
@@ -76,437 +76,414 @@ describe GoodData::Schedule do
|
|
76
76
|
|
77
77
|
describe '#create' do
|
78
78
|
it 'Creates new schedule if mandatory params passed' do
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
79
|
+
schedule = nil
|
80
|
+
begin
|
81
|
+
expect {
|
82
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
83
|
+
}.not_to raise_error
|
84
|
+
|
85
|
+
expect(schedule).to be_truthy
|
86
|
+
ensure
|
87
|
+
schedule && schedule.delete
|
88
|
+
end
|
86
89
|
end
|
87
90
|
|
88
91
|
it 'Creates new schedule if mandatory params passed and optional params are present' do
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
92
|
+
schedule = nil
|
93
|
+
begin
|
94
|
+
expect {
|
95
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
96
|
+
}.not_to raise_error
|
97
|
+
|
98
|
+
expect(schedule).to be_truthy
|
99
|
+
ensure
|
100
|
+
schedule && schedule.delete
|
101
|
+
end
|
96
102
|
end
|
97
103
|
|
98
104
|
it 'Throws exception when no process ID specified' do
|
99
|
-
|
100
|
-
|
101
|
-
|
105
|
+
schedule = nil
|
106
|
+
begin
|
107
|
+
expect {
|
108
|
+
schedule = @project.create_schedule(nil, @test_cron, @project_executable, @test_data)
|
109
|
+
}.to raise_error 'Process ID has to be provided'
|
110
|
+
ensure
|
111
|
+
schedule && schedule.delete
|
112
|
+
end
|
102
113
|
end
|
103
114
|
|
104
115
|
it 'Throws exception when no executable specified' do
|
105
|
-
|
106
|
-
|
107
|
-
|
116
|
+
schedule = nil
|
117
|
+
begin
|
118
|
+
expect {
|
119
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, nil, @test_data)
|
120
|
+
}.to raise_error 'Executable has to be provided'
|
121
|
+
ensure
|
122
|
+
schedule && schedule.delete
|
123
|
+
end
|
108
124
|
end
|
109
125
|
|
110
126
|
it 'Throws exception when no cron is specified' do
|
111
127
|
data = @test_data.deep_dup
|
112
128
|
data[:cron] = nil
|
113
|
-
|
114
|
-
|
115
|
-
|
129
|
+
schedule = nil
|
130
|
+
begin
|
131
|
+
expect {
|
132
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, nil, @project_executable, data)
|
133
|
+
}.to raise_error 'trigger schedule has to be provided'
|
134
|
+
ensure
|
135
|
+
schedule && schedule.delete
|
136
|
+
end
|
116
137
|
end
|
117
138
|
|
118
139
|
it 'Throws exception when no timezone specified' do
|
119
140
|
data = @test_data.deep_dup
|
120
141
|
data[:timezone] = nil
|
121
|
-
|
122
|
-
|
123
|
-
|
142
|
+
schedule = nil
|
143
|
+
begin
|
144
|
+
expect {
|
145
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, data)
|
146
|
+
}.to raise_error 'A timezone has to be provided'
|
147
|
+
ensure
|
148
|
+
schedule && schedule.delete
|
149
|
+
end
|
124
150
|
end
|
125
151
|
|
126
152
|
it 'Throws exception when no timezone specified' do
|
127
153
|
data = @test_data.deep_dup
|
128
154
|
data[:type] = nil
|
155
|
+
schedule = nil
|
156
|
+
begin
|
129
157
|
expect {
|
130
|
-
|
158
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, data)
|
131
159
|
}.to raise_error 'Schedule type has to be provided'
|
160
|
+
ensure
|
161
|
+
schedule && schedule.delete
|
162
|
+
end
|
132
163
|
end
|
133
164
|
end
|
134
165
|
|
135
166
|
describe '#cron' do
|
136
|
-
before(:each) do
|
137
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
138
|
-
end
|
139
|
-
|
140
|
-
after(:each) do
|
141
|
-
@schedule.delete
|
142
|
-
end
|
143
|
-
|
144
167
|
it 'Should return cron as string' do
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
168
|
+
schedule = nil
|
169
|
+
begin
|
170
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
171
|
+
res = schedule.cron
|
172
|
+
res.should_not be_nil
|
173
|
+
res.should_not be_empty
|
174
|
+
res.should be_a_kind_of(String)
|
175
|
+
ensure
|
176
|
+
schedule && schedule.delete
|
177
|
+
end
|
149
178
|
end
|
150
179
|
end
|
151
180
|
|
152
181
|
describe '#cron=' do
|
153
|
-
before(:each) do
|
154
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
155
|
-
end
|
156
|
-
|
157
|
-
after(:each) do
|
158
|
-
@schedule.delete
|
159
|
-
end
|
160
|
-
|
161
182
|
it 'Assigns the cron and marks the object dirty' do
|
162
183
|
test_cron = '2 2 2 2 *'
|
163
184
|
|
164
|
-
|
165
|
-
|
166
|
-
|
185
|
+
begin
|
186
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
187
|
+
schedule.cron = test_cron
|
188
|
+
expect(schedule.cron).to eq(test_cron)
|
189
|
+
expect(schedule.dirty).to eq(true)
|
190
|
+
ensure
|
191
|
+
schedule && schedule.delete
|
192
|
+
end
|
167
193
|
end
|
168
194
|
end
|
169
195
|
|
170
196
|
describe '#executable' do
|
171
|
-
before(:each) do
|
172
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
173
|
-
end
|
174
|
-
|
175
|
-
after(:each) do
|
176
|
-
@schedule.delete
|
177
|
-
end
|
178
|
-
|
179
197
|
it 'Should return executable as string' do
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
198
|
+
begin
|
199
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
200
|
+
res = schedule.executable
|
201
|
+
res.should_not be_nil
|
202
|
+
res.should_not be_empty
|
203
|
+
res.should be_a_kind_of(String)
|
204
|
+
ensure
|
205
|
+
schedule && schedule.delete
|
206
|
+
end
|
184
207
|
end
|
185
208
|
end
|
186
209
|
|
187
210
|
describe '#executable=' do
|
188
|
-
before(:each) do
|
189
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
190
|
-
end
|
191
|
-
|
192
|
-
after(:each) do
|
193
|
-
@schedule.delete
|
194
|
-
end
|
195
|
-
|
196
211
|
it 'Assigns the executable and marks the object dirty' do
|
197
|
-
test_executable = 'this/is/test.
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
212
|
+
test_executable = 'this/is/test.grf'
|
213
|
+
|
214
|
+
begin
|
215
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
216
|
+
schedule.executable = test_executable
|
217
|
+
expect(schedule.executable).to eq(test_executable)
|
218
|
+
expect(schedule.dirty).to eq(true)
|
219
|
+
ensure
|
220
|
+
schedule && schedule.delete
|
221
|
+
end
|
202
222
|
end
|
203
223
|
end
|
204
224
|
|
205
225
|
describe '#execute' do
|
206
|
-
before(:each) do
|
207
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
208
|
-
@process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
|
209
|
-
type: 'RUBY',
|
210
|
-
name: 'Test ETL zipped file GoodData Process')
|
211
|
-
@schedule = @process.create_schedule('0 15 27 7 *', @process.executables.first)
|
212
|
-
end
|
213
|
-
|
214
|
-
after(:each) do
|
215
|
-
@schedule.delete
|
216
|
-
end
|
217
|
-
|
218
226
|
it 'Waits for execution result by default' do
|
219
|
-
|
220
|
-
|
221
|
-
|
227
|
+
begin
|
228
|
+
process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
|
229
|
+
type: 'RUBY',
|
230
|
+
name: 'Test ETL zipped file GoodData Process')
|
231
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
232
|
+
res = schedule.execute
|
233
|
+
expect(res).to be_an_instance_of(GoodData::Execution)
|
234
|
+
expect([:ok, :error].include?(res.status)).to be_truthy
|
235
|
+
ensure
|
236
|
+
schedule && schedule.delete
|
237
|
+
process && process.delete
|
238
|
+
end
|
222
239
|
end
|
223
240
|
|
224
241
|
it 'can be overridden to do not wait for execution result' do
|
225
|
-
|
226
|
-
|
227
|
-
|
242
|
+
begin
|
243
|
+
process = @project.deploy_process('./spec/data/gooddata_version_process/gooddata_version.zip',
|
244
|
+
type: 'RUBY',
|
245
|
+
name: 'Test ETL zipped file GoodData Process')
|
246
|
+
schedule = process.create_schedule('0 15 27 7 *', process.executables.first)
|
247
|
+
res = schedule.execute(:wait => false)
|
248
|
+
expect(res).to be_an_instance_of(GoodData::Execution)
|
249
|
+
expect([:scheduled, :running].include?(res.status)).to be_truthy
|
250
|
+
ensure
|
251
|
+
schedule && schedule.delete
|
252
|
+
process && process.delete
|
253
|
+
end
|
228
254
|
end
|
229
255
|
end
|
230
256
|
|
231
257
|
describe '#execution_url' do
|
232
|
-
before(:each) do
|
233
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
234
|
-
end
|
235
|
-
|
236
|
-
after(:each) do
|
237
|
-
@schedule.delete
|
238
|
-
end
|
239
|
-
|
240
258
|
it 'Should return execution URL as string' do
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
259
|
+
begin
|
260
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
261
|
+
res = schedule.execution_url
|
262
|
+
res.should_not be_nil
|
263
|
+
res.should_not be_empty
|
264
|
+
res.should be_a_kind_of(String)
|
265
|
+
ensure
|
266
|
+
schedule && schedule.delete
|
267
|
+
end
|
245
268
|
end
|
246
269
|
end
|
247
270
|
|
248
271
|
describe '#type' do
|
249
|
-
|
250
|
-
before(:each) do
|
251
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
252
|
-
end
|
253
|
-
|
254
|
-
after(:each) do
|
255
|
-
@schedule.delete
|
256
|
-
end
|
257
|
-
|
258
272
|
it 'Should return execution type as string' do
|
259
|
-
|
260
|
-
|
261
|
-
|
273
|
+
begin
|
274
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
275
|
+
res = schedule.type
|
276
|
+
res.should_not be_nil
|
277
|
+
res.should be_a_kind_of(String)
|
278
|
+
ensure
|
279
|
+
schedule && schedule.delete
|
280
|
+
end
|
262
281
|
end
|
263
282
|
end
|
264
283
|
|
265
284
|
describe '#hidden_params' do
|
266
|
-
before(:each) do
|
267
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
268
|
-
end
|
269
|
-
|
270
|
-
after(:each) do
|
271
|
-
@schedule.delete
|
272
|
-
end
|
273
|
-
|
274
285
|
it 'Should return execution hidden_params as hash' do
|
275
|
-
|
276
|
-
|
277
|
-
|
286
|
+
begin
|
287
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
288
|
+
res = schedule.hidden_params
|
289
|
+
res.should_not be_nil
|
290
|
+
res.should be_a_kind_of(Hash)
|
291
|
+
ensure
|
292
|
+
schedule && schedule.delete
|
293
|
+
end
|
278
294
|
end
|
279
295
|
end
|
280
296
|
|
281
297
|
describe '#hidden_params=' do
|
282
|
-
before(:each) do
|
283
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
284
|
-
end
|
285
|
-
|
286
|
-
after(:each) do
|
287
|
-
@schedule.delete
|
288
|
-
end
|
289
|
-
|
290
298
|
it 'Assigns the hidden params and marks the object dirty' do
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
299
|
+
begin
|
300
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
301
|
+
old_params = schedule.hidden_params
|
302
|
+
|
303
|
+
test_params = {
|
304
|
+
'PROCESS_ID' => '1-2-3-4'
|
305
|
+
}
|
306
|
+
|
307
|
+
schedule.hidden_params = test_params
|
308
|
+
expect(schedule.hidden_params).to eq(old_params.merge(test_params))
|
309
|
+
expect(schedule.dirty).to eq(true)
|
310
|
+
ensure
|
311
|
+
schedule && schedule.delete
|
312
|
+
end
|
300
313
|
end
|
301
314
|
end
|
302
315
|
|
303
316
|
describe '#params' do
|
304
|
-
before(:each) do
|
305
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
306
|
-
end
|
307
|
-
|
308
|
-
after(:each) do
|
309
|
-
@schedule.delete
|
310
|
-
end
|
311
|
-
|
312
317
|
it 'Should return execution params as hash' do
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
318
|
+
begin
|
319
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
320
|
+
res = schedule.params
|
321
|
+
res.should_not be_nil
|
322
|
+
res.should_not be_empty
|
323
|
+
res.should be_a_kind_of(Hash)
|
324
|
+
ensure
|
325
|
+
schedule && schedule.delete
|
326
|
+
end
|
317
327
|
end
|
318
328
|
end
|
319
329
|
|
320
330
|
describe '#params=' do
|
321
|
-
before(:each) do
|
322
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
323
|
-
end
|
324
|
-
|
325
|
-
after(:each) do
|
326
|
-
@schedule.delete
|
327
|
-
end
|
328
|
-
|
329
331
|
it 'Assigns the params and marks the object dirty' do
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
332
|
+
begin
|
333
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
334
|
+
old_params = schedule.params
|
335
|
+
|
336
|
+
test_params = {
|
337
|
+
'PROCESS_ID' => '1-2-3-4'
|
338
|
+
}
|
339
|
+
|
340
|
+
schedule.params = test_params
|
341
|
+
expect(schedule.params).to eq(old_params.merge(test_params))
|
342
|
+
expect(schedule.dirty).to eq(true)
|
343
|
+
ensure
|
344
|
+
schedule && schedule.delete
|
345
|
+
end
|
339
346
|
end
|
340
347
|
end
|
341
348
|
|
342
349
|
describe '#process_id' do
|
343
|
-
before(:each) do
|
344
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
345
|
-
end
|
346
|
-
|
347
|
-
after(:each) do
|
348
|
-
@schedule.delete
|
349
|
-
end
|
350
|
-
|
351
350
|
it 'Should return process id as string' do
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
351
|
+
begin
|
352
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
353
|
+
res = schedule.process_id
|
354
|
+
res.should_not be_nil
|
355
|
+
res.should_not be_empty
|
356
|
+
res.should be_a_kind_of(String)
|
357
|
+
ensure
|
358
|
+
schedule && schedule.delete
|
359
|
+
end
|
356
360
|
end
|
357
361
|
end
|
358
362
|
|
359
363
|
describe '#process_id=' do
|
360
|
-
before(:each) do
|
361
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
362
|
-
end
|
363
|
-
|
364
|
-
after(:each) do
|
365
|
-
@schedule.delete
|
366
|
-
end
|
367
|
-
|
368
364
|
it 'Assigns the process_id and marks the object dirty' do
|
369
365
|
test_process_id = '1-2-3-4'
|
370
366
|
|
371
|
-
|
372
|
-
|
373
|
-
|
367
|
+
begin
|
368
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
369
|
+
schedule.process_id = test_process_id
|
370
|
+
expect(schedule.process_id).to eq(test_process_id)
|
371
|
+
expect(schedule.dirty).to eq(true)
|
372
|
+
ensure
|
373
|
+
schedule && schedule.delete
|
374
|
+
end
|
374
375
|
end
|
375
376
|
end
|
376
377
|
|
377
378
|
describe '#save' do
|
378
|
-
before(:each) do
|
379
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
380
|
-
end
|
381
|
-
|
382
|
-
after(:each) do
|
383
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
384
|
-
end
|
385
|
-
|
386
379
|
it 'Should save a schedule' do
|
387
|
-
|
388
|
-
|
380
|
+
begin
|
381
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
382
|
+
expect(@project.schedules(schedule.uri)).to eq schedule
|
383
|
+
expect(@project.schedules).to include(schedule)
|
384
|
+
ensure
|
385
|
+
schedule && schedule.delete
|
386
|
+
end
|
389
387
|
end
|
390
388
|
end
|
391
389
|
|
392
390
|
describe '#state' do
|
393
|
-
before(:each) do
|
394
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
395
|
-
end
|
396
|
-
|
397
|
-
after(:each) do
|
398
|
-
@schedule.delete
|
399
|
-
end
|
400
|
-
|
401
391
|
it 'Should return execution state as string' do
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
|
392
|
+
begin
|
393
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
394
|
+
res = schedule.state
|
395
|
+
res.should_not be_nil
|
396
|
+
res.should_not be_empty
|
397
|
+
res.should be_a_kind_of(String)
|
398
|
+
ensure
|
399
|
+
schedule && schedule.delete
|
400
|
+
end
|
406
401
|
end
|
407
402
|
end
|
408
403
|
|
409
404
|
describe '#type' do
|
410
|
-
before(:each) do
|
411
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
412
|
-
end
|
413
|
-
|
414
|
-
after(:each) do
|
415
|
-
@schedule.delete
|
416
|
-
end
|
417
|
-
|
418
405
|
it 'Should return execution type as string' do
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
406
|
+
begin
|
407
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
408
|
+
res = schedule.type
|
409
|
+
res.should_not be_nil
|
410
|
+
res.should_not be_empty
|
411
|
+
res.should be_a_kind_of(String)
|
412
|
+
ensure
|
413
|
+
schedule && schedule.delete
|
414
|
+
end
|
423
415
|
end
|
424
416
|
end
|
425
417
|
|
426
418
|
describe '#type=' do
|
427
|
-
before(:each) do
|
428
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
429
|
-
end
|
430
|
-
|
431
|
-
after(:each) do
|
432
|
-
@schedule.delete
|
433
|
-
end
|
434
|
-
|
435
419
|
it 'Assigns the type the object dirty' do
|
436
420
|
test_type = 'TEST'
|
437
421
|
|
438
|
-
|
439
|
-
|
440
|
-
|
422
|
+
begin
|
423
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
424
|
+
schedule.type = test_type
|
425
|
+
expect(schedule.type).to eq(test_type)
|
426
|
+
expect(schedule.dirty).to eq(true)
|
427
|
+
ensure
|
428
|
+
schedule && schedule.delete
|
429
|
+
end
|
441
430
|
end
|
442
431
|
end
|
443
432
|
|
444
433
|
describe '#timezone' do
|
445
|
-
before(:each) do
|
446
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
447
|
-
end
|
448
|
-
|
449
|
-
after(:each) do
|
450
|
-
@schedule.delete
|
451
|
-
end
|
452
|
-
|
453
434
|
it 'Should return timezone as string' do
|
454
|
-
|
455
|
-
|
456
|
-
|
457
|
-
|
435
|
+
begin
|
436
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
437
|
+
res = schedule.timezone
|
438
|
+
res.should_not be_nil
|
439
|
+
res.should_not be_empty
|
440
|
+
res.should be_a_kind_of(String)
|
441
|
+
ensure
|
442
|
+
schedule && schedule.delete
|
443
|
+
end
|
458
444
|
end
|
459
445
|
end
|
460
446
|
|
461
447
|
describe '#timezone=' do
|
462
|
-
before(:each) do
|
463
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
464
|
-
end
|
465
|
-
|
466
|
-
after(:each) do
|
467
|
-
@schedule.delete
|
468
|
-
end
|
469
|
-
|
470
448
|
it 'Assigns the timezone and marks the object dirty' do
|
471
449
|
test_timezone = 'PST'
|
472
450
|
|
473
|
-
|
474
|
-
|
475
|
-
|
451
|
+
begin
|
452
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data)
|
453
|
+
schedule.timezone = test_timezone
|
454
|
+
expect(schedule.timezone).to eq(test_timezone)
|
455
|
+
expect(schedule.dirty).to eq(true)
|
456
|
+
ensure
|
457
|
+
schedule && schedule.delete
|
458
|
+
end
|
476
459
|
end
|
477
460
|
end
|
478
461
|
|
479
462
|
describe '#reschedule' do
|
480
|
-
before(:each) do
|
481
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
482
|
-
end
|
483
|
-
|
484
|
-
after(:each) do
|
485
|
-
@schedule.delete
|
486
|
-
end
|
487
|
-
|
488
463
|
it 'Should return reschedule as integer' do
|
489
|
-
|
490
|
-
|
491
|
-
|
464
|
+
begin
|
465
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
466
|
+
res = schedule.reschedule
|
467
|
+
res.should_not be_nil
|
468
|
+
res.should be_a_kind_of(Integer)
|
469
|
+
ensure
|
470
|
+
schedule && schedule.delete
|
471
|
+
end
|
492
472
|
end
|
493
473
|
end
|
494
474
|
|
495
475
|
describe '#reschedule=' do
|
496
|
-
before(:each) do
|
497
|
-
@schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
498
|
-
end
|
499
|
-
|
500
|
-
after(:each) do
|
501
|
-
@schedule.delete
|
502
|
-
end
|
503
|
-
|
504
476
|
it 'Assigns the reschedule and marks the object dirty' do
|
505
477
|
test_reschedule = 45
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
478
|
+
|
479
|
+
begin
|
480
|
+
schedule = @project.create_schedule(ProcessHelper::PROCESS_ID, @test_cron, @project_executable, @test_data_with_optional_param)
|
481
|
+
schedule.reschedule = test_reschedule
|
482
|
+
expect(schedule.reschedule).to eq(test_reschedule)
|
483
|
+
expect(schedule.dirty).to eq(true)
|
484
|
+
ensure
|
485
|
+
schedule && schedule.delete
|
486
|
+
end
|
510
487
|
end
|
511
488
|
end
|
512
489
|
end
|