marketo 1.1.6 → 1.2.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.
@@ -21,17 +21,35 @@ module Rapleaf
21
21
  #
22
22
  # client = Rapleaf::Marketo.new_client(<access_key>, <secret_key>)
23
23
  #
24
- # get_lead_by_email:
24
+ # *get_lead_by_email:*
25
25
  #
26
26
  # lead_record = client.get_lead_by_email('sombody@examnple.com')
27
+ #
27
28
  # puts lead_record.idnum
29
+ #
28
30
  # puts lead_record.get_attribute('FirstName')
31
+ #
29
32
  # puts lead_record.get_attribute('LastName')
30
33
  #
31
- # sync_lead (update)
34
+ # *sync_lead: (update)*
32
35
  #
33
36
  # lead_record = client.sync_lead('example@rapleaf.com', 'Joe', 'Smith', 'Company 1', '415 911')
34
- # etc. . .
37
+ #
38
+ # *sync_lead_record: (update with custom fields)*
39
+ #
40
+ # lead_record = Rapleaf::Marketo::LeadRecord.new('harry@rapleaf.com')
41
+ #
42
+ # lead_record.set_attribute('FirstName', 'harry')
43
+ #
44
+ # lead_record.set_attribute('LastName', 'smith')
45
+ #
46
+ # lead_record.set_attribute('Email', 'harry@somesite.com')
47
+ #
48
+ # lead_record.set_attribute('Company', 'Rapleaf')
49
+ #
50
+ # lead_record.set_attribute('MobilePhone', '123 456')
51
+ #
52
+ # response = client.sync_lead_record(lead_record)
35
53
  class Client
36
54
  def initialize(savon_client, authentication_header)
37
55
  @client = savon_client
@@ -59,19 +77,28 @@ module Rapleaf
59
77
  #
60
78
  # returns the LeadRecord instance on success otherwise nil
61
79
  def sync_lead(email, first, last, company, mobile)
80
+ lead_record = LeadRecord.new(email)
81
+ lead_record.set_attribute('FirstName', first)
82
+ lead_record.set_attribute('LastName', last)
83
+ lead_record.set_attribute('Email', email)
84
+ lead_record.set_attribute('Company', company)
85
+ lead_record.set_attribute('MobilePhone', mobile)
86
+ sync_lead_record(lead_record)
87
+ end
88
+
89
+ def sync_lead_record(lead_record)
62
90
  begin
91
+ attributes = []
92
+ lead_record.each_attribute_pair do |name, value|
93
+ attributes << {:attr_name => name, :attr_type => 'string', :attr_value => value}
94
+ end
95
+
63
96
  response = send_request("ns1:paramsSyncLead", {
64
97
  :return_lead => true,
65
98
  :lead_record =>
66
- {:email => email,
99
+ {:email => lead_record.email,
67
100
  :lead_attribute_list => {
68
- :attribute => [
69
- {:attr_name => 'FirstName', :attr_type => 'string', :attr_value => first},
70
- {:attr_name => 'LastName', :attr_type => 'string', :attr_value => last},
71
- {:attr_name => 'Email', :attr_type => 'string', :attr_value => email},
72
- {:attr_name => 'Company', :attr_type => 'string', :attr_value => company},
73
- {:attr_name => 'MobilePhone', :attr_type => 'string', :attr_value => mobile}
74
- ]}}})
101
+ :attribute => attributes}}})
75
102
  return LeadRecord.from_hash(response[:success_sync_lead][:result][:lead_record])
76
103
  rescue Exception => e
77
104
  return nil
@@ -2,7 +2,7 @@ module Rapleaf
2
2
  module Marketo
3
3
  # Represents a record of the data known about a lead within marketo
4
4
  class LeadRecord
5
- def initialize(email, idnum)
5
+ def initialize(email, idnum = nil)
6
6
  @email = email
7
7
  @idnum = idnum
8
8
  @attributes = {}
@@ -60,9 +60,10 @@ module Rapleaf
60
60
  }
61
61
  expect_request(savon_client,
62
62
  authentication_header,
63
- {:lead_key => {
63
+ equals_matcher(:lead_key => {
64
64
  :key_value => IDNUM,
65
- :key_type => LeadKeyType::IDNUM}},
65
+ :key_type => LeadKeyType::IDNUM
66
+ }),
66
67
  'ns1:paramsGetLead',
67
68
  response_hash)
68
69
  expected_lead_record = LeadRecord.new(EMAIL, IDNUM)
@@ -102,9 +103,9 @@ module Rapleaf
102
103
  }
103
104
  expect_request(savon_client,
104
105
  authentication_header,
105
- {:lead_key => {
106
+ equals_matcher({:lead_key => {
106
107
  :key_value => EMAIL,
107
- :key_type => LeadKeyType::EMAIL}},
108
+ :key_type => LeadKeyType::EMAIL}}),
108
109
  'ns1:paramsGetLead',
109
110
  response_hash)
110
111
  expected_lead_record = LeadRecord.new(EMAIL, IDNUM)
@@ -115,6 +116,66 @@ module Rapleaf
115
116
  client.get_lead_by_email(EMAIL).should == expected_lead_record
116
117
  end
117
118
 
119
+ it "should have the correct body format on sync_lead_record" do
120
+ savon_client = mock('savon_client')
121
+ authentication_header = mock('authentication_header')
122
+ client = Rapleaf::Marketo::Client.new(savon_client, authentication_header)
123
+ response_hash = {
124
+ :success_sync_lead => {
125
+ :result => {
126
+ :lead_id => IDNUM,
127
+ :sync_status => {
128
+ :error => nil,
129
+ :status => 'UPDATED',
130
+ :lead_id => IDNUM
131
+ },
132
+ :lead_record => {
133
+ :email => EMAIL,
134
+ :lead_attribute_list => {
135
+ :attribute => [
136
+ {:attr_name => 'name1', :attr_type => 'string', :attr_value => 'val1'},
137
+ {:attr_name => 'name2', :attr_type => 'string', :attr_value => 'val2'},
138
+ {:attr_name => 'name3', :attr_type => 'string', :attr_value => 'val3'},
139
+ {:attr_name => 'name4', :attr_type => 'string', :attr_value => 'val4'}
140
+ ]
141
+ },
142
+ :foreign_sys_type => nil,
143
+ :foreign_sys_person_id => nil,
144
+ :id => IDNUM.to_s
145
+ }
146
+ }
147
+ }
148
+ }
149
+ expect_request(savon_client,
150
+ authentication_header,
151
+ equals_matcher({
152
+ :return_lead => true,
153
+ :lead_record => {
154
+ :email => "some@email.com",
155
+ :lead_attribute_list =>
156
+ {
157
+ :attribute => [
158
+ {:attr_value => "val1",
159
+ :attr_name => "name1",
160
+ :attr_type => "string"},
161
+ {:attr_value => "val2",
162
+ :attr_name => "name2",
163
+ :attr_type => "string"}
164
+ ]}}}),
165
+ 'ns1:paramsSyncLead',
166
+ response_hash)
167
+ lead_record = LeadRecord.new(EMAIL)
168
+ lead_record.set_attribute('name1', 'val1')
169
+ lead_record.set_attribute('name2', 'val2')
170
+
171
+ expected_lead_record = LeadRecord.new(EMAIL, IDNUM)
172
+ expected_lead_record.set_attribute('name1', 'val1')
173
+ expected_lead_record.set_attribute('name2', 'val2')
174
+ expected_lead_record.set_attribute('name3', 'val3')
175
+ expected_lead_record.set_attribute('name4', 'val4')
176
+ client.sync_lead_record(lead_record).should == expected_lead_record
177
+ end
178
+
118
179
  it "should have the correct body format on sync_lead" do
119
180
  savon_client = mock('savon_client')
120
181
  authentication_header = mock('authentication_header')
@@ -122,54 +183,62 @@ module Rapleaf
122
183
  response_hash = {
123
184
  :success_sync_lead => {
124
185
  :result => {
125
- :lead_id => IDNUM,
186
+ :lead_id => IDNUM,
126
187
  :sync_status => {
127
- :error => nil,
128
- :status => 'UPDATED',
129
- :lead_id => IDNUM
188
+ :error => nil,
189
+ :status => 'UPDATED',
190
+ :lead_id => IDNUM
130
191
  },
131
- :lead_record => {
132
- :email => EMAIL,
133
- :lead_attribute_list => {
134
- :attribute => [
135
- {:attr_name => 'name1', :attr_type => 'string', :attr_value => 'val1'},
136
- {:attr_name => 'name2', :attr_type => 'string', :attr_value => 'val2'},
137
- {:attr_name => 'name3', :attr_type => 'string', :attr_value => 'val3'},
138
- {:attr_name => 'name4', :attr_type => 'string', :attr_value => 'val4'}
139
- ]
140
- },
141
- :foreign_sys_type => nil,
142
- :foreign_sys_person_id => nil,
143
- :id => IDNUM.to_s
144
- }
192
+ :lead_record => {
193
+ :email => EMAIL,
194
+ :lead_attribute_list => {
195
+ :attribute => [
196
+ {:attr_name => 'name1', :attr_type => 'string', :attr_value => 'val1'},
197
+ {:attr_name => 'name2', :attr_type => 'string', :attr_value => 'val2'},
198
+ {:attr_name => 'name3', :attr_type => 'string', :attr_value => 'val3'},
199
+ {:attr_name => 'name4', :attr_type => 'string', :attr_value => 'val4'}
200
+ ]
201
+ },
202
+ :foreign_sys_type => nil,
203
+ :foreign_sys_person_id => nil,
204
+ :id => IDNUM.to_s
205
+ }
145
206
  }
146
207
  }
147
208
  }
209
+
148
210
  expect_request(savon_client,
149
211
  authentication_header,
150
- {
151
- :return_lead => true,
152
- :lead_record => {
153
- :email => "some@email.com",
154
- :lead_attribute_list =>
155
- {
156
- :attribute => [
157
- {:attr_value => "Joe",
158
- :attr_name => "FirstName",
159
- :attr_type => "string"},
160
- {:attr_value => "Smith",
161
- :attr_name => "LastName",
162
- :attr_type => "string"},
163
- {:attr_value => "some@email.com",
164
- :attr_name =>"Email",
165
- :attr_type => "string"},
166
- {:attr_value => "Rapleaf",
167
- :attr_name =>"Company",
168
- :attr_type =>"string"},
169
- {:attr_value =>"415 123 456",
170
- :attr_name =>"MobilePhone",
171
- :attr_type =>"string"}
172
- ]}}},
212
+ Proc.new { |actual|
213
+ actual_attribute_list = actual[:lead_record][:lead_attribute_list][:attribute]
214
+ actual[:lead_record][:lead_attribute_list][:attribute] = nil
215
+ expected = {
216
+ :return_lead => true,
217
+ :lead_record => {
218
+ :email => "some@email.com",
219
+ :lead_attribute_list =>
220
+ {
221
+ :attribute => nil}}
222
+ }
223
+ actual.should == expected
224
+ actual_attribute_list.should =~ [
225
+ {:attr_value => FIRST,
226
+ :attr_name => "FirstName",
227
+ :attr_type => "string"},
228
+ {:attr_value => LAST,
229
+ :attr_name => "LastName",
230
+ :attr_type => "string"},
231
+ {:attr_value => EMAIL,
232
+ :attr_name =>"Email",
233
+ :attr_type => "string"},
234
+ {:attr_value => COMPANY,
235
+ :attr_name => "Company",
236
+ :attr_type => "string"},
237
+ {:attr_value => MOBILE,
238
+ :attr_name => "MobilePhone",
239
+ :attr_type => "string"}
240
+ ]
241
+ },
173
242
  'ns1:paramsSyncLead',
174
243
  response_hash)
175
244
  expected_lead_record = LeadRecord.new(EMAIL, IDNUM)
@@ -181,8 +250,9 @@ module Rapleaf
181
250
  end
182
251
 
183
252
  context "list operations" do
253
+ LIST_KEY = 'awesome leads list'
254
+
184
255
  before(:each) do
185
- LIST_KEY = 'awesome leads list'
186
256
  @savon_client = mock('savon_client')
187
257
  @authentication_header = mock('authentication_header')
188
258
  @client = Rapleaf::Marketo::Client.new(@savon_client, @authentication_header)
@@ -192,19 +262,19 @@ module Rapleaf
192
262
  response_hash = {} # TODO
193
263
  expect_request(@savon_client,
194
264
  @authentication_header,
195
- {
196
- :list_operation => ListOperationType::ADD_TO,
197
- :list_key => LIST_KEY,
198
- :strict => 'false',
199
- :list_member_list => {
200
- :lead_key => [
201
- {
202
- :key_type => 'EMAIL',
203
- :key_value => EMAIL
204
- }
205
- ]
206
- }
207
- },
265
+ equals_matcher({
266
+ :list_operation => ListOperationType::ADD_TO,
267
+ :list_key => LIST_KEY,
268
+ :strict => 'false',
269
+ :list_member_list => {
270
+ :lead_key => [
271
+ {
272
+ :key_type => 'EMAIL',
273
+ :key_value => EMAIL
274
+ }
275
+ ]
276
+ }
277
+ }),
208
278
  'ns1:paramsListOperation',
209
279
  response_hash)
210
280
 
@@ -215,19 +285,19 @@ module Rapleaf
215
285
  response_hash = {} # TODO
216
286
  expect_request(@savon_client,
217
287
  @authentication_header,
218
- {
219
- :list_operation => ListOperationType::REMOVE_FROM,
220
- :list_key => LIST_KEY,
221
- :strict => 'false',
222
- :list_member_list => {
223
- :lead_key => [
224
- {
225
- :key_type => 'EMAIL',
226
- :key_value => EMAIL
227
- }
228
- ]
229
- }
230
- },
288
+ equals_matcher({
289
+ :list_operation => ListOperationType::REMOVE_FROM,
290
+ :list_key => LIST_KEY,
291
+ :strict => 'false',
292
+ :list_member_list => {
293
+ :lead_key => [
294
+ {
295
+ :key_type => 'EMAIL',
296
+ :key_value => EMAIL
297
+ }
298
+ ]
299
+ }
300
+ }),
231
301
  'ns1:paramsListOperation',
232
302
  response_hash)
233
303
 
@@ -238,19 +308,19 @@ module Rapleaf
238
308
  response_hash = {} # TODO
239
309
  expect_request(@savon_client,
240
310
  @authentication_header,
241
- {
242
- :list_operation => ListOperationType::IS_MEMBER_OF,
243
- :list_key => LIST_KEY,
244
- :strict => 'false',
245
- :list_member_list => {
246
- :lead_key => [
247
- {
248
- :key_type => 'EMAIL',
249
- :key_value => EMAIL
250
- }
251
- ]
252
- }
253
- },
311
+ equals_matcher({
312
+ :list_operation => ListOperationType::IS_MEMBER_OF,
313
+ :list_key => LIST_KEY,
314
+ :strict => 'false',
315
+ :list_member_list => {
316
+ :lead_key => [
317
+ {
318
+ :key_type => 'EMAIL',
319
+ :key_value => EMAIL
320
+ }
321
+ ]
322
+ }
323
+ }),
254
324
  'ns1:paramsListOperation',
255
325
  response_hash)
256
326
 
@@ -261,7 +331,13 @@ module Rapleaf
261
331
 
262
332
  private
263
333
 
264
- def expect_request(savon_client, authentication_header, expected_body, expected_namespace, response_hash)
334
+ def equals_matcher(expected)
335
+ Proc.new { |actual|
336
+ actual.should == expected
337
+ }
338
+ end
339
+
340
+ def expect_request(savon_client, authentication_header, expected_body_matcher, expected_namespace, response_hash)
265
341
  header_hash = stub('header_hash')
266
342
  soap_response = stub('soap_response')
267
343
  request_namespace = mock('namespace')
@@ -273,7 +349,9 @@ module Rapleaf
273
349
  request_header.should_receive(:[]=).with("ns1:AuthenticationHeader", header_hash)
274
350
  soap_request.should_receive(:namespaces).and_return(request_namespace)
275
351
  soap_request.should_receive(:header).and_return(request_header)
276
- soap_request.should_receive(:body=).with(expected_body)
352
+ soap_request.should_receive(:body=) do |actual_body|
353
+ expected_body_matcher.call(actual_body)
354
+ end
277
355
  soap_response.should_receive(:to_hash).and_return(response_hash)
278
356
  savon_client.should_receive(:request).with(expected_namespace).and_yield(soap_request).and_return(soap_response)
279
357
  end
@@ -73,16 +73,12 @@ module Rapleaf
73
73
 
74
74
  actual = LeadRecord.from_hash(savon_hash)
75
75
 
76
- actual.email.should == EMAIL
77
- actual.idnum.should == IDNUM
78
- pairs = []
79
- actual.each_attribute_pair do |attribute_name, attribute_value|
80
- pairs << [attribute_name, attribute_value]
81
- end
82
- pairs.size.should == 3
83
- pairs.should include(['Company', 'Rapleaf'])
84
- pairs.should include(['FirstName', 'James'])
85
- pairs.should include(['LastName', 'O\'Brien'])
76
+ expected = LeadRecord.new(EMAIL, IDNUM)
77
+ expected.set_attribute('Company', 'Rapleaf')
78
+ expected.set_attribute('FirstName', 'James')
79
+ expected.set_attribute('LastName', 'O\'Brien')
80
+
81
+ actual.should == expected
86
82
  end
87
83
  end
88
84
  end
metadata CHANGED
@@ -5,9 +5,9 @@ version: !ruby/object:Gem::Version
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 1
9
- - 6
10
- version: 1.1.6
8
+ - 2
9
+ - 0
10
+ version: 1.2.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - James O'Brien
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-31 00:00:00 -08:00
18
+ date: 2011-02-08 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -50,7 +50,7 @@ dependencies:
50
50
  version: 0.8.3
51
51
  type: :runtime
52
52
  version_requirements: *id002
53
- description: " Allows easy integration with marketo from ruby. You can synchronize leads and fetch them back by email.\n\n based on the SOAP wsdl file: http://app.marketo.com/soap/mktows/1_4?WSDL\n \n\n"
53
+ description: " Allows easy integration with marketo from ruby. You can synchronize leads and fetch them back by email. This is based on the SOAP wsdl file: http://app.marketo.com/soap/mktows/1_4?WSDL\n"
54
54
  email: james@rapleaf.com
55
55
  executables: []
56
56