traffic_mansion 0.0.2
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 +7 -0
- data/.gitignore +18 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +1 -0
- data/README.md +11 -0
- data/Rakefile +1 -0
- data/lib/traffic_mansion.rb +14 -0
- data/lib/traffic_mansion/queue.rb +123 -0
- data/lib/traffic_mansion/queue_processor.rb +23 -0
- data/lib/traffic_mansion/railtie.rb +10 -0
- data/lib/traffic_mansion/response.rb +31 -0
- data/lib/traffic_mansion/tracker.rb +86 -0
- data/lib/traffic_mansion/version.rb +3 -0
- data/spec/queue_spec.rb +277 -0
- data/spec/response_spec.rb +80 -0
- data/spec/spec_helper.rb +20 -0
- data/tasks/traffic_mansion.rake +8 -0
- data/traffic_mansion.gemspec +30 -0
- metadata +176 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 8a660cb1fe56a4de45f4dc7deafd6bde1047abbd
|
4
|
+
data.tar.gz: 88fd56ea76a4211109338f1cef39affc160093b6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 91521431d855ba34deafa166fe605fc2812719b82cd8fdaae9c570a8ceaf7dc266780e03124b0deadecda6db8e887a4e41b7dcfec9569b58c01400271f37c275
|
7
|
+
data.tar.gz: f7ba1666b17eabebae9ffc31039bd1bb60a216bcf3025f020e84983c3c16f635e1d151fc163caeff0a13b2cdbf42f6cc56b85f0f0c5a13277740bb92019f6116
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Copyright (c) 2013 AgileWings
|
data/README.md
ADDED
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/traffic_mansion/version"
|
2
|
+
require File.dirname(__FILE__) + "/traffic_mansion/response"
|
3
|
+
require File.dirname(__FILE__) + "/traffic_mansion/tracker"
|
4
|
+
require File.dirname(__FILE__) + "/traffic_mansion/queue_processor"
|
5
|
+
require File.dirname(__FILE__) + "/traffic_mansion/queue"
|
6
|
+
require File.dirname(__FILE__) + "/traffic_mansion/railtie" if defined?(Rails)
|
7
|
+
|
8
|
+
module TrafficMansion
|
9
|
+
COOKIE_NAME = "tme"
|
10
|
+
|
11
|
+
def self.tracked_client? cookie_jar
|
12
|
+
cookie_jar[TrafficMansion::COOKIE_NAME].present?
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require "mongoid"
|
2
|
+
|
3
|
+
module TrafficMansion
|
4
|
+
class Queue
|
5
|
+
include Mongoid::Document
|
6
|
+
include Mongoid::Timestamps
|
7
|
+
|
8
|
+
field :type, :type => String
|
9
|
+
field :parent_event_id, :type => String
|
10
|
+
field :user_id, :type => String
|
11
|
+
field :data, :type => Hash
|
12
|
+
field :result, :type => Hash
|
13
|
+
field :processed, :type => Boolean, :default => false
|
14
|
+
|
15
|
+
index({ :type => 1 })
|
16
|
+
index({ :parent_event_id => 1 })
|
17
|
+
index({ :user_id => 1 })
|
18
|
+
index({ :processed => 1 })
|
19
|
+
|
20
|
+
def self.add_unique_visit campaign_id, remote_ip, referer
|
21
|
+
event_data = {
|
22
|
+
"campaign_id" => campaign_id,
|
23
|
+
"timestamp" => Time.now.to_i,
|
24
|
+
"remote_addr" => remote_ip,
|
25
|
+
"http_referer" => referer
|
26
|
+
}
|
27
|
+
TrafficMansion::Queue::add "visit", nil, event_data
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.add_signup parent_event_id, user_id, remote_ip, referer
|
31
|
+
event_data = {
|
32
|
+
"user_id" => user_id,
|
33
|
+
"timestamp" => Time.now.to_i,
|
34
|
+
"remote_addr" => remote_ip,
|
35
|
+
"http_referer" => referer
|
36
|
+
}
|
37
|
+
TrafficMansion::Queue::add "signup", parent_event_id, event_data
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
41
|
+
event_data = {
|
42
|
+
"user_id" => user_id,
|
43
|
+
"timestamp" => Time.now.to_i,
|
44
|
+
"transaction" => payment_id,
|
45
|
+
"amount" => amount,
|
46
|
+
"product_code" => product_code,
|
47
|
+
"remote_addr" => remote_ip,
|
48
|
+
"http_referer" => referer
|
49
|
+
}
|
50
|
+
TrafficMansion::Queue::add "sale", nil, event_data
|
51
|
+
end
|
52
|
+
|
53
|
+
def self.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
54
|
+
event_data = {
|
55
|
+
"user_id" => user_id,
|
56
|
+
"timestamp" => Time.now.to_i,
|
57
|
+
"transaction" => payment_id,
|
58
|
+
"amount" => amount,
|
59
|
+
"product_code" => product_code,
|
60
|
+
"remote_addr" => remote_ip,
|
61
|
+
"http_referer" => referer
|
62
|
+
}
|
63
|
+
TrafficMansion::Queue::add "rebill", nil, event_data
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.add type, parent_event_id = nil, data = {}
|
67
|
+
user_id = data["user_id"]
|
68
|
+
event = TrafficMansion::Queue.create :type => type, :parent_event_id => parent_event_id, :user_id => user_id, :data => data
|
69
|
+
TrafficMansion::QueueProcessor.perform_async event.id
|
70
|
+
event
|
71
|
+
end
|
72
|
+
|
73
|
+
def self.find_parent_by_user user_id
|
74
|
+
TrafficMansion::Queue.where(:user_id => user_id, :type => "signup").first
|
75
|
+
end
|
76
|
+
|
77
|
+
def process
|
78
|
+
if !parent? && parent_event_id.nil?
|
79
|
+
update_parent_event_id
|
80
|
+
end
|
81
|
+
if parent_event_id.present?
|
82
|
+
update_from_parent
|
83
|
+
end
|
84
|
+
track
|
85
|
+
end
|
86
|
+
|
87
|
+
def parent?
|
88
|
+
self.type == "visit"
|
89
|
+
end
|
90
|
+
|
91
|
+
def update_parent_event_id
|
92
|
+
parent_event = TrafficMansion::Queue.find_parent_by_user self.user_id
|
93
|
+
if parent_event
|
94
|
+
self.parent_event_id = parent_event.id
|
95
|
+
save
|
96
|
+
else
|
97
|
+
raise "Could not find a parent event!"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def update_from_parent
|
102
|
+
parent_event = TrafficMansion::Queue.find parent_event_id
|
103
|
+
if parent_event && parent_event.processed
|
104
|
+
self.data["visit_id"] = parent_event.data["visit_id"].present? ? parent_event.data["visit_id"] : parent_event.result["visit_id"]
|
105
|
+
save
|
106
|
+
else
|
107
|
+
raise "Parent was not processed yet!"
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def track
|
112
|
+
tracker = TrafficMansion::Tracker.new data
|
113
|
+
res = tracker.send type, data
|
114
|
+
if res.success?
|
115
|
+
self.result = res.get_response
|
116
|
+
self.processed = true
|
117
|
+
save
|
118
|
+
else
|
119
|
+
raise "Tracking failed with result: #{res.get_error}"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require "sidekiq"
|
2
|
+
require "mongoid"
|
3
|
+
|
4
|
+
module TrafficMansion
|
5
|
+
class QueueProcessor
|
6
|
+
include Sidekiq::Worker
|
7
|
+
|
8
|
+
def work(event_id)
|
9
|
+
begin
|
10
|
+
event = TrafficMansion::Queue.find(event_id)
|
11
|
+
if !event.processed
|
12
|
+
event.process
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def perform *args
|
18
|
+
Mongoid.unit_of_work(disable: :all) do
|
19
|
+
work(*args)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require "rack"
|
2
|
+
|
3
|
+
module TrafficMansion
|
4
|
+
class Response
|
5
|
+
def initialize response = ""
|
6
|
+
@last = parse_response response
|
7
|
+
end
|
8
|
+
|
9
|
+
def success?
|
10
|
+
@last["result"].present? && @last["result"] == "1"
|
11
|
+
end
|
12
|
+
|
13
|
+
def error?
|
14
|
+
@last["result"].present? && @last["result"] == "0"
|
15
|
+
end
|
16
|
+
|
17
|
+
def get_error
|
18
|
+
@last["error"]
|
19
|
+
end
|
20
|
+
|
21
|
+
def get_response
|
22
|
+
@last
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def parse_response response
|
28
|
+
Rack::Utils.parse_nested_query response, "\n"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require "rest_client"
|
2
|
+
|
3
|
+
module TrafficMansion
|
4
|
+
class Tracker
|
5
|
+
def initialize options = {}, endpoint = ENV["TRAFFIC_MANSION_ENDPOINT"], http_host = ENV["TRAFFIC_MANSION_HTTP_HOST"]
|
6
|
+
@endpoint = endpoint
|
7
|
+
@http_host = http_host
|
8
|
+
set_data options
|
9
|
+
end
|
10
|
+
|
11
|
+
def set_data data
|
12
|
+
@remote_addr = data[:remote_addr] ? data[:remote_addr] : nil
|
13
|
+
@campaign_id = data[:campaign_id] ? data[:campaign_id] : nil
|
14
|
+
@visit_id = data[:visit_id] ? data[:visit_id] : nil
|
15
|
+
@affiliate_id = data[:affiliate_id] ? data[:affiliate_id] : nil
|
16
|
+
@user_id = data[:user_id] ? data[:user_id] : nil
|
17
|
+
end
|
18
|
+
|
19
|
+
def visit options = {}
|
20
|
+
url = "#{@endpoint}/xd_visit.php"
|
21
|
+
params = {
|
22
|
+
:campaign_id => @campaign_id,
|
23
|
+
:keyword => nil,
|
24
|
+
:timestamp => Time.now.to_i,
|
25
|
+
:http_host => @http_host,
|
26
|
+
:remote_addr => @remote_addr,
|
27
|
+
:http_referer => nil,
|
28
|
+
:visit_id => @visit_id,
|
29
|
+
:affiliate_id => @affiliate_id
|
30
|
+
}.merge options
|
31
|
+
get_response url, params
|
32
|
+
end
|
33
|
+
|
34
|
+
def signup options = {}
|
35
|
+
auth true, options
|
36
|
+
end
|
37
|
+
|
38
|
+
def activate options = {}
|
39
|
+
auth false, options
|
40
|
+
end
|
41
|
+
|
42
|
+
def sale options = {}
|
43
|
+
payment "sale", options
|
44
|
+
end
|
45
|
+
|
46
|
+
def rebill options = {}
|
47
|
+
payment "rebill", options
|
48
|
+
end
|
49
|
+
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def auth is_create, options
|
54
|
+
url = "#{@endpoint}/xd_postsignup.php"
|
55
|
+
params = {
|
56
|
+
:visit_id => @visit_id,
|
57
|
+
:active => is_create ? 0 : 1,
|
58
|
+
:timestamp => Time.now.to_i,
|
59
|
+
:remote_addr => @remote_addr,
|
60
|
+
:user_id => @user_id
|
61
|
+
}.merge options
|
62
|
+
get_response url, params
|
63
|
+
end
|
64
|
+
|
65
|
+
def payment command, options
|
66
|
+
url = "#{@endpoint}/xd_postsale.php"
|
67
|
+
params = {
|
68
|
+
:visit_id => @visit_id,
|
69
|
+
:timestamp => Time.now.to_i,
|
70
|
+
:amount => nil,
|
71
|
+
:product_code => nil,
|
72
|
+
:user_id => @user_id,
|
73
|
+
:username => @username,
|
74
|
+
:transaction => nil,
|
75
|
+
:remote_addr => @remote_addr,
|
76
|
+
:command => command
|
77
|
+
}.merge options
|
78
|
+
get_response url, params
|
79
|
+
end
|
80
|
+
|
81
|
+
def get_response url, params
|
82
|
+
response = RestClient.post url, params
|
83
|
+
TrafficMansion::Response.new response
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/spec/queue_spec.rb
ADDED
@@ -0,0 +1,277 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'traffic_mansion'
|
3
|
+
|
4
|
+
describe TrafficMansion::Queue do
|
5
|
+
describe "self.add_unique_visit" do
|
6
|
+
let(:campaign_id) { "campaign_id" }
|
7
|
+
let(:remote_ip) { "remote_ip" }
|
8
|
+
let(:referer) { "referer" }
|
9
|
+
|
10
|
+
it "persists the visit" do
|
11
|
+
TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
|
12
|
+
TrafficMansion::Queue.last.type.should eql "visit"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "persists the campaign id" do
|
16
|
+
TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
|
17
|
+
TrafficMansion::Queue.last.data["campaign_id"].should eql campaign_id
|
18
|
+
end
|
19
|
+
|
20
|
+
it "persists the remote ip" do
|
21
|
+
TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
|
22
|
+
TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
|
23
|
+
end
|
24
|
+
|
25
|
+
it "persists the referer" do
|
26
|
+
TrafficMansion::Queue.add_unique_visit campaign_id, remote_ip, referer
|
27
|
+
TrafficMansion::Queue.last.data["http_referer"].should eql referer
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "self.add_signup" do
|
32
|
+
let(:parent_event_id) { "campaign_id" }
|
33
|
+
let(:user_id) { "user_id" }
|
34
|
+
let(:remote_ip) { "remote_ip" }
|
35
|
+
let(:referer) { "referer" }
|
36
|
+
|
37
|
+
it "persists the signup" do
|
38
|
+
TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
|
39
|
+
TrafficMansion::Queue.last.type.should eql "signup"
|
40
|
+
end
|
41
|
+
|
42
|
+
it "persists the parent event id" do
|
43
|
+
TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
|
44
|
+
TrafficMansion::Queue.last.parent_event_id.should eql parent_event_id
|
45
|
+
end
|
46
|
+
|
47
|
+
it "persists the user id" do
|
48
|
+
TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
|
49
|
+
TrafficMansion::Queue.last.user_id.should eql user_id
|
50
|
+
end
|
51
|
+
|
52
|
+
it "persists the user id" do
|
53
|
+
TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
|
54
|
+
TrafficMansion::Queue.last.data["user_id"].should eql user_id
|
55
|
+
end
|
56
|
+
|
57
|
+
it "persists the remote ip" do
|
58
|
+
TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
|
59
|
+
TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
|
60
|
+
end
|
61
|
+
|
62
|
+
it "persists the referer" do
|
63
|
+
TrafficMansion::Queue.add_signup parent_event_id, user_id, remote_ip, referer
|
64
|
+
TrafficMansion::Queue.last.data["http_referer"].should eql referer
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
describe "self.add_sale" do
|
69
|
+
let(:user_id) { "user_id" }
|
70
|
+
let(:payment_id) { "payment_id" }
|
71
|
+
let(:amount) { "amount" }
|
72
|
+
let(:product_code) { "product_code" }
|
73
|
+
let(:remote_ip) { "remote_ip" }
|
74
|
+
let(:referer) { "referer" }
|
75
|
+
|
76
|
+
it "persists the sale" do
|
77
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
78
|
+
TrafficMansion::Queue.last.type.should eql "sale"
|
79
|
+
end
|
80
|
+
|
81
|
+
it "persists the user id" do
|
82
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
83
|
+
TrafficMansion::Queue.last.user_id.should eql user_id
|
84
|
+
end
|
85
|
+
|
86
|
+
it "persists the user id" do
|
87
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
88
|
+
TrafficMansion::Queue.last.data["user_id"].should eql user_id
|
89
|
+
end
|
90
|
+
|
91
|
+
it "persists the transaction id" do
|
92
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
93
|
+
TrafficMansion::Queue.last.data["transaction"].should eql payment_id
|
94
|
+
end
|
95
|
+
|
96
|
+
it "persists the amount" do
|
97
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
98
|
+
TrafficMansion::Queue.last.data["amount"].should eql amount
|
99
|
+
end
|
100
|
+
|
101
|
+
it "persists the product code" do
|
102
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
103
|
+
TrafficMansion::Queue.last.data["product_code"].should eql product_code
|
104
|
+
end
|
105
|
+
|
106
|
+
it "persists the remote ip" do
|
107
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
108
|
+
TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
|
109
|
+
end
|
110
|
+
|
111
|
+
it "persists the referer" do
|
112
|
+
TrafficMansion::Queue.add_sale user_id, payment_id, amount, product_code, remote_ip, referer
|
113
|
+
TrafficMansion::Queue.last.data["http_referer"].should eql referer
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
describe "self.add_rebill" do
|
118
|
+
let(:user_id) { "user_id" }
|
119
|
+
let(:payment_id) { "payment_id" }
|
120
|
+
let(:amount) { "amount" }
|
121
|
+
let(:product_code) { "product_code" }
|
122
|
+
let(:remote_ip) { "remote_ip" }
|
123
|
+
let(:referer) { "referer" }
|
124
|
+
|
125
|
+
it "persists the rebill" do
|
126
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
127
|
+
TrafficMansion::Queue.last.type.should eql "rebill"
|
128
|
+
end
|
129
|
+
|
130
|
+
it "persists the user id" do
|
131
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
132
|
+
TrafficMansion::Queue.last.user_id.should eql user_id
|
133
|
+
end
|
134
|
+
|
135
|
+
it "persists the user id" do
|
136
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
137
|
+
TrafficMansion::Queue.last.data["user_id"].should eql user_id
|
138
|
+
end
|
139
|
+
|
140
|
+
it "persists the transaction id" do
|
141
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
142
|
+
TrafficMansion::Queue.last.data["transaction"].should eql payment_id
|
143
|
+
end
|
144
|
+
|
145
|
+
it "persists the amount" do
|
146
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
147
|
+
TrafficMansion::Queue.last.data["amount"].should eql amount
|
148
|
+
end
|
149
|
+
|
150
|
+
it "persists the product code" do
|
151
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
152
|
+
TrafficMansion::Queue.last.data["product_code"].should eql product_code
|
153
|
+
end
|
154
|
+
|
155
|
+
it "persists the remote ip" do
|
156
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
157
|
+
TrafficMansion::Queue.last.data["remote_addr"].should eql remote_ip
|
158
|
+
end
|
159
|
+
|
160
|
+
it "persists the referer" do
|
161
|
+
TrafficMansion::Queue.add_rebill user_id, payment_id, amount, product_code, remote_ip, referer
|
162
|
+
TrafficMansion::Queue.last.data["http_referer"].should eql referer
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
describe "self.find_parent_by_user" do
|
167
|
+
before :each do
|
168
|
+
TrafficMansion::Queue.add_signup "parent_event_id", "user_id", "remote_ip", "referer"
|
169
|
+
end
|
170
|
+
|
171
|
+
it "finds the user parent" do
|
172
|
+
TrafficMansion::Queue.find_parent_by_user("user_id").parent_event_id.should eql "parent_event_id"
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
describe :process do
|
177
|
+
context "when it is a visit event" do
|
178
|
+
let!(:event) { TrafficMansion::Queue.add "visit"}
|
179
|
+
|
180
|
+
context "when the repsonse is success" do
|
181
|
+
let(:result) { mock("TMResult", :success? => true, :get_response => nil) }
|
182
|
+
|
183
|
+
before :each do
|
184
|
+
TrafficMansion::Tracker.any_instance.stub(:send => result)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "is processed" do
|
188
|
+
event.process
|
189
|
+
event.processed.should be_true
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
193
|
+
context "when the repsonse is not success" do
|
194
|
+
let(:result) { mock("TMResult", :success? => false, :get_error => "error text") }
|
195
|
+
|
196
|
+
before :each do
|
197
|
+
TrafficMansion::Tracker.any_instance.stub(:send => result)
|
198
|
+
end
|
199
|
+
|
200
|
+
it "is not processed" do
|
201
|
+
lambda{ event.process }
|
202
|
+
event.processed.should be_false
|
203
|
+
end
|
204
|
+
|
205
|
+
it "raises an error" do
|
206
|
+
lambda{ event.process }.should raise_error("Tracking failed with result: error text")
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context "when it is not a visit event" do
|
213
|
+
let!(:parent_event) { TrafficMansion::Queue.add_signup "parent_event_id", "user_id", nil, nil }
|
214
|
+
let!(:event) { TrafficMansion::Queue.add_sale "user_id", nil, nil, nil, nil, nil }
|
215
|
+
let(:result) { mock("TMResult", :success? => true, :get_response => nil) }
|
216
|
+
|
217
|
+
before :each do
|
218
|
+
parent_event.set :data, {:visit_id => "visit_id"}
|
219
|
+
parent_event.set :processed, true
|
220
|
+
TrafficMansion::Tracker.any_instance.stub(:send => result)
|
221
|
+
end
|
222
|
+
|
223
|
+
it "should update the parent event id" do
|
224
|
+
event.process
|
225
|
+
event.parent_event_id.should eql parent_event.id.to_s
|
226
|
+
end
|
227
|
+
|
228
|
+
context "when it has a parent event id" do
|
229
|
+
context "when it finds a visit id in the data attribute" do
|
230
|
+
before :each do
|
231
|
+
parent_event.data["visit_id"] = "visit_id"
|
232
|
+
end
|
233
|
+
|
234
|
+
it "copies the visit id of the parent" do
|
235
|
+
event.process
|
236
|
+
event.data["visit_id"].should eql parent_event.data["visit_id"]
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
context "when it finds a visit id in the result attribute" do
|
241
|
+
before :each do
|
242
|
+
parent_event.set :data, {}
|
243
|
+
parent_event.set :result, { "visit_id" => "visit_result_id" }
|
244
|
+
end
|
245
|
+
|
246
|
+
it "copies the visit id of the parent" do
|
247
|
+
event.process
|
248
|
+
event.data["visit_id"].should eql parent_event.result["visit_id"]
|
249
|
+
end
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
context "when the repsonse is success" do
|
254
|
+
it "is processed" do
|
255
|
+
event.process
|
256
|
+
event.processed.should be_true
|
257
|
+
end
|
258
|
+
end
|
259
|
+
|
260
|
+
context "when the repsonse is not success" do
|
261
|
+
let(:result) { mock("TMResult", :success? => false, :get_error => "error text") }
|
262
|
+
|
263
|
+
before :each do
|
264
|
+
TrafficMansion::Tracker.any_instance.stub(:send => result)
|
265
|
+
end
|
266
|
+
|
267
|
+
it "is not processed" do
|
268
|
+
lambda{ event.process }
|
269
|
+
event.processed.should be_false
|
270
|
+
end
|
271
|
+
|
272
|
+
it "raises an error" do
|
273
|
+
lambda{ event.process }.should raise_error("Tracking failed with result: error text")
|
274
|
+
end
|
275
|
+
end
|
276
|
+
end
|
277
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'traffic_mansion'
|
3
|
+
|
4
|
+
describe TrafficMansion::Response do
|
5
|
+
describe :success? do
|
6
|
+
let(:response_text) {"result=1\nerror=success"}
|
7
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
8
|
+
|
9
|
+
context "when the result is 1" do
|
10
|
+
it "returns true" do
|
11
|
+
res.should be_success
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
context "when the result is 0" do
|
16
|
+
let(:response_text) {"result=0\nerror=errormsg"}
|
17
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
18
|
+
|
19
|
+
it "returns false" do
|
20
|
+
res.should_not be_success
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "when the result is not present" do
|
25
|
+
let(:response_text) {"error=errormsg"}
|
26
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
27
|
+
|
28
|
+
it "returns false" do
|
29
|
+
res.should_not be_success
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe :error? do
|
35
|
+
context "when the result is 0" do
|
36
|
+
let(:response_text) {"result=0\nerror=successmsg"}
|
37
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
38
|
+
|
39
|
+
it "returns true" do
|
40
|
+
res.should be_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
context "when the result is 1" do
|
45
|
+
let(:response_text) {"result=1\nerror=successmsg"}
|
46
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
47
|
+
|
48
|
+
it "returns false" do
|
49
|
+
res.should_not be_error
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
context "when the result is not present" do
|
54
|
+
let(:response_text) {"error=errormsg"}
|
55
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
56
|
+
|
57
|
+
it "returns false" do
|
58
|
+
res.should_not be_error
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
describe :get_error do
|
64
|
+
let(:response_text) {"error=errormsg"}
|
65
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
66
|
+
|
67
|
+
it "returns the error message" do
|
68
|
+
res.get_error.should eql "errormsg"
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe :get_response do
|
73
|
+
let(:response_text) {"error=errormsg"}
|
74
|
+
let(:res) { TrafficMansion::Response.new response_text }
|
75
|
+
|
76
|
+
it "returns the error message" do
|
77
|
+
res.get_response.should eql Hash["error", "errormsg"]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
require "database_cleaner"
|
3
|
+
require "mongoid"
|
4
|
+
|
5
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each {|f| require f}
|
6
|
+
|
7
|
+
RSpec.configure do |config|
|
8
|
+
config.mock_with :rspec
|
9
|
+
config.before(:suite) do
|
10
|
+
DatabaseCleaner.strategy = :truncation
|
11
|
+
end
|
12
|
+
config.before(:each) do
|
13
|
+
Mongoid::IdentityMap.clear
|
14
|
+
end
|
15
|
+
config.after(:each) do
|
16
|
+
DatabaseCleaner.clean
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
Mongoid::Config.connect_to("mongoid_traffic_mansion_test")
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'traffic_mansion/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "traffic_mansion"
|
8
|
+
spec.version = TrafficMansion::VERSION
|
9
|
+
spec.authors = ["AgileWings"]
|
10
|
+
spec.email = ["dumitru@agilewings.com"]
|
11
|
+
spec.description = %q{Traffic Mansion campaign tracker client}
|
12
|
+
spec.summary = %q{A Ruby on Rails tracker for Traffic Mansion. Depends on MongoID and Sidekiq.}
|
13
|
+
spec.homepage = "http://trafficmansion.com"
|
14
|
+
spec.license = "Copyright 2013 AgileWings"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
22
|
+
spec.add_development_dependency "rspec", "~> 2.13.0"
|
23
|
+
spec.add_development_dependency "database_cleaner", "~> 1.0.1"
|
24
|
+
|
25
|
+
spec.add_runtime_dependency "rack", "~> 1.4.5"
|
26
|
+
spec.add_runtime_dependency "rake", "~> 10.0.3"
|
27
|
+
spec.add_runtime_dependency "rest-client", "~> 1.6.7"
|
28
|
+
spec.add_runtime_dependency "mongoid", "~> 3.0.6"
|
29
|
+
spec.add_runtime_dependency "sidekiq", "~> 2.6.5"
|
30
|
+
end
|
metadata
ADDED
@@ -0,0 +1,176 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: traffic_mansion
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- AgileWings
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-05-14 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.3'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 2.13.0
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 2.13.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: database_cleaner
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 1.0.1
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 1.0.1
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.4.5
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 1.4.5
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 10.0.3
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 10.0.3
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rest-client
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ~>
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.6.7
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ~>
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.6.7
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: mongoid
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.0.6
|
104
|
+
type: :runtime
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.0.6
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: sidekiq
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 2.6.5
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 2.6.5
|
125
|
+
description: Traffic Mansion campaign tracker client
|
126
|
+
email:
|
127
|
+
- dumitru@agilewings.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- .gitignore
|
133
|
+
- Gemfile
|
134
|
+
- LICENSE.txt
|
135
|
+
- README.md
|
136
|
+
- Rakefile
|
137
|
+
- lib/traffic_mansion.rb
|
138
|
+
- lib/traffic_mansion/queue.rb
|
139
|
+
- lib/traffic_mansion/queue_processor.rb
|
140
|
+
- lib/traffic_mansion/railtie.rb
|
141
|
+
- lib/traffic_mansion/response.rb
|
142
|
+
- lib/traffic_mansion/tracker.rb
|
143
|
+
- lib/traffic_mansion/version.rb
|
144
|
+
- spec/queue_spec.rb
|
145
|
+
- spec/response_spec.rb
|
146
|
+
- spec/spec_helper.rb
|
147
|
+
- tasks/traffic_mansion.rake
|
148
|
+
- traffic_mansion.gemspec
|
149
|
+
homepage: http://trafficmansion.com
|
150
|
+
licenses:
|
151
|
+
- Copyright 2013 AgileWings
|
152
|
+
metadata: {}
|
153
|
+
post_install_message:
|
154
|
+
rdoc_options: []
|
155
|
+
require_paths:
|
156
|
+
- lib
|
157
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - '>='
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - '>='
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0'
|
167
|
+
requirements: []
|
168
|
+
rubyforge_project:
|
169
|
+
rubygems_version: 2.0.3
|
170
|
+
signing_key:
|
171
|
+
specification_version: 4
|
172
|
+
summary: A Ruby on Rails tracker for Traffic Mansion. Depends on MongoID and Sidekiq.
|
173
|
+
test_files:
|
174
|
+
- spec/queue_spec.rb
|
175
|
+
- spec/response_spec.rb
|
176
|
+
- spec/spec_helper.rb
|