re_track 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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