bulkforce 1.0.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 +7 -0
- data/.gitignore +8 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +19 -0
- data/Gemfile +14 -0
- data/Guardfile +8 -0
- data/LICENSE +9 -0
- data/README.md +211 -0
- data/Rakefile +6 -0
- data/bulkforce.gemspec +35 -0
- data/lib/bulkforce.rb +109 -0
- data/lib/bulkforce/batch.rb +61 -0
- data/lib/bulkforce/configuration.rb +42 -0
- data/lib/bulkforce/connection.rb +114 -0
- data/lib/bulkforce/connection_builder.rb +40 -0
- data/lib/bulkforce/helper.rb +77 -0
- data/lib/bulkforce/http.rb +272 -0
- data/lib/bulkforce/version.rb +3 -0
- data/spec/integration/delete_spec.rb +18 -0
- data/spec/integration/insert_spec.rb +22 -0
- data/spec/integration/query_spec.rb +25 -0
- data/spec/integration/update_spec.rb +18 -0
- data/spec/integration/upsert_spec.rb +22 -0
- data/spec/lib/bulkforce/batch_spec.rb +128 -0
- data/spec/lib/bulkforce/configuration_spec.rb +121 -0
- data/spec/lib/bulkforce/connection_builder_spec.rb +114 -0
- data/spec/lib/bulkforce/connection_spec.rb +99 -0
- data/spec/lib/bulkforce/helper_spec.rb +249 -0
- data/spec/lib/bulkforce/http_spec.rb +375 -0
- data/spec/lib/bulkforce_spec.rb +128 -0
- data/spec/spec_helper.rb +34 -0
- data/spec/support/integration_helpers.rb +64 -0
- data/spec/support/shared_examples.rb +21 -0
- metadata +199 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe "Bulk Delete", type: :integration do
|
5
|
+
let!(:result) { delete_contacts }
|
6
|
+
|
7
|
+
it "returns a Hash" do
|
8
|
+
expect(result).to be_a(Hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "sets state to 'Completed'" do
|
12
|
+
expect(result[:state]).to eq("Completed")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has no failed records" do
|
16
|
+
expect(result[:number_records_failed]).to eq("0")
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe "Bulk Insert", type: :integration do
|
5
|
+
let!(:result) { insert_contacts }
|
6
|
+
|
7
|
+
it "returns a Hash" do
|
8
|
+
expect(result).to be_a(Hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "sets state to 'Completed'" do
|
12
|
+
expect(result[:state]).to eq("Completed")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "sets correct number of records processed" do
|
16
|
+
expect(result[:number_records_processed]).to eq("2")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has no failed records" do
|
20
|
+
expect(result[:number_records_failed]).to eq("0")
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe "Bulk Query", type: :integration do
|
5
|
+
let!(:result) { client.query("Contact", "select Id from Contact limit 10").freeze }
|
6
|
+
|
7
|
+
let(:size) { 10 }
|
8
|
+
|
9
|
+
it "returns a hash" do
|
10
|
+
expect(result).to be_a(Hash)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "state is 'Completed'" do
|
14
|
+
expect(result[:state]).to eq("Completed")
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
it "returns an array of results" do
|
19
|
+
expect(result[:results]).to be_a(Array)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has correct size of results" do
|
23
|
+
expect(result[:results].count).to eq(size)
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe "Bulk Update", type: :integration do
|
5
|
+
let!(:result) { update_contacts }
|
6
|
+
|
7
|
+
it "returns a Hash" do
|
8
|
+
expect(result).to be_a(Hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "sets state to 'Completed'" do
|
12
|
+
expect(result[:state]).to eq("Completed")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has no failed records" do
|
16
|
+
expect(result[:number_records_failed]).to eq("0")
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe "Bulk Upsert", type: :integration do
|
5
|
+
let!(:result) { upsert_contacts; upsert_contacts }
|
6
|
+
|
7
|
+
it "returns a Hash" do
|
8
|
+
expect(result).to be_a(Hash)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "sets state to 'Completed'" do
|
12
|
+
expect(result[:state]).to eq("Completed")
|
13
|
+
end
|
14
|
+
|
15
|
+
it "sets correct number of records processed" do
|
16
|
+
expect(result[:number_records_processed]).to eq("2")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has no failed records" do
|
20
|
+
expect(result[:number_records_failed]).to eq("0")
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Bulkforce::Batch do
|
5
|
+
describe "#final_status" do
|
6
|
+
it "returns the final status if it already exists" do
|
7
|
+
b = described_class.new nil, nil, nil
|
8
|
+
expected_status = {w: :tf}
|
9
|
+
expect(b).not_to receive(:status)
|
10
|
+
b.instance_variable_set "@final_status", expected_status
|
11
|
+
expect(b.final_status).to eq(expected_status)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "returns specific final status for -1 batch id" do
|
15
|
+
b = described_class.new nil, nil, -1
|
16
|
+
expected_status = {
|
17
|
+
state: "Completed",
|
18
|
+
state_message: "Empty Request",
|
19
|
+
}
|
20
|
+
expect(b).not_to receive(:status)
|
21
|
+
expect(b.final_status).to eq(expected_status)
|
22
|
+
end
|
23
|
+
|
24
|
+
it "queries the status correctly" do
|
25
|
+
b = described_class.new nil, nil, nil
|
26
|
+
expect(b).to receive(:status).once.and_return({w: :tf})
|
27
|
+
# TODO lookup the actual result
|
28
|
+
expect(b).to receive(:results).once.and_return({g: :tfo})
|
29
|
+
expect(b.final_status).to eq({w: :tf, results: {g: :tfo}})
|
30
|
+
end
|
31
|
+
|
32
|
+
it "yields status correctly" do
|
33
|
+
expected_running_state = {
|
34
|
+
state: "InProgress"
|
35
|
+
}
|
36
|
+
expected_final_state = {
|
37
|
+
state: "Completed"
|
38
|
+
}
|
39
|
+
b = described_class.new nil, nil, nil
|
40
|
+
expect(b).to receive(:status).once.and_return(expected_running_state)
|
41
|
+
expect(b).to receive(:status).once.and_return(expected_running_state)
|
42
|
+
expect(b).to receive(:status).once.and_return(expected_final_state)
|
43
|
+
expect(b).to receive(:results).once.and_return({g: :tfo})
|
44
|
+
expect{|blk| b.final_status(0, &blk)}
|
45
|
+
.to yield_successive_args(expected_running_state, expected_final_state)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "raises exception when batch fails" do
|
49
|
+
b = described_class.new nil, nil, nil
|
50
|
+
expected_error_message = "Generic Error Message"
|
51
|
+
expect(b).to receive(:status).once.and_return(
|
52
|
+
{
|
53
|
+
state: "Failed",
|
54
|
+
state_message: expected_error_message})
|
55
|
+
expect{b.final_status}
|
56
|
+
.to raise_error(StandardError, expected_error_message)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
[:request, :result].each do |action|
|
61
|
+
let(:connection) { double("Bulkforce::Connection") }
|
62
|
+
let(:request_result) { "Generic Result/Request" }
|
63
|
+
describe "#raw_#{action}" do
|
64
|
+
|
65
|
+
it "sends correct messages to connection" do
|
66
|
+
b = described_class.new nil, nil, nil
|
67
|
+
b.instance_variable_set "@connection", connection
|
68
|
+
expect(connection).to receive(:"raw_#{action}").and_return(request_result)
|
69
|
+
expect(b.send(:"raw_#{action}")).to eq(request_result)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
describe "#results" do
|
75
|
+
let(:job_id) { "12345" }
|
76
|
+
let(:batch_id) { "67890" }
|
77
|
+
let(:connection) { double("connection") }
|
78
|
+
subject {described_class.new connection, job_id, batch_id}
|
79
|
+
|
80
|
+
context "with a single page of results" do
|
81
|
+
let(:result_id) {"M75200000001Vgt"}
|
82
|
+
let(:single_result) {{:Id=>"M75200000001Vgt", :name=>"Joe"}}
|
83
|
+
|
84
|
+
it "returns the results" do
|
85
|
+
expect(connection).to receive(:query_batch_result_id).
|
86
|
+
with(job_id, batch_id).
|
87
|
+
and_return({:result => result_id})
|
88
|
+
|
89
|
+
expect(connection).to receive(:query_batch_result_data).
|
90
|
+
once.
|
91
|
+
with(job_id, batch_id, result_id).
|
92
|
+
and_return(single_result)
|
93
|
+
|
94
|
+
expect(subject.results).to eq([single_result])
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "with an array of page of results" do
|
99
|
+
let(:result_ids) {["M75200000001Vgt", "M76500000001Vgt", "M73400000001Vgt"]}
|
100
|
+
let(:multiple_results) {[{:Id=>"AAA11123", :name=>"Joe"},
|
101
|
+
{:Id=>"AAA11124", :name=>"Sam"},
|
102
|
+
{:Id=>"AAA11125", :name=>"Mike"}]}
|
103
|
+
|
104
|
+
it "returns concatenated results" do
|
105
|
+
expect(connection).to receive(:query_batch_result_id).
|
106
|
+
with(job_id, batch_id).
|
107
|
+
and_return({:result => result_ids})
|
108
|
+
|
109
|
+
expect(connection).to receive(:query_batch_result_data).
|
110
|
+
ordered.
|
111
|
+
with(job_id, batch_id, result_ids[0]).
|
112
|
+
and_return(multiple_results[0])
|
113
|
+
|
114
|
+
expect(connection).to receive(:query_batch_result_data).
|
115
|
+
ordered.
|
116
|
+
with(job_id, batch_id, result_ids[1]).
|
117
|
+
and_return(multiple_results[1])
|
118
|
+
|
119
|
+
expect(connection).to receive(:query_batch_result_data).
|
120
|
+
ordered.
|
121
|
+
with(job_id, batch_id, result_ids[2]).
|
122
|
+
and_return(multiple_results[2])
|
123
|
+
|
124
|
+
expect(subject.results).to eq(multiple_results)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Bulkforce::Configuration do
|
5
|
+
subject { described_class.new }
|
6
|
+
|
7
|
+
context "api_version" do
|
8
|
+
include_examples "configuration settings", name: :api_version, expected_default: "33.0", env_variable: "SALESFORCE_API_VERSION"
|
9
|
+
end
|
10
|
+
|
11
|
+
context "username" do
|
12
|
+
include_examples "configuration settings", name: :username, expected_default: nil, env_variable: "SALESFORCE_USERNAME"
|
13
|
+
end
|
14
|
+
|
15
|
+
context "password" do
|
16
|
+
include_examples "configuration settings", name: :password, expected_default: nil, env_variable: "SALESFORCE_PASSWORD"
|
17
|
+
end
|
18
|
+
|
19
|
+
context "security_token" do
|
20
|
+
include_examples "configuration settings", name: :security_token, expected_default: nil, env_variable: "SALESFORCE_SECURITY_TOKEN"
|
21
|
+
end
|
22
|
+
|
23
|
+
context "host" do
|
24
|
+
include_examples "configuration settings", name: :host, expected_default: "login.salesforce.com", env_variable: "SALESFORCE_HOST"
|
25
|
+
end
|
26
|
+
|
27
|
+
context "session_id" do
|
28
|
+
include_examples "configuration settings", name: :session_id, expected_default: nil, env_variable: "SALESFORCE_SESSION_ID"
|
29
|
+
end
|
30
|
+
|
31
|
+
context "instance" do
|
32
|
+
include_examples "configuration settings", name: :instance, expected_default: nil, env_variable: "SALESFORCE_INSTANCE"
|
33
|
+
end
|
34
|
+
|
35
|
+
context "client_id" do
|
36
|
+
include_examples "configuration settings", name: :client_id, expected_default: nil, env_variable: "SALESFORCE_CLIENT_ID"
|
37
|
+
end
|
38
|
+
|
39
|
+
context "client_secret" do
|
40
|
+
include_examples "configuration settings", name: :client_secret, expected_default: nil, env_variable: "SALESFORCE_CLIENT_SECRET"
|
41
|
+
end
|
42
|
+
|
43
|
+
context "refresh_token" do
|
44
|
+
include_examples "configuration settings", name: :refresh_token, expected_default: nil, env_variable: "SALESFORCE_REFRESH_TOKEN"
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "#to_h" do
|
48
|
+
let(:api_version) { "configuration_spec_api_version" }
|
49
|
+
let(:username) { "configuration_spec_user" }
|
50
|
+
let(:password) { "configuration_spec_password" }
|
51
|
+
let(:security_token) { "configuration_spec_security_token" }
|
52
|
+
let(:host) { "configuration_spec_host" }
|
53
|
+
let(:session_id) { "00Dx0000000BV7z!AR8AQP0jITN80ESEsj5EbaZTFG0RNBaT1cyWk7TrqoDjoNIWQ2ME_sTZzBjfmOE6zMHq6y8PIW4eWze9JksNEkWUl.Cju7m4" }
|
54
|
+
let(:instance) { "eu2" }
|
55
|
+
let(:client_id) { "3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA9GE&client_secret=1955279925675241571" }
|
56
|
+
let(:client_secret) { "3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA9GE&client_secret=1955279925675241571" }
|
57
|
+
let(:refresh_token) { "Ytwns3AKGIlTka3v9f6Md4kvZsMA9xNgMqVWdaNvBkfUaE7N6TbyVGEZ5eazoHJsa9RVgC5YvdbmPGeSZQNe3A" }
|
58
|
+
|
59
|
+
context "all values set" do
|
60
|
+
subject do
|
61
|
+
described_class.new.tap do |c|
|
62
|
+
c.api_version= api_version
|
63
|
+
c.username = username
|
64
|
+
c.password = password
|
65
|
+
c.security_token = security_token
|
66
|
+
c.host = host
|
67
|
+
c.session_id = session_id
|
68
|
+
c.instance = instance
|
69
|
+
c.client_id = client_id
|
70
|
+
c.client_secret = client_secret
|
71
|
+
c.refresh_token = refresh_token
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
let(:expected_hash) do
|
76
|
+
{
|
77
|
+
api_version: api_version,
|
78
|
+
username: username,
|
79
|
+
password: password,
|
80
|
+
security_token: security_token,
|
81
|
+
host: host,
|
82
|
+
session_id: session_id,
|
83
|
+
instance: instance,
|
84
|
+
client_id: client_id,
|
85
|
+
client_secret: client_secret,
|
86
|
+
refresh_token: refresh_token,
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
it "converts to expected hash" do
|
91
|
+
expect(subject.to_h).to eq(expected_hash)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
context "some values missing" do
|
96
|
+
subject do
|
97
|
+
described_class.new.tap do |c|
|
98
|
+
c.api_version= api_version
|
99
|
+
c.username = username
|
100
|
+
c.password = password
|
101
|
+
c.security_token = security_token
|
102
|
+
c.host = host
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
let(:expected_hash) do
|
107
|
+
{
|
108
|
+
api_version: api_version,
|
109
|
+
username: username,
|
110
|
+
password: password,
|
111
|
+
security_token: security_token,
|
112
|
+
host: host,
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
it "converts to expected hash" do
|
117
|
+
expect(subject.to_h).to eq(expected_hash)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,114 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
|
4
|
+
describe Bulkforce::ConnectionBuilder do
|
5
|
+
describe "#build" do
|
6
|
+
subject { described_class.new(options) }
|
7
|
+
let!(:session_id) { "org_id!session_id" }
|
8
|
+
let!(:instance) { "eu2" }
|
9
|
+
|
10
|
+
before(:each) do
|
11
|
+
allow(Bulkforce::Http).to receive(:login).and_return(session_id: "org_id!session_id", instance: "eu2")
|
12
|
+
allow(Bulkforce::Http).to receive(:oauth_login).and_return(session_id: "org_id!session_id", instance: "eu2")
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:host) { "login.salesforce.com" }
|
16
|
+
let(:api_version) { "33.0" }
|
17
|
+
let(:connection) { subject.build }
|
18
|
+
|
19
|
+
context "username/password" do
|
20
|
+
let(:options) do
|
21
|
+
{
|
22
|
+
host: host,
|
23
|
+
username: username,
|
24
|
+
password: password,
|
25
|
+
security_token: security_token,
|
26
|
+
api_version: api_version,
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
let(:username) { "leif@home.com" }
|
31
|
+
let(:password) { "password" }
|
32
|
+
let(:security_token) { "security_token" }
|
33
|
+
|
34
|
+
it "returns a connection" do
|
35
|
+
expect(connection).to be_a(Bulkforce::Connection)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "triggers login with username, password and security token" do
|
39
|
+
subject.build
|
40
|
+
expect(Bulkforce::Http).
|
41
|
+
to have_received(:login).
|
42
|
+
with(host, username, "#{password}#{security_token}", api_version)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "builds connection with correct attributes", :aggregate_failures do
|
46
|
+
expect(connection.instance_variable_get("@session_id")).to eq(session_id)
|
47
|
+
expect(connection.instance_variable_get("@instance")).to eq(instance)
|
48
|
+
expect(connection.instance_variable_get("@api_version")).to eq(api_version)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
context "session id" do
|
53
|
+
let(:options) do
|
54
|
+
{
|
55
|
+
host: host,
|
56
|
+
session_id: session_id,
|
57
|
+
instance: instance,
|
58
|
+
api_version: api_version,
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
let(:session_id) { "00Dx0000000BV7z!AR8AQP0jITN80ESEsj5EbaZTFG0RNBaT1cyWk7TrqoDjoNIWQ2ME_sTZzBjfmOE6zMHq6y8PIW4eWze9JksNEkWUl.Cju7m4" }
|
63
|
+
let(:instance) { "eu2" }
|
64
|
+
|
65
|
+
it "returns a connection" do
|
66
|
+
expect(subject.build).to be_a(Bulkforce::Connection)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "does not trigger HTTP login workflow" do
|
70
|
+
subject.build
|
71
|
+
expect(Bulkforce::Http).not_to have_received(:login)
|
72
|
+
end
|
73
|
+
|
74
|
+
it "builds connection with correct attributes", :aggregate_failures do
|
75
|
+
expect(connection.instance_variable_get("@session_id")).to eq(session_id)
|
76
|
+
expect(connection.instance_variable_get("@instance")).to eq(instance)
|
77
|
+
expect(connection.instance_variable_get("@api_version")).to eq(api_version)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context "oauth refresh token" do
|
82
|
+
let(:options) do
|
83
|
+
{
|
84
|
+
host: host,
|
85
|
+
client_id: client_id,
|
86
|
+
client_secret: client_secret,
|
87
|
+
refresh_token: refresh_token,
|
88
|
+
api_version: api_version,
|
89
|
+
}
|
90
|
+
end
|
91
|
+
|
92
|
+
let(:client_id) { "3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA9GE&client_secret=1955279925675241571" }
|
93
|
+
let(:client_secret) { "3MVG9lKcPoNINVBIPJjdw1J9LLM82HnFVVX19KY1uA5mu0QqEWhqKpoW3svG3XHrXDiCQjK1mdgAvhCscA9GE&client_secret=1955279925675241571" }
|
94
|
+
let(:refresh_token) { "Ytwns3AKGIlTka3v9f6Md4kvZsMA9xNgMqVWdaNvBkfUaE7N6TbyVGEZ5eazoHJsa9RVgC5YvdbmPGeSZQNe3A" }
|
95
|
+
|
96
|
+
it "returns a connection" do
|
97
|
+
expect(connection).to be_a(Bulkforce::Connection)
|
98
|
+
end
|
99
|
+
|
100
|
+
it "triggers login with username, password and security token" do
|
101
|
+
subject.build
|
102
|
+
expect(Bulkforce::Http).
|
103
|
+
to have_received(:oauth_login).
|
104
|
+
with(host, client_id, client_secret, refresh_token)
|
105
|
+
end
|
106
|
+
|
107
|
+
it "builds connection with correct attributes", :aggregate_failures do
|
108
|
+
expect(connection.instance_variable_get("@session_id")).to eq(session_id)
|
109
|
+
expect(connection.instance_variable_get("@instance")).to eq(instance)
|
110
|
+
expect(connection.instance_variable_get("@api_version")).to eq(api_version)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|