fuelsdk 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog.md +13 -0
- data/fuelsdk.gemspec +1 -0
- data/lib/fuelsdk.rb +1 -0
- data/lib/fuelsdk/client.rb +34 -21
- data/lib/fuelsdk/rest.rb +1 -1
- data/lib/fuelsdk/soap.rb +152 -46
- data/lib/fuelsdk/targeting.rb +10 -9
- data/lib/fuelsdk/version.rb +1 -1
- data/spec/client_spec.rb +10 -0
- data/spec/fuelsdk_response_spec.rb +5 -0
- data/spec/objects_spec.rb +0 -1
- data/spec/soap/configure_spec.rb +19 -0
- data/spec/soap/cud_spec.rb +132 -0
- data/spec/soap/describe_error_spec.rb +25 -0
- data/spec/soap/get_spec.rb +257 -0
- data/spec/soap/perform_spec.rb +53 -0
- data/spec/{soap_spec.rb → soap/soap_spec.rb} +2 -3
- data/spec/spec_helper.rb +48 -0
- data/spec/targeting_spec.rb +46 -15
- metadata +33 -6
- data/spec/objects_helper_spec.rb +0 -32
data/ChangeLog.md
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
FuelSDK-Ruby
|
2
|
+
============
|
3
|
+
|
4
|
+
2013-09-11: Version 0.1.1
|
5
|
+
```
|
6
|
+
Added ChangeLog
|
7
|
+
|
8
|
+
soap_configure, soap_perform with supporting tests
|
9
|
+
|
10
|
+
make soap_cud more rubular and easier to read and support
|
11
|
+
|
12
|
+
fixed some issues when trying to make requests after being passed a jwt
|
13
|
+
```
|
data/fuelsdk.gemspec
CHANGED
data/lib/fuelsdk.rb
CHANGED
data/lib/fuelsdk/client.rb
CHANGED
@@ -3,7 +3,7 @@ module FuelSDK
|
|
3
3
|
# not doing accessor so user, can't update these values from response.
|
4
4
|
# You will see in the code some of these
|
5
5
|
# items are being updated via back doors and such.
|
6
|
-
attr_reader :code, :message, :results, :request_id, :body, :raw
|
6
|
+
attr_reader :code, :message, :results, :request_id, :body, :raw, :decoded_jwt
|
7
7
|
|
8
8
|
# some defaults
|
9
9
|
def success
|
@@ -17,11 +17,11 @@ module FuelSDK
|
|
17
17
|
end
|
18
18
|
alias :more? :more
|
19
19
|
|
20
|
-
def initialize raw, client
|
20
|
+
def initialize raw=nil, client=nil
|
21
21
|
@client = client # keep connection with client in case we request more
|
22
22
|
@results = []
|
23
23
|
@raw = raw
|
24
|
-
unpack raw
|
24
|
+
unpack raw if raw
|
25
25
|
rescue => ex # all else fails return raw
|
26
26
|
puts ex.message
|
27
27
|
raw
|
@@ -38,16 +38,26 @@ module FuelSDK
|
|
38
38
|
end
|
39
39
|
|
40
40
|
class Client
|
41
|
-
attr_accessor :debug, :
|
41
|
+
attr_accessor :debug, :auth_token, :internal_token, :refresh_token,
|
42
42
|
:id, :secret, :signature
|
43
43
|
|
44
44
|
include FuelSDK::Soap
|
45
45
|
include FuelSDK::Rest
|
46
46
|
|
47
|
+
def cache
|
48
|
+
@cache ||= {
|
49
|
+
:retrievable => {},
|
50
|
+
:editable => {}
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
47
54
|
def jwt= encoded_jwt
|
48
55
|
raise 'Require app signature to decode JWT' unless self.signature
|
49
|
-
decoded_jwt
|
56
|
+
self.decoded_jwt=JWT.decode(encoded_jwt, self.signature, true)
|
57
|
+
end
|
50
58
|
|
59
|
+
def decoded_jwt= decoded_jwt
|
60
|
+
@decoded_jwt = decoded_jwt
|
51
61
|
self.auth_token = decoded_jwt['request']['user']['oauthToken']
|
52
62
|
self.internal_token = decoded_jwt['request']['user']['internalOauthToken']
|
53
63
|
self.refresh_token = decoded_jwt['request']['user']['refreshToken']
|
@@ -69,29 +79,32 @@ module FuelSDK
|
|
69
79
|
self.wsdl = params["defaultwsdl"] if params["defaultwsdl"]
|
70
80
|
end
|
71
81
|
|
72
|
-
def
|
82
|
+
def request_token_data
|
73
83
|
raise 'Require Client Id and Client Secret to refresh tokens' unless (id && secret)
|
84
|
+
Hash.new.tap do |h|
|
85
|
+
h['clientId']= id
|
86
|
+
h['clientSecret'] = secret
|
87
|
+
h['refreshToken'] = refresh_token if refresh_token
|
88
|
+
h['accessType'] = 'offline'
|
89
|
+
end
|
90
|
+
end
|
74
91
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
options = Hash.new.tap do |h|
|
84
|
-
h['data'] = payload
|
85
|
-
h['content_type'] = 'application/json'
|
86
|
-
h['params'] = {'legacy' => 1}
|
87
|
-
end
|
92
|
+
def request_token_options data
|
93
|
+
Hash.new.tap do |h|
|
94
|
+
h['data'] = data
|
95
|
+
h['content_type'] = 'application/json'
|
96
|
+
h['params'] = {'legacy' => 1}
|
97
|
+
end
|
98
|
+
end
|
88
99
|
|
100
|
+
def refresh force=false
|
101
|
+
if (self.auth_token.nil? || force)
|
102
|
+
options = request_token_options(request_token_data)
|
89
103
|
response = post("https://auth.exacttargetapis.com/v1/requestToken", options)
|
90
104
|
raise "Unable to refresh token: #{response['message']}" unless response.has_key?('accessToken')
|
91
105
|
|
92
|
-
self.
|
106
|
+
self.auth_token = response['accessToken']
|
93
107
|
self.internal_token = response['legacyToken']
|
94
|
-
#@authTokenExpiration = Time.new + tokenResponse['expiresIn']
|
95
108
|
self.refresh_token = response['refreshToken'] if response.has_key?("refreshToken")
|
96
109
|
end
|
97
110
|
end
|
data/lib/fuelsdk/rest.rb
CHANGED
@@ -67,7 +67,7 @@ module FuelSDK
|
|
67
67
|
def rest_request action, url, options={}
|
68
68
|
retried = false
|
69
69
|
begin
|
70
|
-
(options['params'] ||= {}).merge! 'access_token' =>
|
70
|
+
(options['params'] ||= {}).merge! 'access_token' => auth_token
|
71
71
|
rsp = rest_client.send(action, url, options)
|
72
72
|
raise 'Unauthorized' if rsp.message == 'Unauthorized'
|
73
73
|
rescue
|
data/lib/fuelsdk/soap.rb
CHANGED
@@ -1,6 +1,15 @@
|
|
1
1
|
require 'savon'
|
2
2
|
module FuelSDK
|
3
3
|
|
4
|
+
class DescribeError < StandardError
|
5
|
+
attr_reader :response
|
6
|
+
def initialize response=nil, message=nil
|
7
|
+
response.instance_variable_set(:@message, message) # back door update
|
8
|
+
@response = response
|
9
|
+
super message
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
4
13
|
class SoapResponse < FuelSDK::Response
|
5
14
|
|
6
15
|
def continue
|
@@ -124,37 +133,112 @@ module FuelSDK
|
|
124
133
|
soap_request :describe, message
|
125
134
|
end
|
126
135
|
|
127
|
-
def
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
+
def get_all_object_properties object_type
|
137
|
+
rsp = soap_describe object_type
|
138
|
+
raise DescribeError.new(rsp, "Unable to get #{object_type}") unless rsp.success?
|
139
|
+
rsp
|
140
|
+
end
|
141
|
+
|
142
|
+
def cache_properties action, object_type, properties
|
143
|
+
raise 'Properties should be in cache as a list' unless properties.kind_of? Array
|
144
|
+
cache[action][object_type] = properties
|
145
|
+
end
|
146
|
+
|
147
|
+
def cached_properties? action, object_type
|
148
|
+
cache[action][object_type] rescue nil
|
149
|
+
end
|
150
|
+
|
151
|
+
def retrievable_properties_cached? object_type
|
152
|
+
cached_properties? :retrievable, object_type
|
153
|
+
end
|
154
|
+
|
155
|
+
def cache_retrievable object_type, properties
|
156
|
+
cache_properties :retrievable, object_type, properties
|
157
|
+
end
|
158
|
+
|
159
|
+
def get_retrievable_properties object_type
|
160
|
+
if props=retrievable_properties_cached?(object_type)
|
161
|
+
props
|
162
|
+
else
|
163
|
+
cache_retrievable object_type, get_all_object_properties(object_type).retrievable
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def editable_properties_cached? object_type
|
168
|
+
cached_properties? :editable, object_type
|
169
|
+
end
|
170
|
+
|
171
|
+
def cache_editable object_type, properties
|
172
|
+
cache_properties :editable, object_type, properties
|
173
|
+
end
|
174
|
+
|
175
|
+
def get_editable_properties object_type
|
176
|
+
if props=editable_properties_cached?(object_type)
|
177
|
+
props
|
178
|
+
else
|
179
|
+
cache_editable object_type, get_all_object_properties(object_type).editable
|
180
|
+
end
|
181
|
+
end
|
182
|
+
|
183
|
+
def normalize_properties_for_retrieve object_type, properties
|
184
|
+
if properties.nil? or properties.blank?
|
185
|
+
get_retrievable_properties object_type
|
136
186
|
elsif properties.kind_of? Hash
|
137
|
-
properties
|
187
|
+
properties.keys
|
138
188
|
elsif properties.kind_of? String
|
139
|
-
|
189
|
+
[properties]
|
190
|
+
elsif properties.kind_of? Symbol
|
191
|
+
[properties.to_s]
|
192
|
+
else
|
193
|
+
properties
|
140
194
|
end
|
195
|
+
end
|
141
196
|
|
142
|
-
|
197
|
+
def add_simple_filter_part filter
|
198
|
+
{
|
199
|
+
'Filter' => filter,
|
200
|
+
:attributes! => { 'Filter' => { 'xsi:type' => 'tns:SimpleFilterPart' }}
|
201
|
+
}
|
202
|
+
end
|
143
203
|
|
144
|
-
|
145
|
-
|
146
|
-
|
204
|
+
def add_complex_filter_part filter
|
205
|
+
filter[:attributes!] = {
|
206
|
+
'LeftOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' },
|
207
|
+
'RightOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' }
|
208
|
+
}
|
147
209
|
|
210
|
+
{
|
211
|
+
'Filter' => filter,
|
212
|
+
:attributes! => { 'Filter' => { 'xsi:type' => 'tns:ComplexFilterPart' }}
|
213
|
+
}
|
214
|
+
end
|
215
|
+
|
216
|
+
def normalize_filter filter
|
217
|
+
if filter and filter.kind_of? Hash
|
148
218
|
if filter.has_key?('LogicalOperator')
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
'RightOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' }}
|
219
|
+
add_complex_filter_part filter
|
220
|
+
else
|
221
|
+
add_simple_filter_part filter
|
153
222
|
end
|
223
|
+
else
|
224
|
+
{}
|
154
225
|
end
|
155
|
-
|
226
|
+
end
|
227
|
+
|
228
|
+
def create_object_type_message object_type, properties, filter
|
229
|
+
{'ObjectType' => object_type, 'Properties' => properties}.merge filter
|
230
|
+
end
|
231
|
+
|
232
|
+
def soap_get object_type, properties=nil, filter=nil
|
233
|
+
|
234
|
+
properties = normalize_properties_for_retrieve object_type, properties
|
235
|
+
filter = normalize_filter filter
|
236
|
+
message = create_object_type_message(object_type, properties, filter)
|
237
|
+
|
238
|
+
soap_request :retrieve, 'RetrieveRequest' => message
|
156
239
|
|
157
|
-
|
240
|
+
rescue DescribeError => err
|
241
|
+
return err.response
|
158
242
|
end
|
159
243
|
|
160
244
|
def soap_post object_type, properties
|
@@ -169,43 +253,65 @@ module FuelSDK
|
|
169
253
|
soap_cud :delete, object_type, properties
|
170
254
|
end
|
171
255
|
|
172
|
-
def
|
173
|
-
|
256
|
+
def create_action_message message_type, object_type, properties, action
|
257
|
+
properties = [properties] unless properties.kind_of? Array
|
258
|
+
{
|
174
259
|
'Action' => action,
|
175
|
-
|
176
|
-
|
260
|
+
message_type => {
|
261
|
+
message_type.singularize => properties,
|
177
262
|
:attributes! => {
|
178
|
-
|
263
|
+
message_type.singularize => { 'xsi:type' => ('tns:' + object_type) }
|
179
264
|
}
|
180
265
|
}
|
181
266
|
}
|
267
|
+
end
|
268
|
+
|
269
|
+
def soap_perform object_type, properties, action
|
270
|
+
message = create_action_message 'Definitions', object_type, properties, action
|
182
271
|
soap_request :perform, message
|
183
272
|
end
|
184
273
|
|
185
|
-
|
274
|
+
def soap_configure object_type, properties, action
|
275
|
+
message = create_action_message 'Configurations', object_type, properties, action
|
276
|
+
soap_request :configure, message
|
277
|
+
end
|
186
278
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
279
|
+
def create_objects_message object_type, object_properties
|
280
|
+
raise 'Object properties must be a List' unless object_properties.kind_of? Array
|
281
|
+
raise 'Object properties must be a List of Hashes' unless object_properties.first.kind_of? Hash
|
282
|
+
|
283
|
+
{
|
284
|
+
'Objects' => object_properties,
|
285
|
+
:attributes! => {'Objects' => { 'xsi:type' => ('tns:' + object_type) }}
|
286
|
+
}
|
287
|
+
end
|
288
|
+
|
289
|
+
def normalize_properties_for_cud object_type, properties
|
290
|
+
properties = [properties] unless properties.kind_of? Array
|
291
|
+
raise 'Object properties must be a Hash' unless properties.first.kind_of? Hash
|
292
|
+
|
293
|
+
# get a list of attributes so we can seperate
|
294
|
+
# them from standard object properties
|
295
|
+
type_attrs = get_editable_properties object_type
|
296
|
+
|
297
|
+
properties.each do |p|
|
298
|
+
formated_attrs = []
|
299
|
+
p.each do |k, v|
|
300
|
+
if type_attrs.include? k
|
301
|
+
p.delete k
|
302
|
+
attrs = FuelSDK.format_name_value_pairs k => v
|
303
|
+
formated_attrs.concat attrs
|
201
304
|
end
|
202
|
-
(p['Attributes'] ||= []).concat formated_attrs unless formated_attrs.empty?
|
203
305
|
end
|
306
|
+
(p['Attributes'] ||= []).concat formated_attrs unless formated_attrs.blank?
|
307
|
+
end
|
308
|
+
end
|
204
309
|
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
310
|
+
private
|
311
|
+
|
312
|
+
def soap_cud action, object_type, properties
|
313
|
+
properties = normalize_properties_for_cud object_type, properties
|
314
|
+
message = create_objects_message object_type, properties
|
209
315
|
soap_request action, message
|
210
316
|
end
|
211
317
|
|
data/lib/fuelsdk/targeting.rb
CHANGED
@@ -1,22 +1,23 @@
|
|
1
1
|
module FuelSDK::Targeting
|
2
|
-
attr_accessor :
|
2
|
+
attr_accessor :auth_token
|
3
3
|
attr_reader :endpoint
|
4
4
|
|
5
5
|
include FuelSDK::HTTPRequest
|
6
6
|
|
7
|
+
def refresh
|
8
|
+
raise NotImplementedError
|
9
|
+
end
|
10
|
+
|
7
11
|
def endpoint
|
8
|
-
|
9
|
-
determine_stack
|
10
|
-
end
|
11
|
-
@endpoint
|
12
|
+
@endpoint ||= determine_stack
|
12
13
|
end
|
13
14
|
|
14
15
|
protected
|
15
16
|
def determine_stack
|
16
|
-
|
17
|
+
refresh unless self.auth_token
|
18
|
+
options = {'params' => {'access_token' => self.auth_token}}
|
17
19
|
response = get("https://www.exacttargetapis.com/platform/v1/endpoints/soap", options)
|
18
|
-
|
19
|
-
|
20
|
-
raise 'Unable to determine stack using: ' + e.message
|
20
|
+
raise 'Unable to determine stack' unless response.success?
|
21
|
+
response['url']
|
21
22
|
end
|
22
23
|
end
|
data/lib/fuelsdk/version.rb
CHANGED
data/spec/client_spec.rb
CHANGED
@@ -2,6 +2,16 @@ require 'spec_helper.rb'
|
|
2
2
|
|
3
3
|
describe FuelSDK::Client do
|
4
4
|
|
5
|
+
it { should respond_to :cache }
|
6
|
+
|
7
|
+
describe '#cache' do
|
8
|
+
let(:client) { FuelSDK::Client.new }
|
9
|
+
|
10
|
+
it 'its default keys are retrievable and editable' do
|
11
|
+
expect(client.cache).to eq({:retrievable => {}, :editable => {}})
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
5
15
|
context 'initialized' do
|
6
16
|
|
7
17
|
it 'with client parameters' do
|
data/spec/objects_spec.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FuelSDK::Soap do
|
4
|
+
|
5
|
+
let(:client) { FuelSDK::Client.new }
|
6
|
+
subject {client}
|
7
|
+
|
8
|
+
it 'has inflector support' do
|
9
|
+
expect('Configurations'.singularize).to eq 'Configuration'
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#soap_configure' do
|
13
|
+
it 'makes a soap configure request with message' do
|
14
|
+
subject.should_receive(:create_action_message).with('Configurations', 'Subscriber', [], 'Do it').and_return({})
|
15
|
+
subject.should_receive(:soap_request).with(:configure, {})
|
16
|
+
subject.soap_configure 'Subscriber', [], 'Do it'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FuelSDK::Soap do
|
4
|
+
|
5
|
+
let(:client) { FuelSDK::Client.new }
|
6
|
+
|
7
|
+
subject { client }
|
8
|
+
|
9
|
+
describe '#editable_properties_cached?' do
|
10
|
+
it 'returns a list of editable properties for the object' do
|
11
|
+
subject.should_receive(:cached_properties?)
|
12
|
+
.with(:editable, 'item')
|
13
|
+
.and_return(['prop'])
|
14
|
+
|
15
|
+
expect(subject.editable_properties_cached? 'item').to eq(['prop'])
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'returns nil if not cached' do
|
19
|
+
expect(subject.editable_properties_cached? 'missing').to be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '#get_editable_properties' do
|
24
|
+
it 'returns cached properties' do
|
25
|
+
subject.should_receive(:editable_properties_cached?)
|
26
|
+
.with('object')
|
27
|
+
.and_return(['prop'])
|
28
|
+
|
29
|
+
subject.should_not_receive(:get_all_object_properties)
|
30
|
+
subject.should_not_receive(:cache_editable)
|
31
|
+
|
32
|
+
expect(subject.get_editable_properties('object')).to eq ['prop']
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'requests and caches properties when not in cache' do
|
36
|
+
subject.should_receive(:editable_properties_cached?)
|
37
|
+
.with('object')
|
38
|
+
.and_return(nil)
|
39
|
+
|
40
|
+
response = double(FuelSDK::DescribeResponse)
|
41
|
+
response.stub(:editable).and_return(['prop'])
|
42
|
+
subject.should_receive(:get_all_object_properties)
|
43
|
+
.and_return(response)
|
44
|
+
|
45
|
+
subject.should_receive(:cache_editable)
|
46
|
+
.with('object', ['prop'])
|
47
|
+
.and_return(['prop'])
|
48
|
+
|
49
|
+
expect(subject.get_editable_properties('object')).to eq ['prop']
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#cache_editable' do
|
54
|
+
it 'caches object properties to :editable' do
|
55
|
+
subject.cache_editable('Subscriber', ['Email'])
|
56
|
+
expect(subject.cache[:editable]).to eq 'Subscriber' => ['Email']
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#normalize_properties_for_cud' do
|
61
|
+
|
62
|
+
it 'creates soap objects properties hash putting ' \
|
63
|
+
'custom attributes into name value pairs' do
|
64
|
+
|
65
|
+
subject.should_receive(:get_editable_properties)
|
66
|
+
.with('Subscriber')
|
67
|
+
.and_return(['FirstName'])
|
68
|
+
|
69
|
+
expect(subject.normalize_properties_for_cud(
|
70
|
+
'Subscriber',
|
71
|
+
[{'Email' => 'dev@exacttarget.com', 'FirstName' => 'Devy'}]
|
72
|
+
)).to eq(
|
73
|
+
[{
|
74
|
+
'Email' => 'dev@exacttarget.com',
|
75
|
+
'Attributes' => [{'Name' => 'FirstName', 'Value' => 'Devy'}]
|
76
|
+
}]
|
77
|
+
)
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'converts properties into an array' do
|
81
|
+
subject.should_receive(:get_editable_properties)
|
82
|
+
.with('Subscriber')
|
83
|
+
.and_return(['FirstName'])
|
84
|
+
|
85
|
+
expect(subject.normalize_properties_for_cud(
|
86
|
+
'Subscriber',
|
87
|
+
{'Email' => 'dev@exacttarget.com', 'FirstName' => 'Devy'}
|
88
|
+
)).to eq(
|
89
|
+
[{
|
90
|
+
'Email' => 'dev@exacttarget.com',
|
91
|
+
'Attributes' => [{'Name' => 'FirstName', 'Value' => 'Devy'}]
|
92
|
+
}]
|
93
|
+
)
|
94
|
+
end
|
95
|
+
|
96
|
+
it 'raises an exception if properties are not a hash' do
|
97
|
+
expect { subject.normalize_properties_for_cud('Subscriber', 'Email') }
|
98
|
+
.to raise_error
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
describe '#create_objects_message' do
|
103
|
+
it 'creates hash for soap message' do
|
104
|
+
obj_attributes = [{'Name' => 'First Name', 'Value' => 'Justin'}]
|
105
|
+
expect(subject.create_objects_message('object', obj_attributes)).to eq(
|
106
|
+
{
|
107
|
+
'Objects' => [{'Name' => 'First Name', 'Value' => 'Justin'}],
|
108
|
+
:attributes! => {'Objects' => { 'xsi:type' => 'tns:object' }}
|
109
|
+
}
|
110
|
+
)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'raises an exception if object attributes is not an Array' do
|
114
|
+
expect{ subject.create_objects_message('object', '1') }.to raise_error
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'raises an exception if object attributes are not stored in a hash' do
|
118
|
+
expect{ subject.create_objects_message('object', ['1']) }.to raise_error
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
describe '#soap_cud' do
|
123
|
+
it 'request with message created with normalized properties' do
|
124
|
+
|
125
|
+
subject.should_receive(:normalize_properties_for_cud)
|
126
|
+
subject.should_receive(:create_objects_message)
|
127
|
+
subject.should_receive(:soap_request)
|
128
|
+
|
129
|
+
subject.send :soap_cud, :post, 'Subscriber', [{'EmailAddress' => 'dev@exacttarget.com'}]
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FuelSDK::DescribeError do
|
4
|
+
|
5
|
+
it { should respond_to(:response) }
|
6
|
+
|
7
|
+
let (:triggering) { FuelSDK::SoapResponse.new }
|
8
|
+
|
9
|
+
it 'has passed message as error' do
|
10
|
+
error = FuelSDK::DescribeError.new(triggering, 'i am an error message')
|
11
|
+
expect(error.message).to eq 'i am an error message'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'triggering response is available' do
|
15
|
+
error = FuelSDK::DescribeError.new(triggering, 'i am an error message')
|
16
|
+
expect(error.response).to eq triggering
|
17
|
+
end
|
18
|
+
|
19
|
+
it 'sets message on response' do
|
20
|
+
expect(triggering.message).to be_nil
|
21
|
+
error = FuelSDK::DescribeError.new(triggering, 'i am an error message')
|
22
|
+
expect(triggering.message).to eq 'i am an error message'
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,257 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FuelSDK::Soap do
|
4
|
+
|
5
|
+
let(:client) { FuelSDK::Client.new }
|
6
|
+
subject { client }
|
7
|
+
|
8
|
+
describe '#get_all_object_properties' do
|
9
|
+
|
10
|
+
it 'returns properties for object_type' do
|
11
|
+
response = mock(FuelSDK::DescribeResponse)
|
12
|
+
response.should_receive(:success?).and_return(true)
|
13
|
+
|
14
|
+
subject.should_receive(:soap_describe)
|
15
|
+
.with('some object')
|
16
|
+
.and_return(response)
|
17
|
+
|
18
|
+
expect(subject.get_all_object_properties('some object'))
|
19
|
+
.to eq response
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'raises an DescribeError when describe is unsuccessful' do
|
23
|
+
response = mock(FuelSDK::DescribeResponse)
|
24
|
+
response.should_receive(:success?).and_return(false)
|
25
|
+
response.stub(:status).and_return('ERROR')
|
26
|
+
|
27
|
+
subject.should_receive(:soap_describe)
|
28
|
+
.with('some object')
|
29
|
+
.and_return(response)
|
30
|
+
|
31
|
+
expect { subject.get_all_object_properties('some object') }
|
32
|
+
.to raise_error FuelSDK::DescribeError
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#normalize_properties_for_retrieve' do
|
37
|
+
it 'when properties are nil gets_all_object_properties' do
|
38
|
+
subject.should_receive(:get_retrievable_properties)
|
39
|
+
.with('object').and_return('called all')
|
40
|
+
|
41
|
+
expect(subject.normalize_properties_for_retrieve('object', nil)).to eq 'called all'
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'when properties is a' do
|
45
|
+
subject {
|
46
|
+
client.should_not_receive(:get_retrievable_properties)
|
47
|
+
client
|
48
|
+
}
|
49
|
+
|
50
|
+
it 'Hash returns keys' do
|
51
|
+
expect(subject.normalize_properties_for_retrieve('object', {'Prop1' => 'a', 'Prop2' => 'b'}))
|
52
|
+
.to eq ['Prop1', 'Prop2']
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'String returns Array' do
|
56
|
+
expect(subject.normalize_properties_for_retrieve('object', 'Prop1'))
|
57
|
+
.to eq ['Prop1']
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'Symbol returns Array' do
|
61
|
+
expect(subject.normalize_properties_for_retrieve('object', :Prop1))
|
62
|
+
.to eq ['Prop1']
|
63
|
+
end
|
64
|
+
|
65
|
+
it 'Array returns Array' do
|
66
|
+
expect(subject.normalize_properties_for_retrieve('object', ['Prop1']))
|
67
|
+
.to eq ['Prop1']
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#normalize_filter' do
|
73
|
+
it 'returns complex filter part when filter contains LogicalOperator key' do
|
74
|
+
expect(subject.normalize_filter({'LogicalOperator' => 'AND'}))
|
75
|
+
.to eq(
|
76
|
+
{
|
77
|
+
'Filter' => {
|
78
|
+
'LogicalOperator' => 'AND',
|
79
|
+
:attributes! => {
|
80
|
+
'LeftOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' },
|
81
|
+
'RightOperand' => { 'xsi:type' => 'tns:SimpleFilterPart' }
|
82
|
+
},
|
83
|
+
},
|
84
|
+
:attributes! => { 'Filter' => { 'xsi:type' => 'tns:ComplexFilterPart' }}
|
85
|
+
}
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'returns simple filter part by default' do
|
90
|
+
expect(subject.normalize_filter({'SimpleOperator' => 'equals'}))
|
91
|
+
.to eq(
|
92
|
+
{
|
93
|
+
'Filter' => {
|
94
|
+
'SimpleOperator' => 'equals',
|
95
|
+
},
|
96
|
+
:attributes! => { 'Filter' => { 'xsi:type' => 'tns:SimpleFilterPart' }}
|
97
|
+
}
|
98
|
+
)
|
99
|
+
end
|
100
|
+
|
101
|
+
it 'returns empty hash when no filter' do
|
102
|
+
expect(subject.normalize_filter(nil)).to eq({})
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'returns empty hash when filter is unparsable' do
|
106
|
+
expect(subject.normalize_filter(['unparsable'])).to eq({})
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe '#cache_properties' do
|
111
|
+
it 'raise an error if properties is not an Array' do
|
112
|
+
|
113
|
+
subject.should_not_receive(:cache)
|
114
|
+
expect { subject.cache_properties :retrievable, 'Subscriber', 'EmailAddress' }
|
115
|
+
.to raise_error
|
116
|
+
end
|
117
|
+
|
118
|
+
it 'caches properties' do
|
119
|
+
subject.should_receive(:cache).and_return({:retrievable => {}})
|
120
|
+
expect(subject.cache_properties :retrievable, 'Subscriber', ['EmailAddress'])
|
121
|
+
.to eq(['EmailAddress'])
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#cached_properties?' do
|
126
|
+
it 'returns cached properties' do
|
127
|
+
subject.should_receive(:cache).and_return(
|
128
|
+
{
|
129
|
+
:retrievable => {
|
130
|
+
'Subscriber' => ['EmailAddress']}
|
131
|
+
}
|
132
|
+
)
|
133
|
+
|
134
|
+
expect(subject.cached_properties?(:retrievable, 'Subscriber'))
|
135
|
+
.to eq ['EmailAddress']
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'returns nil on error access cache' do
|
139
|
+
subject.should_receive(:cache).and_return(1)
|
140
|
+
expect(subject.cached_properties?(:retrievable, 'Subscriber'))
|
141
|
+
.to be_nil
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe '#retrievable_properties_cached?' do
|
146
|
+
it 'returns a list of retrievable properties for the object' do
|
147
|
+
subject.should_receive(:cached_properties?)
|
148
|
+
.with(:retrievable, 'item')
|
149
|
+
.and_return(['prop'])
|
150
|
+
|
151
|
+
expect(subject.retrievable_properties_cached? 'item').to eq(['prop'])
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'returns nil if not cached' do
|
155
|
+
expect(subject.retrievable_properties_cached? 'missing').to be_nil
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
describe '#get_retrievable_properties' do
|
160
|
+
it 'returns cached properties' do
|
161
|
+
subject.should_receive(:retrievable_properties_cached?)
|
162
|
+
.with('object')
|
163
|
+
.and_return(['prop'])
|
164
|
+
|
165
|
+
subject.should_not_receive(:get_all_object_properties)
|
166
|
+
subject.should_not_receive(:cache_retrievable)
|
167
|
+
|
168
|
+
expect(subject.get_retrievable_properties('object')).to eq ['prop']
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'requests and caches properties when not in cache' do
|
172
|
+
subject.should_receive(:retrievable_properties_cached?)
|
173
|
+
.with('object')
|
174
|
+
.and_return(nil)
|
175
|
+
|
176
|
+
response = mock(FuelSDK::DescribeResponse)
|
177
|
+
response.stub(:retrievable).and_return(['prop'])
|
178
|
+
subject.should_receive(:get_all_object_properties)
|
179
|
+
.and_return(response)
|
180
|
+
|
181
|
+
subject.should_receive(:cache_retrievable)
|
182
|
+
.with('object', ['prop'])
|
183
|
+
.and_return(['prop'])
|
184
|
+
|
185
|
+
expect(subject.get_retrievable_properties('object')).to eq ['prop']
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
describe '#cache_retrievable' do
|
190
|
+
it 'caches object properties to :retrievable' do
|
191
|
+
subject.cache_retrievable('Subscriber', ['Email'])
|
192
|
+
expect(subject.cache[:retrievable]).to eq 'Subscriber' => ['Email']
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
describe '#soap_get' do
|
197
|
+
it 'request with message created with normalized properties, filters' do
|
198
|
+
|
199
|
+
subject.should_receive(:normalize_properties_for_retrieve)
|
200
|
+
.with('end to end', nil).and_return([])
|
201
|
+
|
202
|
+
subject.should_receive(:normalize_filter)
|
203
|
+
.with(nil).and_return({})
|
204
|
+
|
205
|
+
subject.should_receive(:create_object_type_message)
|
206
|
+
.with('end to end', [], {}).and_return('message')
|
207
|
+
|
208
|
+
subject.should_receive(:soap_request)
|
209
|
+
.with(:retrieve, 'RetrieveRequest' => 'message')
|
210
|
+
|
211
|
+
subject.soap_get 'end to end'
|
212
|
+
end
|
213
|
+
|
214
|
+
it 'request an object without passing properties or a filter' do
|
215
|
+
|
216
|
+
subject.should_receive(:get_retrievable_properties)
|
217
|
+
.with('no criteria').and_return(['Props1'])
|
218
|
+
|
219
|
+
subject.should_not_receive(:add_complex_filter_part)
|
220
|
+
subject.should_not_receive(:add_simple_filter_part)
|
221
|
+
|
222
|
+
subject.should_receive(:soap_request).with(:retrieve, 'RetrieveRequest' => {
|
223
|
+
'ObjectType' => 'no criteria',
|
224
|
+
'Properties' => ['Props1']
|
225
|
+
}
|
226
|
+
)
|
227
|
+
|
228
|
+
subject.soap_get 'no criteria'
|
229
|
+
end
|
230
|
+
|
231
|
+
it 'request an object with limited properties' do
|
232
|
+
|
233
|
+
subject.should_not_receive(:get_retrievable_properties)
|
234
|
+
subject.should_not_receive(:add_complex_fitler_part)
|
235
|
+
subject.should_not_receive(:add_simple_fitler_part)
|
236
|
+
|
237
|
+
subject.should_receive(:soap_request).with(:retrieve, 'RetrieveRequest' => {
|
238
|
+
'ObjectType' => 'limited',
|
239
|
+
'Properties' => ['Props1']
|
240
|
+
}
|
241
|
+
)
|
242
|
+
|
243
|
+
subject.soap_get('limited', ['Props1'])
|
244
|
+
end
|
245
|
+
|
246
|
+
it 'request an invalid object without properties' do
|
247
|
+
subject.should_receive(:get_retrievable_properties) { raise FuelSDK::DescribeError.new(
|
248
|
+
FuelSDK::DescribeResponse.new, "Unable to get invalid"
|
249
|
+
)
|
250
|
+
}
|
251
|
+
|
252
|
+
rsp = subject.soap_get('invalid')
|
253
|
+
expect(rsp.success?).to be_false
|
254
|
+
end
|
255
|
+
end
|
256
|
+
|
257
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe FuelSDK::Soap do
|
4
|
+
|
5
|
+
let(:client) { FuelSDK::Client.new }
|
6
|
+
subject {client}
|
7
|
+
|
8
|
+
it 'has inflector support' do
|
9
|
+
expect('Definitions'.singularize).to eq 'Definition'
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '#create_action_message' do
|
13
|
+
it 'returns message' do
|
14
|
+
expect(subject.create_action_message('Definitions', 'QueryDefinition', [{'ObjectID' => 1}], 'start'))
|
15
|
+
.to eq(
|
16
|
+
{
|
17
|
+
'Action' => 'start',
|
18
|
+
'Definitions' => {
|
19
|
+
'Definition' => [{'ObjectID' => 1}],
|
20
|
+
:attributes! => {
|
21
|
+
'Definition' => { 'xsi:type' => 'tns:QueryDefinition'}
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
)
|
26
|
+
end
|
27
|
+
|
28
|
+
it 'standardizes properties to an array' do
|
29
|
+
expect(subject.create_action_message('Definitions', 'QueryDefinition', {'ObjectID' => 1}, 'start'))
|
30
|
+
.to eq(
|
31
|
+
{
|
32
|
+
'Action' => 'start',
|
33
|
+
'Definitions' => {
|
34
|
+
'Definition' => [{'ObjectID' => 1}],
|
35
|
+
:attributes! => {
|
36
|
+
'Definition' => { 'xsi:type' => 'tns:QueryDefinition'}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
}
|
40
|
+
)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe '#soap_perform' do
|
45
|
+
it 'starts a defined query' do
|
46
|
+
subject.should_receive(:create_action_message)
|
47
|
+
.with('Definitions', 'QueryDefinition', [{'ObjectID' => 1}], 'start')
|
48
|
+
.and_return 'Do It'
|
49
|
+
subject.should_receive(:soap_request).with(:perform, 'Do It')
|
50
|
+
subject.soap_perform 'QueryDefinition', [{'ObjectID' => 1}], 'start'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -6,11 +6,11 @@ describe FuelSDK::Soap do
|
|
6
6
|
|
7
7
|
subject { client }
|
8
8
|
|
9
|
-
it { should respond_to(:soap_get) }
|
10
9
|
it { should respond_to(:soap_post) }
|
11
10
|
it { should respond_to(:soap_patch) }
|
12
11
|
it { should respond_to(:soap_delete) }
|
13
12
|
it { should respond_to(:soap_describe) }
|
13
|
+
it { should respond_to(:soap_perform) }
|
14
14
|
|
15
15
|
it { should respond_to(:header) }
|
16
16
|
it { should_not respond_to(:header=) }
|
@@ -62,8 +62,7 @@ describe FuelSDK::Soap do
|
|
62
62
|
client.stub(:soap_request) do |action, message|
|
63
63
|
[action, message]
|
64
64
|
end
|
65
|
-
|
66
|
-
client.stub_chain(:soap_describe,:editable)
|
65
|
+
client.should_receive(:get_editable_properties)
|
67
66
|
.and_return(['First Name', 'Last Name', 'Gender'])
|
68
67
|
client
|
69
68
|
}
|
data/spec/spec_helper.rb
CHANGED
@@ -12,3 +12,51 @@ RSpec.configure do |config|
|
|
12
12
|
# Use the specified formatter
|
13
13
|
config.formatter = :documentation
|
14
14
|
end
|
15
|
+
|
16
|
+
shared_examples_for 'Response Object' do
|
17
|
+
it { should respond_to(:code) }
|
18
|
+
it { should respond_to(:message) }
|
19
|
+
it { should respond_to(:results) }
|
20
|
+
it { should respond_to(:request_id) }
|
21
|
+
it { should respond_to(:body) }
|
22
|
+
it { should respond_to(:raw) }
|
23
|
+
it { should respond_to(:more) }
|
24
|
+
it { should respond_to(:more?) }
|
25
|
+
it { should respond_to(:success) }
|
26
|
+
it { should respond_to(:success?) }
|
27
|
+
it { should respond_to(:status) }
|
28
|
+
it { should respond_to(:continue) }
|
29
|
+
end
|
30
|
+
|
31
|
+
# Everything will be readable so test for shared from Read behavior
|
32
|
+
shared_examples_for 'Soap Read Object' do
|
33
|
+
# begin backwards compat
|
34
|
+
it { should respond_to :props= }
|
35
|
+
it { should respond_to :authStub= }
|
36
|
+
# end
|
37
|
+
it { should respond_to :id }
|
38
|
+
it { should respond_to :properties }
|
39
|
+
it { should respond_to :client }
|
40
|
+
it { should respond_to :filter }
|
41
|
+
it { should respond_to :info }
|
42
|
+
it { should respond_to :get }
|
43
|
+
end
|
44
|
+
|
45
|
+
shared_examples_for 'Soap CUD Object' do
|
46
|
+
it { should respond_to :post }
|
47
|
+
it { should respond_to :patch }
|
48
|
+
it { should respond_to :delete }
|
49
|
+
end
|
50
|
+
|
51
|
+
shared_examples_for 'Soap Object' do
|
52
|
+
it_behaves_like 'Soap Read Object'
|
53
|
+
it_behaves_like 'Soap CUD Object'
|
54
|
+
end
|
55
|
+
|
56
|
+
shared_examples_for 'Soap Read Only Object' do
|
57
|
+
it_behaves_like 'Soap Read Object'
|
58
|
+
it { should_not respond_to :post }
|
59
|
+
it { should_not respond_to :patch }
|
60
|
+
it { should_not respond_to :delete }
|
61
|
+
end
|
62
|
+
|
data/spec/targeting_spec.rb
CHANGED
@@ -11,28 +11,59 @@ describe FuelSDK::Targeting do
|
|
11
11
|
it { should respond_to(:post) }
|
12
12
|
it { should respond_to(:patch) }
|
13
13
|
it { should respond_to(:delete) }
|
14
|
-
it { should respond_to(:
|
14
|
+
it { should respond_to(:auth_token) }
|
15
|
+
|
16
|
+
let(:response) {
|
17
|
+
rsp = double(FuelSDK::HTTPResponse)
|
18
|
+
rsp.stub(:success?).and_return(true)
|
19
|
+
rsp.stub(:[]).with('url').and_return('S#.authentication.target')
|
20
|
+
rsp
|
21
|
+
}
|
22
|
+
|
23
|
+
let(:client) {
|
24
|
+
Class.new.new.extend(FuelSDK::Targeting)
|
25
|
+
}
|
15
26
|
|
16
27
|
describe '#determine_stack' do
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
describe 'without auth_token' do
|
29
|
+
it 'calls refresh' do
|
30
|
+
client.stub(:refresh) {
|
31
|
+
client.instance_variable_set('@auth_token', 'open_sesame')
|
32
|
+
}
|
33
|
+
client.stub(:get)
|
34
|
+
.with('https://www.exacttargetapis.com/platform/v1/endpoints/soap',
|
35
|
+
{'params'=>{'access_token'=>'open_sesame'}})
|
36
|
+
.and_return(response)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe 'with valid auth_token' do
|
41
|
+
before :each do
|
42
|
+
client.should_receive(:auth_token).twice.and_return('open_sesame')
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'when successful returns endpoint' do
|
46
|
+
client.stub(:get)
|
47
|
+
.with('https://www.exacttargetapis.com/platform/v1/endpoints/soap',
|
48
|
+
{'params'=>{'access_token'=>'open_sesame'}})
|
49
|
+
.and_return(response)
|
50
|
+
expect(client.send(:determine_stack)).to eq 'S#.authentication.target'
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'raises error on unsuccessful responses' do
|
54
|
+
client.stub(:get).and_return{
|
55
|
+
rsp = double(FuelSDK::HTTPResponse)
|
56
|
+
rsp.stub(:success?).and_return(false)
|
57
|
+
rsp
|
58
|
+
}
|
59
|
+
expect{ client.send(:determine_stack) }.to raise_error 'Unable to determine stack'
|
60
|
+
end
|
26
61
|
end
|
27
62
|
end
|
28
63
|
|
29
64
|
describe '#endpoint' do
|
30
|
-
let(:client) { c = Class.new.new.extend(FuelSDK::Targeting)
|
31
|
-
c.stub(:get).and_return({'url' => 'S#.authentication.target'})
|
32
|
-
c
|
33
|
-
}
|
34
|
-
|
35
65
|
it 'calls determine_stack to find target' do
|
66
|
+
client.should_receive(:determine_stack).and_return('S#.authentication.target')
|
36
67
|
expect(client.endpoint).to eq 'S#.authentication.target'
|
37
68
|
end
|
38
69
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fuelsdk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-09-12 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -140,6 +140,22 @@ dependencies:
|
|
140
140
|
- - ~>
|
141
141
|
- !ruby/object:Gem::Version
|
142
142
|
version: 0.1.6
|
143
|
+
- !ruby/object:Gem::Dependency
|
144
|
+
name: activesupport
|
145
|
+
requirement: !ruby/object:Gem::Requirement
|
146
|
+
none: false
|
147
|
+
requirements:
|
148
|
+
- - ~>
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: 3.2.8
|
151
|
+
type: :runtime
|
152
|
+
prerelease: false
|
153
|
+
version_requirements: !ruby/object:Gem::Requirement
|
154
|
+
none: false
|
155
|
+
requirements:
|
156
|
+
- - ~>
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: 3.2.8
|
143
159
|
description: Fuel SDK for Ruby
|
144
160
|
email: []
|
145
161
|
executables: []
|
@@ -147,6 +163,7 @@ extensions: []
|
|
147
163
|
extra_rdoc_files: []
|
148
164
|
files:
|
149
165
|
- .gitignore
|
166
|
+
- ChangeLog.md
|
150
167
|
- Gemfile
|
151
168
|
- Guardfile
|
152
169
|
- README.md
|
@@ -180,12 +197,17 @@ files:
|
|
180
197
|
- samples/sample-unsubevent.rb
|
181
198
|
- samples/sample_helper.rb
|
182
199
|
- spec/client_spec.rb
|
200
|
+
- spec/fuelsdk_response_spec.rb
|
183
201
|
- spec/helper_funcs_spec.rb
|
184
202
|
- spec/http_request_spec.rb
|
185
|
-
- spec/objects_helper_spec.rb
|
186
203
|
- spec/objects_spec.rb
|
187
204
|
- spec/rest_spec.rb
|
188
|
-
- spec/
|
205
|
+
- spec/soap/configure_spec.rb
|
206
|
+
- spec/soap/cud_spec.rb
|
207
|
+
- spec/soap/describe_error_spec.rb
|
208
|
+
- spec/soap/get_spec.rb
|
209
|
+
- spec/soap/perform_spec.rb
|
210
|
+
- spec/soap/soap_spec.rb
|
189
211
|
- spec/spec_helper.rb
|
190
212
|
- spec/targeting_spec.rb
|
191
213
|
homepage: https://code.exacttarget.com/sdks
|
@@ -233,11 +255,16 @@ test_files:
|
|
233
255
|
- samples/sample-unsubevent.rb
|
234
256
|
- samples/sample_helper.rb
|
235
257
|
- spec/client_spec.rb
|
258
|
+
- spec/fuelsdk_response_spec.rb
|
236
259
|
- spec/helper_funcs_spec.rb
|
237
260
|
- spec/http_request_spec.rb
|
238
|
-
- spec/objects_helper_spec.rb
|
239
261
|
- spec/objects_spec.rb
|
240
262
|
- spec/rest_spec.rb
|
241
|
-
- spec/
|
263
|
+
- spec/soap/configure_spec.rb
|
264
|
+
- spec/soap/cud_spec.rb
|
265
|
+
- spec/soap/describe_error_spec.rb
|
266
|
+
- spec/soap/get_spec.rb
|
267
|
+
- spec/soap/perform_spec.rb
|
268
|
+
- spec/soap/soap_spec.rb
|
242
269
|
- spec/spec_helper.rb
|
243
270
|
- spec/targeting_spec.rb
|
data/spec/objects_helper_spec.rb
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
|
2
|
-
# Everything will be readable so test for shared from Read behavior
|
3
|
-
shared_examples_for 'Soap Read Object' do
|
4
|
-
# begin backwards compat
|
5
|
-
it { should respond_to :props= }
|
6
|
-
it { should respond_to :authStub= }
|
7
|
-
# end
|
8
|
-
it { should respond_to :id }
|
9
|
-
it { should respond_to :properties }
|
10
|
-
it { should respond_to :client }
|
11
|
-
it { should respond_to :filter }
|
12
|
-
it { should respond_to :info }
|
13
|
-
it { should respond_to :get }
|
14
|
-
end
|
15
|
-
|
16
|
-
shared_examples_for 'Soap CUD Object' do
|
17
|
-
it { should respond_to :post }
|
18
|
-
it { should respond_to :patch }
|
19
|
-
it { should respond_to :delete }
|
20
|
-
end
|
21
|
-
|
22
|
-
shared_examples_for 'Soap Object' do
|
23
|
-
it_behaves_like 'Soap Read Object'
|
24
|
-
it_behaves_like 'Soap CUD Object'
|
25
|
-
end
|
26
|
-
|
27
|
-
shared_examples_for 'Soap Read Only Object' do
|
28
|
-
it_behaves_like 'Soap Read Object'
|
29
|
-
it { should_not respond_to :post }
|
30
|
-
it { should_not respond_to :patch }
|
31
|
-
it { should_not respond_to :delete }
|
32
|
-
end
|