leadsquared 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,35 @@
1
+ module Leadsquared
2
+ class ApiConnection
3
+ attr_reader :connection
4
+
5
+ def initialize(service)
6
+ @connection = Leadsquared::Client.new
7
+ @service = service
8
+ end
9
+
10
+ protected
11
+
12
+ def url_with_service(action)
13
+ @service + action
14
+ end
15
+
16
+ def handle_response(response)
17
+ case response.status
18
+ when 200
19
+ return JSON.parse response.body
20
+ when 400
21
+ raise InvalidRequestError.new("Bad Request")
22
+ when 401
23
+ raise InvalidRequestError.new("Unauthorized Request")
24
+ when 404
25
+ raise InvalidRequestError.new("API Not Found")
26
+ when 500
27
+ message = response.body.try(:[], "ExceptionMessage")
28
+ raise InvalidRequestError.new("Internal Error: #{message}")
29
+ else
30
+ raise InvalidRequestError.new("Unknown Error#{response.body}")
31
+ end
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ require 'faraday'
2
+
3
+ module Leadsquared
4
+ class Client
5
+ ENDPOINT = 'https://api.leadsquared.com'.freeze
6
+ HEADERS = {'Content-Type' => 'application/json', 'Accept' => 'application/json'}.freeze
7
+
8
+ attr_reader :key, :secret, :endpoint
9
+
10
+ def initialize(key = nil, secret = nil, endpoint = nil)
11
+ @key = key || Leadsquared.config.key
12
+ @secret = secret || Leadsquared.config.secret
13
+ @endpoint = endpoint || Leadsquared.config.endpoint || ENDPOINT
14
+ raise ArgumentError.new("Missing key or secret") unless @secret and @key
15
+ end
16
+
17
+ def post(url, params = {}, body = nil)
18
+ conn = Faraday.new(url: @endpoint)
19
+ merged_params = {accessKey: @key, secretKey: @secret}.merge(params)
20
+ response = conn.post(url) do |req|
21
+ req.headers = HEADERS
22
+ req.params = merged_params
23
+ req.body = body if body
24
+ end
25
+
26
+ response
27
+ end
28
+
29
+ def get(url, params = {})
30
+ conn = Faraday.new(url: @endpoint)
31
+ merged_params = {accessKey: @key, secretKey: @secret}.merge(params)
32
+ response = conn.get(url) do |req|
33
+ req.headers = HEADERS
34
+ req.params = merged_params
35
+ end
36
+
37
+ response
38
+ end
39
+
40
+ end
41
+ end
@@ -0,0 +1,21 @@
1
+ require 'logger'
2
+
3
+ module Leadsquared
4
+
5
+ class Config
6
+ attr_accessor :key, :secret, :endpoint, :logger
7
+
8
+ def logger
9
+ @logger ||= Logger.new(STDERR)
10
+ end
11
+ end
12
+
13
+ def self.configure
14
+ yield config
15
+ end
16
+
17
+ def self.config
18
+ @config ||= Config.new
19
+ end
20
+
21
+ end
@@ -0,0 +1,5 @@
1
+ module Leadsquared
2
+ class Engine < Rails::Engine
3
+ isolate_namespace Leadsquared
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ module Leadsquared
2
+ class InvalidRequestError < StandardError
3
+ def initialize(error)
4
+ super(error)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,106 @@
1
+ require 'json'
2
+ require 'active_support/core_ext/object/try'
3
+
4
+ module Leadsquared
5
+ class Lead < ApiConnection
6
+ SERVICE = '/v2/LeadManagement.svc/'.freeze
7
+
8
+ def initialize
9
+ super(SERVICE)
10
+ end
11
+
12
+ def get_meta_data
13
+ url = url_with_service("LeadsMetaData.Get")
14
+ response = connection.get(url, {})
15
+ handle_response response
16
+ end
17
+
18
+ def get_lead_by_id(lead_id)
19
+ url = url_with_service("Leads.GetById")
20
+ response = connection.get(url, {id: lead_id})
21
+ parsed_response = handle_response response
22
+ parsed_response.first
23
+ end
24
+
25
+ def get_lead_by_email(email)
26
+ url = url_with_service("Leads.GetByEmailaddress")
27
+ response = connection.get(url, {emailaddress: email})
28
+ parsed_response = handle_response response
29
+ parsed_response.first
30
+ end
31
+
32
+ def quick_search(key)
33
+ url = url_with_service("Leads.GetByQuickSearch")
34
+ response = connection.get(url, {key: key})
35
+ handle_response response
36
+ end
37
+
38
+ def create_lead(email = nil, first_name = nil, last_name = nil)
39
+ url = url_with_service("Lead.Create")
40
+ body = [
41
+ {
42
+ "Attribute": "EmailAddress",
43
+ "Value": email
44
+ },
45
+ {
46
+ "Attribute": "FirstName",
47
+ "Value": first_name
48
+ },
49
+ {
50
+ "Attribute": "LastName",
51
+ "Value": last_name
52
+ }
53
+ ]
54
+ response = connection.post(url, {}, body.to_json)
55
+ parsed_response = handle_response response
56
+ parsed_response["Message"]["Id"]
57
+ end
58
+
59
+ def update_lead(lead_id, values_hash = {})
60
+ url = url_with_service("Lead.Update")
61
+ body = values_hash.map {|key, val| {"Attribute" => key, "Value" => val} }
62
+ response = connection.post(url, {leadId: lead_id}, body.to_json)
63
+ parsed_response = handle_response response
64
+ parsed_response["Status"]
65
+ end
66
+
67
+ def create_or_update(email = nil, first_name = nil, last_name = nil, phone = nil, search_by = "EmailAddress")
68
+ url = url_with_service("Lead.CreateOrUpdate")
69
+ body = [
70
+ {
71
+ "Attribute": "EmailAddress",
72
+ "Value": email
73
+ },
74
+ {
75
+ "Attribute": "FirstName",
76
+ "Value": first_name
77
+ },
78
+ {
79
+ "Attribute": "LastName",
80
+ "Value": last_name
81
+ },
82
+ {
83
+ "Attribute": "Phone",
84
+ "Value": phone
85
+ },
86
+ {
87
+ "Attribute": "SearchBy",
88
+ "Value": search_by
89
+ }
90
+ ]
91
+ response = connection.post(url, {}, body.to_json)
92
+ parsed_response = handle_response response
93
+ parsed_response["Message"]["Id"]
94
+ end
95
+
96
+ def visitor_to_lead(prospect_id, values_hash = {})
97
+ url = url_with_service("Lead.Convert")
98
+ body = values_hash.map {|key, val| {"Attribute" => key, "Value" => val} }
99
+ response = connection.post(url, {leadId: prospect_id}, body.to_json)
100
+ parsed_response = handle_response response
101
+ parsed_response["Status"]
102
+ end
103
+
104
+ end
105
+
106
+ end
@@ -0,0 +1,147 @@
1
+ require 'spec_helper'
2
+
3
+ describe Leadsquared::Lead do
4
+ let(:mock_connection) { double("connection") }
5
+ let(:service) { '/v2/ProspectActivity.svc/' }
6
+ let(:lead_id) { "3131ea6a-bb20-4457-b183-ddf6d8716dfe" }
7
+ let(:email) { "test@example.com" }
8
+ let(:current_utc_time) { Time.now.utc.to_s.gsub(/ UTC$/, "") }
9
+ subject { Leadsquared::Activity.new }
10
+
11
+ before do
12
+ expect(Leadsquared::Client).to receive(:new).and_return mock_connection
13
+ end
14
+
15
+ describe "#get_activities" do
16
+ let(:url) { "#{service}Retrieve" }
17
+ let(:activity_event_id) { 201 }
18
+ let(:body) do
19
+ {
20
+ "Parameter" => {"ActivityEvent" => activity_event_id},
21
+ "Paging" => {"Offset" => 0, "RowCount" => 10}
22
+ }
23
+ end
24
+ let(:success_response) do
25
+ {
26
+ "RecordCount" => 0,
27
+ "ProspectActivities" => []
28
+ }
29
+ end
30
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
31
+
32
+ it "valid request with existing id" do
33
+ expect(mock_connection).to receive(:post).with(url, {leadId: lead_id}, body.to_json).and_return valid_response
34
+ subject.get_activities(lead_id, activity_event_id)
35
+ end
36
+ end
37
+
38
+ describe "#create_activity_type" do
39
+ let(:url) { "#{service}CreateType" }
40
+ let(:score) { 10 }
41
+ let(:activity_name) { "New Activity" }
42
+ let(:description) { "Some Description" }
43
+ let(:body) do
44
+ {
45
+ "ActivityEventName" => activity_name,
46
+ "Score" => score,
47
+ "Description" => description,
48
+ "Direction" => 0
49
+ }
50
+ end
51
+ let(:success_response) do
52
+ {
53
+ "Status": "Success",
54
+ "Message": {
55
+ "Id": "206"
56
+ }
57
+ }
58
+ end
59
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
60
+
61
+ it "activity event" do
62
+ expect(mock_connection).to receive(:post).with(url, {}, body.to_json).and_return valid_response
63
+ response = subject.create_activity_type(activity_name, score, description)
64
+ expect(response).to eq("206")
65
+ end
66
+ end
67
+
68
+ describe "#create" do
69
+ let(:url) { "#{service}Create" }
70
+ let(:id) { "d91bd87a-7bca-11e5-a199-22000aa4133b" }
71
+ let(:event_id) { "201" }
72
+ let(:body) do
73
+ {
74
+ "EmailAddress" => email,
75
+ "ActivityEvent" => event_id,
76
+ "ActivityNote" => nil,
77
+ "ActivityDateTime" => current_utc_time,
78
+ "FirstName" => nil,
79
+ "LastName" => nil
80
+ }
81
+ end
82
+
83
+ let(:success_response) do
84
+ {
85
+ "Status": "Success",
86
+ "Message": {
87
+ "Id": id
88
+ }
89
+ }
90
+ end
91
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
92
+
93
+ before do
94
+ Timecop.freeze(Time.local(2015))
95
+ end
96
+
97
+ after do
98
+ Timecop.return
99
+ end
100
+
101
+ it "valid activity" do
102
+ expect(mock_connection).to receive(:post).with(url, {}, body.to_json).and_return valid_response
103
+ response = subject.create(email, event_id)
104
+ expect(response).to eq(id)
105
+ end
106
+ end
107
+
108
+ describe "#create_lead_activity" do
109
+ let(:url) { "#{service}Create" }
110
+ let(:id) { "d91bd87a-7bca-11e5-a199-22000aa4133b" }
111
+ let(:event_id) { "201" }
112
+ let(:notes) { "Some Description" }
113
+ let(:body) do
114
+ {
115
+ "RelatedProspectId" => lead_id,
116
+ "ActivityEvent" => event_id,
117
+ "ActivityNote" => notes,
118
+ "ActivityDateTime" => current_utc_time
119
+ }
120
+ end
121
+
122
+ let(:success_response) do
123
+ {
124
+ "Status": "Success",
125
+ "Message": {
126
+ "Id": id
127
+ }
128
+ }
129
+ end
130
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
131
+
132
+ before do
133
+ Timecop.freeze(Time.local(2015))
134
+ end
135
+
136
+ after do
137
+ Timecop.return
138
+ end
139
+
140
+ it "valid activity" do
141
+ expect(mock_connection).to receive(:post).with(url, {leadId: lead_id}, body.to_json).and_return valid_response
142
+ response = subject.create_lead_activity(lead_id, event_id, notes)
143
+ expect(response).to eq(id)
144
+ end
145
+ end
146
+
147
+ end
@@ -0,0 +1,72 @@
1
+ require 'spec_helper'
2
+
3
+ describe Leadsquared::Client do
4
+ let(:client) { Leadsquared::Client.new('token', 'pass', 'http://localhost:8088/mock') }
5
+
6
+ describe "Valid Request" do
7
+ let(:service) { "service1" }
8
+ let(:body) do
9
+ {key1: 'value1', key2: 'value2'}
10
+ end
11
+ let(:auth_params) { "?accessKey=token&secretKey=pass" }
12
+
13
+ it "#post" do
14
+ blk = lambda do |req|
15
+ expect(req.body).to match(body)
16
+ end
17
+ stub_request(:post, "http://localhost:8088/mock/#{service}#{auth_params}").with(&blk).
18
+ to_return(status: 200, body: "{\"id\": \"123456\"}")
19
+ response = client.post(service, {}, body)
20
+ expect(response.status).to eql(200)
21
+ end
22
+
23
+ it "#get" do
24
+ params = {xid: '1'}
25
+ stub_request(:get, "http://localhost:8088/mock/#{service}#{auth_params}&xid=1").
26
+ to_return(status: 200, body: body.to_json)
27
+ response = client.get(service, params)
28
+ expect(response.status).to eql(200)
29
+
30
+ end
31
+ end
32
+
33
+ describe "Invalid Request" do
34
+ pending "TODO"
35
+ end
36
+
37
+ describe "Configuration" do
38
+ it "requires token and secret" do
39
+ expect { Leadsquared::Client.new }.to raise_error(ArgumentError)
40
+ end
41
+
42
+ describe "preset" do
43
+ before do
44
+ Leadsquared.configure do |config|
45
+ config.key = 'mylogin'
46
+ config.secret = 'mypassword'
47
+ config.endpoint = "http://google.com"
48
+ end
49
+ end
50
+
51
+ after do
52
+ Leadsquared.configure do |config|
53
+ config.key = nil
54
+ config.secret = nil
55
+ config.endpoint = Leadsquared::Client::ENDPOINT
56
+ end
57
+ end
58
+
59
+ it "configures the client" do
60
+ Leadsquared.configure do |config|
61
+ config.key = 'mylogin'
62
+ config.secret = 'mypassword'
63
+ config.endpoint = "http://google.com"
64
+ end
65
+ client = Leadsquared::Client.new
66
+ expect(client.key).to eq('mylogin')
67
+ expect(client.secret).to eq('mypassword')
68
+ expect(client.endpoint).to eq("http://google.com")
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,324 @@
1
+ require 'spec_helper'
2
+
3
+ describe Leadsquared::Lead do
4
+ let(:mock_connection) { double("connection") }
5
+ let(:lead_id) { "3131ea6a-bb20-4457-b183-ddf6d8716dfe" }
6
+ let(:email) { "test@example.com" }
7
+ let(:first_name) { "Bob" }
8
+ let(:last_name) { "Zeiger" }
9
+
10
+ let(:invalid_response_body) do
11
+ {
12
+ "Status" => "Error",
13
+ "ExceptionType" => "MXDuplicateEntryException",
14
+ "ExceptionMessage" => "Duplicate entry 'john.smith@acmeconsulting.co' for key 'UQ_Prospect_Base_EmailAddress'"
15
+ }
16
+ end
17
+ let(:invalid_response) { double("response", status: 500, body: invalid_response_body) }
18
+ let(:service) { '/v2/LeadManagement.svc/' }
19
+
20
+ subject { Leadsquared::Lead.new }
21
+
22
+ before do
23
+ expect( Leadsquared::Client).to receive(:new).and_return mock_connection
24
+ end
25
+
26
+ describe "#get_lead_by_id" do
27
+ let(:url) { "#{service}Leads.GetById" }
28
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
29
+ let(:empty_response) { double("response", status: 200, body: [].to_json) }
30
+ let(:success_response) do
31
+ [
32
+ {
33
+ "ProspectID" => " Lead Id ",
34
+ "FirstName" => "Syed",
35
+ "LastName" => "Rizwan Ali",
36
+ "EmailAddress" => "rizwan@yopmail.com",
37
+ "Company" => "Roga",
38
+ "SourceReferrer" => ""
39
+ }
40
+ ]
41
+ end
42
+
43
+ it "valid request with existing id" do
44
+ expect(mock_connection).to receive(:get).with(url, {id: lead_id}).and_return valid_response
45
+ response = subject.get_lead_by_id(lead_id)
46
+ end
47
+
48
+ it "with missing id" do
49
+ missing_id = "12345"
50
+ expect(mock_connection).to receive(:get).with(url, {id: missing_id}).and_return empty_response
51
+ response = subject.get_lead_by_id(missing_id)
52
+ end
53
+ end
54
+
55
+ describe "#get_lead_by_email" do
56
+ let(:url) { "#{service}Leads.GetByEmailaddress" }
57
+ let(:email) { "test@example.com" }
58
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
59
+ let(:empty_response) { double("response", status: 200, body: [].to_json) }
60
+ let(:success_response) do
61
+ [
62
+ {
63
+ "ProspectID" => " Lead Email ",
64
+ "FirstName" => "Syed",
65
+ "LastName" => "Rizwan Ali",
66
+ "EmailAddress" => "rizwan@yopmail.com",
67
+ "Company" => "Roga",
68
+ "SourceReferrer" => ""
69
+ }
70
+ ]
71
+ end
72
+
73
+ it "valid request with existing id" do
74
+ expect(mock_connection).to receive(:get).with(url, {emailaddress: email}).and_return valid_response
75
+ response = subject.get_lead_by_email(email)
76
+ end
77
+
78
+ it "with missing id" do
79
+ expect(mock_connection).to receive(:get).with(url, {emailaddress: email}).and_return empty_response
80
+ response = subject.get_lead_by_email(email)
81
+ end
82
+ end
83
+
84
+ describe "#quick_search" do
85
+ let(:url) { "#{service}Leads.GetByQuickSearch" }
86
+ let(:key) { "Jhon" }
87
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
88
+ let(:empty_response) { double("response", status: 200, body: [].to_json) }
89
+ let(:success_response) do
90
+ [
91
+ {
92
+ "ProspectID": "16837df6-ec85werwer9b1f3a902",
93
+ "FirstName" => "Syed",
94
+ "LastName" => "Rizwan Ali",
95
+ "EmailAddress" => "rizwan@yopmail.com",
96
+ "Company" => "Roga",
97
+ "SourceReferrer" => ""
98
+ },
99
+ {
100
+ "ProspectID": "16837df6-ec85werwer9b1f3a903",
101
+ "FirstName" => "Syed2",
102
+ "LastName" => "Rizwan Ali",
103
+ "EmailAddress" => "rizwan2@yopmail.com",
104
+ "Company" => "Roga",
105
+ "SourceReferrer" => ""
106
+ }
107
+ ]
108
+ end
109
+
110
+ it "valid request with existing id" do
111
+ expect(mock_connection).to receive(:get).with(url, {key: key}).and_return valid_response
112
+ response = subject.quick_search(key)
113
+ end
114
+
115
+ it "with missing id" do
116
+ expect(mock_connection).to receive(:get).with(url, {key: key}).and_return empty_response
117
+ response = subject.quick_search(key)
118
+ end
119
+
120
+ end
121
+
122
+ describe "#visitor_to_lead" do
123
+ let(:url) { "#{service}Lead.Convert" }
124
+ let(:values_hash) do
125
+ {"OwnerId" => "1234567"}
126
+ end
127
+ let(:success_response) do
128
+ {
129
+ "Status" => "Success",
130
+ "Message" => {
131
+ "AffectedRows" => 1
132
+ }
133
+ }
134
+ end
135
+ let(:body) do
136
+ [
137
+ {
138
+ "Attribute": "OwnerId",
139
+ "Value": "1234567"
140
+ }
141
+ ]
142
+ end
143
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
144
+
145
+ it "converts valid user" do
146
+ expect(mock_connection).to receive(:post).with(url, {leadId: lead_id}, body.to_json).and_return valid_response
147
+ response = subject.visitor_to_lead(lead_id, values_hash)
148
+ expect(response).to eq(success_response["Status"])
149
+ end
150
+ end
151
+
152
+ describe "#update" do
153
+ let(:url) { "#{service}Lead.Update" }
154
+ let(:new_values) do
155
+ {phone: "1234567", city: "NY"}
156
+ end
157
+ let(:success_response) do
158
+ {
159
+ "Status" => "Success",
160
+ "Message" => {
161
+ "AffectedRows" => 1
162
+ }
163
+ }
164
+ end
165
+ let(:failed_response) do
166
+ {
167
+ "Status" => "Error",
168
+ "ExceptionType" => "MXInvalidEntityException",
169
+ "ExceptionMessage" => "Lead does not exist in the system"
170
+ }
171
+ end
172
+ let(:body) do
173
+ [
174
+ {
175
+ "Attribute": "phone",
176
+ "Value": "1234567"
177
+ },
178
+ {
179
+ "Attribute": "city",
180
+ "Value": "NY"
181
+ }
182
+ ]
183
+ end
184
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
185
+ let(:invalid_response) { double("response", status: 500, body: failed_response.to_json) }
186
+
187
+ it "existing lead" do
188
+ expect(mock_connection).to receive(:post).with(url, {leadId: lead_id}, body.to_json).and_return valid_response
189
+ response = subject.update_lead(lead_id, new_values)
190
+ expect(response).to eq(success_response["Status"])
191
+ end
192
+
193
+ it "missing lead" do
194
+ expect(mock_connection).to receive(:post).with(url, {leadId: lead_id}, body.to_json).and_return invalid_response
195
+ expect {
196
+ subject.update_lead(lead_id, new_values)
197
+ }.to raise_error(Leadsquared::InvalidRequestError)
198
+ end
199
+ end
200
+
201
+ describe "#create_or_update" do
202
+ let(:success_response) do
203
+ {
204
+ "Status" => "Success",
205
+ "Message" => {
206
+ "Id" => "xxxxxxxx-Lead-Idxx-xxxx-xxxxxxxxxxx",
207
+ "AffectedRows" => 1
208
+ }
209
+ }
210
+ end
211
+
212
+ describe "search by email" do
213
+ let(:url) { "#{service}Lead.CreateOrUpdate" }
214
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
215
+ let(:body) do
216
+ [
217
+ {
218
+ "Attribute": "EmailAddress",
219
+ "Value": email
220
+ },
221
+ {
222
+ "Attribute": "FirstName",
223
+ "Value": first_name
224
+ },
225
+ {
226
+ "Attribute": "LastName",
227
+ "Value": last_name
228
+ },
229
+ {
230
+ "Attribute": "Phone",
231
+ "Value": nil
232
+ },
233
+ {
234
+ "Attribute": "SearchBy",
235
+ "Value": "EmailAddress"
236
+ }
237
+ ]
238
+ end
239
+ it "valid request" do
240
+ expect(mock_connection).to receive(:post).with(url, {}, body.to_json).and_return valid_response
241
+ response = subject.create_or_update(email, first_name, last_name)
242
+ expect(response).to eq(success_response["Message"]["Id"])
243
+ end
244
+ end
245
+
246
+ describe "search by phone" do
247
+ pending "TODO"
248
+ end
249
+ end
250
+
251
+ describe "#create_lead" do
252
+ let(:url) { "#{service}Lead.Create" }
253
+ let(:body) do
254
+ [
255
+ {
256
+ "Attribute" => "EmailAddress",
257
+ "Value" => email
258
+ },
259
+ {
260
+ "Attribute" => "FirstName",
261
+ "Value" => first_name
262
+ },
263
+ {
264
+ "Attribute" => "LastName",
265
+ "Value" => last_name
266
+ }
267
+ ]
268
+ end
269
+ let(:success_response) do
270
+ {
271
+ "Status" => "Success",
272
+ "Message" => {
273
+ "Id" => "3131ea6a-bb20-4457-b183-ddf6d8716dfe"
274
+ }
275
+ }
276
+ end
277
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
278
+
279
+ it "valid request with given params" do
280
+ expect(mock_connection).to receive(:post).with(url, {}, body.to_json).and_return valid_response
281
+ response = subject.create_lead(email, first_name, last_name)
282
+ expect(response).to eq(success_response["Message"]["Id"])
283
+ end
284
+
285
+ it "invalid request" do
286
+ expect(mock_connection).to receive(:post).with(url, {}, body.to_json).and_return invalid_response
287
+ expect {
288
+ subject.create_lead(email, first_name, last_name)
289
+ }.to raise_error(Leadsquared::InvalidRequestError)
290
+ end
291
+ end
292
+
293
+ describe "#get_meta_data" do
294
+ let(:success_response) do
295
+ [
296
+ {
297
+ "SchemaName" => "mx_CreationTime",
298
+ "DisplayName" => "CreationTime",
299
+ "DataType" => "Time",
300
+ "IsMandatory" => false,
301
+ "MaxLength" => "50",
302
+ "RenderType" => 21,
303
+ "RenderTypeTextValue" => "Time"
304
+ },
305
+ {
306
+ "SchemaName" => "mx_ModifiedTime",
307
+ "DisplayName" => "ModifiedTime",
308
+ "DataType" => "Time",
309
+ "IsMandatory" => false,
310
+ "MaxLength" => "50",
311
+ "RenderType" => 21,
312
+ "RenderTypeTextValue" => "Time"
313
+ }]
314
+ end
315
+ let(:valid_response) { double("response", status: 200, body: success_response.to_json) }
316
+ let(:url) { "#{service}LeadsMetaData.Get" }
317
+
318
+ it "valid request with given params" do
319
+ expect(mock_connection).to receive(:get).with(url, {}).and_return valid_response
320
+ response = subject.get_meta_data
321
+ end
322
+
323
+ end
324
+ end