logster 1.2.11 → 1.3.pre

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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +18 -17
  3. data/.travis.yml +15 -16
  4. data/CHANGELOG.md +130 -130
  5. data/Gemfile +4 -4
  6. data/Guardfile +8 -8
  7. data/LICENSE.txt +22 -22
  8. data/README.md +99 -96
  9. data/Rakefile +24 -23
  10. data/assets/fonts/FontAwesome.otf +0 -0
  11. data/assets/fonts/fontawesome-webfont.eot +0 -0
  12. data/assets/fonts/fontawesome-webfont.svg +639 -639
  13. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  14. data/assets/fonts/fontawesome-webfont.woff +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  16. data/assets/images/Icon-144_rounded.png +0 -0
  17. data/assets/images/Icon-144_square.png +0 -0
  18. data/assets/images/icon_144x144.png +0 -0
  19. data/assets/images/icon_64x64.png +0 -0
  20. data/assets/javascript/client-app.js +81 -0
  21. data/assets/javascript/vendor.js +5302 -0
  22. data/assets/stylesheets/client-app.css +1 -0
  23. data/assets/stylesheets/vendor.css +4 -0
  24. data/build_client_app.sh +12 -0
  25. data/client-app/.editorconfig +20 -0
  26. data/client-app/.ember-cli +9 -0
  27. data/client-app/.eslintignore +19 -0
  28. data/client-app/.eslintrc.js +46 -0
  29. data/client-app/.gitignore +23 -0
  30. data/client-app/.travis.yml +27 -0
  31. data/client-app/.watchmanconfig +3 -0
  32. data/client-app/README.md +57 -0
  33. data/client-app/app/app.js +14 -0
  34. data/client-app/app/components/message-info.js +18 -0
  35. data/client-app/app/components/message-row.js +45 -0
  36. data/client-app/app/components/panel-resizer.js +75 -0
  37. data/client-app/app/components/tab-contents.js +27 -0
  38. data/client-app/app/components/tab-link.js +5 -0
  39. data/client-app/app/components/tabbed-section.js +32 -0
  40. data/client-app/app/components/time-formatter.js +25 -0
  41. data/client-app/app/components/update-time.js +21 -0
  42. data/client-app/app/controllers/index.js +83 -0
  43. data/client-app/app/controllers/show.js +13 -0
  44. data/client-app/app/index.html +29 -0
  45. data/client-app/app/initializers/app-init.js +55 -0
  46. data/client-app/app/lib/preload.js +14 -0
  47. data/client-app/app/lib/utilities.js +140 -0
  48. data/client-app/app/models/message-collection.js +158 -0
  49. data/client-app/app/models/message.js +99 -0
  50. data/client-app/app/resolver.js +3 -0
  51. data/client-app/app/router.js +14 -0
  52. data/client-app/app/routes/index.js +53 -0
  53. data/client-app/app/routes/show.js +14 -0
  54. data/{assets/stylesheets → client-app/app/styles}/app.css +387 -390
  55. data/{assets/javascript → client-app/app}/templates/application.hbs +2 -2
  56. data/client-app/app/templates/components/message-info.hbs +44 -0
  57. data/{assets/javascript → client-app/app/templates}/components/message-row.hbs +17 -17
  58. data/client-app/app/templates/components/tabbed-section.hbs +10 -0
  59. data/client-app/app/templates/components/time-formatter.hbs +1 -0
  60. data/{assets/javascript → client-app/app}/templates/index.hbs +57 -57
  61. data/{assets/javascript → client-app/app}/templates/show.hbs +4 -4
  62. data/client-app/config/environment.js +51 -0
  63. data/client-app/config/optional-features.json +3 -0
  64. data/client-app/config/targets.js +18 -0
  65. data/client-app/ember-cli-build.js +29 -0
  66. data/client-app/package-lock.json +11365 -0
  67. data/client-app/package.json +56 -0
  68. data/client-app/testem.js +25 -0
  69. data/client-app/tests/index.html +34 -0
  70. data/client-app/tests/integration/components/message-info-test.js +26 -0
  71. data/client-app/tests/integration/components/message-row-test.js +26 -0
  72. data/client-app/tests/integration/components/panel-resizer-test.js +26 -0
  73. data/client-app/tests/integration/components/tab-contents-test.js +26 -0
  74. data/client-app/tests/integration/components/tab-link-test.js +26 -0
  75. data/client-app/tests/integration/components/tabbed-section-test.js +26 -0
  76. data/client-app/tests/integration/components/time-formatter-test.js +26 -0
  77. data/client-app/tests/integration/components/update-time-test.js +26 -0
  78. data/client-app/tests/test-helper.js +8 -0
  79. data/client-app/tests/unit/controllers/index-test.js +12 -0
  80. data/client-app/tests/unit/controllers/show-test.js +12 -0
  81. data/client-app/tests/unit/initializers/app-init-test.js +31 -0
  82. data/client-app/tests/unit/routes/index-test.js +11 -0
  83. data/client-app/tests/unit/routes/show-test.js +11 -0
  84. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  85. data/lib/logster.rb +54 -54
  86. data/lib/logster/base_store.rb +130 -130
  87. data/lib/logster/configuration.rb +25 -25
  88. data/lib/logster/ignore_pattern.rb +65 -65
  89. data/lib/logster/logger.rb +102 -101
  90. data/lib/logster/message.rb +227 -226
  91. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  92. data/lib/logster/middleware/reporter.rb +56 -54
  93. data/lib/logster/middleware/viewer.rb +220 -251
  94. data/lib/logster/rails/railtie.rb +58 -58
  95. data/lib/logster/redis_store.rb +481 -477
  96. data/lib/logster/version.rb +3 -3
  97. data/lib/logster/web.rb +14 -14
  98. data/logster.gemspec +34 -33
  99. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  100. data/test/fake_data/Gemfile +4 -4
  101. data/test/fake_data/generate.rb +10 -10
  102. data/test/logster/middleware/test_reporter.rb +21 -21
  103. data/test/logster/middleware/test_viewer.rb +96 -70
  104. data/test/logster/test_base_store.rb +147 -147
  105. data/test/logster/test_ignore_pattern.rb +41 -41
  106. data/test/logster/test_logger.rb +74 -74
  107. data/test/logster/test_message.rb +34 -34
  108. data/test/logster/test_redis_rate_limiter.rb +230 -230
  109. data/test/logster/test_redis_store.rb +427 -414
  110. data/test/test_helper.rb +38 -37
  111. data/vendor/assets/javascripts/logster.js.erb +39 -39
  112. metadata +83 -24
  113. data/assets/javascript/app.js +0 -817
  114. data/assets/javascript/components/message-info.hbs +0 -47
  115. data/assets/javascript/components/panel-resizer.hbs +0 -0
  116. data/assets/javascript/components/tab-contents.hbs +0 -1
  117. data/assets/javascript/components/tab-link.hbs +0 -1
  118. data/assets/javascript/components/tabbed-section.hbs +0 -6
  119. data/assets/javascript/external/ember-template-compiler.js +0 -22346
  120. data/assets/javascript/external/ember.js +0 -58500
  121. data/assets/javascript/external/ember.min.js +0 -17
  122. data/assets/javascript/external/jquery.min.js +0 -5
  123. data/assets/javascript/external/lodash.min.js +0 -87
  124. data/assets/javascript/external/moment.min.js +0 -6
  125. data/assets/stylesheets/font-awesome.min.css +0 -4
  126. data/bower.json +0 -25
@@ -1,3 +1,3 @@
1
- module Logster
2
- VERSION = "1.2.11"
3
- end
1
+ module Logster
2
+ VERSION = "1.3.pre"
3
+ end
@@ -1,14 +1,14 @@
1
- require 'logster/middleware/viewer'
2
-
3
- class Logster::Web
4
- class FourOhFour
5
- def call(env)
6
- [404, {}, ["not found"]]
7
- end
8
- end
9
-
10
- def self.call(env)
11
- @middleware ||= Logster::Middleware::Viewer.new(FourOhFour.new)
12
- @middleware.call(env)
13
- end
14
- end
1
+ require 'logster/middleware/viewer'
2
+
3
+ class Logster::Web
4
+ class FourOhFour
5
+ def call(env)
6
+ [404, {}, ["not found"]]
7
+ end
8
+ end
9
+
10
+ def self.call(env)
11
+ @middleware ||= Logster::Middleware::Viewer.new(FourOhFour.new)
12
+ @middleware.call(env)
13
+ end
14
+ end
@@ -1,33 +1,34 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'logster/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "logster"
8
- spec.version = Logster::VERSION
9
- spec.authors = ["UI for viewing logs in Rack"]
10
- spec.email = ["sam.saffron@gmail.com"]
11
- spec.summary = %q{UI for viewing logs in Rack}
12
- spec.description = %q{UI for viewing logs in Rack}
13
- spec.homepage = "https://github.com/discourse/logster"
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
- f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
18
- end
19
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
- spec.require_paths = ["lib"]
22
-
23
- # NOTE dependency on rack is not explicit, this enables us to use
24
- # logster outside of rack (for reporting)
25
-
26
- spec.add_development_dependency "bundler", "~> 1.6"
27
- spec.add_development_dependency "rake"
28
- spec.add_development_dependency "rack"
29
- spec.add_development_dependency "redis"
30
- spec.add_development_dependency "guard"
31
- spec.add_development_dependency "guard-minitest"
32
- spec.add_development_dependency "timecop"
33
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'logster/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "logster"
8
+ spec.version = Logster::VERSION
9
+ spec.authors = ["UI for viewing logs in Rack"]
10
+ spec.email = ["sam.saffron@gmail.com"]
11
+ spec.summary = %q{UI for viewing logs in Rack}
12
+ spec.description = %q{UI for viewing logs in Rack}
13
+ spec.homepage = "https://github.com/discourse/logster"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.start_with?("bower_components") || f.start_with?("website") || f.start_with?("bin")
18
+ end
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+
23
+ # NOTE dependency on rack is not explicit, this enables us to use
24
+ # logster outside of rack (for reporting)
25
+
26
+ spec.add_development_dependency "bundler", "~> 1.6"
27
+ spec.add_development_dependency "rake"
28
+ spec.add_development_dependency "rack"
29
+ spec.add_development_dependency "redis"
30
+ spec.add_development_dependency "guard"
31
+ spec.add_development_dependency "guard-minitest"
32
+ spec.add_development_dependency "timecop"
33
+ spec.add_development_dependency "byebug"
34
+ end
@@ -1,46 +1,46 @@
1
- require_relative '../test_helper'
2
- require 'logster/logger'
3
- require 'logster/redis_store'
4
- require 'logger'
5
- require 'examples/sidekiq_logster_reporter'
6
-
7
- class TestSidekiqReporter < MiniTest::Test
8
-
9
- def setup
10
- Logster.store = @store = Logster::RedisStore.new(Redis.new)
11
- Logster.logger = @logger = Logster::Logger.new(Logster.store)
12
- @store.clear_all
13
- end
14
-
15
- def teardown
16
- @store.clear_all
17
- end
18
-
19
- def test_sidekiq_handler_example
20
- handler = SidekiqLogsterReporter.new
21
- error = nil
22
- begin
23
- raise TypeError.new
24
- rescue => e
25
- error = e
26
- end
27
- trace = error.backtrace
28
-
29
- handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
30
-
31
- report = @store.latest[0]
32
-
33
- # Message is right format
34
- assert_equal("Job exception: TypeError\n", report.message)
35
-
36
- # A backtrace is joined()
37
- assert_equal(trace.join("\n"), report.backtrace)
38
- # The backtrace is deleted from the env
39
- assert_nil(report.env['backtrace'])
40
- assert_nil(report.env[:backtrace])
41
-
42
- # The env is in the report
43
- assert_equal("Test", report.env['code'])
44
- assert_equal(20, report.env['params']['article_id'])
45
- end
46
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/logger'
3
+ require 'logster/redis_store'
4
+ require 'logger'
5
+ require 'examples/sidekiq_logster_reporter'
6
+
7
+ class TestSidekiqReporter < MiniTest::Test
8
+
9
+ def setup
10
+ Logster.store = @store = Logster::RedisStore.new(Redis.new)
11
+ Logster.logger = @logger = Logster::Logger.new(Logster.store)
12
+ @store.clear_all
13
+ end
14
+
15
+ def teardown
16
+ @store.clear_all
17
+ end
18
+
19
+ def test_sidekiq_handler_example
20
+ handler = SidekiqLogsterReporter.new
21
+ error = nil
22
+ begin
23
+ raise TypeError.new
24
+ rescue => e
25
+ error = e
26
+ end
27
+ trace = error.backtrace
28
+
29
+ handler.call(error, code: "Test", something_important: "Foo", params: { article_id: 20 })
30
+
31
+ report = @store.latest[0]
32
+
33
+ # Message is right format
34
+ assert_equal("Job exception: TypeError\n", report.message)
35
+
36
+ # A backtrace is joined()
37
+ assert_equal(trace.join("\n"), report.backtrace)
38
+ # The backtrace is deleted from the env
39
+ assert_nil(report.env['backtrace'])
40
+ assert_nil(report.env[:backtrace])
41
+
42
+ # The env is in the report
43
+ assert_equal("Test", report.env['code'])
44
+ assert_equal(20, report.env['params']['article_id'])
45
+ end
46
+ end
@@ -1,4 +1,4 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'redis'
4
- gem 'logster', path: '../../'
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'redis'
4
+ gem 'logster', path: '../../'
@@ -1,10 +1,10 @@
1
- require 'redis'
2
- require 'logster'
3
-
4
- Logster.config.allow_grouping = true
5
- Logster.config.application_version = "ABC123"
6
- Logster.store = Logster::RedisStore.new
7
-
8
- 10.times do
9
- Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
10
- end
1
+ require 'redis'
2
+ require 'logster'
3
+
4
+ Logster.config.allow_grouping = true
5
+ Logster.config.application_version = "ABC123"
6
+ Logster.store = Logster::RedisStore.new
7
+
8
+ 10.times do
9
+ Logster.store.report(Logger::WARN, "application", "test warning", backtrace: "method1\nmethod2", env: {something: ["hello world", "hello places"], another: {thing: "something else"}})
10
+ end
@@ -1,21 +1,21 @@
1
- require_relative '../../test_helper'
2
- require 'rack'
3
- require 'logster/redis_store'
4
- require 'logster/middleware/reporter'
5
-
6
-
7
- class TestReporter < Minitest::Test
8
-
9
- def test_logs_errors
10
- Logster.store = Logster::TestStore.new
11
-
12
- reporter = Logster::Middleware::Reporter.new(nil)
13
- env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
14
- status, = reporter.call(env)
15
-
16
- assert_equal(200, status)
17
- assert_equal(1, Logster.store.count)
18
- end
19
-
20
- end
21
-
1
+ require_relative '../../test_helper'
2
+ require 'rack'
3
+ require 'logster/redis_store'
4
+ require 'logster/middleware/reporter'
5
+
6
+
7
+ class TestReporter < Minitest::Test
8
+
9
+ def test_logs_errors
10
+ Logster.store = Logster::TestStore.new
11
+
12
+ reporter = Logster::Middleware::Reporter.new(nil)
13
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
14
+ status, = reporter.call(env)
15
+
16
+ assert_equal(200, status)
17
+ assert_equal(1, Logster.store.count)
18
+ end
19
+
20
+ end
21
+
@@ -1,70 +1,96 @@
1
- require_relative '../../test_helper'
2
- require 'rack'
3
- require 'logster/redis_store'
4
- require 'logster/middleware/viewer'
5
-
6
- class TestViewer < Minitest::Test
7
-
8
- class BrokenApp
9
- def call(env)
10
- [500, {}, ["broken"]]
11
- end
12
- end
13
-
14
- def setup
15
- Logster.store = Logster::RedisStore.new
16
- end
17
-
18
- def teardown
19
- Logster.config.subdirectory = nil
20
- Logster.store = nil
21
- end
22
-
23
- def viewer
24
- @viewer ||= begin
25
- Logster.config.subdirectory = "/logsie"
26
- Logster::Middleware::Viewer.new(nil)
27
- end
28
- end
29
-
30
- def test_path_resolution
31
- assert_nil(viewer.send(:resolve_path, "/logs"))
32
- assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
33
- assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
34
- assert_equal("/",viewer.send(:resolve_path, "/logsie"))
35
- assert_equal("/",viewer.send(:resolve_path, "/logsie/"))
36
- assert_equal("/hello/world",viewer.send(:resolve_path, "/logsie/hello/world"))
37
- end
38
-
39
- def test_search_raceguard_s
40
- _,_,result_j = viewer.call(Rack::MockRequest.env_for("/logsie/messages.json?search=searchkey"))
41
- result = JSON.parse(result_j.first)
42
- assert_equal('searchkey', result['search'])
43
- end
44
-
45
- def test_search_raceguard_sr
46
- _,_,result_j = viewer.call(Rack::MockRequest.env_for("/logsie/messages.json?search=/regex/&regex_search=true"))
47
- result = JSON.parse(result_j.first)
48
- assert_equal('/regex/', result['search'])
49
- end
50
-
51
- def test_search_raceguard_f
52
- _,_,result_j = viewer.call(Rack::MockRequest.env_for("/logsie/messages.json?filter=0_1_2_3_4"))
53
- result = JSON.parse(result_j.first)
54
- assert_equal([0,1,2,3,4], result['filter'])
55
- end
56
-
57
- def test_assets
58
- env = {}
59
- env["PATH_INFO"] = "/logsie/javascript/external/jquery.min.js"
60
- env["REQUEST_METHOD"] = "GET"
61
-
62
- result, = viewer.call(env)
63
- assert_equal(200, result)
64
- end
65
-
66
- def test_regex_parse
67
- assert_equal(/hello/i, viewer.send(:parse_regex, '/hello/i'))
68
- end
69
-
70
- end
1
+ require_relative '../../test_helper'
2
+ require 'rack'
3
+ require 'logster/redis_store'
4
+ require 'logster/middleware/viewer'
5
+
6
+ class TestViewer < Minitest::Test
7
+
8
+ class BrokenApp
9
+ def call(env)
10
+ [500, {}, ["broken"]]
11
+ end
12
+ end
13
+
14
+ def setup
15
+ Logster.config.subdirectory = "/logsie"
16
+ Logster.store = Logster::RedisStore.new
17
+ end
18
+
19
+ def teardown
20
+ Logster.config.subdirectory = nil
21
+ Logster.store = nil
22
+ end
23
+
24
+ def viewer
25
+ @viewer ||= Logster::Middleware::Viewer.new(nil)
26
+ end
27
+
28
+ def request
29
+ @request ||= Rack::MockRequest.new(Rack::Lint.new(viewer))
30
+ end
31
+
32
+ def test_path_resolution
33
+ assert_nil(viewer.send(:resolve_path, "/logs"))
34
+ assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
35
+ assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
36
+ assert_equal("/",viewer.send(:resolve_path, "/logsie"))
37
+ assert_equal("/",viewer.send(:resolve_path, "/logsie/"))
38
+ assert_equal("/hello/world",viewer.send(:resolve_path, "/logsie/hello/world"))
39
+ end
40
+
41
+ def test_search_raceguard_s
42
+ response = request.get('/logsie/messages.json?search=searchkey')
43
+ result = JSON.parse(response.body)
44
+ assert_equal('searchkey', result['search'])
45
+ end
46
+
47
+ def test_search_raceguard_sr
48
+ response = request.get('/logsie/messages.json?search=/regex/&regex_search=true')
49
+ result = JSON.parse(response.body)
50
+ assert_equal('/regex/', result['search'])
51
+ end
52
+
53
+ def test_search_raceguard_f
54
+ response = request.get("/logsie/messages.json?filter=0_1_2_3_4")
55
+ result = JSON.parse(response.body)
56
+ assert_equal([0,1,2,3,4], result['filter'])
57
+ end
58
+
59
+ def test_regex_parse
60
+ assert_equal(/hello/i, viewer.send(:parse_regex, '/hello/i'))
61
+ end
62
+
63
+ def test_linking_to_a_valid_js_files
64
+ %w(
65
+ /logsie/javascript/client-app.js
66
+ /logsie/javascript/vendor.js
67
+ ).each do |path|
68
+ response = request.get(path)
69
+ assert_equal(200, response.status)
70
+ assert_equal('application/javascript', response.headers['Content-Type'])
71
+ end
72
+ end
73
+
74
+ def test_linking_to_a_valid_css_files
75
+ %w(
76
+ /logsie/stylesheets/client-app.css
77
+ /logsie/stylesheets/vendor.css
78
+ ).each do |path|
79
+ response = request.get(path)
80
+ assert_equal(200, response.status)
81
+ assert_equal('text/css', response.headers['Content-Type'])
82
+ end
83
+ end
84
+
85
+ def test_linking_to_an_invalid_ember_component_or_template
86
+ %w(
87
+ /logsie/javascript/templates/application.hbs
88
+ /logsie/javascript/templates/does_not_exist.js
89
+ /logsie/javascript/components/does_not_exist.js
90
+ /logsie/javascript/templates/../../app.js
91
+ ).each do |path|
92
+ response = request.get(path)
93
+ assert_equal(404, response.status, "#{path} should have 404'ed")
94
+ end
95
+ end
96
+ end
@@ -1,147 +1,147 @@
1
- require_relative '../test_helper'
2
- require 'logster/base_store'
3
- require 'logster/ignore_pattern'
4
-
5
- class TestBaseStore < Minitest::Test
6
-
7
- def setup
8
- @store = Logster::TestStore.new
9
- @store.clear_all
10
- end
11
-
12
- def teardown
13
- @store.clear_all
14
- end
15
-
16
- def test_report_skip_empty
17
- @store.skip_empty = true
18
- @store.report(Logger::WARN, "test", nil)
19
- @store.report(Logger::WARN, "test", '')
20
- @store.report(Logger::WARN, "test", "foo") #
21
- @store.skip_empty = false
22
- @store.report(Logger::WARN, "test", nil) #
23
-
24
- assert_equal(2, @store.count)
25
- end
26
-
27
- def test_report_skip_level
28
- @store.level = nil
29
- @store.report(Logger::DEBUG, "test", "A") #
30
- @store.level = Logger::WARN
31
- @store.report(Logger::DEBUG, "test", "A")
32
- @store.report(Logger::INFO, "test", "B")
33
- @store.report(Logger::WARN, "test", "C") #
34
- @store.report(Logger::ERROR, "test", "D") #
35
- assert_equal(3, @store.count)
36
- end
37
-
38
- def test_report_skip_ignore
39
- @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
40
- @store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
41
- @store.report(Logger::WARN, "test", "B")
42
- @store.ignore = [
43
- /^ActiveRecord::RecordNotFound \(Couldn't find Upload/,
44
- /^Can't verify CSRF token authenticity/
45
- ]
46
- @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
47
- @store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
48
- @store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9489+78946947)")
49
- @store.report(Logger::WARN, "test", "B")
50
-
51
- assert_equal(4, @store.count)
52
- end
53
-
54
- def test_ignore_pattern_basic
55
- @store.ignore = [
56
- Logster::IgnorePattern.new(nil, {username: 'CausingErrors'})
57
- ]
58
- @store.report(Logger::WARN, "test", "Foobar") #
59
- @store.report(Logger::WARN, "test", "Foobar", { env: { username: 'CausingErrors' }})
60
- @store.report(Logger::WARN, "test", "Foobar", env: nil)
61
- @store.report(Logger::WARN, "test", "Something Else", { env: { username: 'CausingErrors' }})
62
- @store.report(Logger::WARN, "test", "Something Else", { env: { 'username' => 'CausingErrors' }})
63
- @store.report(Logger::WARN, "test", "Something Else", { env: { username: 'GoodPerson' }}) #
64
- @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
65
-
66
- assert_equal(4, @store.count)
67
- end
68
-
69
- def test_ignore_pattern_real
70
- @store.ignore = [
71
- /^ActionController::RoutingError \(No route matches/,
72
- Logster::IgnorePattern.new("Can't verify CSRF token authenticity", { REQUEST_URI: /\/trackback\/$/ })
73
- ]
74
- # blocked
75
- @store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
76
- env: {
77
- HTTP_HOST: 'meta.discourse.org',
78
- REQUEST_URI: '/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/',
79
- REQUEST_METHOD: 'POST',
80
- HTTP_USER_AGENT: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
81
- params: {
82
- title: 'Something Spammy',
83
- url: 'http://spam.example.net/whatever/spam.html',
84
- excerpt: 'http://spam.example.com/pdf/blahblah.html free viagra',
85
- blog_name: 'get free spam for cheap'
86
- }
87
- }
88
- })
89
- # logged
90
- @store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
91
- env: {
92
- HTTP_HOST: 'meta.discourse.org',
93
- REQUEST_URI: '/session',
94
- REQUEST_METHOD: 'POST',
95
- HTTP_USER_AGENT: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
96
- params: {
97
- username: 'user',
98
- password: 'password',
99
- form_authenticity_token: 'incorrect'
100
- }
101
- }
102
- })
103
- assert_equal(1, @store.count)
104
- end
105
-
106
- def test_timestamp
107
- time = Time.now - 24*60*60
108
- message = @store.report(Logger::WARN, "test", "B", timestamp: time)
109
-
110
- assert_equal(time, message.timestamp)
111
- end
112
-
113
- def test_backtrace
114
- # Create an error with a backtrace
115
- error = TypeError.new
116
- begin
117
- raise error
118
- rescue => e
119
- error = e
120
- end
121
-
122
- # Backtrace can be passed via backtrace param or env
123
- message = @store.report(Logger::WARN, "test", "A", backtrace: error.backtrace)
124
- assert_equal(error.backtrace.join("\n"), message.backtrace)
125
- message = @store.report(Logger::WARN, "test", "B", env: {backtrace: error.backtrace})
126
- assert_equal(error.backtrace.join("\n"), message.backtrace)
127
-
128
- # Via env takes priority
129
- message = @store.report(Logger::WARN, "test", "C", backtrace: "Garbage", env: {backtrace: error.backtrace})
130
- assert_equal(error.backtrace.join("\n"), message.backtrace)
131
-
132
- # Backtrace is always a string
133
- # Cannot do an equal assert here, because it uses `caller` when not provided
134
- message = @store.report(Logger::WARN, "test", "D", backtrace: nil)
135
- assert_kind_of(String, message.backtrace)
136
- message = @store.report(Logger::WARN, "test", "E", env: {backtrace: nil})
137
- assert_kind_of(String, message.backtrace)
138
- message = @store.report(Logger::WARN, "test", "F", backtrace: nil, env: {backtrace: nil})
139
- assert_kind_of(String, message.backtrace)
140
- message = @store.report(Logger::WARN, "test", "G")
141
- assert_kind_of(String, message.backtrace)
142
-
143
- # Arrays are turned into strings via join \n
144
- message = @store.report(Logger::WARN, "test", "H", backtrace: ["Foo", "Bar"])
145
- assert_equal("Foo\nBar", message.backtrace)
146
- end
147
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/base_store'
3
+ require 'logster/ignore_pattern'
4
+
5
+ class TestBaseStore < Minitest::Test
6
+
7
+ def setup
8
+ @store = Logster::TestStore.new
9
+ @store.clear_all
10
+ end
11
+
12
+ def teardown
13
+ @store.clear_all
14
+ end
15
+
16
+ def test_report_skip_empty
17
+ @store.skip_empty = true
18
+ @store.report(Logger::WARN, "test", nil)
19
+ @store.report(Logger::WARN, "test", '')
20
+ @store.report(Logger::WARN, "test", "foo") #
21
+ @store.skip_empty = false
22
+ @store.report(Logger::WARN, "test", nil) #
23
+
24
+ assert_equal(2, @store.count)
25
+ end
26
+
27
+ def test_report_skip_level
28
+ @store.level = nil
29
+ @store.report(Logger::DEBUG, "test", "A") #
30
+ @store.level = Logger::WARN
31
+ @store.report(Logger::DEBUG, "test", "A")
32
+ @store.report(Logger::INFO, "test", "B")
33
+ @store.report(Logger::WARN, "test", "C") #
34
+ @store.report(Logger::ERROR, "test", "D") #
35
+ assert_equal(3, @store.count)
36
+ end
37
+
38
+ def test_report_skip_ignore
39
+ @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
40
+ @store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
41
+ @store.report(Logger::WARN, "test", "B")
42
+ @store.ignore = [
43
+ /^ActiveRecord::RecordNotFound \(Couldn't find Upload/,
44
+ /^Can't verify CSRF token authenticity/
45
+ ]
46
+ @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity")
47
+ @store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9947)")
48
+ @store.report(Logger::FATAL, "test", "ActiveRecord::RecordNotFound (Couldn't find Upload with 'id'=9489+78946947)")
49
+ @store.report(Logger::WARN, "test", "B")
50
+
51
+ assert_equal(4, @store.count)
52
+ end
53
+
54
+ def test_ignore_pattern_basic
55
+ @store.ignore = [
56
+ Logster::IgnorePattern.new(nil, {username: 'CausingErrors'})
57
+ ]
58
+ @store.report(Logger::WARN, "test", "Foobar") #
59
+ @store.report(Logger::WARN, "test", "Foobar", { env: { username: 'CausingErrors' }})
60
+ @store.report(Logger::WARN, "test", "Foobar", env: nil)
61
+ @store.report(Logger::WARN, "test", "Something Else", { env: { username: 'CausingErrors' }})
62
+ @store.report(Logger::WARN, "test", "Something Else", { env: { 'username' => 'CausingErrors' }})
63
+ @store.report(Logger::WARN, "test", "Something Else", { env: { username: 'GoodPerson' }}) #
64
+ @store.report(Logger::WARN, "test", "Can't verify CSRF token authenticity") #
65
+
66
+ assert_equal(4, @store.count)
67
+ end
68
+
69
+ def test_ignore_pattern_real
70
+ @store.ignore = [
71
+ /^ActionController::RoutingError \(No route matches/,
72
+ Logster::IgnorePattern.new("Can't verify CSRF token authenticity", { REQUEST_URI: /\/trackback\/$/ })
73
+ ]
74
+ # blocked
75
+ @store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
76
+ env: {
77
+ HTTP_HOST: 'meta.discourse.org',
78
+ REQUEST_URI: '/t/use-more-standard-smiley-codes-instead-of-smile/1822/trackback/',
79
+ REQUEST_METHOD: 'POST',
80
+ HTTP_USER_AGENT: 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',
81
+ params: {
82
+ title: 'Something Spammy',
83
+ url: 'http://spam.example.net/whatever/spam.html',
84
+ excerpt: 'http://spam.example.com/pdf/blahblah.html free viagra',
85
+ blog_name: 'get free spam for cheap'
86
+ }
87
+ }
88
+ })
89
+ # logged
90
+ @store.report(Logger::WARN, "whatever", "Can't verify CSRF token authenticity", {
91
+ env: {
92
+ HTTP_HOST: 'meta.discourse.org',
93
+ REQUEST_URI: '/session',
94
+ REQUEST_METHOD: 'POST',
95
+ HTTP_USER_AGENT: 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
96
+ params: {
97
+ username: 'user',
98
+ password: 'password',
99
+ form_authenticity_token: 'incorrect'
100
+ }
101
+ }
102
+ })
103
+ assert_equal(1, @store.count)
104
+ end
105
+
106
+ def test_timestamp
107
+ time = Time.now - 24*60*60
108
+ message = @store.report(Logger::WARN, "test", "B", timestamp: time)
109
+
110
+ assert_equal(time, message.timestamp)
111
+ end
112
+
113
+ def test_backtrace
114
+ # Create an error with a backtrace
115
+ error = TypeError.new
116
+ begin
117
+ raise error
118
+ rescue => e
119
+ error = e
120
+ end
121
+
122
+ # Backtrace can be passed via backtrace param or env
123
+ message = @store.report(Logger::WARN, "test", "A", backtrace: error.backtrace)
124
+ assert_equal(error.backtrace.join("\n"), message.backtrace)
125
+ message = @store.report(Logger::WARN, "test", "B", env: {backtrace: error.backtrace})
126
+ assert_equal(error.backtrace.join("\n"), message.backtrace)
127
+
128
+ # Via env takes priority
129
+ message = @store.report(Logger::WARN, "test", "C", backtrace: "Garbage", env: {backtrace: error.backtrace})
130
+ assert_equal(error.backtrace.join("\n"), message.backtrace)
131
+
132
+ # Backtrace is always a string
133
+ # Cannot do an equal assert here, because it uses `caller` when not provided
134
+ message = @store.report(Logger::WARN, "test", "D", backtrace: nil)
135
+ assert_kind_of(String, message.backtrace)
136
+ message = @store.report(Logger::WARN, "test", "E", env: {backtrace: nil})
137
+ assert_kind_of(String, message.backtrace)
138
+ message = @store.report(Logger::WARN, "test", "F", backtrace: nil, env: {backtrace: nil})
139
+ assert_kind_of(String, message.backtrace)
140
+ message = @store.report(Logger::WARN, "test", "G")
141
+ assert_kind_of(String, message.backtrace)
142
+
143
+ # Arrays are turned into strings via join \n
144
+ message = @store.report(Logger::WARN, "test", "H", backtrace: ["Foo", "Bar"])
145
+ assert_equal("Foo\nBar", message.backtrace)
146
+ end
147
+ end