fuelsdk 0.0.4 → 0.0.5

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.
@@ -54,7 +54,7 @@ module FuelSDK
54
54
  definition = raw.body[raw.body.keys.first][:object_definition]
55
55
  _props = definition[:properties]
56
56
  _props.each do |p|
57
- @retrievable << p[:name] if p[:is_retrievable]
57
+ @retrievable << p[:name] if p[:is_retrievable] and (p[:name] != 'DataRetentionPeriod')
58
58
  @updatable << p[:name] if p[:is_updatable]
59
59
  @required << p[:name] if p[:is_required]
60
60
  @properties << p[:name]
@@ -125,7 +125,7 @@ module FuelSDK
125
125
  end
126
126
 
127
127
  def soap_get object_type, properties=nil, filter=nil
128
- if properties.nil?
128
+ if properties.nil? or properties.empty?
129
129
  rsp = soap_describe object_type
130
130
  if rsp.success?
131
131
  properties = rsp.retrievable
@@ -169,15 +169,6 @@ module FuelSDK
169
169
  soap_cud :delete, object_type, properties
170
170
  end
171
171
 
172
- def format_attributes attributes
173
- attrs = []
174
- attributes.each do |name, value|
175
- attrs.push 'Name' => name, 'Value' => value
176
- end
177
-
178
- attrs
179
- end
180
-
181
172
  private
182
173
 
183
174
  def soap_cud action, object_type, properties
@@ -191,7 +182,7 @@ module FuelSDK
191
182
  p.each do |k, v|
192
183
  if type_attrs.include? k
193
184
  p.delete k
194
- attrs = format_attributes k => v
185
+ attrs = FuelSDK.format_name_value_pairs k => v
195
186
  formated_attrs.concat attrs
196
187
  end
197
188
  end
@@ -0,0 +1,11 @@
1
+ module FuelSDK
2
+ module_function
3
+ def format_name_value_pairs attributes
4
+ attrs = []
5
+ attributes.each do |name, value|
6
+ attrs.push 'Name' => name, 'Value' => value
7
+ end
8
+
9
+ attrs
10
+ end
11
+ end
@@ -1,3 +1,3 @@
1
1
  module FuelSDK
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -1,7 +1,8 @@
1
- require '../ET_Client.rb'
1
+ require 'fuelsdk'
2
+ require_relative 'sample_helper'
2
3
 
3
4
  begin
4
- stubObj = ET_Client.new(false, false)
5
+ stubObj = ET_Client.new auth
5
6
 
6
7
  NewListName = "RubySDKList"
7
8
 
@@ -19,6 +20,7 @@ begin
19
20
  p 'Message: ' + postResponse.message.to_s
20
21
  p 'Result Count: ' + postResponse.results.length.to_s
21
22
  p 'Results: ' + postResponse.results.inspect
23
+ raise 'Failure creating list' unless postResponse.success?
22
24
 
23
25
  if postResponse.status then
24
26
 
@@ -31,6 +33,7 @@ begin
31
33
  p 'Message: ' + AddSubResponse.message.to_s
32
34
  p 'Result Count: ' + AddSubResponse.results.length.to_s
33
35
  p 'Results: ' + AddSubResponse.results.inspect
36
+ raise 'Failure adding user to list' unless AddSubResponse.success?
34
37
 
35
38
  # Delete List
36
39
  p '>>> Delete List'
@@ -43,6 +46,7 @@ begin
43
46
  p 'Message: ' + deleteResponse.message.to_s
44
47
  p 'Results Length: ' + deleteResponse.results.length.to_s
45
48
  p 'Results: ' + deleteResponse.results.to_s
49
+ raise 'Failure deleting list' unless deleteResponse.success?
46
50
  end
47
51
 
48
52
  rescue => e
@@ -1,7 +1,8 @@
1
- require '../ET_Client.rb'
1
+ require 'fuelsdk'
2
+ require_relative 'sample_helper'
2
3
 
3
4
  begin
4
- myclient = ET_Client.new(false, false)
5
+ myclient = ET_Client.new auth
5
6
 
6
7
  ## Example using CreateDataExtensions() method
7
8
 
@@ -20,6 +21,8 @@ begin
20
21
  p 'Message: ' + createDEResponse.message.to_s
21
22
  p 'Results Length: ' + createDEResponse.results.length.to_s
22
23
  p 'Results: ' + createDEResponse.results.to_s
24
+ raise 'Failure creating data extensions' unless createDEResponse.success?
25
+ raise 'Failure creating data extensions' unless createDEResponse.results.count == 2
23
26
 
24
27
  # Cleaning up the newly created DEs
25
28
  # Delete deOne
@@ -1,9 +1,9 @@
1
- require '../ET_Client.rb'
2
-
1
+ require 'fuelsdk'
2
+ require_relative 'sample_helper'
3
+ require 'pry'
3
4
 
4
5
  begin
5
- stubObj = ET_Client.new(false, false)
6
-
6
+ stubObj = ET_Client.new auth
7
7
 
8
8
  # Get all of the DataExtensions in an Account
9
9
  p '>>> Get all of the DataExtensions in an Account'
@@ -14,29 +14,31 @@ begin
14
14
  p 'Retrieve Status: ' + getResponse.status.to_s
15
15
  p 'Code: ' + getResponse.code.to_s
16
16
  p 'Message: ' + getResponse.message.to_s
17
- p 'MoreResults: ' + getResponse.moreResults.to_s
17
+ p 'MoreResults: ' + getResponse.more?.to_s
18
18
  p 'RequestID: ' + getResponse.request_id.to_s
19
19
  p 'Results Length: ' + getResponse.results.length.to_s
20
20
  #p 'Results: ' + getResponse.results.to_s
21
+ raise 'Failure retrieving data extensions' unless getResponse.success?
21
22
 
22
23
  # Specify a name for the data extension that will be used for testing
23
24
  # Note: Name and CustomerKey will be the same value
24
25
  # WARNING: Data Extension will be deleted so don't use the name of a
25
26
  # production data extension
26
- NameOfDE = "ThisWillBeDeleted-Test"
27
-
27
+ NameOfDE = "ThisWillBeDeleted-Testz"
28
28
 
29
29
  # Create Data Extension
30
30
  p '>>> Create Data Extension'
31
31
  de2 = ET_DataExtension.new
32
32
  de2.authStub = stubObj
33
33
  de2.props = {"Name" => NameOfDE,"CustomerKey" => NameOfDE}
34
- de2.columns = [{"Name" => "Name", "FieldType" => "Text", "IsPrimaryKey" => "true", "MaxLength" => "100", "IsRequired" => "true"},{"Name" => "OtherField", "FieldType" => "Text"}]
34
+ de2.columns = [{"Name" => "Name", "FieldType" => "Text", "IsPrimaryKey" => "true", "MaxLength" => "100", "IsRequired" => "true"},
35
+ {"Name" => "OtherField", "FieldType" => "Text"}]
35
36
  postResponse = de2.post
36
37
  p 'Post Status: ' + postResponse.status.to_s
37
38
  p 'Code: ' + postResponse.code.to_s
38
39
  p 'Message: ' + postResponse.message.to_s
39
40
  p 'Results: ' + postResponse.results.inspect
41
+ raise 'Failure creating data extension' unless postResponse.success?
40
42
 
41
43
  # Update DE to add new field
42
44
  p '>>> Update DE to add new field'
@@ -49,8 +51,7 @@ begin
49
51
  p 'Code: ' + patchResponse.code.to_s
50
52
  p 'Message: ' + patchResponse.message.to_s
51
53
  p 'Results: ' + patchResponse.results.inspect
52
-
53
-
54
+ raise 'Failure updating data extension' unless patchResponse.success?
54
55
 
55
56
  # Retrieve all columns for data extension
56
57
  p '>>> Retrieve all columns for data extension '
@@ -62,11 +63,12 @@ begin
62
63
  p 'Retrieve Status: ' + getResponse.status.to_s
63
64
  p 'Code: ' + getResponse.code.to_s
64
65
  p 'Message: ' + getResponse.message.to_s
65
- p 'MoreResults: ' + getResponse.moreResults.to_s
66
+ p 'MoreResults: ' + getResponse.more?.to_s
66
67
  p 'RequestID: ' + getResponse.request_id.to_s
67
68
  p 'Results Length: ' + getResponse.results.length.to_s
68
69
  p 'Results: ' + getResponse.results.to_s
69
-
70
+ raise 'Failure retrieving data extension columns' unless getResponse.success?
71
+ raise 'Failure retrieving correct number of data extension columns' unless getResponse.results.count == 3
70
72
 
71
73
  # Add a row to a data extension (using CustomerKey)
72
74
  p '>>> Add a row to a data extension'
@@ -79,6 +81,7 @@ begin
79
81
  p 'Code: ' + postResponse.code.to_s
80
82
  p 'Message: ' + postResponse.message.to_s
81
83
  p 'Results: ' + postResponse.results.inspect
84
+ raise 'Failure creating data extension row' unless postResponse.success?
82
85
 
83
86
  # Add a row to a data extension (Using Name)
84
87
  p '>>> Add a row to a data extension'
@@ -91,6 +94,7 @@ begin
91
94
  p 'Code: ' + postResponse.code.to_s
92
95
  p 'Message: ' + postResponse.message.to_s
93
96
  p 'Results: ' + postResponse.results.inspect
97
+ raise 'Failure creating data extension row' unless postResponse.success?
94
98
 
95
99
  # Retrieve all rows
96
100
  p '>>> Retrieve all rows'
@@ -102,10 +106,12 @@ begin
102
106
  p 'Retrieve Status: ' + getResponse.status.to_s
103
107
  p 'Code: ' + getResponse.code.to_s
104
108
  p 'Message: ' + getResponse.message.to_s
105
- p 'MoreResults: ' + getResponse.moreResults.to_s
109
+ p 'MoreResults: ' + getResponse.more?.to_s
106
110
  p 'RequestID: ' + getResponse.request_id.to_s
107
111
  p 'Results Length: ' + getResponse.results.length.to_s
108
112
  p 'Results: ' + getResponse.results.to_s
113
+ raise 'Failure retrieving data extension rows' unless getResponse.success?
114
+ raise 'Failure retrieving correct number of data extension rows' unless getResponse.results.count == 2
109
115
 
110
116
  # Update a row in a data extension
111
117
  p '>>> Update a row in a data extension'
@@ -113,11 +119,12 @@ begin
113
119
  de4.authStub = stubObj
114
120
  de4.CustomerKey = NameOfDE
115
121
  de4.props = {"Name" => "MAC3", "OtherField" => "UPDATED!"}
116
- postResponse = de4.patch
117
- p 'Patch Status: ' + postResponse.status.to_s
118
- p 'Code: ' + postResponse.code.to_s
119
- p 'Message: ' + postResponse.message.to_s
120
- p 'Results: ' + postResponse.results.inspect
122
+ patchResponse = de4.patch
123
+ p 'Patch Status: ' + patchResponse.status.to_s
124
+ p 'Code: ' + patchResponse.code.to_s
125
+ p 'Message: ' + patchResponse.message.to_s
126
+ p 'Results: ' + patchResponse.results.inspect
127
+ raise 'Failure updating data extension row' unless patchResponse.success?
121
128
 
122
129
  # Retrieve only updated row
123
130
  p '>>> Retrieve only updated row'
@@ -130,10 +137,11 @@ begin
130
137
  p 'Retrieve Status: ' + getResponse.status.to_s
131
138
  p 'Code: ' + getResponse.code.to_s
132
139
  p 'Message: ' + getResponse.message.to_s
133
- p 'MoreResults: ' + getResponse.moreResults.to_s
140
+ p 'MoreResults: ' + getResponse.more?.to_s
134
141
  p 'RequestID: ' + getResponse.request_id.to_s
135
142
  p 'Results Length: ' + getResponse.results.length.to_s
136
143
  p 'Results: ' + getResponse.results.to_s
144
+ raise 'Failure retrieving data extension rows' unless getResponse.success?
137
145
 
138
146
  # Delete a row from a data extension
139
147
  p '>>> Delete a row from a data extension'
@@ -146,6 +154,7 @@ begin
146
154
  p 'Code: ' + deleteResponse.code.to_s
147
155
  p 'Message: ' + deleteResponse.message.to_s
148
156
  p 'Results: ' + deleteResponse.results.inspect
157
+ raise 'Failure deleting data extension row' unless deleteResponse.success?
149
158
 
150
159
  # Delete a Data Extension
151
160
  p '>>> Delete a Data Extension'
@@ -157,10 +166,11 @@ begin
157
166
  p 'Code: ' + delResponse.code.to_s
158
167
  p 'Message: ' + delResponse.message.to_s
159
168
  p 'Results: ' + delResponse.results.inspect
169
+ raise 'Failure deleting data extension' unless deleteResponse.success?
160
170
 
161
171
  =begin
162
- # Retrieve lots of rows with moreResults
163
- p '>>> Retrieve lots of rows with moreResults'
172
+ # Retrieve lots of rows with more?
173
+ p '>>> Retrieve lots of rows with more?'
164
174
  row = ET_DataExtension::Row.new()
165
175
  row.authStub = stubObj
166
176
  row.Name = "zipstolong"
@@ -169,18 +179,19 @@ begin
169
179
  p 'Retrieve Status: ' + getResponse.status.to_s
170
180
  p 'Code: ' + getResponse.code.to_s
171
181
  p 'Message: ' + getResponse.message.to_s
172
- p 'MoreResults: ' + getResponse.moreResults.to_s
182
+ p 'MoreResults: ' + getResponse.more?.to_s
173
183
  p 'RequestID: ' + getResponse.request_id.to_s
174
184
  p 'Results Length: ' + getResponse.results.length.to_s
175
185
  #p 'Results: ' + getResponse.results.to_s
186
+ raise 'Failure retrieving data extension rows' unless getResponse.success?
176
187
 
177
- while getResponse.moreResults do
178
- p '>>> Continue Retrieve lots of rows with moreResults'
188
+ while getResponse.more? do
189
+ p '>>> Continue Retrieve lots of rows with more?'
179
190
  getResponse = row.getMoreResults
180
191
  p 'Retrieve Status: ' + getResponse.status.to_s
181
192
  p 'Code: ' + getResponse.code.to_s
182
193
  p 'Message: ' + getResponse.message.to_s
183
- p 'MoreResults: ' + getResponse.moreResults.to_s
194
+ p 'MoreResults: ' + getResponse.more?.to_s
184
195
  p 'RequestID: ' + getResponse.request_id.to_s
185
196
  p 'Results Length: ' + getResponse.results.length.to_s
186
197
  end
@@ -189,4 +200,10 @@ begin
189
200
  rescue => e
190
201
  p "Caught exception: #{e.message}"
191
202
  p e.backtrace
203
+
204
+ de5 = ET_DataExtension.new
205
+ de5.authStub = stubObj
206
+ de5.props = {"Name" => NameOfDE,"CustomerKey" => NameOfDE}
207
+ de5.delete
208
+
192
209
  end
@@ -1,25 +1,32 @@
1
1
 
2
+ # Everything will be readable so test for shared from Read behavior
2
3
  shared_examples_for 'Soap Read Object' do
3
- it { should respond_to(:info) }
4
- it { should respond_to(:get) }
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 }
5
14
  end
6
15
 
7
16
  shared_examples_for 'Soap CUD Object' do
8
- it { should respond_to(:post) }
9
- it { should respond_to(:patch) }
10
- it { should respond_to(:delete) }
17
+ it { should respond_to :post }
18
+ it { should respond_to :patch }
19
+ it { should respond_to :delete }
11
20
  end
12
21
 
13
22
  shared_examples_for 'Soap Object' do
14
- it { should respond_to(:id) }
15
23
  it_behaves_like 'Soap Read Object'
16
24
  it_behaves_like 'Soap CUD Object'
17
25
  end
18
26
 
19
27
  shared_examples_for 'Soap Read Only Object' do
20
- it { should respond_to(:id) }
21
28
  it_behaves_like 'Soap Read Object'
22
- it { should_not respond_to(:post) }
23
- it { should_not respond_to(:patch) }
24
- it { should_not respond_to(:delete) }
29
+ it { should_not respond_to :post }
30
+ it { should_not respond_to :patch }
31
+ it { should_not respond_to :delete }
25
32
  end
@@ -1,6 +1,29 @@
1
1
  require 'spec_helper.rb'
2
2
  require 'objects_helper_spec.rb'
3
3
 
4
+ describe FuelSDK::Objects::Base do
5
+
6
+ let(:object) { FuelSDK::Objects::Base.new }
7
+ subject{ object }
8
+
9
+ describe '#properties' do
10
+ it 'is empty by default' do
11
+ expect(object.properties).to be_empty
12
+ end
13
+
14
+ it 'returns item in array when item is not an array' do
15
+ object.properties = {'name' => 'value'}
16
+ expect(object.properties).to eq([{'name' => 'value'}])
17
+ end
18
+
19
+ it 'returns array when assigned array' do
20
+ object.properties = [{'name' => 'value'}]
21
+ expect(object.properties).to eq([{'name' => 'value'}])
22
+ end
23
+ end
24
+
25
+ end
26
+
4
27
  describe FuelSDK::BounceEvent do
5
28
 
6
29
  let(:object) { FuelSDK::BounceEvent.new }
@@ -100,6 +123,354 @@ describe FuelSDK::Subscriber do
100
123
  its(:id){ should eq 'Subscriber' }
101
124
  end
102
125
 
126
+ describe FuelSDK::DataExtension::Column do
127
+
128
+ let(:object) { FuelSDK::DataExtension::Column.new }
129
+ subject{ object }
130
+
131
+ it_behaves_like 'Soap Read Only Object'
132
+ its(:id){ should eq 'DataExtensionField' }
133
+ end
134
+
135
+ describe FuelSDK::DataExtension do
136
+ let(:object) { FuelSDK::DataExtension.new }
137
+ subject{ object }
138
+
139
+ it_behaves_like 'Soap Object'
140
+ its(:id){ should eq 'DataExtension' }
141
+ it { should respond_to :columns= }
142
+ it { should respond_to :fields }
143
+ it { should respond_to :fields= }
144
+
145
+ describe '#post' do
146
+ subject {
147
+ object.stub_chain(:client, :soap_post) do |id, properties|
148
+ [id, properties]
149
+ end
150
+
151
+ object
152
+ }
153
+
154
+ # maybe one day will make it smart enough to zip properties and fields if count is same?
155
+ it 'raises an error when it has a list of properties and fields' do
156
+ subject.fields = [{'Name' => 'Name'}]
157
+ subject.properties = [{'Name' => 'Some DE'}, {'Name' => 'Some DE'}]
158
+ expect{subject.post}.to raise_error(
159
+ 'Unable to handle muliple DataExtension definitions and a field definition')
160
+ end
161
+
162
+ it 'fields must be empty if not nil' do
163
+ subject.fields = []
164
+ subject.properties = [{'Name' => 'Some DE', 'fields' => [{'Name' => 'A field'}]}]
165
+ expect(subject.post).to eq(
166
+ [
167
+ 'DataExtension',
168
+ [{
169
+ 'Name' => 'Some DE',
170
+ 'Fields' => {
171
+ 'Field' => [{'Name' => 'A field'}]
172
+ }
173
+ }]
174
+ ])
175
+ end
176
+
177
+ it 'DataExtension can be created using properties and fields accessors' do
178
+ subject.fields = [{'Name' => 'A field'}]
179
+ subject.properties = {'Name' => 'Some DE'}
180
+ expect(subject.post).to eq(
181
+ [
182
+ 'DataExtension',
183
+ [{
184
+ 'Name' => 'Some DE',
185
+ 'Fields' => {
186
+ 'Field' => [{'Name' => 'A field'}]
187
+ }
188
+ }]
189
+ ])
190
+ end
191
+
192
+ it 'DataExtension fields can be apart of the DataExtention properties' do
193
+ subject.properties = {'Name' => 'Some DE', 'Fields' => {'Field' => [{'Name' => 'A field'}]}}
194
+ expect(subject.post).to eq(
195
+ [
196
+ 'DataExtension',
197
+ [{
198
+ 'Name' => 'Some DE',
199
+ 'Fields' => {
200
+ 'Field' => [{'Name' => 'A field'}]
201
+ }
202
+ }]
203
+ ])
204
+ end
205
+
206
+ it 'List of DataExtension definitions can be passed' do
207
+ subject.properties = [{'Name' => 'Some DE', 'Fields' => {'Field' => [{'Name' => 'A field'}]}},
208
+ {'Name' => 'Another DE', 'Fields' => {'Field' => [{'Name' => 'A second field'}]}}]
209
+ expect(subject.post).to eq(
210
+ [
211
+ 'DataExtension',
212
+ [{
213
+ 'Name' => 'Some DE',
214
+ 'Fields' => {
215
+ 'Field' => [{'Name' => 'A field'}]
216
+ }
217
+ },{
218
+ 'Name' => 'Another DE',
219
+ 'Fields' => {
220
+ 'Field' => [{'Name' => 'A second field'}]
221
+ }
222
+ }]
223
+ ])
224
+ end
225
+
226
+ it 'DataExtension definitions will translate fields entry to correct format' do
227
+ subject.properties = {'Name' => 'Some DE', 'fields' => [{'Name' => 'A field'}]}
228
+ expect(subject.post).to eq(
229
+ [
230
+ 'DataExtension',
231
+ [{
232
+ 'Name' => 'Some DE',
233
+ 'Fields' => {
234
+ 'Field' => [{'Name' => 'A field'}]
235
+ }
236
+ }]
237
+ ])
238
+ end
239
+
240
+ it 'DataExtension definitions will translate columns entry to correct format' do
241
+ subject.properties = {'Name' => 'Some DE', 'columns' => [{'Name' => 'A field'}]}
242
+ expect(subject.post).to eq(
243
+ [
244
+ 'DataExtension',
245
+ [{
246
+ 'Name' => 'Some DE',
247
+ 'Fields' => {
248
+ 'Field' => [{'Name' => 'A field'}]
249
+ }
250
+ }]
251
+ ])
252
+ end
253
+
254
+ it 'supports columns attribute for a single DataExtension definition' do
255
+ subject.columns = [{'Name' => 'A field'}]
256
+ subject.properties = {'Name' => 'Some DE'}
257
+ expect(subject.post).to eq(
258
+ [
259
+ 'DataExtension',
260
+ [{
261
+ 'Name' => 'Some DE',
262
+ 'Fields' => {
263
+ 'Field' => [{'Name' => 'A field'}]
264
+ }
265
+ }]
266
+ ])
267
+ end
268
+
269
+ describe 'fields are defined twice' do
270
+ it 'when defined in properties and by fields' do
271
+ subject.fields = [{'Name' => 'A field'}]
272
+ subject.properties = {'Name' => 'Some DE', 'Fields' => {'Field' => [{'Name' => 'A field'}]}}
273
+ expect{subject.post}.to raise_error 'Fields are defined in too many ways. Please only define once.'
274
+ end
275
+ it 'when defined in properties explicitly and with columns key' do
276
+ subject.properties = {'Name' => 'Some DE',
277
+ 'columns' => [{'Name' => 'A fields'}],
278
+ 'Fields' => {'Field' => [{'Name' => 'A field'}]
279
+ }}
280
+ expect{subject.post}.to raise_error 'Fields are defined in too many ways. Please only define once.'
281
+ end
282
+ it 'when defined in properties explicitly and with fields key' do
283
+ subject.properties = {'Name' => 'Some DE',
284
+ 'fields' => [{'Name' => 'A fields'}],
285
+ 'Fields' => {'Field' => [{'Name' => 'A field'}]
286
+ }}
287
+ expect{subject.post}.to raise_error 'Fields are defined in too many ways. Please only define once.'
288
+ end
289
+ it 'when defined in with fields and colums key' do
290
+ subject.properties = {'Name' => 'Some DE',
291
+ 'fields' => [{'Name' => 'A fields'}],
292
+ 'columns' => [{'Name' => 'A field'}]
293
+ }
294
+ expect{subject.post}.to raise_error 'Fields are defined in too many ways. Please only define once.'
295
+ end
296
+ it 'when defined in with fields key and accessor' do
297
+ subject.fields = [{'Name' => 'A field'}]
298
+ subject.properties = {'Name' => 'Some DE',
299
+ 'fields' => [{'Name' => 'A fields'}]
300
+ }
301
+ expect{subject.post}.to raise_error 'Fields are defined in too many ways. Please only define once.'
302
+ end
303
+ end
304
+ end
305
+
306
+ describe '#patch' do
307
+ subject {
308
+ object.stub_chain(:client, :soap_patch) do |id, properties|
309
+ [id, properties]
310
+ end
311
+
312
+ object
313
+ }
314
+
315
+ it 'DataExtension can be created using properties and fields accessors' do
316
+ subject.fields = [{'Name' => 'A field'}]
317
+ subject.properties = {'Name' => 'Some DE'}
318
+ expect(subject.patch).to eq(
319
+ [
320
+ 'DataExtension',
321
+ [{
322
+ 'Name' => 'Some DE',
323
+ 'Fields' => {
324
+ 'Field' => [{'Name' => 'A field'}]
325
+ }
326
+ }]
327
+ ])
328
+ end
329
+ end
330
+ end
331
+
332
+ describe FuelSDK::DataExtension::Row do
333
+ let(:object) { FuelSDK::DataExtension::Row.new }
334
+ subject{ object }
335
+
336
+ it_behaves_like 'Soap Object'
337
+ its(:id){ should eq 'DataExtensionObject' }
338
+ it { should respond_to :name }
339
+ it { should respond_to :name= }
340
+ it { should respond_to :customer_key }
341
+ it { should respond_to :customer_key= }
342
+
343
+ describe '#name' do
344
+ it 'raises error when missing both name and customer key' do
345
+ expect{ subject.name }.to raise_error('Unable to process DataExtension::Row '\
346
+ 'request due to missing CustomerKey and Name')
347
+ end
348
+
349
+ it 'returns value' do
350
+ subject.name = 'name'
351
+ expect( subject.name ).to eq 'name'
352
+ end
353
+ end
354
+
355
+ describe '#customer_key' do
356
+ it 'raises error when missing both name and customer key' do
357
+ expect{ subject.customer_key }.to raise_error('Unable to process DataExtension::Row '\
358
+ 'request due to missing CustomerKey and Name')
359
+ end
360
+
361
+ it 'returns value' do
362
+ subject.customer_key = 'key'
363
+ expect( subject.customer_key ).to eq 'key'
364
+ end
365
+ end
366
+
367
+ describe '#retrieve_required' do
368
+ it 'raises error when missing both name and customer key' do
369
+ expect{ subject.send(:retrieve_required)}.to raise_error('Unable to process DataExtension::Row '\
370
+ 'request due to missing CustomerKey and Name')
371
+ expect{ subject.name }.to raise_error('Unable to process DataExtension::Row '\
372
+ 'request due to missing CustomerKey and Name')
373
+ end
374
+
375
+ it 'updates missing' do
376
+ rsp = mock(FuelSDK::SoapResponse)
377
+ rsp.stub(:results).and_return([{:name => 'Products', :customer_key => 'ProductsKey'}])
378
+ rsp.stub(:success?).and_return true
379
+
380
+ subject.stub_chain(:client,:soap_get).and_return(rsp)
381
+ subject.name = 'Not Nil'
382
+
383
+ # this really wouldn't work this way. name shouldn't be updated since its whats being used for filter,
384
+ # but its a good test to show retrieve_required being fired
385
+ expect(subject.name).to eq 'Not Nil' # not fired
386
+ expect(subject.customer_key).to eq 'ProductsKey' # fired... stubbed get returns customer_key and name for update
387
+ expect(subject.name).to eq 'Products' # returned name
388
+ end
389
+ end
390
+
391
+ describe '#get' do
392
+ subject {
393
+ object.stub_chain(:client, :soap_get) do |id, properties, filter|
394
+ [id, properties, filter]
395
+ end
396
+
397
+ object
398
+ }
399
+
400
+ it 'passes id including name to super get' do
401
+ subject.name = 'Justin'
402
+ expect(subject.get).to eq(['DataExtensionObject[Justin]', [], nil])
403
+ end
404
+ end
405
+
406
+ describe '#post' do
407
+ subject {
408
+ object.stub_chain(:client, :soap_post) do |id, properties|
409
+ [id, properties]
410
+ end
411
+
412
+ object
413
+ }
414
+
415
+ it 'raises an error when missing both name and customer key' do
416
+ subject.properties = [{'Name' => 'Some DE'}, {'Name' => 'Some DE'}]
417
+ expect{subject.post}.to raise_error('Unable to process DataExtension::Row ' \
418
+ 'request due to missing CustomerKey and Name')
419
+ end
420
+
421
+ it 'uses explicitly defined properties' do
422
+ subject.properties = [{'CustomerKey' => 'Subscribers',
423
+ 'Properties' => {'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
424
+ expect(subject.post).to eq([
425
+ 'DataExtensionObject', [{
426
+ 'CustomerKey' => 'Subscribers',
427
+ 'Properties' => {'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
428
+ ])
429
+ end
430
+
431
+ it 'inserts customer key into properties when set using accessor' do
432
+ subject.customer_key = 'Subscribers'
433
+ subject.properties = [{'Properties' => {
434
+ 'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
435
+ expect(subject.post).to eq([
436
+ 'DataExtensionObject', [{
437
+ 'CustomerKey' => 'Subscribers',
438
+ 'Properties' => {'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
439
+ ])
440
+ end
441
+
442
+ it 'uses name to get customer key for inseration' do
443
+ subject.name = 'Subscribers'
444
+
445
+ rsp = mock(FuelSDK::SoapResponse)
446
+ rsp.stub(:results).and_return([{:name => 'Products', :customer_key => 'ProductsKey'}])
447
+ rsp.stub(:success?).and_return true
448
+
449
+ subject.stub_chain(:client, :soap_get).and_return(rsp)
450
+ subject.properties = [{'Properties' => {
451
+ 'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
452
+
453
+ expect(subject.post).to eq([
454
+ 'DataExtensionObject', [{
455
+ 'CustomerKey' => 'ProductsKey',
456
+ 'Properties' => {'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
457
+ ])
458
+ end
459
+
460
+ it 'correctly formats array property' do
461
+ subject.customer_key = 'Subscribers'
462
+
463
+ subject.properties = [{'Name' => 'Justin'}]
464
+
465
+ expect(subject.post).to eq([
466
+ 'DataExtensionObject', [{
467
+ 'CustomerKey' => 'Subscribers',
468
+ 'Properties' => {'Property' => [{'Name' => 'Name', 'Value' => 'Justin'}]}}]
469
+ ])
470
+ end
471
+ end
472
+ end
473
+
103
474
  # verify backward compats
104
475
  describe ET_Subscriber do
105
476