marketo-api-ruby 0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +2 -0
- data/.gemtest +0 -0
- data/Contributing.rdoc +65 -0
- data/Gemfile +9 -0
- data/History.rdoc +3 -0
- data/Licence.rdoc +24 -0
- data/Manifest.txt +32 -0
- data/README.rdoc +105 -0
- data/Rakefile +65 -0
- data/lib/marketo-api-ruby.rb +1 -0
- data/lib/marketo_api.rb +39 -0
- data/lib/marketo_api/campaigns.rb +194 -0
- data/lib/marketo_api/client.rb +169 -0
- data/lib/marketo_api/client_proxy.rb +104 -0
- data/lib/marketo_api/lead.rb +277 -0
- data/lib/marketo_api/leads.rb +150 -0
- data/lib/marketo_api/lists.rb +109 -0
- data/lib/marketo_api/mobject.rb +272 -0
- data/lib/marketo_api/mobjects.rb +115 -0
- data/spec/marketo/authentication_header_spec.rb +66 -0
- data/spec/marketo/client_spec.rb +363 -0
- data/spec/marketo/lead_key_spec.rb +40 -0
- data/spec/marketo/lead_record_spec.rb +86 -0
- data/spec/spec_helper.rb +4 -0
- data/test/marketo_api/test_campaigns.rb +173 -0
- data/test/marketo_api/test_client.rb +83 -0
- data/test/marketo_api/test_lead.rb +158 -0
- data/test/marketo_api/test_leads.rb +133 -0
- data/test/marketo_api/test_lists.rb +95 -0
- data/test/marketo_api/test_mobject.rb +273 -0
- data/test/marketo_api/test_mobjects.rb +158 -0
- data/test/minitest_helper.rb +69 -0
- data/test/test_marketo_api.rb +38 -0
- metadata +302 -0
- metadata.gz.sig +3 -0
@@ -0,0 +1,133 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
class TestMarketoAPILeads < Minitest::Test
|
4
|
+
include MarketoTestHelper
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@subject = @client.leads
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_get_invalid_lead_key_hash
|
12
|
+
assert_raises(ArgumentError) { subject.get({}) }
|
13
|
+
end
|
14
|
+
|
15
|
+
GET_LEAD_STUB = ->(method, key) {
|
16
|
+
{
|
17
|
+
lead_record_list: {
|
18
|
+
lead_record: {
|
19
|
+
id: key[:lead_key][:key_value].to_i,
|
20
|
+
lead_attribute_list: {
|
21
|
+
attribute: [
|
22
|
+
{ attr_name: 'Email', attr_value: nil, attr_type: 'string' },
|
23
|
+
{ attr_name: 'Method', attr_value: method, attr_type: 'string' },
|
24
|
+
{ attr_name: 'LeadKey', attr_value: key, attr_type: 'string' }
|
25
|
+
]
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
31
|
+
|
32
|
+
def test_get_valid_lead_key
|
33
|
+
lead_key = { lead_key: { key_type: 'id', key_value: 416 } }
|
34
|
+
subject.stub :call, GET_LEAD_STUB do
|
35
|
+
lead = subject.get(lead_key)
|
36
|
+
assert_instance_of MarketoAPI::Lead, lead
|
37
|
+
assert_equal 416, lead.id
|
38
|
+
assert_equal :get_lead, lead[:Method]
|
39
|
+
assert_equal lead_key, lead[:LeadKey]
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_get_lead
|
44
|
+
search_lead = MarketoAPI::Lead.new(id: 416)
|
45
|
+
lead_key = search_lead.params_for_get
|
46
|
+
subject.stub :call, GET_LEAD_STUB do
|
47
|
+
lead = subject.get(lead_key)
|
48
|
+
assert_instance_of MarketoAPI::Lead, lead
|
49
|
+
assert_equal 416, lead.id
|
50
|
+
assert_equal :get_lead, lead[:Method]
|
51
|
+
assert_equal lead_key, lead[:LeadKey]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_named_getters
|
56
|
+
MarketoAPI::Lead::NAMED_KEYS.each_pair do |name, key|
|
57
|
+
method = :"get_by_#{name}"
|
58
|
+
assert subject.respond_to? method
|
59
|
+
|
60
|
+
stub_specialized :get do
|
61
|
+
assert_equal key, subject.send(method, 42).first
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_get_type_and_value
|
67
|
+
MarketoAPI::Lead::NAMED_KEYS.each_pair do |name, key|
|
68
|
+
subject.stub :call, GET_LEAD_STUB do
|
69
|
+
lead_key = MarketoAPI::Lead.key(name, 416)
|
70
|
+
lead = subject.get(name, 416)
|
71
|
+
assert_instance_of MarketoAPI::Lead, lead
|
72
|
+
assert_equal 416, lead.id
|
73
|
+
assert_equal :get_lead, lead[:Method]
|
74
|
+
assert_equal lead_key, lead[:LeadKey]
|
75
|
+
|
76
|
+
lead_key = MarketoAPI::Lead.key(key, 416)
|
77
|
+
lead = subject.get(key, 416)
|
78
|
+
assert_instance_of MarketoAPI::Lead, lead
|
79
|
+
assert_equal 416, lead.id
|
80
|
+
assert_equal :get_lead, lead[:Method]
|
81
|
+
assert_equal lead_key, lead[:LeadKey]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
EMPTY_LEAD_HASH = {
|
87
|
+
lead_record: {
|
88
|
+
lead_attribute_list: {
|
89
|
+
attribute: []
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
def test_sync
|
95
|
+
subject.stub :extract_from_response, ARGS_STUB, EMPTY_LEAD_HASH do
|
96
|
+
stub_soap_call do
|
97
|
+
hash = GET_LEAD_STUB[:sync_lead, lead_key(416)]
|
98
|
+
lead = MarketoAPI::Lead.
|
99
|
+
from_soap_hash(hash[:lead_record_list][:lead_record])
|
100
|
+
|
101
|
+
result = subject.send(:transform_param, :sync, lead)
|
102
|
+
|
103
|
+
method, params = subject.sync(lead)
|
104
|
+
assert_equal :sync_lead, method
|
105
|
+
assert_equal result, params
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def test_sync_multiple
|
111
|
+
subject.stub :extract_from_response, ARGS_STUB, [] do
|
112
|
+
stub_soap_call do
|
113
|
+
hashes = [
|
114
|
+
GET_LEAD_STUB[:sync_multiple_leads, lead_key(416)],
|
115
|
+
GET_LEAD_STUB[:sync_multiple_leads, lead_key(905)],
|
116
|
+
]
|
117
|
+
leads = hashes.map { |hash|
|
118
|
+
MarketoAPI::Lead.
|
119
|
+
from_soap_hash(hash[:lead_record_list][:lead_record])
|
120
|
+
}
|
121
|
+
lead_list = subject.send(:transform_param_list, :sync, leads)
|
122
|
+
result = {
|
123
|
+
dedup_enabled: true,
|
124
|
+
lead_record_list: lead_list
|
125
|
+
}
|
126
|
+
|
127
|
+
method, params = subject.sync_multiple(leads)
|
128
|
+
assert_equal :sync_multiple_leads, method
|
129
|
+
assert_equal result, params
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require "minitest_helper"
|
2
|
+
|
3
|
+
class TestMarketoAPILists < Minitest::Test
|
4
|
+
include MarketoTestHelper
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@subject = @client.lists
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_add
|
12
|
+
stub_specialized :list_operation do
|
13
|
+
assert_equal :ADDTOLIST, subject.add(:list_key).first
|
14
|
+
end
|
15
|
+
stub_soap_call do
|
16
|
+
result = {
|
17
|
+
list_operation: :ADDTOLIST,
|
18
|
+
list_key: :list_key,
|
19
|
+
strict: false,
|
20
|
+
list_member_list: [ lead_key(416) ]
|
21
|
+
}
|
22
|
+
|
23
|
+
method, options = subject.add(:list_key, lead: lead_key(416))
|
24
|
+
assert_equal :list_operation, method
|
25
|
+
assert_equal result, options
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_add_no_leads
|
30
|
+
assert_raises(ArgumentError) { subject.add(:list_key) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_add_merged_leads
|
34
|
+
stub_soap_call do
|
35
|
+
result = {
|
36
|
+
list_operation: :ADDTOLIST,
|
37
|
+
list_key: :list_key,
|
38
|
+
strict: false,
|
39
|
+
list_member_list: [ lead_key(905), lead_key(416) ]
|
40
|
+
}
|
41
|
+
|
42
|
+
method, options = subject.add(:list_key, leads: lead_key(905),
|
43
|
+
lead: lead_key(416))
|
44
|
+
assert_equal :list_operation, method
|
45
|
+
assert_equal result, options
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_remove
|
50
|
+
stub_specialized :list_operation do
|
51
|
+
assert_equal :REMOVEFROMLIST, subject.remove(:list_key).first
|
52
|
+
end
|
53
|
+
stub_soap_call do
|
54
|
+
result = {
|
55
|
+
list_operation: :REMOVEFROMLIST,
|
56
|
+
list_key: :list_key,
|
57
|
+
strict: false,
|
58
|
+
list_member_list: [ lead_key(416) ]
|
59
|
+
}
|
60
|
+
|
61
|
+
method, options = subject.remove(:list_key, lead: lead_key(416))
|
62
|
+
assert_equal :list_operation, method
|
63
|
+
assert_equal result, options
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_member_q
|
68
|
+
stub_specialized :list_operation do
|
69
|
+
assert_equal :ISMEMBEROFLIST, subject.member?(:list_key).first
|
70
|
+
end
|
71
|
+
stub_soap_call do
|
72
|
+
result = {
|
73
|
+
list_operation: :ISMEMBEROFLIST,
|
74
|
+
list_key: :list_key,
|
75
|
+
strict: false,
|
76
|
+
list_member_list: [ lead_key(416) ]
|
77
|
+
}
|
78
|
+
|
79
|
+
method, options = subject.member?(:list_key, lead: lead_key(416))
|
80
|
+
assert_equal :list_operation, method
|
81
|
+
assert_equal result, options
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def test_class_key
|
86
|
+
subject.class::NAMED_TYPES.each { |k, v|
|
87
|
+
result = { list_key: { key_type: v, key_value: 'value' } }
|
88
|
+
|
89
|
+
assert_equal result, subject.class.key(k, 'value')
|
90
|
+
assert_equal result, subject.class.key(v, 'value')
|
91
|
+
}
|
92
|
+
|
93
|
+
assert_raises(ArgumentError) { subject.class.key('invalid', 'value') }
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,273 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
class TestMarketoAPIMObject < Minitest::Test
|
4
|
+
include MarketoTestHelper
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
@id = 99
|
9
|
+
@attributes = {
|
10
|
+
String: 'string',
|
11
|
+
Int: 5,
|
12
|
+
}
|
13
|
+
@types = {
|
14
|
+
Tag: {
|
15
|
+
String: 'string',
|
16
|
+
Int: 5
|
17
|
+
}
|
18
|
+
}
|
19
|
+
@subject = MarketoAPI::MObject.new(:Opportunity, @id) do |lead|
|
20
|
+
@attributes.each { |k, v| lead.attributes[k] = v }
|
21
|
+
@types.each { |k, v| lead.types[k] = v }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_type
|
26
|
+
assert_equal :Opportunity, subject.type
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_initialization
|
30
|
+
MarketoAPI::MObject::ALL_TYPES.each do |type|
|
31
|
+
assert_equal type, MarketoAPI::MObject.new(type).type
|
32
|
+
assert_equal type, MarketoAPI::MObject.send(type.downcase).type
|
33
|
+
end
|
34
|
+
|
35
|
+
assert_raises(ArgumentError) {
|
36
|
+
MarketoAPI::MObject.new(:UnknownType)
|
37
|
+
}
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_id
|
41
|
+
assert_equal 99, subject.id
|
42
|
+
subject.id = 33
|
43
|
+
assert_equal 33, subject.id
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_include_details
|
47
|
+
refute subject.include_details
|
48
|
+
subject.include_details = true
|
49
|
+
assert subject.include_details
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_attributes
|
53
|
+
assert_equal @attributes, subject.attributes
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_types
|
57
|
+
local = MarketoAPI::MObject.opportunity
|
58
|
+
assert_equal({}, local.types)
|
59
|
+
local.types[:Tag]
|
60
|
+
assert_equal({ Tag: {} }, local.types)
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_criteria_empty
|
64
|
+
assert_empty subject.criteria
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_criteria_correct_name_translation
|
68
|
+
MarketoAPI::MObject::Criteria::TYPES.each do |k, v|
|
69
|
+
c = subject.criteria(k, 'value', :eq).last
|
70
|
+
assert_same v, c.name
|
71
|
+
c = subject.criteria(c.name.dup, 'value', :eq).last
|
72
|
+
assert_same v, c.name
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def test_criteria_correct_comparison
|
77
|
+
MarketoAPI::MObject::Criteria::CMP.each do |cmp|
|
78
|
+
c = subject.criteria(:name, 'value', cmp).last
|
79
|
+
assert_equal cmp, c.comparison
|
80
|
+
c = subject.criteria(:name, 'value', cmp.downcase).last
|
81
|
+
assert_equal cmp, c.comparison
|
82
|
+
end
|
83
|
+
|
84
|
+
assert_raises(ArgumentError) {
|
85
|
+
subject.criteria(:foo, 'value', :xx)
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_criteria_bad_params
|
90
|
+
assert_raises(ArgumentError) {
|
91
|
+
subject.criteria(:foo, 'value', :eq)
|
92
|
+
}
|
93
|
+
assert_raises(ArgumentError) {
|
94
|
+
subject.criteria(:name)
|
95
|
+
}
|
96
|
+
assert_raises(ArgumentError) {
|
97
|
+
subject.criteria(:name, 'value')
|
98
|
+
}
|
99
|
+
end
|
100
|
+
|
101
|
+
def test_criteria_hash
|
102
|
+
MarketoAPI::MObject::Criteria::TYPES.each do |k, v|
|
103
|
+
MarketoAPI::MObject::Criteria::CMP.each do |cmp|
|
104
|
+
c = subject.criteria(k, 'value', cmp).last
|
105
|
+
e = {
|
106
|
+
attr_name: v,
|
107
|
+
attr_value: 'value',
|
108
|
+
comparison: cmp
|
109
|
+
}
|
110
|
+
|
111
|
+
assert_equal e, c.to_h
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_association_empty
|
117
|
+
assert_empty subject.associations
|
118
|
+
end
|
119
|
+
|
120
|
+
def test_association_correct_name_translation
|
121
|
+
MarketoAPI::MObject::Association::TYPES.each do |k|
|
122
|
+
c = subject.association(k, id: 1).last
|
123
|
+
assert_same k, c.type
|
124
|
+
c = subject.association(k.downcase, id: 1).last
|
125
|
+
assert_same k, c.type
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def test_association_bad_params
|
130
|
+
assert_raises(ArgumentError) {
|
131
|
+
subject.association(:foo, id: 2)
|
132
|
+
}
|
133
|
+
assert_raises(KeyError) {
|
134
|
+
subject.association(:lead)
|
135
|
+
}
|
136
|
+
end
|
137
|
+
|
138
|
+
def test_association_options
|
139
|
+
z = ->(options) { subject.association(:lead, options).last }
|
140
|
+
|
141
|
+
c = z.call(id: 1)
|
142
|
+
assert_equal 1, c.id
|
143
|
+
assert_nil c.external
|
144
|
+
|
145
|
+
c = z.call(external: 1)
|
146
|
+
assert_nil c.id
|
147
|
+
assert_equal 1, c.external_key
|
148
|
+
|
149
|
+
c = z.call(id: 1, external_key: 2)
|
150
|
+
assert_equal 1, c.id
|
151
|
+
assert_equal 2, c.external
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_association_hash
|
155
|
+
MarketoAPI::MObject::Association::TYPES.each do |k|
|
156
|
+
c = subject.association(k, id: 3, external: 4).last
|
157
|
+
e = {
|
158
|
+
m_obj_type: k,
|
159
|
+
id: 3,
|
160
|
+
external_key: 4
|
161
|
+
}
|
162
|
+
|
163
|
+
assert_equal e, c.to_h
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def test_params_for_delete_invalid_type
|
168
|
+
assert_raises(ArgumentError) {
|
169
|
+
MarketoAPI::MObject.program(32).params_for_delete
|
170
|
+
}
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_params_for_delete_missing_id
|
174
|
+
assert_raises(ArgumentError) {
|
175
|
+
MarketoAPI::MObject.opportunity.params_for_delete
|
176
|
+
}
|
177
|
+
end
|
178
|
+
|
179
|
+
def test_params_for_delete
|
180
|
+
assert_equal({ type: subject.type, id: subject.id },
|
181
|
+
subject.params_for_delete)
|
182
|
+
end
|
183
|
+
|
184
|
+
def test_params_for_get_invalid_type
|
185
|
+
assert_raises(ArgumentError) {
|
186
|
+
MarketoAPI::MObject.activityrecord.params_for_get
|
187
|
+
}
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_params_for_get
|
191
|
+
assert_equal({
|
192
|
+
type: subject.type, id: subject.id, include_details: false
|
193
|
+
}, subject.params_for_get)
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_params_for_get_minimal
|
197
|
+
subject.id = nil
|
198
|
+
assert_equal({
|
199
|
+
type: subject.type, include_details: false
|
200
|
+
}, subject.params_for_get)
|
201
|
+
end
|
202
|
+
|
203
|
+
def test_params_for_get_with_details
|
204
|
+
subject.include_details = true
|
205
|
+
assert_equal({
|
206
|
+
type: subject.type, id: subject.id, include_details: true
|
207
|
+
}, subject.params_for_get)
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_params_for_get_with_stream_position
|
211
|
+
subject.stream_position = 'position'
|
212
|
+
assert_equal({
|
213
|
+
type: subject.type, id: subject.id, include_details: false,
|
214
|
+
stream_position: 'position'
|
215
|
+
}, subject.params_for_get)
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_params_for_get_with_criteria
|
219
|
+
subject.criteria(:name, 'value', :eq)
|
220
|
+
assert_equal({
|
221
|
+
type: subject.type, id: subject.id, include_details: false,
|
222
|
+
m_obj_criteria_list: [
|
223
|
+
{
|
224
|
+
attr_name: 'Name',
|
225
|
+
attr_value: 'value',
|
226
|
+
comparison: :EQ
|
227
|
+
}
|
228
|
+
]
|
229
|
+
}, subject.params_for_get)
|
230
|
+
end
|
231
|
+
|
232
|
+
def test_params_for_get_with_association
|
233
|
+
subject.association(:Lead, id: 3, external: 4)
|
234
|
+
assert_equal({
|
235
|
+
type: subject.type, id: subject.id, include_details: false,
|
236
|
+
m_obj_association_list: [
|
237
|
+
{
|
238
|
+
m_obj_type: :Lead,
|
239
|
+
id: 3,
|
240
|
+
external_key: 4
|
241
|
+
}
|
242
|
+
]
|
243
|
+
}, subject.params_for_get)
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_class_from_soap_hash
|
247
|
+
hash = {
|
248
|
+
type: :Opportunity,
|
249
|
+
id: 99,
|
250
|
+
attrib_list: {
|
251
|
+
attrib: [
|
252
|
+
{ name: 'String', value: 'string' },
|
253
|
+
{ name: 'Int', value: 5 },
|
254
|
+
]
|
255
|
+
},
|
256
|
+
type_attrib_list: {
|
257
|
+
type_attrib: [
|
258
|
+
{
|
259
|
+
attr_type: 'Tag',
|
260
|
+
attr_list: {
|
261
|
+
attrib: [
|
262
|
+
{ name: 'String', value: 'string' },
|
263
|
+
{ name: 'Int', value: 5 },
|
264
|
+
]
|
265
|
+
}
|
266
|
+
}
|
267
|
+
]
|
268
|
+
}
|
269
|
+
}
|
270
|
+
|
271
|
+
assert_equal subject, MarketoAPI::MObject.from_soap_hash(hash)
|
272
|
+
end
|
273
|
+
end
|