re_track 0.4.0 → 0.5.0

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.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +12 -0
  4. data/.rspec +2 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +8 -0
  8. data/Appraisals +9 -0
  9. data/Gemfile +5 -0
  10. data/Gemfile.lock +150 -0
  11. data/README.md +6 -9
  12. data/Rakefile +7 -1
  13. data/app/models/re_track/referer_tracking.rb +3 -0
  14. data/gemfiles/rails_3.gemfile +9 -0
  15. data/gemfiles/rails_4.gemfile +9 -0
  16. data/lib/re_track/sweeper.rb +50 -12
  17. data/lib/re_track/trackable.rb +2 -6
  18. data/lib/re_track/tracker.rb +21 -18
  19. data/lib/re_track/version.rb +1 -1
  20. data/lib/re_track.rb +4 -4
  21. data/re_track.gemspec +29 -0
  22. data/script/rails +8 -0
  23. data/spec/controllers/referer_tracking_spec.rb +89 -0
  24. data/spec/dummy/README.rdoc +261 -0
  25. data/spec/dummy/Rakefile +7 -0
  26. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  27. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  28. data/spec/dummy/app/assets/stylesheets/scaffold.css +56 -0
  29. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  30. data/spec/dummy/app/controllers/users_controller.rb +44 -0
  31. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  32. data/spec/dummy/app/mailers/.gitkeep +0 -0
  33. data/spec/dummy/app/models/.gitkeep +0 -0
  34. data/spec/dummy/app/models/user.rb +6 -0
  35. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  36. data/spec/dummy/app/views/users/_form.html.erb +17 -0
  37. data/spec/dummy/app/views/users/edit.html.erb +6 -0
  38. data/spec/dummy/app/views/users/index.html.erb +21 -0
  39. data/spec/dummy/app/views/users/new.html.erb +5 -0
  40. data/spec/dummy/app/views/users/show.html.erb +5 -0
  41. data/spec/dummy/config/application.rb +67 -0
  42. data/spec/dummy/config/boot.rb +10 -0
  43. data/spec/dummy/config/environment.rb +5 -0
  44. data/spec/dummy/config/environments/development.rb +37 -0
  45. data/spec/dummy/config/environments/production.rb +67 -0
  46. data/spec/dummy/config/environments/test.rb +38 -0
  47. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  48. data/spec/dummy/config/initializers/inflections.rb +15 -0
  49. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  50. data/spec/dummy/config/initializers/secret_token.rb +8 -0
  51. data/spec/dummy/config/initializers/session_store.rb +8 -0
  52. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  53. data/spec/dummy/config/locales/en.yml +5 -0
  54. data/spec/dummy/config/mongoid.yml +19 -0
  55. data/spec/dummy/config/routes.rb +7 -0
  56. data/spec/dummy/config.ru +4 -0
  57. data/spec/dummy/db/.gitkeep +0 -0
  58. data/spec/dummy/lib/assets/.gitkeep +0 -0
  59. data/spec/dummy/log/.gitkeep +0 -0
  60. data/spec/dummy/public/404.html +26 -0
  61. data/spec/dummy/public/422.html +26 -0
  62. data/spec/dummy/public/500.html +25 -0
  63. data/spec/dummy/public/favicon.ico +0 -0
  64. data/spec/dummy/script/rails +6 -0
  65. data/spec/models/re_track/referer_tracking_spec.rb +64 -0
  66. data/spec/spec_helper.rb +51 -0
  67. metadata +159 -16
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4aabe5f9c6436c6acb865eb1996a94bc4f7f561c
4
- data.tar.gz: 145e7a9168c92966f8df5cc876dfdb22f2e1e696
3
+ metadata.gz: d9c55efc6a40f7368c49e1dccbc6e12418ae4c11
4
+ data.tar.gz: 1f761b5374e042dd592026d141d7761022edfbc5
5
5
  SHA512:
6
- metadata.gz: 19ad52bd8a4279132b347a12c47bdd159bdf0d8a46a712970ea94ed7960a2dd7b7b603ed00420d8d0d30d5a60df3e19a47afb090561a8a58e5a97394b1b3ff86
7
- data.tar.gz: 1aec4f86f8d2fd071b4bd7e84fa39b43cd1533b8b08b5396f2cf63dca13d339ff02f2eee80fa165b05e5b4609c2fc0908956d953591aa33609f1efa6d78dc5ab
6
+ metadata.gz: f27cdeb865526103258b6ce3baea05e14dcf37f1b6cffcec8ee3c9ccca2b53687efeb385b0660e1b21ed4d25e06b6468f1dec1ca2021752f6b8363772637ab5e
7
+ data.tar.gz: c30b3a2e9867cc8884ad3dd5c0ece2c2e9767da87ee94af3b0c9f6afd761d0b1ba6ee6260f6bdd065ab5b2ea20e980663f366571a5eba17b220a942ac75dc771
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ service_name: travis-ci
data/.gitignore ADDED
@@ -0,0 +1,12 @@
1
+ .DS_Store
2
+ .bundle/
3
+ log/*.log
4
+ pkg/
5
+ coverage/
6
+ spec/dummy/db/*.sqlite3
7
+ spec/dummy/log/*.log
8
+ spec/dummy/tmp/
9
+ spec/dummy/.sass-cache
10
+ .yardoc/
11
+ ctags
12
+ gemfiles/*.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format documentation
data/.ruby-gemset ADDED
@@ -0,0 +1 @@
1
+ re_track
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ ruby-2.0.0
data/.travis.yml ADDED
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ gemfile:
6
+ - gemfiles/rails_3.gemfile
7
+ - gemfiles/rails_4.gemfile
8
+ services: mongodb
data/Appraisals ADDED
@@ -0,0 +1,9 @@
1
+ appraise 'rails-3' do
2
+ gem 'rails', '~> 3.0'
3
+ gem 'mongoid', '~> 3.0'
4
+ end
5
+
6
+ appraise 'rails-4' do
7
+ gem 'rails', '~> 4.0.0'
8
+ gem 'mongoid', '~> 4.0.0.alpha1', github: 'mongoid/mongoid'
9
+ end
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source 'https://rubygems.org/'
2
+ gemspec
3
+
4
+ # jquery-rails is used by the dummy application
5
+ gem "jquery-rails"
data/Gemfile.lock ADDED
@@ -0,0 +1,150 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ re_track (0.5.0)
5
+ activesupport
6
+ mongoid (>= 3)
7
+ rails
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ actionmailer (3.2.15)
13
+ actionpack (= 3.2.15)
14
+ mail (~> 2.5.4)
15
+ actionpack (3.2.15)
16
+ activemodel (= 3.2.15)
17
+ activesupport (= 3.2.15)
18
+ builder (~> 3.0.0)
19
+ erubis (~> 2.7.0)
20
+ journey (~> 1.0.4)
21
+ rack (~> 1.4.5)
22
+ rack-cache (~> 1.2)
23
+ rack-test (~> 0.6.1)
24
+ sprockets (~> 2.2.1)
25
+ activemodel (3.2.15)
26
+ activesupport (= 3.2.15)
27
+ builder (~> 3.0.0)
28
+ activerecord (3.2.15)
29
+ activemodel (= 3.2.15)
30
+ activesupport (= 3.2.15)
31
+ arel (~> 3.0.2)
32
+ tzinfo (~> 0.3.29)
33
+ activeresource (3.2.15)
34
+ activemodel (= 3.2.15)
35
+ activesupport (= 3.2.15)
36
+ activesupport (3.2.15)
37
+ i18n (~> 0.6, >= 0.6.4)
38
+ multi_json (~> 1.0)
39
+ appraisal (0.5.2)
40
+ bundler
41
+ rake
42
+ arel (3.0.3)
43
+ builder (3.0.4)
44
+ coderay (1.1.0)
45
+ coveralls (0.7.0)
46
+ multi_json (~> 1.3)
47
+ rest-client
48
+ simplecov (>= 0.7)
49
+ term-ansicolor
50
+ thor
51
+ database_cleaner (1.2.0)
52
+ diff-lcs (1.2.5)
53
+ docile (1.1.0)
54
+ erubis (2.7.0)
55
+ hike (1.2.3)
56
+ i18n (0.6.5)
57
+ journey (1.0.4)
58
+ jquery-rails (3.0.4)
59
+ railties (>= 3.0, < 5.0)
60
+ thor (>= 0.14, < 2.0)
61
+ json (1.8.1)
62
+ mail (2.5.4)
63
+ mime-types (~> 1.16)
64
+ treetop (~> 1.4.8)
65
+ method_source (0.8.2)
66
+ mime-types (1.25)
67
+ mongoid (3.1.5)
68
+ activemodel (~> 3.2)
69
+ moped (~> 1.4)
70
+ origin (~> 1.0)
71
+ tzinfo (~> 0.3.29)
72
+ moped (1.5.1)
73
+ multi_json (1.8.2)
74
+ origin (1.1.0)
75
+ polyglot (0.3.3)
76
+ pry (0.9.12.3)
77
+ coderay (~> 1.0)
78
+ method_source (~> 0.8)
79
+ slop (~> 3.4)
80
+ rack (1.4.5)
81
+ rack-cache (1.2)
82
+ rack (>= 0.4)
83
+ rack-ssl (1.3.3)
84
+ rack
85
+ rack-test (0.6.2)
86
+ rack (>= 1.0)
87
+ rails (3.2.15)
88
+ actionmailer (= 3.2.15)
89
+ actionpack (= 3.2.15)
90
+ activerecord (= 3.2.15)
91
+ activeresource (= 3.2.15)
92
+ activesupport (= 3.2.15)
93
+ bundler (~> 1.0)
94
+ railties (= 3.2.15)
95
+ railties (3.2.15)
96
+ actionpack (= 3.2.15)
97
+ activesupport (= 3.2.15)
98
+ rack-ssl (~> 1.3.2)
99
+ rake (>= 0.8.7)
100
+ rdoc (~> 3.4)
101
+ thor (>= 0.14.6, < 2.0)
102
+ rake (10.1.0)
103
+ rdoc (3.12.2)
104
+ json (~> 1.4)
105
+ rest-client (1.6.7)
106
+ mime-types (>= 1.16)
107
+ rspec-core (2.14.7)
108
+ rspec-expectations (2.14.4)
109
+ diff-lcs (>= 1.1.3, < 2.0)
110
+ rspec-mocks (2.14.4)
111
+ rspec-rails (2.14.0)
112
+ actionpack (>= 3.0)
113
+ activesupport (>= 3.0)
114
+ railties (>= 3.0)
115
+ rspec-core (~> 2.14.0)
116
+ rspec-expectations (~> 2.14.0)
117
+ rspec-mocks (~> 2.14.0)
118
+ simplecov (0.8.2)
119
+ docile (~> 1.1.0)
120
+ multi_json
121
+ simplecov-html (~> 0.8.0)
122
+ simplecov-html (0.8.0)
123
+ slop (3.4.7)
124
+ sprockets (2.2.2)
125
+ hike (~> 1.2)
126
+ multi_json (~> 1.0)
127
+ rack (~> 1.0)
128
+ tilt (~> 1.1, != 1.3.0)
129
+ term-ansicolor (1.2.2)
130
+ tins (~> 0.8)
131
+ thor (0.18.1)
132
+ tilt (1.4.1)
133
+ tins (0.13.1)
134
+ treetop (1.4.15)
135
+ polyglot
136
+ polyglot (>= 0.3.1)
137
+ tzinfo (0.3.38)
138
+
139
+ PLATFORMS
140
+ ruby
141
+
142
+ DEPENDENCIES
143
+ appraisal
144
+ coveralls
145
+ database_cleaner
146
+ jquery-rails
147
+ pry
148
+ re_track!
149
+ rspec-rails
150
+ simplecov
data/README.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # ReTrack
2
2
 
3
3
  [![Build Status](https://travis-ci.org/gewo/re_track.png)](https://travis-ci.org/gewo/re_track/)
4
+ [![Coverage Status](https://coveralls.io/repos/gewo/re_track/badge.png)](https://coveralls.io/r/gewo/re_track)
5
+ [![Code Climate](https://codeclimate.com/github/gewo/re_track.png)](https://codeclimate.com/github/gewo/re_track)
6
+ [![Dependency Status](https://gemnasium.com/gewo/re_track.png)](https://gemnasium.com/gewo/re_track)
4
7
 
5
8
  Track HTTP-Referrers in Rails using Mongoid.
6
9
 
@@ -27,7 +30,8 @@ Or install it yourself as:
27
30
 
28
31
  OtherController
29
32
  # put in the controllers which create the model you want to track
30
- cache_sweeper ReTrack::Sweeper
33
+ include ReTrack::Sweeper
34
+ re_track :user # there has to be a trackable @user instance variable
31
35
  end
32
36
 
33
37
  MyModel
@@ -35,19 +39,12 @@ Or install it yourself as:
35
39
  include ReTrack::Trackable
36
40
  end
37
41
 
38
- When your `OtherController` creates `MyModel` a
42
+ When your `OtherController` creates `MyModel` in its `create`-action a
39
43
  `ReTrack::RefererTracking` is created as well, access it like this:
40
44
 
41
45
  my_model.referer_tracking
42
46
  ReTrack::RefererTracking.all.distinct(:first_url)
43
47
 
44
- ## TODO
45
-
46
- ### Get rid of `ActionController::Caching::Sweeper`!
47
-
48
- * right now ActiveRecord *and* Mongoid are required in your Rails app
49
- * it works although Mongoid models are observed by `ActiveRecord::Observer`s...
50
-
51
48
  ## Contributing
52
49
 
53
50
  1. Fork it
data/Rakefile CHANGED
@@ -4,6 +4,8 @@ begin
4
4
  rescue LoadError
5
5
  puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
6
6
  end
7
+ require 'appraisal'
8
+
7
9
  begin
8
10
  require 'rdoc/task'
9
11
  rescue LoadError
@@ -16,9 +18,13 @@ RDoc::Task.new(:rdoc) do |rdoc|
16
18
  rdoc.rdoc_dir = 'rdoc'
17
19
  rdoc.title = 'ReTrack'
18
20
  rdoc.options << '--line-numbers'
19
- rdoc.rdoc_files.include('README.rdoc')
21
+ rdoc.rdoc_files.include('README.md')
20
22
  rdoc.rdoc_files.include('lib/**/*.rb')
21
23
  end
22
24
 
23
25
  Bundler::GemHelper.install_tasks
24
26
 
27
+ require 'rspec/core/rake_task'
28
+ RSpec::Core::RakeTask.new :spec
29
+
30
+ task default: :spec
@@ -15,6 +15,9 @@ module ReTrack
15
15
  field :forwarded_ip, type: String
16
16
  field :accept_language, type: String
17
17
 
18
+ [:referer_url, :first_url, :user_agent, :first_visited_at, :ip,
19
+ :forwarded_ip, :accept_language].each { |field| index({ field => 1 }) }
20
+
18
21
  # Extract query parameters from referer_url and first_url.
19
22
  #
20
23
  # @example
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org/"
4
+
5
+ gem "jquery-rails"
6
+ gem "rails", "~> 3.0"
7
+ gem "mongoid", "~> 3.0"
8
+
9
+ gemspec :path=>"../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org/"
4
+
5
+ gem "jquery-rails"
6
+ gem "rails", "~> 4.0.0"
7
+ gem "mongoid", "~> 4.0.0.alpha1", :github=>"mongoid/mongoid"
8
+
9
+ gemspec :path=>"../"
@@ -1,17 +1,55 @@
1
- class ReTrack::Sweeper < ActionController::Caching::Sweeper
2
- def after_create(record)
3
- if session && session[:retrack]
4
- rt = ReTrack::RefererTracking.new
5
- rt.trackable = record
6
-
7
- session[:retrack].each_pair do |key, value|
8
- rt[key] = value if rt.attribute_names.include?(key.to_s)
1
+ module ReTrack
2
+ module Sweeper
3
+ extend ActiveSupport::Concern
4
+
5
+ mattr_accessor :rt_model_instance_names
6
+
7
+ included do
8
+ after_filter :rt_after_filter, only: :create
9
+ end
10
+
11
+ module ClassMethods
12
+ def re_track(record_instance_name)
13
+ (@rt_record_instance_names ||= []) << record_instance_name
9
14
  end
10
15
 
11
- rt.save!
16
+ def rt_record_instance_names
17
+ (@rt_record_instance_names ||= []).uniq
18
+ end
12
19
  end
13
- rescue => e
14
- Rails.logger.info(
15
- "ReTrack::Sweeper.after_create error saving record: #{e}")
20
+
21
+ private
22
+
23
+ def rt_after_filter
24
+ rt_records.each { |record| rt_after_create record }
25
+ true
26
+ end
27
+
28
+ def rt_records
29
+ self.class.rt_record_instance_names.map do |name|
30
+ instance_variable_get "@#{name}"
31
+ end
32
+ end
33
+
34
+ def rt_create_referer_tracking!(record)
35
+ rt = ReTrack::RefererTracking.new
36
+ rt.trackable = record
37
+
38
+ session[:retrack].each_pair do |key, value|
39
+ rt[key] = value if rt.attribute_names.include?(key.to_s)
40
+ end
41
+
42
+ rt.save!
43
+ end
44
+
45
+ def rt_after_create(record)
46
+ return unless record.persisted?
47
+ if session && session[:retrack]
48
+ rt_create_referer_tracking! record
49
+ end
50
+ rescue => e
51
+ Rails.logger.info(
52
+ "ReTrack::Sweeper.after_create error saving record: #{e}")
53
+ end
16
54
  end
17
55
  end
@@ -7,12 +7,8 @@ module ReTrack
7
7
  included do
8
8
  has_one :referer_tracking,
9
9
  class_name: 'ReTrack::RefererTracking',
10
- as: :trackable
11
-
12
- klass = self
13
- ReTrack::Sweeper.class_eval do
14
- observe klass
15
- end
10
+ as: :trackable,
11
+ validate: false
16
12
  end
17
13
  end
18
14
  end
@@ -6,25 +6,28 @@ module ReTrack
6
6
  before_filter :rt_track_referer
7
7
  end
8
8
 
9
- def rt_track_referer
10
- if session[:retrack].nil? && !request_from_a_known_bot?
11
- session[:retrack] = hash = {}
12
- hash[:referer_url] = request.headers['HTTP_REFERER'].presence || 'none'
13
- hash[:first_url] = request.url
14
- hash[:user_agent] = request.env['HTTP_USER_AGENT']
15
- hash[:first_visited_at] = Time.now
16
- hash[:ip] = request.remote_ip
17
- hash[:forwarded_ip] = request.env['HTTP_X_FORWARDED_FOR'] ||
18
- request.env['HTTP_CLIENT_IP']
19
- hash[:accept_language] = request.env['HTTP_ACCEPT_LANGUAGE']
9
+ private
10
+
11
+ TRACK = {
12
+ referer_url: ->(request) { request.headers['HTTP_REFERER'].presence || 'none' },
13
+ first_url: ->(request) { request.url },
14
+ user_agent: ->(request) { request.env['HTTP_USER_AGENT'] },
15
+ first_visited_at: ->(request) { Time.now },
16
+ ip: ->(request) { request.remote_ip },
17
+ accept_language: ->(request) { request.env['HTTP_ACCEPT_LANGUAGE'] },
18
+ forwarded_ip: ->(request) { request.env['HTTP_X_FORWARDED_FOR'] || request.env['HTTP_CLIENT_IP'] }
19
+ }
20
+
21
+ def rt_track_referer
22
+ session[:retrack].nil? && !request_from_a_known_bot? &&
23
+ session[:retrack] = Hash[TRACK.map { |k, v| [k, v.call(request)] }]
20
24
  end
21
- end
22
25
 
23
- def request_from_a_known_bot?
24
- bot_user_agents = ['GoogleBot', 'Mediapartners-Google', 'msnbot',
25
- 'TwengaBot', 'DigExt; DTS Agent', 'YandexImages']
26
- bot_user_agents_re = /\b(#{bot_user_agents * '|'})\b/i
27
- request.user_agent =~ bot_user_agents_re
28
- end
26
+ def request_from_a_known_bot?
27
+ bot_user_agents = ['GoogleBot', 'Mediapartners-Google', 'msnbot',
28
+ 'TwengaBot', 'DigExt; DTS Agent', 'YandexImages']
29
+ bot_user_agents_re = /\b(#{bot_user_agents * '|'})\b/i
30
+ request.user_agent =~ bot_user_agents_re
31
+ end
29
32
  end
30
33
  end
@@ -1,3 +1,3 @@
1
1
  module ReTrack
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.0'
3
3
  end
data/lib/re_track.rb CHANGED
@@ -1,7 +1,7 @@
1
- require "re_track/engine"
2
- require "re_track/tracker"
3
- require "re_track/sweeper"
4
- require "re_track/trackable"
1
+ require 're_track/engine'
2
+ require 're_track/tracker'
3
+ require 're_track/sweeper'
4
+ require 're_track/trackable'
5
5
 
6
6
  module ReTrack
7
7
  end
data/re_track.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 're_track/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 're_track'
7
+ s.version = ReTrack::VERSION
8
+ s.authors = ['Gebhard Wöstemeyer']
9
+ s.email = ['g.woestemeyer@gmail.com']
10
+ s.homepage = 'https://github.com/gewo/re_track'
11
+ s.summary = 'Track HTTP-Referrers in Rails using Mongoid/MongoDB'
12
+ s.description = 'Track HTTP-Referrers in Rails using Mongoid/MongoDB'
13
+ s.license = 'MIT'
14
+
15
+ s.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
16
+ s.test_files = s.files.grep(/^spec\//)
17
+ s.require_paths = ['lib']
18
+
19
+ s.add_runtime_dependency 'rails'
20
+ s.add_runtime_dependency 'mongoid', '>= 3'
21
+ s.add_runtime_dependency 'activesupport'
22
+
23
+ s.add_development_dependency 'rspec-rails'
24
+ s.add_development_dependency 'simplecov'
25
+ s.add_development_dependency 'coveralls'
26
+ s.add_development_dependency 'database_cleaner'
27
+ s.add_development_dependency 'pry'
28
+ s.add_development_dependency 'appraisal'
29
+ end
data/script/rails ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
3
+
4
+ ENGINE_ROOT = File.expand_path('../..', __FILE__)
5
+ ENGINE_PATH = File.expand_path('../../lib/re_track/engine', __FILE__)
6
+
7
+ require 'rails/all'
8
+ require 'rails/engine/commands'
@@ -0,0 +1,89 @@
1
+ require 'spec_helper'
2
+
3
+ describe UsersController, "RefererTracking" do
4
+ before :each do
5
+ @request.env['HTTP_REFERER'] = (@referer = "awesome.pa.ge/believe/me")
6
+ @request.env['HTTP_USER_AGENT'] = @ua = "Fancy new UA"
7
+ @request.env['REMOTE_ADDR'] = @ip = '102.97.107.101'
8
+ get :new
9
+ end
10
+
11
+ it "saves referer_url to session" do
12
+ session[:retrack].should_not be_blank
13
+ session[:retrack][:referer_url].should == @referer
14
+ end
15
+
16
+ it "saves first_url to session" do
17
+ session[:retrack].should_not be_blank
18
+ session[:retrack][:first_url].should =~ %r(users/new$)
19
+ end
20
+
21
+ context "on the second request" do
22
+ before :each do
23
+ @request.env['HTTP_REFERER'] = ("this.is.the.new/referer")
24
+ end
25
+
26
+ it "doesn't update referer_url" do
27
+ get :index
28
+ session[:retrack][:referer_url].should == @referer
29
+ end
30
+
31
+ it "doesn't update first_url" do
32
+ get :index
33
+ session[:retrack][:first_url].should =~ %r(users/new$)
34
+ end
35
+ end
36
+
37
+ describe "POST 'create'" do
38
+ it "saves a user" do
39
+ expect {
40
+ post :create
41
+ }.to change(User.all, :count).by(1)
42
+ end
43
+
44
+ it "saves a RefererTracking" do
45
+ expect {
46
+ post :create
47
+ }.to change(ReTrack::RefererTracking.all, :count).by(1)
48
+ end
49
+
50
+ context "when saving the RefererTracking" do
51
+ before :each do
52
+ post :create
53
+ @rt = ReTrack::RefererTracking.last
54
+ end
55
+
56
+ it "saves the referer_url in RefererTracking" do
57
+ @rt.referer_url.should == @referer
58
+ end
59
+
60
+ it "saves the first_url in RefererTracking" do
61
+ @rt.first_url.should =~ %r(users/new$)
62
+ end
63
+
64
+ it "saves the user_agent in RefererTracking" do
65
+ @rt.user_agent.should == @ua
66
+ end
67
+
68
+ it "saves the first_visited_at in RefererTracking" do
69
+ # TODO: use Timecop
70
+ @rt.first_visited_at.should be_within(5.seconds).of(DateTime.now)
71
+ end
72
+
73
+ it "saves the correct user in RefererTracking" do
74
+ user = User.last
75
+ @rt.trackable.should == user
76
+ end
77
+
78
+ it 'saves the ip in RefererTracking' do
79
+ @rt.ip.should == @ip
80
+ end
81
+ end
82
+
83
+ it "completes the response when there are errors in the sweeper" do
84
+ ReTrack::RefererTracking.any_instance.stub(:save).and_raise
85
+ post :create
86
+ response.should be_a_redirect # not a 500
87
+ end
88
+ end
89
+ end