markety 1.4.3 → 2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +3 -0
  3. data/README.md +66 -15
  4. data/Rakefile +1 -1
  5. data/example_xml/get_lead_failure.xml +42 -0
  6. data/example_xml/get_lead_success.xml +63 -0
  7. data/example_xml/get_lead_success_two_leads.xml +88 -0
  8. data/example_xml/list_op_add_to_list_success.xml +42 -0
  9. data/example_xml/list_op_is_member_of_list_failure.xml +50 -0
  10. data/example_xml/list_op_is_member_of_list_success.xml +51 -0
  11. data/example_xml/list_op_remove_from_list_failure.xml +50 -0
  12. data/example_xml/list_op_remove_from_list_success.xml +42 -0
  13. data/example_xml/sync_lead_failure.xml +60 -0
  14. data/example_xml/sync_lead_success.xml +78 -0
  15. data/lib/markety.rb +26 -1
  16. data/lib/markety/authentication_header.rb +3 -3
  17. data/lib/markety/client.rb +35 -141
  18. data/lib/markety/command.rb +11 -0
  19. data/lib/markety/command/get_lead.rb +27 -0
  20. data/lib/markety/command/list_operation.rb +68 -0
  21. data/lib/markety/command/sync_lead.rb +55 -0
  22. data/lib/markety/enums.rb +18 -16
  23. data/lib/markety/lead.rb +69 -0
  24. data/lib/markety/lead_key.rb +5 -4
  25. data/lib/markety/response.rb +15 -0
  26. data/lib/markety/response/generic_response.rb +45 -0
  27. data/lib/markety/response/get_lead_response.rb +35 -0
  28. data/lib/markety/response/list_operation_response.rb +30 -0
  29. data/lib/markety/response/response_factory.rb +27 -0
  30. data/lib/markety/response/sync_lead_response.rb +32 -0
  31. data/lib/markety/version.rb +1 -3
  32. data/spec/markety/lead_key_spec.rb +10 -11
  33. data/spec/markety/{lead_record_spec.rb → lead_spec.rb} +13 -30
  34. data/spec/markety/response/get_lead_response_spec.rb +170 -0
  35. data/spec/markety/response/list_operation_response_spec.rb +76 -0
  36. data/spec/markety/response/sync_lead_response_spec.rb +107 -0
  37. data/spec/spec_helper.rb +4 -0
  38. data/spec/support/savon_helper.rb +14 -0
  39. metadata +61 -33
  40. data/lib/markety/lead_record.rb +0 -73
@@ -0,0 +1,32 @@
1
+ require 'markety/lead'
2
+ require 'markety/response/generic_response'
3
+
4
+ module Markety
5
+ module Response
6
+ # Response class for SyncLead commands
7
+ class SyncLeadResponse < GenericResponse
8
+
9
+ # +:created+ or +:updated+ (or nil if unsuccessful)
10
+ attr_reader :update_type
11
+ # the updated or created Lead (or nil if unsuccessful)
12
+ attr_reader :updated_lead
13
+ # the ID of the created or updated Lead (or nil if unsuccessful)
14
+ attr_reader :lead_id
15
+
16
+ def initialize(response)
17
+ super(:sync_response,response)
18
+ h = self.to_hash
19
+
20
+ if self.success?
21
+ sync_status = h[:success_sync_lead][:result][:sync_status]
22
+ @lead_id = sync_status[:lead_id]
23
+ @update_type = sync_status[:status].downcase.to_sym
24
+ @updated_lead = ::Markety::Lead.from_hash(h[:success_sync_lead][:result][:lead_record])
25
+ else
26
+ # overwrite super's crap error message with useful one
27
+ @error_message = h[:fault][:detail][:service_exception][:message]
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,5 +1,3 @@
1
1
  module Markety
2
-
3
- VERSION = "1.4.3"
4
-
2
+ VERSION = "2.0"
5
3
  end
@@ -4,29 +4,28 @@ module Markety
4
4
  describe LeadKeyType do
5
5
  it "should define the correct types" do
6
6
  LeadKeyType::IDNUM.should == 'IDNUM'
7
- LeadKeyType::COOKIE.should == 'COOKIE'
8
7
  LeadKeyType::EMAIL.should == 'EMAIL'
9
- LeadKeyType::LEADOWNEREMAIL.should == 'LEADOWNEREMAIL'
10
- LeadKeyType::SFDCACCOUNTID.should == 'SFDCACCOUNTID'
11
- LeadKeyType::SFDCCONTACTID.should == 'SFDCCONTACTID'
12
- LeadKeyType::SFDCLEADID.should == 'SFDCLEADID'
13
- LeadKeyType::SFDCLEADOWNERID.should == 'SFDCLEADOWNERID'
14
- LeadKeyType::SFDCOPPTYID.should == 'SFDCOPPTYID'
8
+ #LeadKeyType::COOKIE.should == 'COOKIE'
9
+ #LeadKeyType::LEADOWNEREMAIL.should == 'LEADOWNEREMAIL'
10
+ #LeadKeyType::SFDCACCOUNTID.should == 'SFDCACCOUNTID'
11
+ #LeadKeyType::SFDCCONTACTID.should == 'SFDCCONTACTID'
12
+ #LeadKeyType::SFDCLEADID.should == 'SFDCLEADID'
13
+ #LeadKeyType::SFDCLEADOWNERID.should == 'SFDCLEADOWNERID'
14
+ #LeadKeyType::SFDCOPPTYID.should == 'SFDCOPPTYID'
15
15
  end
16
16
  end
17
17
 
18
18
  describe LeadKey do
19
+ KEY_VALUE = 'a value'
20
+ KEY_TYPE = LeadKeyType::IDNUM
21
+
19
22
  it "should store type and value on construction" do
20
- KEY_VALUE = 'a value'
21
- KEY_TYPE = LeadKeyType::IDNUM
22
23
  lead_key = LeadKey.new(KEY_TYPE, KEY_VALUE)
23
24
  lead_key.key_type.should == KEY_TYPE
24
25
  lead_key.key_value.should == KEY_VALUE
25
26
  end
26
27
 
27
28
  it "should to_hash correctly" do
28
- KEY_VALUE = 'a value'
29
- KEY_TYPE = LeadKeyType::IDNUM
30
29
  lead_key = LeadKey.new(KEY_TYPE, KEY_VALUE)
31
30
 
32
31
  lead_key.to_hash.should == {
@@ -6,22 +6,22 @@ module Markety
6
6
 
7
7
 
8
8
 
9
- describe LeadRecord do
9
+ describe Lead do
10
10
  it "should store the idnum" do
11
- lead_record = LeadRecord.new(EMAIL, IDNUM)
11
+ lead_record = Lead.new(email:EMAIL, idnum:IDNUM)
12
12
  lead_record.idnum.should == IDNUM
13
13
  end
14
14
 
15
15
  it "should store the email" do
16
- LeadRecord.new(EMAIL, IDNUM).email.should == EMAIL
16
+ Lead.new(email:EMAIL, idnum:IDNUM).email.should == EMAIL
17
17
  end
18
18
 
19
19
  it "should implement == sensibly" do
20
- lead_record1 = LeadRecord.new(EMAIL, IDNUM)
20
+ lead_record1 = Lead.new(email:EMAIL, idnum:IDNUM)
21
21
  lead_record1.set_attribute('favourite color', 'red')
22
22
  lead_record1.set_attribute('age', '100')
23
23
 
24
- lead_record2 = LeadRecord.new(EMAIL, IDNUM)
24
+ lead_record2 = Lead.new(email:EMAIL, idnum:IDNUM)
25
25
  lead_record2.set_attribute('favourite color', 'red')
26
26
  lead_record2.set_attribute('age', '100')
27
27
 
@@ -29,35 +29,18 @@ module Markety
29
29
  end
30
30
 
31
31
  it "should store when attributes are set" do
32
- lead_record = LeadRecord.new(EMAIL, IDNUM)
32
+ lead_record = Lead.new(email:EMAIL, idnum:IDNUM)
33
33
  lead_record.set_attribute('favourite color', 'red')
34
34
  lead_record.get_attribute('favourite color').should == 'red'
35
35
  end
36
36
 
37
37
  it "should store when attributes are updated" do
38
- lead_record = LeadRecord.new(EMAIL, IDNUM)
38
+ lead_record = Lead.new(email:EMAIL, idnum:IDNUM)
39
39
  lead_record.set_attribute('favourite color', 'red')
40
40
  lead_record.set_attribute('favourite color', 'green')
41
41
  lead_record.get_attribute('favourite color').should == 'green'
42
42
  end
43
43
 
44
- it "should yield all attributes through each_attribute_pair" do
45
- lead_record = LeadRecord.new(EMAIL, IDNUM)
46
- lead_record.set_attribute('favourite color', 'red')
47
- lead_record.set_attribute('favourite color', 'green')
48
- lead_record.set_attribute('age', '99')
49
-
50
- pairs = []
51
- lead_record.each_attribute_pair do |attribute_name, attribute_value|
52
- pairs << [attribute_name, attribute_value]
53
- end
54
-
55
- pairs.size.should == 3
56
- pairs.should include(['favourite color', 'green'])
57
- pairs.should include(['age', '99'])
58
- pairs.should include(['Email', EMAIL])
59
- end
60
-
61
44
  it 'should be instantiable from savon hash with no attributes' do
62
45
  savon_hash = {
63
46
  :id => IDNUM,
@@ -67,8 +50,8 @@ module Markety
67
50
  :lead_attribute_list => nil
68
51
  }
69
52
 
70
- actual = LeadRecord.from_hash(savon_hash)
71
- expected = LeadRecord.new(EMAIL, IDNUM)
53
+ actual = Lead.from_hash(savon_hash)
54
+ expected = Lead.new(email:EMAIL, idnum:IDNUM)
72
55
 
73
56
  actual.should == expected
74
57
  end
@@ -84,9 +67,9 @@ module Markety
84
67
  {:attribute => { :attr_name => 'FirstName', :attr_value => 'Yaya', :attr_type => 'string'}}
85
68
  }
86
69
 
87
- actual = LeadRecord.from_hash(savon_hash)
70
+ actual = Lead.from_hash(savon_hash)
88
71
 
89
- expected = LeadRecord.new(EMAIL, IDNUM)
72
+ expected = Lead.new(email:EMAIL, idnum:IDNUM)
90
73
  expected.set_attribute('FirstName', 'Yaya')
91
74
 
92
75
  actual.should == expected
@@ -107,9 +90,9 @@ module Markety
107
90
  :id => IDNUM
108
91
  }
109
92
 
110
- actual = LeadRecord.from_hash(savon_hash)
93
+ actual = Lead.from_hash(savon_hash)
111
94
 
112
- expected = LeadRecord.new(EMAIL, IDNUM)
95
+ expected = Lead.new(email:EMAIL, idnum:IDNUM)
113
96
  expected.set_attribute('Company', 'Yaya')
114
97
  expected.set_attribute('FirstName', 'James')
115
98
  expected.set_attribute('LastName', 'O\'Brien')
@@ -0,0 +1,170 @@
1
+ require 'spec_helper'
2
+
3
+ module Markety
4
+ module Response
5
+ describe GetLeadResponse do
6
+
7
+ let(:success_xml) { <<END
8
+ <?xml version="1.0" encoding="UTF-8"?>
9
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/">
10
+ <SOAP-ENV:Body>
11
+ <ns1:successGetLead>
12
+ <result>
13
+ <count>1</count>
14
+ <leadRecordList>
15
+ <leadRecord>
16
+ <Id>1001081</Id>
17
+ <Email>foo@example.com</Email>
18
+ <ForeignSysPersonId xsi:nil="true"/>
19
+ <ForeignSysType xsi:nil="true"/>
20
+ <leadAttributeList>
21
+ <attribute>
22
+ <attrName>FirstName</attrName>
23
+ <attrType>string</attrType>
24
+ <attrValue>Burt</attrValue>
25
+ </attribute>
26
+ <attribute>
27
+ <attrName>LastName</attrName>
28
+ <attrType>string</attrType>
29
+ <attrValue>Reynolds</attrValue>
30
+ </attribute>
31
+ </leadAttributeList>
32
+ </leadRecord>
33
+ </leadRecordList>
34
+ </result>
35
+ </ns1:successGetLead>
36
+ </SOAP-ENV:Body>
37
+ </SOAP-ENV:Envelope>
38
+ END
39
+ }
40
+
41
+ let(:success_xml_two_leads) { <<END
42
+ <?xml version="1.0" encoding="UTF-8"?>
43
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/">
44
+ <SOAP-ENV:Body>
45
+ <ns1:successGetLead>
46
+ <result>
47
+ <count>2</count>
48
+ <leadRecordList>
49
+ <leadRecord>
50
+ <Id>1001084</Id>
51
+ <Email>foo@example.com</Email>
52
+ <ForeignSysPersonId xsi:nil="true"/>
53
+ <ForeignSysType xsi:nil="true"/>
54
+ <leadAttributeList>
55
+ <attribute>
56
+ <attrName>Company</attrName>
57
+ <attrType>string</attrType>
58
+ <attrValue>The Price is Right</attrValue>
59
+ </attribute>
60
+ <attribute>
61
+ <attrName>FirstName</attrName>
62
+ <attrType>string</attrType>
63
+ <attrValue>Bob</attrValue>
64
+ </attribute>
65
+ <attribute>
66
+ <attrName>LastName</attrName>
67
+ <attrType>string</attrType>
68
+ <attrValue>Barker</attrValue>
69
+ </attribute>
70
+ </leadAttributeList>
71
+ </leadRecord>
72
+ <leadRecord>
73
+ <Id>1001081</Id>
74
+ <Email>foo@example.com</Email>
75
+ <ForeignSysPersonId xsi:nil="true"/>
76
+ <ForeignSysType xsi:nil="true"/>
77
+ <leadAttributeList>
78
+ <attribute>
79
+ <attrName>Company</attrName>
80
+ <attrType>string</attrType>
81
+ <attrValue>foo</attrValue>
82
+ </attribute>
83
+ <attribute>
84
+ <attrName>FirstName</attrName>
85
+ <attrType>string</attrType>
86
+ <attrValue>foo</attrValue>
87
+ </attribute>
88
+ <attribute>
89
+ <attrName>LastName</attrName>
90
+ <attrType>string</attrType>
91
+ <attrValue>foo</attrValue>
92
+ </attribute>
93
+ <attribute>
94
+ <attrName>LeadStatus</attrName>
95
+ <attrType>string</attrType>
96
+ <attrValue>Inactive</attrValue>
97
+ </attribute>
98
+ </leadAttributeList>
99
+ </leadRecord>
100
+ </leadRecordList>
101
+ </result>
102
+ </ns1:successGetLead>
103
+ </SOAP-ENV:Body>
104
+ </SOAP-ENV:Envelope>
105
+ END
106
+ }
107
+
108
+ let(:failure_xml) { <<END
109
+ <?xml version="1.0" encoding="UTF-8"?>
110
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
111
+ <SOAP-ENV:Body>
112
+ <SOAP-ENV:Fault>
113
+ <faultcode>SOAP-ENV:Client</faultcode>
114
+ <faultstring>20103 - Lead not found</faultstring>
115
+ <detail>
116
+ <ns1:serviceException xmlns:ns1="http://www.marketo.com/mktows/">
117
+ <name>mktServiceException</name>
118
+ <message>No lead found with EMAIL = pants@example.com (20103)</message>
119
+ <code>20103</code>
120
+ </ns1:serviceException>
121
+ </detail>
122
+ </SOAP-ENV:Fault>
123
+ </SOAP-ENV:Body>
124
+ </SOAP-ENV:Envelope>
125
+ END
126
+ }
127
+
128
+
129
+ it 'can construct from a success - one lead' do
130
+ savon_resp = SavonHelper.create_response(success_xml)
131
+ r = GetLeadResponse.new(savon_resp)
132
+
133
+ # GenericResponse fields
134
+ r.success?.should == true
135
+ r.error_message.should be_nil
136
+
137
+ # SyncLeadResponse fields
138
+ r.leads.length.should == 1
139
+ r.leads.first.get_attribute("FirstName").should == "Burt"
140
+ end
141
+
142
+ it 'can construct from a success - two leads' do
143
+ savon_resp = SavonHelper.create_response(success_xml_two_leads)
144
+ r = GetLeadResponse.new(savon_resp)
145
+
146
+ # GenericResponse fields
147
+ r.success?.should == true
148
+ r.error_message.should be_nil
149
+
150
+ # SyncLeadResponse fields
151
+ r.leads.length.should == 2
152
+ r.leads[0].get_attribute("Company").should == "The Price is Right"
153
+ r.leads[1].get_attribute("Company").should == "foo"
154
+ end
155
+
156
+
157
+ it 'can construct from a failure' do
158
+ savon_resp = SavonHelper.create_response(failure_xml)
159
+ r = GetLeadResponse.new(savon_resp)
160
+
161
+ # GenericResponse fields
162
+ r.success?.should == false
163
+ r.error_message.should == "No lead found with EMAIL = pants@example.com (20103)"
164
+
165
+ # SyncLeadResponse fields
166
+ r.leads.empty?.should be true
167
+ end
168
+ end
169
+ end
170
+ end
@@ -0,0 +1,76 @@
1
+ require 'spec_helper'
2
+
3
+ module Markety
4
+ module Response
5
+ describe ListOperationResponse do
6
+
7
+ let(:success_xml) {<<END
8
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.marketo.com/mktows/">
9
+ <SOAP-ENV:Body>
10
+ <ns1:successListOperation>
11
+ <result>
12
+ <success>true</success>
13
+ <statusList>
14
+ <leadStatus>
15
+ <leadKey>
16
+ <keyType>IDNUM</keyType>
17
+ <keyValue>1001088</keyValue>
18
+ </leadKey>
19
+ <status>true</status>
20
+ </leadStatus>
21
+ </statusList>
22
+ </result>
23
+ </ns1:successListOperation>
24
+ </SOAP-ENV:Body>
25
+ </SOAP-ENV:Envelope>
26
+ END
27
+ }
28
+
29
+ let(:failure_xml) {<<END
30
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://www.marketo.com/mktows/">
31
+ <SOAP-ENV:Body>
32
+ <ns1:successListOperation>
33
+ <result>
34
+ <success>false</success>
35
+ <statusList>
36
+ <leadStatus>
37
+ <leadKey>
38
+ <keyType>IDNUM</keyType>
39
+ <keyValue>1001086</keyValue>
40
+ </leadKey>
41
+ <status>false</status>
42
+ </leadStatus>
43
+ </statusList>
44
+ </result>
45
+ </ns1:successListOperation>
46
+ </SOAP-ENV:Body>
47
+ </SOAP-ENV:Envelope>
48
+ END
49
+ }
50
+
51
+
52
+ it 'can construct from a success' do
53
+ savon_resp = SavonHelper.create_response(success_xml)
54
+ r = ListOperationResponse.new(savon_resp)
55
+
56
+ # GenericResponse fields
57
+ r.success?.should == true
58
+ r.error_message.should be_nil
59
+
60
+ r.list_operation_success?.should == true
61
+ end
62
+
63
+ it 'can construct from a failure' do
64
+ savon_resp = SavonHelper.create_response(failure_xml)
65
+ r = ListOperationResponse.new(savon_resp)
66
+
67
+ # GenericResponse fields
68
+ r.success?.should == true
69
+ r.error_message.should be_nil
70
+
71
+ r.list_operation_success?.should == false
72
+ end
73
+
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,107 @@
1
+ require 'spec_helper'
2
+
3
+ module Markety
4
+ module Response
5
+ describe SyncLeadResponse do
6
+
7
+ let(:success_xml) { <<END
8
+ <?xml version="1.0" encoding="UTF-8"?>
9
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns1="http://www.marketo.com/mktows/">
10
+ <SOAP-ENV:Body>
11
+ <ns1:successSyncLead>
12
+ <result>
13
+ <leadId>1001064</leadId>
14
+ <syncStatus>
15
+ <leadId>1001064</leadId>
16
+ <status>CREATED</status>
17
+ <error xsi:nil="true"/>
18
+ </syncStatus>
19
+ <leadRecord>
20
+ <Id>1001064</Id>
21
+ <Email>spiderman@example.com</Email>
22
+ <ForeignSysPersonId xsi:nil="true"/>
23
+ <ForeignSysType xsi:nil="true"/>
24
+ <leadAttributeList>
25
+ <attribute>
26
+ <attrName>FirstName</attrName>
27
+ <attrType>string</attrType>
28
+ <attrValue>Peter</attrValue>
29
+ </attribute>
30
+ <attribute>
31
+ <attrName>LastName</attrName>
32
+ <attrType>string</attrType>
33
+ <attrValue>Parker</attrValue>
34
+ </attribute>
35
+ <attribute>
36
+ <attrName>Website</attrName>
37
+ <attrType>url</attrType>
38
+ <attrValue>example.com</attrValue>
39
+ </attribute>
40
+ </leadAttributeList>
41
+ </leadRecord>
42
+ </result>
43
+ </ns1:successSyncLead>
44
+ </SOAP-ENV:Body>
45
+ </SOAP-ENV:Envelope>
46
+ END
47
+ }
48
+
49
+ let(:failure_xml) { <<END
50
+ <?xml version="1.0" encoding="UTF-8"?>
51
+ <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
52
+ <SOAP-ENV:Body>
53
+ <SOAP-ENV:Fault>
54
+ <faultcode>SOAP-ENV:Client</faultcode>
55
+ <faultstring>20105 - Unknown lead field</faultstring>
56
+ <detail>
57
+ <ns1:serviceException xmlns:ns1="http://www.marketo.com/mktows/">
58
+ <name>mktServiceException</name>
59
+ <message>syncLead operation failed: unknown fields for import: pants (20105)</message>
60
+ <code>20105</code>
61
+ </ns1:serviceException>
62
+ </detail>
63
+ </SOAP-ENV:Fault>
64
+ </SOAP-ENV:Body>
65
+ </SOAP-ENV:Envelope>
66
+ END
67
+ }
68
+
69
+
70
+
71
+ it 'can construct from a success' do
72
+ savon_resp = SavonHelper.create_response(success_xml)
73
+
74
+ r = SyncLeadResponse.new(savon_resp)
75
+
76
+ # GenericResponse fields
77
+ r.success?.should == true
78
+ r.error_message.should be_nil
79
+ # to_xml
80
+ # to_hash
81
+
82
+ # SyncLeadResponse fields
83
+ r.lead_id.should == "1001064"
84
+ r.update_type.should == :created
85
+ r.updated_lead.is_a?(::Markety::Lead).should == true
86
+ end
87
+
88
+ it 'can construct from a failure' do
89
+ savon_resp = SavonHelper.create_response(failure_xml)
90
+
91
+ r = SyncLeadResponse.new(savon_resp)
92
+
93
+ # GenericResponse fields
94
+ r.success?.should == false
95
+ r.error_message.should == "syncLead operation failed: unknown fields for import: pants (20105)"
96
+ # to_xml
97
+ # to_hash
98
+
99
+ # SyncLeadResponse fields
100
+ r.lead_id.should be_nil
101
+ r.update_type.should be_nil
102
+ r.updated_lead.should be_nil
103
+ end
104
+
105
+ end #describe SyncLeadResponse
106
+ end #module Response
107
+ end #module Markety