the_tracker 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +16 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +138 -0
- data/Guardfile +8 -0
- data/LICENSE.txt +22 -0
- data/README.md +272 -0
- data/Rakefile +1 -0
- data/lib/the_tracker/railtie.rb +9 -0
- data/lib/the_tracker/tracker.rb +64 -0
- data/lib/the_tracker/trackers/ad_form.rb +37 -0
- data/lib/the_tracker/trackers/base.rb +32 -0
- data/lib/the_tracker/trackers/g_ad_services.rb +46 -0
- data/lib/the_tracker/trackers/g_analytics.rb +98 -0
- data/lib/the_tracker/trackers/g_universal.rb +126 -0
- data/lib/the_tracker/trackers/gtm.rb +59 -0
- data/lib/the_tracker/trackers/kenshoo.rb +49 -0
- data/lib/the_tracker/trackers/relevant.rb +25 -0
- data/lib/the_tracker/trackers/uservoice.rb +39 -0
- data/lib/the_tracker/version.rb +3 -0
- data/lib/the_tracker/view_helpers.rb +15 -0
- data/lib/the_tracker.rb +8 -0
- data/spec/spec_helper.rb +15 -0
- data/spec/the_tracker/tracker_spec.rb +121 -0
- data/spec/the_tracker/trackers/ad_form_spec.rb +22 -0
- data/spec/the_tracker/trackers/base_spec.rb +40 -0
- data/spec/the_tracker/trackers/g_ad_services_spec.rb +26 -0
- data/spec/the_tracker/trackers/g_analytics_spec.rb +98 -0
- data/spec/the_tracker/trackers/g_universal_spec.rb +141 -0
- data/spec/the_tracker/trackers/gtm_spec.rb +31 -0
- data/spec/the_tracker/trackers/kenshoo_spec.rb +27 -0
- data/spec/the_tracker/trackers/relevant_spec.rb +23 -0
- data/spec/the_tracker/trackers/uservoice_spec.rb +29 -0
- data/spec/the_tracker/view_helpers_spec.rb +51 -0
- data/the_tracker.gemspec +23 -0
- metadata +156 -0
@@ -0,0 +1,98 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module Trackers
|
3
|
+
class GAnalytics < Base
|
4
|
+
|
5
|
+
# Analytics uat
|
6
|
+
def initialize(options)
|
7
|
+
@options = options
|
8
|
+
super()
|
9
|
+
end
|
10
|
+
|
11
|
+
def name
|
12
|
+
:ganalytics
|
13
|
+
end
|
14
|
+
|
15
|
+
def add_transaction(tid=0, store='', total=0, tax=0, shipping=0, city='', state='', country='')
|
16
|
+
tid = Time.now.to_i if (tid.nil?) or (tid.to_s == '0')
|
17
|
+
@transaction = Transaction.new(tid, store, total, tax, shipping, city, state, country)
|
18
|
+
end
|
19
|
+
|
20
|
+
def add_transaction_item(sku='', product='', category='', price=0, quantity=0)
|
21
|
+
@transaction.add_item(sku, product, category, price, quantity)
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_custom_var(index, name, value, scope)
|
25
|
+
custom_vars[index] = [name, value, scope]
|
26
|
+
end
|
27
|
+
|
28
|
+
def track_event(category, action, label='', value=0, non_interactive=false)
|
29
|
+
"_gaq.push(['_trackEvent', '#{category}', '#{action}', '#{label}', #{value}, #{non_interactive}]);"
|
30
|
+
end
|
31
|
+
|
32
|
+
def header
|
33
|
+
return if !active
|
34
|
+
<<-EOF
|
35
|
+
<script type="text/javascript">//<![CDATA[
|
36
|
+
var _gaq = _gaq || [];
|
37
|
+
_gaq.push(['_setAccount', '#{@options[:id]}']);
|
38
|
+
#{extra_conf}
|
39
|
+
_gaq.push(['_trackPageview']);
|
40
|
+
(function () {
|
41
|
+
var ga = document.createElement('script');
|
42
|
+
ga.type = 'text/javascript';
|
43
|
+
ga.async = true;
|
44
|
+
ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
|
45
|
+
var s = document.getElementsByTagName('script')[0];
|
46
|
+
s.parentNode.insertBefore(ga, s);
|
47
|
+
})();
|
48
|
+
//]]></script>
|
49
|
+
EOF
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def extra_conf
|
55
|
+
conf = ''
|
56
|
+
conf << "_gaq.push(['_setDomainName', '#{@options[:domain_name]}']);\n" if @options[:domain_name]
|
57
|
+
conf << "_gaq.push(['_setAllowLinker', #{@options[:allow_linker]}]);\n" if @options[:allow_linker]
|
58
|
+
conf << set_custom_vars
|
59
|
+
conf << set_transactions
|
60
|
+
conf
|
61
|
+
end
|
62
|
+
|
63
|
+
def set_custom_vars
|
64
|
+
custom_vars.map do | index, cv |
|
65
|
+
"_gaq.push(['_setCustomVar', #{index}, '#{cv[0]}', '#{cv[1]}', '#{cv[2]}']);"
|
66
|
+
end.join('\n')
|
67
|
+
end
|
68
|
+
|
69
|
+
def set_transactions
|
70
|
+
return '' unless @transaction
|
71
|
+
conf = "_gaq.push(['_addTrans', '#{@transaction.id}', '#{@transaction.store}', '#{@transaction.total}', '#{@transaction.tax}', '#{@transaction.shipping}', '#{@transaction.city}', '#{@transaction.state}', '#{@transaction.country}']);\n"
|
72
|
+
conf << @transaction.items.map do |item|
|
73
|
+
"_gaq.push(['_addItem', '#{@transaction.id}', '#{item.sku}', '#{item.product}', '#{item.category}', '#{item.price}', '#{item.quantity}']);"
|
74
|
+
end.join('\n')
|
75
|
+
conf << "_gaq.push(['_trackTrans']);"
|
76
|
+
@transaction = nil
|
77
|
+
conf
|
78
|
+
end
|
79
|
+
|
80
|
+
def custom_vars
|
81
|
+
@custom_vars ||= {}
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class Item < Struct.new(:sku, :product, :category, :price, :quantity)
|
86
|
+
end
|
87
|
+
|
88
|
+
class Transaction < Struct.new(:id, :store, :total, :tax, :shipping, :city, :state, :country)
|
89
|
+
def add_item(sku, product, category, price, quantity)
|
90
|
+
items << Item.new(sku, product, category, price, quantity)
|
91
|
+
end
|
92
|
+
|
93
|
+
def items
|
94
|
+
@items ||= []
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,126 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module Trackers
|
3
|
+
class GUniversal < Base
|
4
|
+
|
5
|
+
attr_accessor :name
|
6
|
+
|
7
|
+
# Universal Analytics
|
8
|
+
def initialize(options)
|
9
|
+
@name = options.delete(:name) || :guniversal
|
10
|
+
@options = options
|
11
|
+
super()
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_transaction(tid=0, store='', total=0, tax=0, shipping=0)
|
15
|
+
tid = Time.now.to_i if (tid.nil?) or (tid.to_s == '0')
|
16
|
+
@transaction = EcommerceTransaction.new(tid, store, total, tax, shipping)
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_transaction_item(sku='', product='', category='', price=0, quantity=0)
|
20
|
+
@transaction.add_item(sku, product, category, price, quantity)
|
21
|
+
end
|
22
|
+
|
23
|
+
def add_custom_var(type, index, value)
|
24
|
+
if (type == :dimension)
|
25
|
+
custom_dimensions[index] = value
|
26
|
+
else
|
27
|
+
custom_metrics[index] = value
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_user_id(uid)
|
32
|
+
@uid = uid
|
33
|
+
end
|
34
|
+
|
35
|
+
def header
|
36
|
+
return if !active
|
37
|
+
<<-EOF
|
38
|
+
<!-- Google Analytics -->
|
39
|
+
<script>
|
40
|
+
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
|
41
|
+
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
|
42
|
+
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
|
43
|
+
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
|
44
|
+
ga('create', '#{@options[:id]}', 'auto', {#{create_conf}});
|
45
|
+
ga('#{name}.send', 'pageview');
|
46
|
+
#{extra_conf}
|
47
|
+
</script>
|
48
|
+
<!-- End Google Analytics -->
|
49
|
+
EOF
|
50
|
+
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def create_conf
|
55
|
+
[account_name, allow_linker, user_id].compact.join(', ')
|
56
|
+
end
|
57
|
+
|
58
|
+
def account_name
|
59
|
+
"'name': '#{name}'"
|
60
|
+
end
|
61
|
+
|
62
|
+
def allow_linker
|
63
|
+
"'allowLinker': true" if @options[:allow_linker]
|
64
|
+
end
|
65
|
+
|
66
|
+
def user_id
|
67
|
+
"'userId': '#{@uid}'" if @uid
|
68
|
+
end
|
69
|
+
|
70
|
+
def extra_conf
|
71
|
+
conf = ''
|
72
|
+
conf << "ga('#{name}.require', 'linker');\n"
|
73
|
+
conf << "ga('linker:autoLink', #{@options[:domain_name]});\n" if @options[:domain_name]
|
74
|
+
conf << set_custom_dimensions
|
75
|
+
conf << set_custom_metrics
|
76
|
+
conf << set_transactions
|
77
|
+
conf
|
78
|
+
end
|
79
|
+
|
80
|
+
def set_custom_dimensions
|
81
|
+
custom_dimensions.map do | index, value |
|
82
|
+
"ga('#{name}.set', 'dimension#{index}', '#{value}');"
|
83
|
+
end.join(' ')
|
84
|
+
end
|
85
|
+
|
86
|
+
def set_custom_metrics
|
87
|
+
custom_metrics.map do | index, value |
|
88
|
+
"ga('#{name}.set', 'metric#{index}', '#{value}');"
|
89
|
+
end.join(' ')
|
90
|
+
end
|
91
|
+
|
92
|
+
def set_transactions
|
93
|
+
return '' unless @transaction
|
94
|
+
conf = "ga('#{name}.require', 'ecommerce', 'ecommerce.js');\n"
|
95
|
+
conf << "ga('#{name}.ecommerce:addTransaction', { 'id': '#{@transaction.id}', 'affiliation': '#{@transaction.store}', 'revenue': '#{@transaction.total}', 'shipping': '#{@transaction.shipping}', 'tax': '#{@transaction.tax}' });\n"
|
96
|
+
conf << @transaction.items.map do |item|
|
97
|
+
"ga('#{name}.ecommerce:addItem', {'id': '#{@transaction.id}', 'name': '#{item.product}', 'sku': '#{item.sku}', 'category': '#{item.category}', 'price': '#{item.price}', 'quantity': '#{item.quantity}'});\n"
|
98
|
+
end.join('\n')
|
99
|
+
conf << "ga('#{name}.ecommerce:send');\n"
|
100
|
+
@transaction = nil
|
101
|
+
conf
|
102
|
+
end
|
103
|
+
|
104
|
+
def custom_dimensions
|
105
|
+
@custom_dimensions ||= {}
|
106
|
+
end
|
107
|
+
|
108
|
+
def custom_metrics
|
109
|
+
@custom_metrics ||= {}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class EcommerceItem < Struct.new(:sku, :product, :category, :price, :quantity)
|
114
|
+
end
|
115
|
+
|
116
|
+
class EcommerceTransaction < Struct.new(:id, :store, :total, :tax, :shipping)
|
117
|
+
def add_item(sku, product, category, price, quantity)
|
118
|
+
items << EcommerceItem.new(sku, product, category, price, quantity)
|
119
|
+
end
|
120
|
+
|
121
|
+
def items
|
122
|
+
@items ||= []
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module Trackers
|
3
|
+
class Gtm < Base
|
4
|
+
|
5
|
+
attr_accessor :data_layer
|
6
|
+
|
7
|
+
# Gtm info
|
8
|
+
def initialize(options)
|
9
|
+
@gtmid = options[:gtmid]
|
10
|
+
super()
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
:gtm
|
15
|
+
end
|
16
|
+
|
17
|
+
def body_top
|
18
|
+
return if !active
|
19
|
+
<<-EOF
|
20
|
+
#{show_data_layer}
|
21
|
+
<!-- Google Tag Manager -->
|
22
|
+
<noscript><iframe src="//www.googletagmanager.com/ns.html?id=#{@gtmid}"
|
23
|
+
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
|
24
|
+
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
|
25
|
+
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
|
26
|
+
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
|
27
|
+
'//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
|
28
|
+
})(window,document,'script','dataLayer','#{@gtmid}');</script>
|
29
|
+
<!-- End Google Tag Manager -->
|
30
|
+
EOF
|
31
|
+
end
|
32
|
+
|
33
|
+
def add_data_layer(data, value)
|
34
|
+
data_layer[data] = value
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def data_layer
|
40
|
+
@data_layer ||= {}
|
41
|
+
end
|
42
|
+
|
43
|
+
def show_data_layer
|
44
|
+
return if data_layer.empty?
|
45
|
+
<<-EOF
|
46
|
+
<script>
|
47
|
+
dataLayer = [{
|
48
|
+
#{data_layer_to_string}
|
49
|
+
}];
|
50
|
+
</script>
|
51
|
+
EOF
|
52
|
+
end
|
53
|
+
|
54
|
+
def data_layer_to_string
|
55
|
+
data_layer.map{|k,v| "'#{k}': '#{v}'"}.join(',')
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module Trackers
|
3
|
+
class Kenshoo < Base
|
4
|
+
|
5
|
+
# Kenshoo info
|
6
|
+
def initialize(options)
|
7
|
+
@token = options[:token]
|
8
|
+
@type = options[:type]
|
9
|
+
@val = options[:val]
|
10
|
+
@orderId = options[:orderId]
|
11
|
+
@promoCode = options[:promoCode]
|
12
|
+
@valueCurrency = options[:valueCurrency]
|
13
|
+
@trackEvent = options[:trackEvent]
|
14
|
+
super()
|
15
|
+
end
|
16
|
+
|
17
|
+
def name
|
18
|
+
:kenshoo
|
19
|
+
end
|
20
|
+
|
21
|
+
def body_top
|
22
|
+
return if !active
|
23
|
+
<<-EOF
|
24
|
+
<script type=text/javascript>
|
25
|
+
var hostProtocol = (("https:" == document.location.protocol) ? "https" : "http");
|
26
|
+
document.write('<scr'+'ipt src="', hostProtocol+
|
27
|
+
'://#{@trackEvent}.xg4ken.com/media/getpx.php?cid=#{@id}','" type="text/JavaScript"><\/scr'+'ipt>');
|
28
|
+
</script>
|
29
|
+
<script type=text/javascript>
|
30
|
+
var params = new Array();
|
31
|
+
params[0]='id=#{@token}';
|
32
|
+
params[1]='type=#{@type}';
|
33
|
+
params[2]='val=#{@val}';
|
34
|
+
params[3]='orderId=#{@orderId}';
|
35
|
+
params[4]='promoCode=#{@promoCode}';
|
36
|
+
params[5]='valueCurrency=#{@valueCurrency}';
|
37
|
+
params[6]='GCID='; //For Live Tracking only
|
38
|
+
params[7]='kw='; //For Live Tracking only
|
39
|
+
params[8]='product='; //For Live Tracking only
|
40
|
+
k_trackevent(params,'#{@trackEvent}');
|
41
|
+
</script>
|
42
|
+
<noscript>
|
43
|
+
<img src="https://1191.xg4ken.com/media/redir.php?track=1&token=#{@token}&type=#{@type}&val=#{@val}&orderId=#{@orderId}&promoCode=#{@promoCode}&valueCurrency=#{@valueCurrency}&GCID=&kw=&product=" width="1" height="1">
|
44
|
+
</noscript>
|
45
|
+
EOF
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module Trackers
|
3
|
+
class Relevant < Base
|
4
|
+
|
5
|
+
# Relevant info
|
6
|
+
def initialize(options)
|
7
|
+
@token = options[:token]
|
8
|
+
@seg = options[:seg ]
|
9
|
+
@orderId = options[:orderId]
|
10
|
+
super()
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
:relevant
|
15
|
+
end
|
16
|
+
|
17
|
+
def body_bottom
|
18
|
+
return if !active
|
19
|
+
<<-EOF
|
20
|
+
<img src="http://ib.adnxs.com/px?id=#{@token}&seg=#{@seg}&orderId=#{@orderId}&t=2" width="1" height="1" />
|
21
|
+
EOF
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module Trackers
|
3
|
+
class Uservoice < Base
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
# AdForm info pm and id
|
7
|
+
def initialize(key_file, options)
|
8
|
+
@options = options
|
9
|
+
@key_file = key_file
|
10
|
+
super()
|
11
|
+
end
|
12
|
+
|
13
|
+
def name
|
14
|
+
:uservoice
|
15
|
+
end
|
16
|
+
|
17
|
+
def header
|
18
|
+
return if !active
|
19
|
+
<<-EOF
|
20
|
+
<script type="text/javascript">
|
21
|
+
(function(){var uv=document.createElement('script');uv.type='text/javascript';uv.async=true;uv.src='//widget.uservoice.com/#{@key_file}.js';var s=document.getElementsByTagName('script')[0];s.parentNode.insertBefore(uv,s)})()
|
22
|
+
</script>
|
23
|
+
EOF
|
24
|
+
end
|
25
|
+
|
26
|
+
def body_bottom
|
27
|
+
return if !active
|
28
|
+
<<-EOF
|
29
|
+
<script type="text/javascript">
|
30
|
+
UserVoice = window.UserVoice || [];
|
31
|
+
UserVoice.push(['showTab', 'classic_widget',
|
32
|
+
#{@options.to_json}
|
33
|
+
]);
|
34
|
+
</script>
|
35
|
+
EOF
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module TheTracker
|
2
|
+
module ViewHelpers
|
3
|
+
def header_tracking_code
|
4
|
+
TheTracker::Tracker.instance.header
|
5
|
+
end
|
6
|
+
|
7
|
+
def body_top_tracking_code
|
8
|
+
TheTracker::Tracker.instance.body_top
|
9
|
+
end
|
10
|
+
|
11
|
+
def body_bottom_tracking_code
|
12
|
+
TheTracker::Tracker.instance.body_bottom
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/the_tracker.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'the_tracker/version'
|
2
|
+
require 'the_tracker/tracker'
|
3
|
+
require 'the_tracker/view_helpers'
|
4
|
+
require 'the_tracker/trackers/base'
|
5
|
+
require 'the_tracker/railtie' if defined? Rails
|
6
|
+
Dir.glob("#{File.dirname(__FILE__)}/the_tracker/trackers/*.rb").each do |f|
|
7
|
+
require f
|
8
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'the_tracker'
|
2
|
+
|
3
|
+
class TheTracker::Tracker
|
4
|
+
def self.reset
|
5
|
+
self.instance.instance_variable_set(:@trackers, {})
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
11
|
+
config.run_all_when_everything_filtered = true
|
12
|
+
config.filter_run :focus
|
13
|
+
config.order = 'random'
|
14
|
+
config.before { TheTracker::Tracker.reset }
|
15
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TheTracker::Tracker do
|
4
|
+
describe :methods do
|
5
|
+
describe :add do
|
6
|
+
it 'returns registered trackers' do
|
7
|
+
test_tr = mock('Object', :header => 'my tracker', :name => :track_test)
|
8
|
+
described_class.reset
|
9
|
+
described_class.config do |tmf|
|
10
|
+
tmf.add test_tr
|
11
|
+
end
|
12
|
+
test_tr2 = mock('Object', :header => 'other tracker', :name => :track_test2)
|
13
|
+
described_class.instance.add test_tr2
|
14
|
+
described_class.instance.trackers.size.should == 2
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe :add_once do
|
19
|
+
before :each do
|
20
|
+
test_tr = mock('Object', :body_bottom => 'my tracker', :name => :track_test)
|
21
|
+
described_class.reset
|
22
|
+
described_class.config do |tmf|
|
23
|
+
tmf.add test_tr
|
24
|
+
end
|
25
|
+
test_tr2 = mock('Object', :body_bottom => 'other tracker', :name => :track_test2)
|
26
|
+
described_class.instance.add_once test_tr2
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'register a new tracker' do
|
30
|
+
described_class.instance.trackers.size.should == 2
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'deregister the tracker after it has been injected on a page' do
|
34
|
+
described_class.instance.trackers.size.should == 2
|
35
|
+
described_class.instance.body_bottom
|
36
|
+
described_class.instance.trackers.size.should == 1
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe :header do
|
41
|
+
before :each do
|
42
|
+
ga = mock('Object', :header => 'google analytics', :name => :ganalytics)
|
43
|
+
tracker = TheTracker::Tracker.clone
|
44
|
+
@tracker = tracker.instance
|
45
|
+
@tracker.add ga
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'returns all headers from trackers' do
|
49
|
+
@tracker.header.should == 'google analytics'
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'adds headers of new tracker' do
|
53
|
+
sc = mock('Object', :header => 'site catalist', :name => :sitecat)
|
54
|
+
sc.stub(:header).and_return('site catalist')
|
55
|
+
@tracker.add sc
|
56
|
+
@tracker.header.should == "google analytics\nsite catalist"
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'should not render nil trackers' do
|
60
|
+
ss = mock('Object', :header => 'site nil', :name => :stupid_site)
|
61
|
+
ss.stub(:header).and_return(nil)
|
62
|
+
@tracker.add ss
|
63
|
+
@tracker.header.should == 'google analytics'
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
describe :body_top do
|
68
|
+
before :each do
|
69
|
+
ga = mock('Object', :body_top => 'google analytics', :name => :ganalytics)
|
70
|
+
tracker = TheTracker::Tracker.clone
|
71
|
+
@tracker = tracker.instance
|
72
|
+
@tracker.add ga
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'returns body_top from trackers' do
|
76
|
+
@tracker.body_top.should == 'google analytics'
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'adds new tracker' do
|
80
|
+
sc = mock('Object', :body_top => 'site catalist', :name => :sitecat)
|
81
|
+
sc.stub(:body_top).and_return('site catalist')
|
82
|
+
@tracker.add sc
|
83
|
+
@tracker.body_top.should == "google analytics\nsite catalist"
|
84
|
+
end
|
85
|
+
|
86
|
+
it 'should not render nil trackers' do
|
87
|
+
ss = mock('Object', :body_top => 'site nil', :name => :stupid_site)
|
88
|
+
ss.stub(:body_top).and_return(nil)
|
89
|
+
@tracker.add ss
|
90
|
+
@tracker.body_top.should == 'google analytics'
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe :body_bottom do
|
95
|
+
before :each do
|
96
|
+
ga = mock('Object', :body_bottom => 'google analytics', :name => :ganalytics)
|
97
|
+
tracker = TheTracker::Tracker.clone
|
98
|
+
@tracker = tracker.instance
|
99
|
+
@tracker.add ga
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'returns body_bottom from trackers' do
|
103
|
+
@tracker.body_bottom.should == 'google analytics'
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'adds new tracker' do
|
107
|
+
sc = mock('Object', :body_bottom => 'site catalist', :name => :sitecat)
|
108
|
+
sc.stub(:body_bottom).and_return('site catalist')
|
109
|
+
@tracker.add sc
|
110
|
+
@tracker.body_bottom.should == "google analytics\nsite catalist"
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should not render nil trackers' do
|
114
|
+
ss = mock('Object', :body_bottom => 'site nil', :name => :stupid_site)
|
115
|
+
ss.stub(:body_bottom).and_return(nil)
|
116
|
+
@tracker.add ss
|
117
|
+
@tracker.body_bottom.should == 'google analytics'
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TheTracker::Trackers::AdForm do
|
4
|
+
subject { described_class.new(:pm => '111666', :id => '333555') }
|
5
|
+
describe :methods do
|
6
|
+
describe :header do
|
7
|
+
it 'should return ad_form content' do
|
8
|
+
subject.header.should include('https://track.adform.net/serving/scripts/trackpoint/async/')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should include pm and id information' do
|
12
|
+
subject.header.should include('pm: 111666')
|
13
|
+
subject.header.should include('id: 333555')
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'returns nothing if tracker not active' do
|
17
|
+
subject.active = false
|
18
|
+
subject.header.should == nil
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TheTracker::Trackers::Base do
|
4
|
+
describe :methods do
|
5
|
+
describe :header do
|
6
|
+
it 'should return an empty array' do
|
7
|
+
subject.header.should == []
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
describe :body_top do
|
12
|
+
it 'should return an empty array' do
|
13
|
+
subject.body_top.should == []
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe :body_bottom do
|
18
|
+
it 'should return an empty array' do
|
19
|
+
subject.body_bottom.should == []
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe :name do
|
24
|
+
it 'should raise a NotImplementedError' do
|
25
|
+
expect { subject.name }.to raise_error(NotImplementedError)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
describe :active do
|
30
|
+
it 'should be active by default' do
|
31
|
+
subject.active.should be
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should be active by default' do
|
35
|
+
subject.active = false
|
36
|
+
subject.active.should be_false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TheTracker::Trackers::GAdServices do
|
4
|
+
subject { described_class.new(:id => 12345678, :language => 'en', :format => '2', :color => "ffffff", :label => 'SomeThingReallyCool', :value => 0) }
|
5
|
+
describe :methods do
|
6
|
+
describe :body_bottom do
|
7
|
+
it 'should return ad_form content' do
|
8
|
+
subject.body_bottom.should include('//www.googleadservices.com/pagead/conversion.js')
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should include id, langage, format, color, label and value information' do
|
12
|
+
subject.body_bottom.should include('var google_conversion_id = 12345678');
|
13
|
+
subject.body_bottom.should include("var google_conversion_language = \"en\"");
|
14
|
+
subject.body_bottom.should include("var google_conversion_format = \"2\"");
|
15
|
+
subject.body_bottom.should include("var google_conversion_color = \"ffffff\"");
|
16
|
+
subject.body_bottom.should include("var google_conversion_label = \"SomeThingReallyCool\"");
|
17
|
+
subject.body_bottom.should include('var google_conversion_value = 0');
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns nothing if tracker not active' do
|
21
|
+
subject.active = false
|
22
|
+
subject.body_bottom.should == nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|