From 59a804be7fb804fda1d1896b23ecae69932eafae Mon Sep 17 00:00:00 2001 From: Phil Oye Date: Sun, 2 Aug 2015 10:52:16 +1000 Subject: [PATCH] Transactional email: Timeline + Statistics --- lib/createsend.rb | 1 + lib/createsend/transactional_timeline.rb | 45 +++++++ test/fixtures/tx_message_details.json | 36 ++++++ .../tx_message_details_with_statistics.json | 72 ++++++++++++ test/fixtures/tx_messages.json | 38 ++++++ test/fixtures/tx_messages_classic.json | 15 +++ test/fixtures/tx_messages_smart.json | 15 +++ test/fixtures/tx_resend_message.json | 6 + test/fixtures/tx_statistics_classic.json | 14 +++ test/fixtures/tx_statistics_smart.json | 14 +++ test/transactional_timeline_test.rb | 110 ++++++++++++++++++ 11 files changed, 366 insertions(+) create mode 100644 lib/createsend/transactional_timeline.rb create mode 100644 test/fixtures/tx_message_details.json create mode 100644 test/fixtures/tx_message_details_with_statistics.json create mode 100644 test/fixtures/tx_messages.json create mode 100644 test/fixtures/tx_messages_classic.json create mode 100644 test/fixtures/tx_messages_smart.json create mode 100644 test/fixtures/tx_resend_message.json create mode 100644 test/fixtures/tx_statistics_classic.json create mode 100644 test/fixtures/tx_statistics_smart.json create mode 100644 test/transactional_timeline_test.rb diff --git a/lib/createsend.rb b/lib/createsend.rb index c361986..67ee451 100644 --- a/lib/createsend.rb +++ b/lib/createsend.rb @@ -13,3 +13,4 @@ require 'createsend/administrator' require 'createsend/transactional_classic_email' require 'createsend/transactional_smart_email' +require 'createsend/transactional_timeline' diff --git a/lib/createsend/transactional_timeline.rb b/lib/createsend/transactional_timeline.rb new file mode 100644 index 0000000..dc42dcd --- /dev/null +++ b/lib/createsend/transactional_timeline.rb @@ -0,0 +1,45 @@ +module CreateSend + module Transactional + class Timeline < CreateSend + attr_reader :client_id + + def initialize(auth, client_id = nil) + @auth = auth + @client_id = client_id + super + end + + def messages(options = {}) + options = add_client_id(options) + response = get "/transactional/messages", { :query => options } + response.map{|item| Hashie::Mash.new(item)} + end + + def statistics(options = {}) + options = add_client_id(options) + response = get "/transactional/statistics", { :query => options } + Hashie::Mash.new(response) + end + + def details(message_id, options = {}) + options = add_client_id(options) + response = get "/transactional/messages/#{message_id}", { :query => options } + Hashie::Mash.new(response) + end + + def resend(message_id) + response = post "/transactional/messages/#{message_id}/resend" + response.map{|item| Hashie::Mash.new(item)} + end + + private + + def add_client_id(options) + options['clientID'] = @client_id if @client_id + options + end + + end + end +end + diff --git a/test/fixtures/tx_message_details.json b/test/fixtures/tx_message_details.json new file mode 100644 index 0000000..aa35898 --- /dev/null +++ b/test/fixtures/tx_message_details.json @@ -0,0 +1,36 @@ +{ + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "SmartEmailID": "c0da9c4c-e7e4-11e4-a74d-6c4008bc7468", + "CanBeResent": true, + "Recipient": "Joe Smith ", + "Message": { + "From": "Team Webapp ", + "jamesmith@example.com" + ], + "CC": [ + "Joe Smith " + ], + "BCC": "joesmith@example.com", + "Attachments": [ + { + "Name": "Invoice.pdf", + "Type": "application/pdf" + } + ], + "Body": { + "Html": "...", + "Text": "..." + }, + "Data": { + "new_password_url": "https://www.mywebapp.com/newpassword?uid=jguf45hf74hbf74gf" + } + }, + "TotalOpens": 1, + "TotalClicks": 1 +} + diff --git a/test/fixtures/tx_message_details_with_statistics.json b/test/fixtures/tx_message_details_with_statistics.json new file mode 100644 index 0000000..e933691 --- /dev/null +++ b/test/fixtures/tx_message_details_with_statistics.json @@ -0,0 +1,72 @@ +{ + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "SmartEmailID": "c0da9c4c-e7e4-11e4-a74d-6c4008bc7468", + "CanBeResent": true, + "Recipient": "Joe Smith ", + "Message": { + "From": "Team Webapp ", + "jamesmith@example.com" + ], + "CC": [ + "Joe Smith " + ], + "BCC": "joesmith@example.com", + "Attachments": [ + { + "Name": "Invoice.pdf", + "Type": "application/pdf" + } + ], + "Body": { + "Html": "...", + "Text": "..." + }, + "Data": { + "new_password_url": "https://www.mywebapp.com/newpassword?uid=jguf45hf74hbf74gf" + } + }, + "TotalOpens": 1, + "TotalClicks": 1, + "Opens": [ + { + "EmailAddress": "jamesmith@example.com", + "Date": "2009-05-18 16:45:00", + "IPAddress": "192.168.0.1", + "Geolocation": { + "Latitude": -33.8683, + "Longitude": 151.2086, + "City": "Sydney", + "Region": "New South Wales", + "CountryCode": "AU", + "CountryName": "Australia" + }, + "MailClient": { + "Name": "Apple Mail", + "OS": "OS X", + "Device": "Desktop" + } + } + ], + "Clicks": [ + { + "EmailAddress": "jamesmith@example.com", + "Date": "2009-05-18 16:45:00", + "IPAddress": "192.168.0.1", + "URL": "http://www.myexammple.com/index.html", + "Geolocation": { + "Latitude": -33.8683, + "Longitude": 151.2086, + "City": "Sydney", + "Region": "New South Wales", + "CountryCode": "AU", + "CountryName": "Australia" + } + } + ] +} + diff --git a/test/fixtures/tx_messages.json b/test/fixtures/tx_messages.json new file mode 100644 index 0000000..c5e7fa5 --- /dev/null +++ b/test/fixtures/tx_messages.json @@ -0,0 +1,38 @@ +[ + { + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "Recipient": "Joe Smith ", + "From": "Team ", + "Subject": "Ungrouped message", + "TotalOpens": 2, + "TotalClicks": 4, + "CanBeResent": true + }, + { + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "Recipient": "Joe Smith ", + "From": "Team ", + "Subject": "Your password has been reset", + "TotalOpens": 2, + "TotalClicks": 4, + "CanBeResent": true, + "Group": "Password Reset" + }, + { + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "Recipient": "Joe Smith ", + "From": "Team ", + "Subject": "Your credit card has expired", + "TotalOpens": 2, + "TotalClicks": 4, + "CanBeResent": true, + "SmartEmailID": "21dab350-f484-11e4-ad38-6c4008bc7468" + } +] + diff --git a/test/fixtures/tx_messages_classic.json b/test/fixtures/tx_messages_classic.json new file mode 100644 index 0000000..bc1844f --- /dev/null +++ b/test/fixtures/tx_messages_classic.json @@ -0,0 +1,15 @@ +[ + { + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "Recipient": "Joe Smith ", + "From": "Team ", + "Subject": "Your password has been reset", + "TotalOpens": 2, + "TotalClicks": 4, + "CanBeResent": true, + "Group": "Password Reset" + } +] + diff --git a/test/fixtures/tx_messages_smart.json b/test/fixtures/tx_messages_smart.json new file mode 100644 index 0000000..4a767f3 --- /dev/null +++ b/test/fixtures/tx_messages_smart.json @@ -0,0 +1,15 @@ +[ + { + "MessageID": "ddc697c7-0788-4df3-a71a-a7cb935f00bd", + "Status": "Delivered", + "SentAt": "2014-01-15T16:09:19-05:00", + "Recipient": "Joe Smith ", + "From": "Team ", + "Subject": "Your credit card has expired", + "TotalOpens": 2, + "TotalClicks": 4, + "CanBeResent": true, + "SmartEmailID": "21dab350-f484-11e4-ad38-6c4008bc7468" + } +] + diff --git a/test/fixtures/tx_resend_message.json b/test/fixtures/tx_resend_message.json new file mode 100644 index 0000000..979ff92 --- /dev/null +++ b/test/fixtures/tx_resend_message.json @@ -0,0 +1,6 @@ +{ + "Status": "Accepted", + "Recipient": "Joe Smith ", + "MessageID": "cfb5e081-ef66-4bc4-a1c0-48493b34e694" +} + diff --git a/test/fixtures/tx_statistics_classic.json b/test/fixtures/tx_statistics_classic.json new file mode 100644 index 0000000..be1517e --- /dev/null +++ b/test/fixtures/tx_statistics_classic.json @@ -0,0 +1,14 @@ +{ + "Query": { + "Group": "Password Reset", + "From": "2014-02-03", + "To": "2015-02-02", + "TimeZone": "(GMT+10:00) Canberra, Melbourne, Sydney" + }, + "Sent": 1000, + "Bounces": 8, + "Delivered": 992, + "Opened": 300, + "Clicked": 50 +} + diff --git a/test/fixtures/tx_statistics_smart.json b/test/fixtures/tx_statistics_smart.json new file mode 100644 index 0000000..767f726 --- /dev/null +++ b/test/fixtures/tx_statistics_smart.json @@ -0,0 +1,14 @@ +{ + "Query": { + "SmartEmailID": "bb4a6ebb-663d-42a0-bdbe-60512cf30a01", + "From": "2014-02-03", + "To": "2015-02-02", + "TimeZone": "UTC" + }, + "Sent": 1000, + "Bounces": 8, + "Delivered": 992, + "Opened": 300, + "Clicked": 50 +} + diff --git a/test/transactional_timeline_test.rb b/test/transactional_timeline_test.rb new file mode 100644 index 0000000..8e0f5f3 --- /dev/null +++ b/test/transactional_timeline_test.rb @@ -0,0 +1,110 @@ +require File.dirname(__FILE__) + '/helper' + +class TransactionalTimelineTest < Test::Unit::TestCase + multiple_contexts "authenticated_using_oauth_context", "authenticated_using_api_key_context" do + setup do + @client_id = "87y8d7qyw8d7yq8w7ydwqwd" + @message_id = "ddc697c7-0788-4df3-a71a-a7cb935f00bd" + @before_id = 'e2e270e6-fbce-11e4-97fc-a7cf717ca157' + @after_id = 'e96fc6ca-fbce-11e4-949f-c3ccd6a68863' + @smart_email_id = 'bb4a6ebb-663d-42a0-bdbe-60512cf30a01' + end + + should "get statistics with the default parameters" do + stub_get(@auth, "transactional/statistics", "tx_statistics_classic.json") + response = CreateSend::Transactional::Timeline.new(@auth).statistics + response.Sent.should == 1000 + response.Opened.should == 300 + end + + should "get statistics filtered by date and classic group" do + stub_get(@auth, "transactional/statistics?from=2015-01-01&to=2015-06-30&timezone=client&group=Password%20Reset", "tx_statistics_classic.json") + response = CreateSend::Transactional::Timeline.new(@auth).statistics( + "from" => "2015-01-01", + "to" => "2015-06-30", + "timezone" => "client", + "group" => "Password Reset" + ) + response.Query.TimeZone.should == "(GMT+10:00) Canberra, Melbourne, Sydney" + response.Query.Group.should == "Password Reset" + response.Sent.should == 1000 + end + + should "get statistics filtered by date and smart email" do + stub_get(@auth, "transactional/statistics?from=2015-01-01&to=2015-06-30&timezone=utc&smartEmailID=#{@smart_email_id}", "tx_statistics_smart.json") + response = CreateSend::Transactional::Timeline.new(@auth).statistics( + "from" => "2015-01-01", + "to" => "2015-06-30", + "timezone" => "utc", + "smartEmailID" => "bb4a6ebb-663d-42a0-bdbe-60512cf30a01" + ) + response.Query.TimeZone.should == "UTC" + response.Query.SmartEmailID.should == "bb4a6ebb-663d-42a0-bdbe-60512cf30a01" + response.Sent.should == 1000 + end + + should "get the message timeline with default parameters" do + stub_get(@auth, "transactional/messages", "tx_messages.json") + response = CreateSend::Transactional::Timeline.new(@auth).messages + response.length.should == 3 + response[0].MessageID.should == "ddc697c7-0788-4df3-a71a-a7cb935f00bd" + response[0].Status.should == "Delivered" + end + + should "get the message timeline for a smart email" do + stub_get(@auth, "transactional/messages?status=all&count=200&sentBeforeID=#{@before_id}&sentAfterID=#{@after_id}&smartEmailID=#{@smart_email_id}&clientID=#{@client_id}", "tx_messages_smart.json") + response = CreateSend::Transactional::Timeline.new(@auth).messages( + "status" => 'all', + "count" => 200, + "sentBeforeID" => @before_id, + "sentAfterID" => @after_id, + "smartEmailID" => @smart_email_id, + "clientID" => @client_id + ) + response.length.should == 1 + response[0].MessageID.should == "ddc697c7-0788-4df3-a71a-a7cb935f00bd" + response[0].Status.should == "Delivered" + end + + should "get the message timeline for a classic group" do + stub_get(@auth, "transactional/messages?status=all&count=200&sentBeforeID=#{@before_id}&sentAfterID=#{@after_id}&group=Password%20Reset&clientID=#{@client_id}", "tx_messages_classic.json") + response = CreateSend::Transactional::Timeline.new(@auth).messages( + "status" => 'all', + "count" => 200, + "sentBeforeID" => @before_id, + "sentAfterID" => @after_id, + "group" => 'Password Reset', + "clientID" => @client_id + ) + response.length.should == 1 + response[0].Group.should == "Password Reset" + response[0].Status.should == "Delivered" + end + + should "get the message details" do + stub_get(@auth, "transactional/messages/#{@message_id}", "tx_message_details.json") + response = CreateSend::Transactional::Timeline.new(@auth).details(@message_id) + response.TotalOpens.should == 1 + response.TotalClicks.should == 1 + end + + should "get the message details with statistics" do + stub_get(@auth, "transactional/messages/#{@message_id}?statistics=true", "tx_message_details_with_statistics.json") + response = CreateSend::Transactional::Timeline.new(@auth).details(@message_id, :statistics => true) + response.Opens.length == 1 + response.Clicks.length == 1 + end + + should "resend a message" do + stub_post(@auth, "transactional/messages/#{@message_id}/resend", "tx_send_single.json") + response = CreateSend::Transactional::Timeline.new(@auth).resend(@message_id) + response.length.should == 1 + response[0].MessageID.should == "0cfe150d-d507-11e4-84a7-c31e5b59881d" + response[0].Recipient.should == "\"Bob Sacamano\" " + response[0].Status.should == "Received" + end + + end +end + +