From 94152d4acd077fed7d38824532501c87fbda4eb5 Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Mon, 5 Feb 2018 22:33:07 +0530 Subject: [PATCH 1/7] Add a module to access Marketo emails This commit adds a sample code to access Marketo emails by ID and name. It also has a method to be able to access an email's content. --- lib/mrkt.rb | 2 ++ lib/mrkt/concerns/crud_emails.rb | 21 +++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 lib/mrkt/concerns/crud_emails.rb diff --git a/lib/mrkt.rb b/lib/mrkt.rb index fb88859..ef26a01 100644 --- a/lib/mrkt.rb +++ b/lib/mrkt.rb @@ -13,6 +13,7 @@ require 'mrkt/concerns/crud_custom_objects' require 'mrkt/concerns/crud_custom_activities' require 'mrkt/concerns/crud_programs' +require 'mrkt/concerns/crud_emails' module Mrkt class Client @@ -28,6 +29,7 @@ class Client include CrudCustomObjects include CrudCustomActivities include CrudPrograms + include CrudEmails attr_accessor :debug diff --git a/lib/mrkt/concerns/crud_emails.rb b/lib/mrkt/concerns/crud_emails.rb new file mode 100644 index 0000000..81cc012 --- /dev/null +++ b/lib/mrkt/concerns/crud_emails.rb @@ -0,0 +1,21 @@ +module Mrkt + module CrudEmails + def get_email_by_id(id) + get("/rest/asset/v1/email/#{id}.json") + end + + def get_email_by_name(name) + params = { + name: name + } + + get("/rest/asset/v1/email/byName.json", params) + end + + def get_email_content(id) + + get("/rest/asset/v1/email/#{id}/content.json") + end + + end +end From 3ea86311c2038dc7cc8073ab6656304a4347a617 Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Tue, 13 Feb 2018 06:15:58 +0530 Subject: [PATCH 2/7] Update email content, schedule campaign IMPORTANT: while sending data to update email, make sure the content type is multipart/form-data --- lib/mrkt/concerns/crud_campaigns.rb | 13 +++++++++++++ lib/mrkt/concerns/crud_emails.rb | 13 +++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/mrkt/concerns/crud_campaigns.rb b/lib/mrkt/concerns/crud_campaigns.rb index c81af94..d9f9838 100644 --- a/lib/mrkt/concerns/crud_campaigns.rb +++ b/lib/mrkt/concerns/crud_campaigns.rb @@ -10,5 +10,18 @@ def request_campaign(id, lead_ids, tokens = {}) } end end + + def schedule_campaign(id, run_at = nil) + if run_at.blank? + run_at = 2.minutes.from_now.in_time_zone(-8).iso8601 + end + post_json("/rest/v1/campaigns/#{id}/schedule.json") do + { + input: { + runAt: run_at + } + } + end + end end end diff --git a/lib/mrkt/concerns/crud_emails.rb b/lib/mrkt/concerns/crud_emails.rb index 81cc012..752721d 100644 --- a/lib/mrkt/concerns/crud_emails.rb +++ b/lib/mrkt/concerns/crud_emails.rb @@ -8,14 +8,23 @@ def get_email_by_name(name) params = { name: name } - get("/rest/asset/v1/email/byName.json", params) end def get_email_content(id) - get("/rest/asset/v1/email/#{id}/content.json") end + def approve_email_draft(id) + post("/rest/asset/v1/email/#{id}/approveDraft.json") + end + + def update_email_content(id, html_id, content, text_value = nil) + post("/rest/asset/v1/email/#{id}/content/#{html_id}.json") do |req| + req.headers[:content_type] = 'multipart/form-data;charset=UTF-8' + req.body = {type: "Text", value: content} + end + end + end end From e1a97e5d76c9249af9280990e3d5de7bafe27fd8 Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Wed, 14 Feb 2018 04:19:42 +0530 Subject: [PATCH 3/7] Test: Update email subject --- lib/mrkt/concerns/crud_emails.rb | 15 +++++++++++++++ lib/mrkt/errors.rb | 1 + 2 files changed, 16 insertions(+) diff --git a/lib/mrkt/concerns/crud_emails.rb b/lib/mrkt/concerns/crud_emails.rb index 752721d..8c938c4 100644 --- a/lib/mrkt/concerns/crud_emails.rb +++ b/lib/mrkt/concerns/crud_emails.rb @@ -19,6 +19,12 @@ def approve_email_draft(id) post("/rest/asset/v1/email/#{id}/approveDraft.json") end + def update_email(id) + post("/rest/asset/v1/email/#{id}/content.json") do + { subject: {type: "string", value: "Announcement Alert"}} + end + end + def update_email_content(id, html_id, content, text_value = nil) post("/rest/asset/v1/email/#{id}/content/#{html_id}.json") do |req| req.headers[:content_type] = 'multipart/form-data;charset=UTF-8' @@ -26,5 +32,14 @@ def update_email_content(id, html_id, content, text_value = nil) end end + def update_email_full_content(id, content) + payload = {} + payload[:content] = Faraday::UploadIO.new(content.path, 'text/html') + # payload = {content: content} + post("/rest/asset/v1/email/#{id}/fullContent.json", payload) do |req| + req.headers[:content_type] = 'multipart/form-data;charset=UTF-8' + end + end + end end diff --git a/lib/mrkt/errors.rb b/lib/mrkt/errors.rb index 1b1aa02..1aa6992 100644 --- a/lib/mrkt/errors.rb +++ b/lib/mrkt/errors.rb @@ -47,6 +47,7 @@ def self.create_class end def self.find_by_response_code(response_code) + puts response_code.inspect const_get(RESPONSE_CODE_TO_ERROR.fetch(response_code, 'Error')) end end From c80db04d1fe16738a62c6b864022581cc3930fe2 Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Thu, 15 Feb 2018 03:43:41 +0530 Subject: [PATCH 4/7] Update email subject, add spec - add code to update emai subject - add a new error class for code 702 (no data found) - add spec for campaign schedule and email --- lib/mrkt/concerns/crud_campaigns.rb | 3 - lib/mrkt/concerns/crud_emails.rb | 40 +++++-------- lib/mrkt/errors.rb | 1 + spec/concerns/crud_campaigns_spec.rb | 42 ++++++++++++++ spec/concerns/crud_emails_spec.rb | 85 ++++++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 28 deletions(-) create mode 100644 spec/concerns/crud_emails_spec.rb diff --git a/lib/mrkt/concerns/crud_campaigns.rb b/lib/mrkt/concerns/crud_campaigns.rb index d9f9838..cd22723 100644 --- a/lib/mrkt/concerns/crud_campaigns.rb +++ b/lib/mrkt/concerns/crud_campaigns.rb @@ -12,9 +12,6 @@ def request_campaign(id, lead_ids, tokens = {}) end def schedule_campaign(id, run_at = nil) - if run_at.blank? - run_at = 2.minutes.from_now.in_time_zone(-8).iso8601 - end post_json("/rest/v1/campaigns/#{id}/schedule.json") do { input: { diff --git a/lib/mrkt/concerns/crud_emails.rb b/lib/mrkt/concerns/crud_emails.rb index 8c938c4..b44dd97 100644 --- a/lib/mrkt/concerns/crud_emails.rb +++ b/lib/mrkt/concerns/crud_emails.rb @@ -1,30 +1,29 @@ module Mrkt module CrudEmails - def get_email_by_id(id) - get("/rest/asset/v1/email/#{id}.json") - end + # def get_email_by_id(id) + # get("/rest/asset/v1/email/#{id}.json") + # end - def get_email_by_name(name) - params = { - name: name - } - get("/rest/asset/v1/email/byName.json", params) - end + # def get_email_by_name(name) + # params = { + # name: name + # } + # get("/rest/asset/v1/email/byName.json", params) + # end - def get_email_content(id) - get("/rest/asset/v1/email/#{id}/content.json") - end + # def get_email_content(id) + # get("/rest/asset/v1/email/#{id}/content.json") + # end def approve_email_draft(id) post("/rest/asset/v1/email/#{id}/approveDraft.json") end - def update_email(id) - post("/rest/asset/v1/email/#{id}/content.json") do - { subject: {type: "string", value: "Announcement Alert"}} - end + def update_email(id, subject) + post("/rest/asset/v1/email/#{id}/content.json?subject={'type':'Text','value':'#{subject}'}") end + def update_email_content(id, html_id, content, text_value = nil) post("/rest/asset/v1/email/#{id}/content/#{html_id}.json") do |req| req.headers[:content_type] = 'multipart/form-data;charset=UTF-8' @@ -32,14 +31,5 @@ def update_email_content(id, html_id, content, text_value = nil) end end - def update_email_full_content(id, content) - payload = {} - payload[:content] = Faraday::UploadIO.new(content.path, 'text/html') - # payload = {content: content} - post("/rest/asset/v1/email/#{id}/fullContent.json", payload) do |req| - req.headers[:content_type] = 'multipart/form-data;charset=UTF-8' - end - end - end end diff --git a/lib/mrkt/errors.rb b/lib/mrkt/errors.rb index 1aa6992..d088deb 100644 --- a/lib/mrkt/errors.rb +++ b/lib/mrkt/errors.rb @@ -25,6 +25,7 @@ def self.create_class 610 => 'RequestedResourceNotFound', 611 => 'System', 612 => 'InvalidContentType', + 702 => 'NoDataFound', 703 => 'DisabledFeature', 1001 => 'TypeMismatch', 1002 => 'MissingParamater', diff --git a/spec/concerns/crud_campaigns_spec.rb b/spec/concerns/crud_campaigns_spec.rb index 113c026..c80b7b2 100644 --- a/spec/concerns/crud_campaigns_spec.rb +++ b/spec/concerns/crud_campaigns_spec.rb @@ -13,6 +13,7 @@ value: 'Value for other token' }] end + subject { client.request_campaign(id, lead_ids, tokens) } before do @@ -68,4 +69,45 @@ end end end + + describe '#schedule_campaign' do + let(:id) { 42 } + + subject { client.schedule_campaign(id) } + + before do + stub_request(:post, "https://#{host}/rest/v1/campaigns/#{id}/schedule.json") + .to_return(json_stub(response_stub)) + end + + context 'with an invalid campaign id' do + let(:response_stub) do + { + requestId: 'a2b#9a4567d34f', + success: false, + errors: [{ + code: '1013', + message: 'Campaign not found' + }] + } + end + + it 'should raise an Error' do + expect { subject }.to raise_error(Mrkt::Errors::ObjectNotFound) + end + end + + context 'with valid campaign id' do + let(:response_stub) do + { + requestId: 'e42b#14272d07d78', + success: true, + :result=>[{:id=>1254}] + } + end + + it { is_expected.to eq(response_stub) } + end + end + end diff --git a/spec/concerns/crud_emails_spec.rb b/spec/concerns/crud_emails_spec.rb new file mode 100644 index 0000000..5b0f5c6 --- /dev/null +++ b/spec/concerns/crud_emails_spec.rb @@ -0,0 +1,85 @@ +describe Mrkt::CrudCampaigns do + include_context 'initialized client' + + describe '#approve_email_draft' do + let(:id) { 42 } + + subject { client.approve_email_draft(id) } + + before do + stub_request(:post, "https://#{host}/rest/asset/v1/email/#{id}/approveDraft.json") + .to_return(json_stub(response_stub)) + end + + context 'with an invalid email id' do + let(:response_stub) do + { + requestId: 'a2b#9a4567d34f', + success: false, + errors: [{ + code: '702', + message: 'Email not found' + }] + } + end + + it 'should raise an Error' do + expect { subject }.to raise_error(Mrkt::Errors::NoDataFound) + end + end + + context 'with valid email id' do + let(:response_stub) do + { + requestId: 'e42b#14272d07d78', + success: true, + :result=>[{:id=>42}] + } + end + + it { is_expected.to eq(response_stub) } + end + end + + describe '#update_email' do + let(:id) { 42 } + let(:email_subject) { "Test" } + + subject { client.update_email(id, email_subject) } + + before do + stub_request(:post, "https://#{host}/rest/asset/v1/email/#{id}/content.json?subject={'type':'Text','value':'#{email_subject}'}") + .to_return(json_stub(response_stub)) + end + + context 'with an invalid email id' do + let(:response_stub) do + { + requestId: 'a2b#9a4567d34f', + success: false, + errors: [{ + code: '702', + message: 'Email not found' + }] + } + end + + it 'should raise an Error' do + expect { subject }.to raise_error(Mrkt::Errors::NoDataFound) + end + end + + context 'with valid email id' do + let(:response_stub) do + { + requestId: 'e42b#14272d07d78', + success: true, + :result=>[{:id=>42}] + } + end + + it { is_expected.to eq(response_stub) } + end + end + +end From 7df0aacf51fb25b52b0fb2a8f7f405942d17ba3d Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Mon, 26 Mar 2018 18:41:05 +0530 Subject: [PATCH 5/7] Fetch a marketo email record using it's ID --- lib/mrkt/concerns/crud_emails.rb | 19 ++++++---------- lib/mrkt/errors.rb | 1 - spec/concerns/crud_emails_spec.rb | 36 +++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/lib/mrkt/concerns/crud_emails.rb b/lib/mrkt/concerns/crud_emails.rb index b44dd97..405ab35 100644 --- a/lib/mrkt/concerns/crud_emails.rb +++ b/lib/mrkt/concerns/crud_emails.rb @@ -1,19 +1,12 @@ module Mrkt module CrudEmails - # def get_email_by_id(id) - # get("/rest/asset/v1/email/#{id}.json") - # end - - # def get_email_by_name(name) - # params = { - # name: name - # } - # get("/rest/asset/v1/email/byName.json", params) - # end + def get_email_by_id(id) + get("/rest/asset/v1/email/#{id}.json") + end - # def get_email_content(id) - # get("/rest/asset/v1/email/#{id}/content.json") - # end + def get_email_content(id) + get("/rest/asset/v1/email/#{id}/content.json") + end def approve_email_draft(id) post("/rest/asset/v1/email/#{id}/approveDraft.json") diff --git a/lib/mrkt/errors.rb b/lib/mrkt/errors.rb index d088deb..e1e889c 100644 --- a/lib/mrkt/errors.rb +++ b/lib/mrkt/errors.rb @@ -48,7 +48,6 @@ def self.create_class end def self.find_by_response_code(response_code) - puts response_code.inspect const_get(RESPONSE_CODE_TO_ERROR.fetch(response_code, 'Error')) end end diff --git a/spec/concerns/crud_emails_spec.rb b/spec/concerns/crud_emails_spec.rb index 5b0f5c6..03c7fe2 100644 --- a/spec/concerns/crud_emails_spec.rb +++ b/spec/concerns/crud_emails_spec.rb @@ -1,6 +1,42 @@ describe Mrkt::CrudCampaigns do include_context 'initialized client' + describe '#get_email_by_id' do + let(:id) { 42 } + + subject { client.get_email_by_id(id) } + + before do + stub_request(:get, "https://#{host}/rest/asset/v1/email/#{id}.json") + .to_return(json_stub(response_stub)) + end + + context 'with invalid email id' do + let(:response_stub) do + { + requestId: '7cdc#14eb6ae8a86', + success: true, + warnings: ["No assets found for the given search criteria."] + } + end + + it { is_expected.to eq(response_stub) } + end + + context 'for valid email id' do + let(:response_stub) do + { + requestId: 'e42b#14272d07d78', + success: true + } + end + + it { is_expected.to eq(response_stub) } + end + end + + + describe '#approve_email_draft' do let(:id) { 42 } From 9147bb07dcbe30c676583bb61d295c6f9d4a0bca Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Mon, 26 Mar 2018 18:46:46 +0530 Subject: [PATCH 6/7] Removed the code for getting email content --- lib/mrkt/concerns/crud_emails.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/mrkt/concerns/crud_emails.rb b/lib/mrkt/concerns/crud_emails.rb index 405ab35..fe104a9 100644 --- a/lib/mrkt/concerns/crud_emails.rb +++ b/lib/mrkt/concerns/crud_emails.rb @@ -4,10 +4,6 @@ def get_email_by_id(id) get("/rest/asset/v1/email/#{id}.json") end - def get_email_content(id) - get("/rest/asset/v1/email/#{id}/content.json") - end - def approve_email_draft(id) post("/rest/asset/v1/email/#{id}/approveDraft.json") end @@ -16,7 +12,6 @@ def update_email(id, subject) post("/rest/asset/v1/email/#{id}/content.json?subject={'type':'Text','value':'#{subject}'}") end - def update_email_content(id, html_id, content, text_value = nil) post("/rest/asset/v1/email/#{id}/content/#{html_id}.json") do |req| req.headers[:content_type] = 'multipart/form-data;charset=UTF-8' From 8dfec4f6fd1651afd4fcf7c9f4bfb2b99bb4704b Mon Sep 17 00:00:00 2001 From: prachi-mantri Date: Mon, 26 Mar 2018 20:29:28 +0530 Subject: [PATCH 7/7] Encode URL for post request in the spec --- spec/concerns/crud_emails_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/concerns/crud_emails_spec.rb b/spec/concerns/crud_emails_spec.rb index 03c7fe2..d21ded0 100644 --- a/spec/concerns/crud_emails_spec.rb +++ b/spec/concerns/crud_emails_spec.rb @@ -84,7 +84,7 @@ subject { client.update_email(id, email_subject) } before do - stub_request(:post, "https://#{host}/rest/asset/v1/email/#{id}/content.json?subject={'type':'Text','value':'#{email_subject}'}") + stub_request(:post, URI.encode("https://#{host}/rest/asset/v1/email/#{id}/content.json?subject={'type':'Text','value':'#{email_subject}'}")) .to_return(json_stub(response_stub)) end