projectlocker_pulse 0.2.1

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 (82) hide show
  1. data/CHANGELOG +26 -0
  2. data/Gemfile +3 -0
  3. data/Guardfile +6 -0
  4. data/INSTALL +20 -0
  5. data/MIT-LICENSE +23 -0
  6. data/README.md +439 -0
  7. data/README_FOR_HEROKU_ADDON.md +89 -0
  8. data/Rakefile +223 -0
  9. data/SUPPORTED_RAILS_VERSIONS +38 -0
  10. data/TESTING.md +41 -0
  11. data/features/metal.feature +18 -0
  12. data/features/rack.feature +60 -0
  13. data/features/rails.feature +272 -0
  14. data/features/rails_with_js_notifier.feature +97 -0
  15. data/features/rake.feature +27 -0
  16. data/features/sinatra.feature +29 -0
  17. data/features/step_definitions/file_steps.rb +10 -0
  18. data/features/step_definitions/metal_steps.rb +23 -0
  19. data/features/step_definitions/rack_steps.rb +23 -0
  20. data/features/step_definitions/rails_application_steps.rb +478 -0
  21. data/features/step_definitions/rake_steps.rb +17 -0
  22. data/features/support/env.rb +18 -0
  23. data/features/support/matchers.rb +35 -0
  24. data/features/support/projectlocker_pulse_shim.rb.template +16 -0
  25. data/features/support/rails.rb +201 -0
  26. data/features/support/rake/Rakefile +68 -0
  27. data/features/support/terminal.rb +107 -0
  28. data/features/user_informer.feature +63 -0
  29. data/generators/pulse/lib/insert_commands.rb +34 -0
  30. data/generators/pulse/lib/rake_commands.rb +24 -0
  31. data/generators/pulse/pulse_generator.rb +94 -0
  32. data/generators/pulse/templates/capistrano_hook.rb +6 -0
  33. data/generators/pulse/templates/initializer.rb +6 -0
  34. data/generators/pulse/templates/pulse_tasks.rake +25 -0
  35. data/install.rb +1 -0
  36. data/lib/projectlocker_pulse.rb +159 -0
  37. data/lib/pulse/backtrace.rb +108 -0
  38. data/lib/pulse/capistrano.rb +43 -0
  39. data/lib/pulse/configuration.rb +305 -0
  40. data/lib/pulse/notice.rb +390 -0
  41. data/lib/pulse/rack.rb +54 -0
  42. data/lib/pulse/rails/action_controller_catcher.rb +30 -0
  43. data/lib/pulse/rails/controller_methods.rb +85 -0
  44. data/lib/pulse/rails/error_lookup.rb +33 -0
  45. data/lib/pulse/rails/javascript_notifier.rb +47 -0
  46. data/lib/pulse/rails/middleware/exceptions_catcher.rb +33 -0
  47. data/lib/pulse/rails.rb +40 -0
  48. data/lib/pulse/rails3_tasks.rb +99 -0
  49. data/lib/pulse/railtie.rb +49 -0
  50. data/lib/pulse/rake_handler.rb +65 -0
  51. data/lib/pulse/sender.rb +128 -0
  52. data/lib/pulse/shared_tasks.rb +47 -0
  53. data/lib/pulse/tasks.rb +83 -0
  54. data/lib/pulse/user_informer.rb +27 -0
  55. data/lib/pulse/utils/blank.rb +53 -0
  56. data/lib/pulse/version.rb +3 -0
  57. data/lib/pulse_tasks.rb +64 -0
  58. data/lib/rails/generators/pulse/pulse_generator.rb +100 -0
  59. data/lib/templates/javascript_notifier.erb +15 -0
  60. data/lib/templates/rescue.erb +91 -0
  61. data/pulse.gemspec +39 -0
  62. data/rails/init.rb +1 -0
  63. data/resources/README.md +34 -0
  64. data/resources/ca-bundle.crt +3376 -0
  65. data/script/integration_test.rb +38 -0
  66. data/test/backtrace_test.rb +162 -0
  67. data/test/capistrano_test.rb +34 -0
  68. data/test/catcher_test.rb +333 -0
  69. data/test/configuration_test.rb +236 -0
  70. data/test/helper.rb +263 -0
  71. data/test/javascript_notifier_test.rb +51 -0
  72. data/test/logger_test.rb +79 -0
  73. data/test/notice_test.rb +490 -0
  74. data/test/notifier_test.rb +276 -0
  75. data/test/projectlocker_pulse_tasks_test.rb +170 -0
  76. data/test/pulse.xsd +88 -0
  77. data/test/rack_test.rb +58 -0
  78. data/test/rails_initializer_test.rb +36 -0
  79. data/test/recursion_test.rb +10 -0
  80. data/test/sender_test.rb +288 -0
  81. data/test/user_informer_test.rb +29 -0
  82. metadata +432 -0
data/Rakefile ADDED
@@ -0,0 +1,223 @@
1
+ require 'rake'
2
+ require 'rake/testtask'
3
+ require 'rubygems/package_task'
4
+ begin
5
+ require 'cucumber/rake/task'
6
+ rescue LoadError
7
+ $stderr.puts "Please install cucumber: `gem install cucumber`"
8
+ exit 1
9
+ end
10
+ require './lib/pulse/version'
11
+
12
+ FEATURES = ["sinatra","rack","metal","user_informer"]
13
+
14
+ desc 'Default: run unit tests.'
15
+ task :default => [:test, "cucumber:rails:all"] + FEATURES
16
+
17
+ desc "Clean out the tmp directory"
18
+ task :clean do
19
+ exec "rm -rf tmp"
20
+ end
21
+
22
+ desc 'Test the projectlocker-pulse gem.'
23
+ Rake::TestTask.new(:test) do |t|
24
+ t.libs << 'lib'
25
+ t.pattern = 'test/**/*_test.rb'
26
+ t.verbose = true
27
+ end
28
+
29
+ namespace :changeling do
30
+ desc "Bumps the version by a minor or patch version, depending on what was passed in."
31
+ task :bump, :part do |t, args|
32
+ # Thanks, Jeweler!
33
+ if Pulse::VERSION =~ /^(\d+)\.(\d+)\.(\d+)(?:\.(.*?))?$/
34
+ major = $1.to_i
35
+ minor = $2.to_i
36
+ patch = $3.to_i
37
+ build = $4
38
+ else
39
+ abort
40
+ end
41
+
42
+ case args[:part]
43
+ when /minor/
44
+ minor += 1
45
+ patch = 0
46
+ when /patch/
47
+ patch += 1
48
+ else
49
+ abort
50
+ end
51
+
52
+ version = [major, minor, patch, build].compact.join('.')
53
+
54
+ File.open(File.join("lib", "pulse", "version.rb"), "w") do |f|
55
+ f.write <<EOF
56
+ module Pulse
57
+ VERSION = "#{version}".freeze
58
+ end
59
+ EOF
60
+ end
61
+ end
62
+
63
+ desc "Writes out the new CHANGELOG and prepares the release"
64
+ task :change do
65
+ load 'lib/pulse/version.rb'
66
+ file = "CHANGELOG"
67
+ old = File.read(file)
68
+ version = Pulse::VERSION
69
+ message = "Bumping to version #{version}"
70
+ editor = ENV["EDITOR"] || "vim" # prefer vim if no env variable for editor is set
71
+
72
+ File.open(file, "w") do |f|
73
+ f.write <<EOF
74
+ Version #{version} - #{Time.now}
75
+ ===============================================================================
76
+
77
+ #{`git log $(git tag | grep -v rc | tail -1)..HEAD | git shortlog`}
78
+ #{old}
79
+ EOF
80
+ end
81
+
82
+ exec ["#{editor} #{file}",
83
+ "git commit -aqm '#{message}'",
84
+ "git tag -a -m '#{message}' v#{version}",
85
+ "echo '\n\n\033[32mMarked v#{version} /' `git show-ref -s refs/heads/master` 'for release. Run: rake changeling:push\033[0m\n\n'"].join(' && ')
86
+ end
87
+
88
+ desc "Bump by a minor version (1.2.3 => 1.3.0)"
89
+ task :minor do |t|
90
+ Rake::Task['changeling:bump'].invoke(t.name)
91
+ Rake::Task['changeling:change'].invoke
92
+ end
93
+
94
+ desc "Bump by a patch version, (1.2.3 => 1.2.4)"
95
+ task :patch do |t|
96
+ Rake::Task['changeling:bump'].invoke(t.name)
97
+ Rake::Task['changeling:change'].invoke
98
+ end
99
+
100
+ desc "Push the latest version and tags"
101
+ task :push do |t|
102
+ system("git push origin master")
103
+ system("git push origin $(git tag | grep -v rc | tail -1)")
104
+ end
105
+ end
106
+
107
+ begin
108
+ require 'yard'
109
+ YARD::Rake::YardocTask.new do |t|
110
+ t.files = ['lib/**/*.rb', 'TESTING.rdoc']
111
+ end
112
+ rescue LoadError
113
+ end
114
+
115
+ GEM_ROOT = File.dirname(__FILE__).freeze
116
+
117
+ desc "Clean files generated by rake tasks"
118
+ task :clobber => [:clobber_rdoc, :clobber_package]
119
+
120
+ LOCAL_GEM_ROOT = File.join(GEM_ROOT, 'tmp', 'local_gems').freeze
121
+ RAILS_VERSIONS = IO.read('SUPPORTED_RAILS_VERSIONS').strip.split("\n")
122
+ LOCAL_GEMS =
123
+ [
124
+ ["rack","1.3.2"],
125
+ ] +
126
+ RAILS_VERSIONS.collect { |version| ['rails', version] } +
127
+ [
128
+ ['sham_rack', nil],
129
+ ['capistrano', nil],
130
+ ['sqlite3-ruby', nil],
131
+ ["therubyracer",nil],
132
+ ["sinatra",nil]
133
+ ]
134
+
135
+
136
+ desc "Vendor test gems: Run this once to prepare your test environment"
137
+ task :vendor_test_gems do
138
+ old_gem_path = ENV['GEM_PATH']
139
+ old_gem_home = ENV['GEM_HOME']
140
+ ENV['GEM_PATH'] = LOCAL_GEM_ROOT
141
+ ENV['GEM_HOME'] = LOCAL_GEM_ROOT
142
+
143
+ LOCAL_GEMS.each do |gem_name, version|
144
+ gem_file_pattern = [gem_name, version || '*'].compact.join('-')
145
+ version_option = version ? "-v #{version}" : ''
146
+ pattern = File.join(LOCAL_GEM_ROOT, 'gems', "#{gem_file_pattern}")
147
+ existing = Dir.glob(pattern).first
148
+ if existing
149
+ puts "\nskipping #{gem_name} since it's already vendored," +
150
+ "remove it from the tmp directory first."
151
+ next
152
+ end
153
+
154
+ command = "gem install -i #{LOCAL_GEM_ROOT} --no-ri --no-rdoc --backtrace #{version_option} #{gem_name}"
155
+ puts "Vendoring #{gem_file_pattern}..."
156
+ unless system("#{command} 2>&1")
157
+ puts "Command failed: #{command}"
158
+ exit(1)
159
+ end
160
+ end
161
+
162
+ ENV['GEM_PATH'] = old_gem_path
163
+ ENV['GEM_HOME'] = old_gem_home
164
+ end
165
+
166
+ Cucumber::Rake::Task.new(:cucumber) do |t|
167
+ t.fork = true
168
+ t.cucumber_opts = ['--format', (ENV['CUCUMBER_FORMAT'] || 'progress')]
169
+ end
170
+
171
+ task :cucumber => [:vendor_test_gems]
172
+
173
+
174
+ def run_rails_cucumber_task(version, additional_cucumber_args)
175
+ puts "Testing Rails #{version}"
176
+ if version.empty?
177
+ raise "No Rails version specified - make sure ENV['RAILS_VERSION'] is set, e.g. with `rake cucumber:rails:all`"
178
+ end
179
+ ENV['RAILS_VERSION'] = version
180
+ cmd = "cucumber --format #{ENV['CUCUMBER_FORMAT'] || 'progress'} #{additional_cucumber_args} features/rails.feature features/rails_with_js_notifier.feature"
181
+ puts "Running command: #{cmd}"
182
+ system(cmd)
183
+ end
184
+
185
+ def define_rails_cucumber_tasks(additional_cucumber_args = '')
186
+ namespace :rails do
187
+ RAILS_VERSIONS.each do |version|
188
+ desc "Test integration of the gem with Rails #{version}"
189
+ task version => [:vendor_test_gems] do
190
+ exit 1 unless run_rails_cucumber_task(version, additional_cucumber_args)
191
+ end
192
+ end
193
+
194
+ desc "Test integration of the gem with all Rails versions"
195
+ task :all do
196
+ results = RAILS_VERSIONS.map do |version|
197
+ run_rails_cucumber_task(version, additional_cucumber_args)
198
+ end
199
+
200
+ exit 1 unless results.all?
201
+ end
202
+ end
203
+ end
204
+
205
+ namespace :cucumber do
206
+ namespace :wip do
207
+ define_rails_cucumber_tasks('--tags @wip')
208
+ end
209
+
210
+ define_rails_cucumber_tasks
211
+
212
+ rule /#{"(" + FEATURES.join("|") + ")"}/ do |t|
213
+ framework = t.name
214
+ desc "Test integration of the gem with #{framework}"
215
+ task framework.to_sym do
216
+ puts "Testing #{framework.split(":").last}..."
217
+ cmd = "cucumber --format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features/#{framework.split(":").last}.feature"
218
+ puts "Running command: #{cmd}"
219
+ system(cmd)
220
+ end
221
+ end
222
+
223
+ end
@@ -0,0 +1,38 @@
1
+ 2.3.14
2
+ 3.0.0
3
+ 3.0.1
4
+ 3.0.2
5
+ 3.0.3
6
+ 3.0.4
7
+ 3.0.5
8
+ 3.0.6
9
+ 3.0.7
10
+ 3.0.8
11
+ 3.0.9
12
+ 3.0.10
13
+ 3.0.11
14
+ 3.0.12
15
+ 3.0.13
16
+ 3.0.14
17
+ 3.0.15
18
+ 3.0.16
19
+ 3.0.17
20
+ 3.1.0
21
+ 3.1.1
22
+ 3.1.2
23
+ 3.1.3
24
+ 3.1.4
25
+ 3.1.5
26
+ 3.1.6
27
+ 3.1.7
28
+ 3.1.8
29
+ 3.1.4
30
+ 3.2.0
31
+ 3.2.1
32
+ 3.2.2
33
+ 3.2.3
34
+ 3.2.4
35
+ 3.2.5
36
+ 3.2.6
37
+ 3.2.7
38
+ 3.2.8
data/TESTING.md ADDED
@@ -0,0 +1,41 @@
1
+ Running the suite
2
+ =================
3
+
4
+ Since the notifier must run on many versions of Rails, running its test suite is slightly different than you may be used to.
5
+
6
+ You should start by trusting the .rvmrc file. We come in peace.
7
+
8
+ Then execute the following command:
9
+
10
+ rake vendor_test_gems
11
+ # NOT: bundle exec rake vendor_test_gems
12
+
13
+ This command will download the various versions of Rails and other gems that the notifier must be tested against.
14
+
15
+ Then, to start the suite, run
16
+
17
+ rake
18
+ # NOT: bundle exec rake
19
+
20
+ Finally, this test suite runs against many rails versions. If you
21
+ prefer to run it against specific version hit
22
+
23
+ rake cucumber:rails:<VERSION>
24
+
25
+ You can also specify to test only against the certain frameworks we
26
+ support (rack, rake and sinatra) by executing
27
+
28
+ rake cucumber:<FRAMEWORK>
29
+
30
+ This tasks are not printed out with `rake -T` since they're added
31
+ dynamically in the Rakefile.
32
+
33
+
34
+ For Maintainers
35
+ ================
36
+
37
+ When developing the Pulse gem, be sure to use the integration test against an existing project on staging before pushing to master.
38
+
39
+ ./script/integration_test.rb <test project's api key> <staging server hostname>
40
+
41
+ ./script/integration_test.rb <test project's api key> <staging server hostname> secure
@@ -0,0 +1,18 @@
1
+ Feature: Rescue errors in Rails middleware
2
+
3
+ Background:
4
+ Given I have built and installed the "projectlocker-pulse" gem
5
+ And I generate a new Rails application
6
+ And I configure the Pulse shim
7
+ And I configure my application to require the "projectlocker-pulse" gem
8
+ And I run the pulse generator with "-k myapikey"
9
+
10
+ Scenario: Rescue an exception in the dispatcher
11
+ When I define a Metal endpoint called "Exploder":
12
+ """
13
+ def self.call(env)
14
+ raise "Explode"
15
+ end
16
+ """
17
+ When I perform a request to "http://example.com:123/metal/index?param=value"
18
+ Then I should receive a Pulse notification
@@ -0,0 +1,60 @@
1
+ Feature: Use the notifier in a plain Rack app
2
+
3
+ Background:
4
+ Given I have built and installed the "projectlocker-pulse" gem
5
+
6
+ Scenario: Rescue and exception in a Rack app
7
+ Given the following Rack app:
8
+ """
9
+ require 'logger'
10
+ require 'rack'
11
+ require 'projectlocker_pulse'
12
+
13
+ Pulse.configure do |config|
14
+ config.api_key = 'my_api_key'
15
+ config.logger = Logger.new STDOUT
16
+ end
17
+
18
+ app = Rack::Builder.app do
19
+ use Pulse::Rack
20
+ run lambda { |env| raise "Rack down" }
21
+ end
22
+ """
23
+ When I perform a Rack request to "http://example.com:123/test/index?param=value"
24
+ Then I should receive a Pulse notification
25
+
26
+ Scenario: Ignore user agents
27
+ Given the following Rack app:
28
+ """
29
+ require 'logger'
30
+ require 'rack'
31
+ require 'projectlocker_pulse'
32
+
33
+ Pulse.configure do |config|
34
+ config.api_key = 'my_api_key'
35
+ config.ignore_user_agent << /ignore/
36
+ config.logger = Logger.new STDOUT
37
+ end
38
+
39
+ class Mock
40
+ class AppendUserAgent
41
+ def initialize(app)
42
+ @app = app
43
+ end
44
+
45
+ def call(env)
46
+ env["HTTP_USER_AGENT"] = "ignore"
47
+ @app.call(env)
48
+ end
49
+ end
50
+ end
51
+
52
+ app = Rack::Builder.app do
53
+ use Pulse::Rack
54
+ use Mock::AppendUserAgent
55
+ run lambda { |env| raise "Rack down" }
56
+ end
57
+ """
58
+ When I perform a Rack request to "http://example.com:123/test/index?param=value"
59
+ Then I should not see "** [Pulse] Response from Pulse:"
60
+
@@ -0,0 +1,272 @@
1
+ Feature: Install the Gem in a Rails application
2
+
3
+ Background:
4
+ Given I have built and installed the "projectlocker-pulse" gem
5
+ And I generate a new Rails application
6
+
7
+ Scenario: Use the gem without vendoring the gem in a Rails application
8
+ When I configure the Pulse shim
9
+ And I configure my application to require the "projectlocker-pulse" gem
10
+ And I run the pulse generator with "-k myapikey"
11
+ Then the command should have run successfully
12
+ And I should receive a Pulse notification
13
+ And I should see the Rails version
14
+
15
+ Scenario: vendor the gem and uninstall
16
+ When I configure the Pulse shim
17
+ And I configure my application to require the "projectlocker-pulse" gem
18
+ And I unpack the "projectlocker-pulse" gem
19
+ And I run the pulse generator with "-k myapikey"
20
+ Then the command should have run successfully
21
+ When I uninstall the "projectlocker-pulse" gem
22
+ And I install cached gems
23
+ And I run "rake pulse:test"
24
+ Then I should see "** [Pulse] Response from Pulse:"
25
+ And I should receive two Pulse notifications
26
+
27
+ Scenario: Configure the notifier by hand
28
+ When I configure the Pulse shim
29
+ And I configure the notifier to use "myapikey" as an API key
30
+ And I configure my application to require the "projectlocker-pulse" gem
31
+ And I run the pulse generator with ""
32
+ Then I should receive a Pulse notification
33
+
34
+ Scenario: Configuration within initializer isn't overridden by Railtie
35
+ When I configure the Pulse shim
36
+ And I configure usage of Pulse
37
+ Then the command should have run successfully
38
+ When I configure the notifier to use the following configuration lines:
39
+ """
40
+ config.api_key = "myapikey"
41
+ config.project_root = "argle/bargle"
42
+ """
43
+ And I define a response for "TestController#index":
44
+ """
45
+ session[:value] = "test"
46
+ raise RuntimeError, "some message"
47
+ """
48
+ And I route "/test/index" to "test#index"
49
+ And I perform a request to "http://example.com:123/test/index?param=value"
50
+ Then I should receive a Pulse notification
51
+
52
+ Scenario: Try to install without an api key
53
+ When I configure my application to require the "projectlocker-pulse" gem
54
+ And I run the projectlocker-pulse generator with ""
55
+ Then I should see "Must pass --api-key or --heroku or create config/initializers/pulse.rb"
56
+
57
+ Scenario: Configure and deploy using only installed gem
58
+ When I run "capify ."
59
+ And I configure the Pulse shim
60
+ And I configure my application to require the "projectlocker-pulse" gem
61
+ And I run the pulse generator with "-k myapikey"
62
+ And I configure my application to require the "capistrano" gem if necessary
63
+ And I run "cap -T"
64
+ Then I should see "pulse:deploy"
65
+
66
+ Scenario: Configure and deploy using only vendored gem
67
+ When I run "capify ."
68
+ And I configure the Pulse shim
69
+ And I configure my application to require the "projectlocker-pulse" gem
70
+ And I unpack the "projectlocker-pulse" gem
71
+ And I run the pulse generator with "-k myapikey"
72
+ And I uninstall the "projectlocker-pulse" gem
73
+ And I install cached gems
74
+ And I configure my application to require the "capistrano" gem if necessary
75
+ And I run "cap -T"
76
+ Then I should see "pulse:deploy"
77
+
78
+ Scenario: Try to install when the pulse plugin still exists
79
+ When I install the "pulse" plugin
80
+ And I configure the Pulse shim
81
+ And I configure the notifier to use "myapikey" as an API key
82
+ And I configure my application to require the "projectlocker-pulse" gem
83
+ And I run the pulse generator with ""
84
+ Then I should see "You must first remove the pulse plugin. Please run: script/plugin remove pulse"
85
+
86
+ Scenario: Rescue an exception in a controller
87
+ When I configure the Pulse shim
88
+ And I configure usage of Pulse
89
+ And I define a response for "TestController#index":
90
+ """
91
+ session[:value] = "test"
92
+ raise RuntimeError, "some message"
93
+ """
94
+ And I route "/test/index" to "test#index"
95
+ And I perform a request to "http://example.com:123/test/index?param=value"
96
+ Then I should receive a Pulse notification
97
+ Then I should see "test"
98
+
99
+ Scenario: The gem should not be considered a framework gem
100
+ When I configure the Pulse shim
101
+ And I configure my application to require the "projectlocker-pulse" gem
102
+ And I run the pulse generator with "-k myapikey"
103
+ And I run "rake gems"
104
+ Then I should see that "projectlocker-pulse" is not considered a framework gem
105
+
106
+ Scenario: The app uses Vlad instead of Capistrano
107
+ When I configure the Pulse shim
108
+ And I configure my application to require the "projectlocker-pulse" gem
109
+ And I run "touch config/deploy.rb"
110
+ And I run "rm Capfile"
111
+ And I run the pulse generator with "-k myapikey"
112
+ Then "config/deploy.rb" should not contain "capistrano"
113
+
114
+ Scenario: Support the Heroku addon in the generator
115
+ When I configure the Pulse shim
116
+ And I configure the Heroku rake shim
117
+ And I configure the Heroku gem shim with "myapikey"
118
+ And I configure my application to require the "projectlocker-pulse" gem
119
+ And I run the pulse generator with "--heroku"
120
+ Then the command should have run successfully
121
+ And I should receive a Pulse notification
122
+ And I should see the Rails version
123
+ And my Pulse configuration should contain the following line:
124
+ """
125
+ config.api_key = ENV['PULSE_API_KEY']
126
+ """
127
+
128
+ Scenario: Support the --app option for the Heroku addon in the generator
129
+ When I configure the Pulse shim
130
+ And I configure the Heroku rake shim
131
+ And I configure the Heroku gem shim with "myapikey" and multiple app support
132
+ And I configure my application to require the "projectlocker-pulse" gem
133
+ And I run the pulse generator with "--heroku -a myapp"
134
+ Then the command should have run successfully
135
+ And I should receive a Pulse notification
136
+ And I should see the Rails version
137
+ And my Pulse configuration should contain the following line:
138
+ """
139
+ config.api_key = ENV['PULSE_API_KEY']
140
+ """
141
+
142
+ Scenario: Filtering parameters in a controller
143
+ When I configure the Pulse shim
144
+ And I configure usage of Pulse
145
+ When I configure the notifier to use the following configuration lines:
146
+ """
147
+ config.api_key = "myapikey"
148
+ config.params_filters << "credit_card_number"
149
+ """
150
+ And I define a response for "TestController#index":
151
+ """
152
+ params[:credit_card_number] = "red23"
153
+ raise RuntimeError, "some message"
154
+ """
155
+ And I route "/test/index" to "test#index"
156
+ And I perform a request to "http://example.com:123/test/index?param=value"
157
+ Then I should receive a Pulse notification
158
+ Then I should not see "red23"
159
+ And I should see "FILTERED"
160
+
161
+ Scenario: Filtering session in a controller
162
+ When I configure the Pulse shim
163
+ And I configure usage of Pulse
164
+ When I configure the notifier to use the following configuration lines:
165
+ """
166
+ config.api_key = "myapikey"
167
+ config.params_filters << "secret"
168
+ """
169
+ And I define a response for "TestController#index":
170
+ """
171
+ session["secret"] = "blue42"
172
+ raise RuntimeError, "some message"
173
+ """
174
+ And I route "/test/index" to "test#index"
175
+ And I perform a request to "http://example.com:123/test/index?param=value"
176
+ Then I should receive a Pulse notification
177
+ Then I should not see "blue42"
178
+ And I should see "FILTERED"
179
+
180
+ Scenario: Filtering session and params based on Rails parameter filters
181
+ When I configure the Pulse shim
182
+ And I configure usage of Pulse
183
+ And I configure the application to filter parameter "secret"
184
+ And I define a response for "TestController#index":
185
+ """
186
+ params["secret"] = "red23"
187
+ session["secret"] = "blue42"
188
+ raise RuntimeError, "some message"
189
+ """
190
+ And I route "/test/index" to "test#index"
191
+ And I perform a request to "http://example.com:123/test/index?param=value"
192
+ Then I should receive a Pulse notification
193
+ And I should not see "red23"
194
+ And I should not see "blue42"
195
+ And I should see "FILTERED"
196
+
197
+ Scenario: Notify projectlocker-pulse within the controller
198
+ When I configure the Pulse shim
199
+ And I configure usage of Pulse
200
+ And I define a response for "TestController#index":
201
+ """
202
+ session[:value] = "test"
203
+ notify_projectlocker_pulse(RuntimeError.new("some message"))
204
+ render :nothing => true
205
+ """
206
+ And I route "/test/index" to "test#index"
207
+ And I perform a request to "http://example.com:123/test/index?param=value"
208
+ Then I should receive a Pulse notification
209
+ And I should see "test"
210
+
211
+ Scenario: Reporting 404s should be disabled by default
212
+ When I configure the Pulse shim
213
+ And I configure usage of Pulse
214
+ And I perform a request to "http://example.com:123/this/route/does/not/exist"
215
+ Then I should see "The page you were looking for doesn't exist."
216
+ And I should not receive a Pulse notification
217
+
218
+ Scenario: Reporting 404s should work when configured properly
219
+ When I configure the Pulse shim
220
+ And I configure usage of Pulse
221
+ When I configure the notifier to use the following configuration lines:
222
+ """
223
+ config.ignore_only = []
224
+ """
225
+ And I perform a request to "http://example.com:123/this/route/does/not/exist"
226
+ Then I should see "The page you were looking for doesn't exist."
227
+ And I should receive a Pulse notification
228
+
229
+ Scenario: reporting over SSL with utf8 check should work
230
+ Given PENDING I fix this one
231
+ When I configure the Pulse shim
232
+ And I configure usage of Pulse
233
+ When I configure the notifier to use the following configuration lines:
234
+ """
235
+ config.secure = true
236
+ """
237
+ And I define a response for "TestController#index":
238
+ """
239
+ raise RuntimeError, "some message"
240
+ """
241
+ And I route "/test/index" to "test#index"
242
+ And I perform a request to "http://example.com:123/test/index?utf8=✓"
243
+ Then I should receive a Pulse notification
244
+
245
+ Scenario: It should also send the user details
246
+ When I configure the Pulse shim
247
+ And I configure usage of Pulse
248
+ And I define a response for "TestController#index":
249
+ """
250
+ raise RuntimeError, "some message"
251
+ """
252
+ And I route "/test/index" to "test#index"
253
+ And I have set up authentication system in my app that uses "current_user"
254
+ And I perform a request to "http://example.com:123/test/index"
255
+ Then I should receive a Pulse notification
256
+ And the Pulse notification should contain user details
257
+ When I have set up authentication system in my app that uses "current_member"
258
+ And I perform a request to "http://example.com:123/test/index"
259
+ Then I should receive a Pulse notification
260
+ And the Pulse notification should contain user details
261
+
262
+ Scenario: It should log the notice when failure happens
263
+ When Pulse server is not responding
264
+ And I configure usage of Pulse
265
+ And I define a response for "TestController#index":
266
+ """
267
+ raise RuntimeError, "some message"
268
+ """
269
+ And I route "/test/index" to "test#index"
270
+ And I perform a request to "http://example.com:123/test/index?param=value"
271
+ Then I should see "Notice details:"
272
+ And I should see "some message"