logster 2.1.2 → 2.2.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 (127) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +21 -19
  3. data/.rubocop.yml +1 -1
  4. data/.travis.yml +16 -16
  5. data/CHANGELOG.md +224 -172
  6. data/Gemfile +4 -4
  7. data/Guardfile +8 -8
  8. data/LICENSE.txt +22 -22
  9. data/README.md +99 -99
  10. data/Rakefile +21 -21
  11. data/assets/fonts/FontAwesome.otf +0 -0
  12. data/assets/fonts/fontawesome-webfont.eot +0 -0
  13. data/assets/fonts/fontawesome-webfont.svg +639 -639
  14. data/assets/fonts/fontawesome-webfont.ttf +0 -0
  15. data/assets/fonts/fontawesome-webfont.woff +0 -0
  16. data/assets/fonts/fontawesome-webfont.woff2 +0 -0
  17. data/assets/images/Icon-144_rounded.png +0 -0
  18. data/assets/images/Icon-144_square.png +0 -0
  19. data/assets/images/icon_144x144.png +0 -0
  20. data/assets/images/icon_64x64.png +0 -0
  21. data/assets/javascript/client-app.js +115 -106
  22. data/assets/stylesheets/client-app.css +1 -1
  23. data/build_client_app.sh +0 -0
  24. data/client-app/.editorconfig +20 -20
  25. data/client-app/.ember-cli +9 -9
  26. data/client-app/.eslintignore +19 -19
  27. data/client-app/.eslintrc.js +46 -46
  28. data/client-app/.gitignore +23 -23
  29. data/client-app/.travis.yml +27 -27
  30. data/client-app/.watchmanconfig +3 -3
  31. data/client-app/README.md +57 -57
  32. data/client-app/app/app.js +0 -0
  33. data/client-app/app/components/actions-menu.js +43 -43
  34. data/client-app/app/components/env-tab.js +80 -80
  35. data/client-app/app/components/message-info.js +0 -0
  36. data/client-app/app/components/message-row.js +0 -0
  37. data/client-app/app/components/panel-resizer.js +0 -0
  38. data/client-app/app/components/patterns-list.js +109 -0
  39. data/client-app/app/components/tab-contents.js +27 -27
  40. data/client-app/app/components/tabbed-section.js +0 -0
  41. data/client-app/app/components/time-formatter.js +0 -0
  42. data/client-app/app/components/update-time.js +0 -0
  43. data/client-app/app/controllers/index.js +22 -6
  44. data/client-app/app/controllers/show.js +0 -0
  45. data/client-app/app/helpers/logster-url.js +12 -0
  46. data/client-app/app/helpers/or.js +7 -0
  47. data/client-app/app/index.html +30 -29
  48. data/client-app/app/initializers/app-init.js +67 -67
  49. data/client-app/app/lib/preload.js +20 -20
  50. data/client-app/app/lib/utilities.js +150 -149
  51. data/client-app/app/models/message-collection.js +0 -0
  52. data/client-app/app/models/message.js +100 -100
  53. data/client-app/app/models/pattern-item.js +25 -0
  54. data/client-app/app/resolver.js +0 -0
  55. data/client-app/app/router.js +1 -0
  56. data/client-app/app/routes/index.js +2 -9
  57. data/client-app/app/routes/settings.js +15 -0
  58. data/client-app/app/routes/show.js +0 -0
  59. data/client-app/app/styles/app.css +633 -527
  60. data/client-app/app/templates/application.hbs +2 -2
  61. data/client-app/app/templates/components/actions-menu.hbs +12 -12
  62. data/client-app/app/templates/components/env-tab.hbs +10 -10
  63. data/client-app/app/templates/components/message-info.hbs +41 -41
  64. data/client-app/app/templates/components/message-row.hbs +15 -15
  65. data/client-app/app/templates/components/panel-resizer.hbs +3 -3
  66. data/client-app/app/templates/components/patterns-list.hbs +25 -0
  67. data/client-app/app/templates/components/tabbed-section.hbs +10 -10
  68. data/client-app/app/templates/components/time-formatter.hbs +1 -1
  69. data/client-app/app/templates/index.hbs +65 -58
  70. data/client-app/app/templates/settings.hbs +26 -0
  71. data/client-app/app/templates/show.hbs +7 -7
  72. data/client-app/config/environment.js +51 -51
  73. data/client-app/config/optional-features.json +3 -3
  74. data/client-app/config/targets.js +18 -18
  75. data/client-app/ember-cli-build.js +29 -29
  76. data/client-app/package-lock.json +11357 -11365
  77. data/client-app/package.json +57 -56
  78. data/client-app/public/assets/images/icon_144x144.png +0 -0
  79. data/client-app/public/assets/images/icon_64x64.png +0 -0
  80. data/client-app/testem.js +25 -25
  81. data/client-app/tests/index.html +34 -34
  82. data/client-app/tests/integration/components/env-tab-test.js +134 -123
  83. data/client-app/tests/integration/components/message-info-test.js +111 -111
  84. data/client-app/tests/integration/components/patterns-list-test.js +56 -0
  85. data/client-app/tests/test-helper.js +8 -8
  86. data/client-app/tests/unit/controllers/index-test.js +12 -12
  87. data/client-app/tests/unit/controllers/show-test.js +12 -12
  88. data/client-app/tests/unit/initializers/app-init-test.js +31 -31
  89. data/client-app/tests/unit/routes/index-test.js +11 -11
  90. data/client-app/tests/unit/routes/show-test.js +11 -11
  91. data/lib/examples/sidekiq_logster_reporter.rb +21 -21
  92. data/lib/logster.rb +59 -54
  93. data/lib/logster/base_store.rb +169 -141
  94. data/lib/logster/cache.rb +20 -0
  95. data/lib/logster/configuration.rb +27 -26
  96. data/lib/logster/defer_logger.rb +14 -14
  97. data/lib/logster/ignore_pattern.rb +65 -65
  98. data/lib/logster/logger.rb +113 -113
  99. data/lib/logster/message.rb +212 -212
  100. data/lib/logster/middleware/debug_exceptions.rb +26 -26
  101. data/lib/logster/middleware/reporter.rb +55 -55
  102. data/lib/logster/middleware/viewer.rb +297 -222
  103. data/lib/logster/pattern.rb +95 -0
  104. data/lib/logster/rails/railtie.rb +63 -63
  105. data/lib/logster/redis_store.rb +584 -566
  106. data/lib/logster/scheduler.rb +54 -54
  107. data/lib/logster/suppression_pattern.rb +17 -0
  108. data/lib/logster/version.rb +3 -3
  109. data/lib/logster/web.rb +14 -14
  110. data/logster.gemspec +35 -35
  111. data/test/examples/test_sidekiq_reporter_example.rb +46 -46
  112. data/test/fake_data/Gemfile +4 -4
  113. data/test/fake_data/generate.rb +10 -10
  114. data/test/logster/middleware/test_reporter.rb +19 -19
  115. data/test/logster/middleware/test_viewer.rb +267 -96
  116. data/test/logster/test_base_store.rb +147 -147
  117. data/test/logster/test_cache.rb +38 -0
  118. data/test/logster/test_defer_logger.rb +34 -34
  119. data/test/logster/test_ignore_pattern.rb +41 -41
  120. data/test/logster/test_logger.rb +100 -86
  121. data/test/logster/test_message.rb +119 -119
  122. data/test/logster/test_pattern.rb +152 -0
  123. data/test/logster/test_redis_rate_limiter.rb +230 -230
  124. data/test/logster/test_redis_store.rb +689 -720
  125. data/test/test_helper.rb +38 -38
  126. data/vendor/assets/javascripts/logster.js.erb +39 -39
  127. metadata +24 -7
@@ -1,54 +1,54 @@
1
- module Logster
2
- module Deferer
3
- attr_reader :queue, :thread
4
- def initialize
5
- @queue = Queue.new
6
- @mutex = Mutex.new
7
- @thread = nil
8
- @enabled = true
9
- end
10
-
11
- def disable
12
- @enabled = false
13
- end
14
-
15
- def enable
16
- @enabled = true
17
- end
18
-
19
- def schedule(&blk)
20
- if @enabled
21
- start_thread if !@thread&.alive?
22
- @queue << blk
23
- else
24
- return if blk == :terminate
25
- blk.call
26
- end
27
- end
28
-
29
- private
30
-
31
- def start_thread
32
- @mutex.synchronize do
33
- if !@thread&.alive?
34
- @thread = Thread.new { do_work }
35
- end
36
- end
37
- end
38
-
39
- def do_work
40
- while true
41
- blk = @queue.pop
42
- # we need to be able to break the loop so that the new
43
- # thread "finishes" and let us test this code.
44
- break if blk == :terminate
45
- blk.call
46
- end
47
- end
48
- end
49
-
50
- class Scheduler
51
- extend Deferer
52
- initialize
53
- end
54
- end
1
+ module Logster
2
+ module Deferer
3
+ attr_reader :queue, :thread
4
+ def initialize
5
+ @queue = Queue.new
6
+ @mutex = Mutex.new
7
+ @thread = nil
8
+ @enabled = true
9
+ end
10
+
11
+ def disable
12
+ @enabled = false
13
+ end
14
+
15
+ def enable
16
+ @enabled = true
17
+ end
18
+
19
+ def schedule(&blk)
20
+ if @enabled
21
+ start_thread if !@thread&.alive?
22
+ @queue << blk
23
+ else
24
+ return if blk == :terminate
25
+ blk.call
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def start_thread
32
+ @mutex.synchronize do
33
+ if !@thread&.alive?
34
+ @thread = Thread.new { do_work }
35
+ end
36
+ end
37
+ end
38
+
39
+ def do_work
40
+ while true
41
+ blk = @queue.pop
42
+ # we need to be able to break the loop so that the new
43
+ # thread "finishes" and let us test this code.
44
+ break if blk == :terminate
45
+ blk.call
46
+ end
47
+ end
48
+ end
49
+
50
+ class Scheduler
51
+ extend Deferer
52
+ initialize
53
+ end
54
+ end
@@ -0,0 +1,17 @@
1
+ module Logster
2
+ class SuppressionPattern < Pattern
3
+ def self.set_name
4
+ "__LOGSTER__suppression_patterns_set".freeze
5
+ end
6
+
7
+ def save
8
+ super
9
+ @store.clear_suppression_patterns_cache
10
+ end
11
+
12
+ def destroy(clear_cache: true) # arg used in tests
13
+ super()
14
+ @store.clear_suppression_patterns_cache if clear_cache
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
- module Logster
2
- VERSION = "2.1.2"
3
- end
1
+ module Logster
2
+ VERSION = "2.2.0"
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,35 +1,35 @@
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
- spec.add_development_dependency "rubocop", "~> 0.61.1"
35
- 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"
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
+ spec.add_development_dependency "rubocop", "~> 0.61.1"
35
+ 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,19 +1,19 @@
1
- require_relative '../../test_helper'
2
- require 'rack'
3
- require 'logster/redis_store'
4
- require 'logster/middleware/reporter'
5
-
6
- class TestReporter < Minitest::Test
7
-
8
- def test_logs_errors
9
- Logster.store = Logster::TestStore.new
10
-
11
- reporter = Logster::Middleware::Reporter.new(nil)
12
- env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
13
- status, = reporter.call(env)
14
-
15
- assert_equal(200, status)
16
- assert_equal(1, Logster.store.count)
17
- end
18
-
19
- end
1
+ require_relative '../../test_helper'
2
+ require 'rack'
3
+ require 'logster/redis_store'
4
+ require 'logster/middleware/reporter'
5
+
6
+ class TestReporter < Minitest::Test
7
+
8
+ def test_logs_errors
9
+ Logster.store = Logster::TestStore.new
10
+
11
+ reporter = Logster::Middleware::Reporter.new(nil)
12
+ env = Rack::MockRequest.env_for("/logs/report_js_error?message=hello")
13
+ status, = reporter.call(env)
14
+
15
+ assert_equal(200, status)
16
+ assert_equal(1, Logster.store.count)
17
+ end
18
+
19
+ end
@@ -1,96 +1,267 @@
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
+ 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
+ Logster.store.clear_all
18
+ end
19
+
20
+ def teardown
21
+ Logster.config.subdirectory = nil
22
+ Logster.store.clear_all
23
+ Logster.store = nil
24
+ end
25
+
26
+ def viewer
27
+ @viewer ||= Logster::Middleware::Viewer.new(nil)
28
+ end
29
+
30
+ def request
31
+ @request ||= Rack::MockRequest.new(Rack::Lint.new(viewer))
32
+ end
33
+
34
+ def test_path_resolution
35
+ assert_nil(viewer.send(:resolve_path, "/logs"))
36
+ assert_nil(viewer.send(:resolve_path, "/admin/logsie"))
37
+ assert_nil(viewer.send(:resolve_path, "/admin/logsie/bla"))
38
+ assert_equal("/", viewer.send(:resolve_path, "/logsie"))
39
+ assert_equal("/", viewer.send(:resolve_path, "/logsie/"))
40
+ assert_equal("/hello/world", viewer.send(:resolve_path, "/logsie/hello/world"))
41
+ end
42
+
43
+ def test_search_raceguard_s
44
+ response = request.get('/logsie/messages.json?search=searchkey')
45
+ result = JSON.parse(response.body)
46
+ assert_equal('searchkey', result['search'])
47
+ end
48
+
49
+ def test_search_raceguard_sr
50
+ response = request.get('/logsie/messages.json?search=/regex/&regex_search=true')
51
+ result = JSON.parse(response.body)
52
+ assert_equal('/regex/', result['search'])
53
+ end
54
+
55
+ def test_search_raceguard_f
56
+ response = request.get("/logsie/messages.json?filter=0_1_2_3_4")
57
+ result = JSON.parse(response.body)
58
+ assert_equal([0, 1, 2, 3, 4], result['filter'])
59
+ end
60
+
61
+ def test_regex_parse
62
+ assert_equal(/hello/i, viewer.send(:parse_regex, '/hello/i'))
63
+ end
64
+
65
+ def test_settings_page_responds_with_json
66
+ Logster.store.ignore = [/somepattern/, /anotherpattern/]
67
+ record = Logster::SuppressionPattern.new("custompattern")
68
+ record.save
69
+
70
+ response = request.get("/logsie/settings.json")
71
+ assert_equal(200, response.status)
72
+ assert_includes(response.content_type, "application/json")
73
+ json = JSON.parse(response.body)
74
+ custom_patterns = json["custom_patterns"]
75
+ coded_patterns = json["coded_patterns"]
76
+ assert_includes(custom_patterns, "/custompattern/")
77
+ assert_includes(coded_patterns, "/somepattern/")
78
+ assert_includes(coded_patterns, "/anotherpattern/")
79
+
80
+ Logster.store.ignore = nil
81
+ record.destroy
82
+
83
+ response = request.get("/logsie/settings.json")
84
+ assert_equal(200, response.status)
85
+ json = JSON.parse(response.body)
86
+ assert_equal([], json["custom_patterns"])
87
+ assert_equal([], json["coded_patterns"])
88
+ end
89
+
90
+ def test_settings_page_responds_with_html
91
+ response = request.get("/logsie/settings")
92
+ assert_equal(200, response.status)
93
+ assert_includes(response.content_type, "text/html")
94
+ end
95
+
96
+ def test_patterns_endpoint_doesnt_accept_GETs
97
+ Logster.config.enable_custom_patterns_via_ui = true
98
+
99
+ response = request.get("/logsie/patterns/suppression.json",
100
+ params: { pattern: "patternfromuser" }
101
+ )
102
+ assert_equal(405, response.status)
103
+ assert_equal(0, Logster::SuppressionPattern.find_all.size)
104
+ ensure
105
+ Logster.config.enable_custom_patterns_via_ui = false
106
+ end
107
+
108
+ def test_patterns_endpoint_doesnt_work_when_its_disabled_from_config
109
+ Logster.config.enable_custom_patterns_via_ui = false
110
+
111
+ response = request.post("/logsie/patterns/suppression.json",
112
+ params: { pattern: "patternfromuser" }
113
+ )
114
+ assert_equal(403, response.status)
115
+ assert_equal(0, Logster::SuppressionPattern.find_all.size)
116
+ end
117
+
118
+ def test_patterns_endpoint_doesnt_work_with_undefined_set
119
+ Logster.config.enable_custom_patterns_via_ui = true
120
+
121
+ response = request.post("/logsie/patterns/weirdset.json",
122
+ params: { pattern: "disallowedpattern" }
123
+ )
124
+ assert_equal(404, response.status)
125
+ Logster::PATTERNS.each do |klass|
126
+ assert_equal(0, klass.find_all.size)
127
+ end
128
+ ensure
129
+ Logster.config.enable_custom_patterns_via_ui = false
130
+ end
131
+
132
+ def test_creating_patterns_works
133
+ Logster.config.enable_custom_patterns_via_ui = true
134
+
135
+ response = request.post("/logsie/patterns/suppression.json",
136
+ params: { pattern: "newpattern" }
137
+ )
138
+ assert_equal(200, response.status)
139
+ assert_equal(/newpattern/, Logster::SuppressionPattern.find_all.first)
140
+
141
+ json = JSON.parse(response.body)
142
+ assert_equal("/newpattern/", json["pattern"])
143
+ ensure
144
+ Logster.config.enable_custom_patterns_via_ui = false
145
+ end
146
+
147
+ def test_modifying_patterns_returns_404_for_non_existing_patterns
148
+ Logster.config.enable_custom_patterns_via_ui = true
149
+
150
+ response = request.put("/logsie/patterns/suppression.json",
151
+ params: { new_pattern: "doesntexists", pattern: "doesntexisttoo" }
152
+ )
153
+
154
+ assert_equal(404, response.status)
155
+ assert_equal(0, Logster::SuppressionPattern.find_all.size)
156
+ ensure
157
+ Logster.config.enable_custom_patterns_via_ui = false
158
+ end
159
+
160
+ def test_modifying_doesnt_accept_empty_regexp
161
+ Logster.config.enable_custom_patterns_via_ui = true
162
+ Logster::SuppressionPattern.new("goodcitizen").save
163
+
164
+ response = request.put("/logsie/patterns/suppression.json",
165
+ params: { new_pattern: "", pattern: "goodcitizen" }
166
+ )
167
+
168
+ assert_equal(400, response.status)
169
+ patterns = Logster::SuppressionPattern.find_all
170
+ assert_equal(1, patterns.size)
171
+ assert_equal(/goodcitizen/, patterns.first)
172
+ ensure
173
+ Logster.config.enable_custom_patterns_via_ui = false
174
+ end
175
+
176
+ def test_modifying_patterns_works
177
+ Logster.config.enable_custom_patterns_via_ui = true
178
+ Logster::SuppressionPattern.new("oldpattern").save
179
+ Logster::SuppressionPattern.new("notgoinganywhere").save
180
+
181
+ response = request.put("/logsie/patterns/suppression.json",
182
+ params: { pattern: "oldpattern", new_pattern: "brandnewpattern" }
183
+ )
184
+
185
+ assert_equal(200, response.status)
186
+ patterns = Logster::SuppressionPattern.find_all
187
+ assert_equal(2, patterns.size)
188
+ assert_includes(patterns, /brandnewpattern/)
189
+ assert_includes(patterns, /notgoinganywhere/)
190
+
191
+ json = JSON.parse(response.body)
192
+ assert_equal("/brandnewpattern/", json["pattern"])
193
+ ensure
194
+ Logster.config.enable_custom_patterns_via_ui = false
195
+ end
196
+
197
+ def test_removing_patterns_works
198
+ Logster.config.enable_custom_patterns_via_ui = true
199
+ Logster::SuppressionPattern.new("tobedeleted").save
200
+ Logster::SuppressionPattern.new("notgoinganywhere").save
201
+
202
+ response = request.delete("/logsie/patterns/suppression.json",
203
+ params: { pattern: "tobedeleted" }
204
+ )
205
+ assert_equal(200, response.status)
206
+
207
+ response = request.delete("/logsie/patterns/suppression.json",
208
+ params: { pattern: "doesntexistanymore" }
209
+ )
210
+ assert_equal(404, response.status)
211
+
212
+ patterns = Logster::SuppressionPattern.find_all
213
+ assert_equal(1, patterns.size)
214
+ assert_includes(patterns, /notgoinganywhere/)
215
+ ensure
216
+ Logster.config.enable_custom_patterns_via_ui = false
217
+ end
218
+
219
+ def test_clear_all_button_shouldnt_clear_custom_patterns
220
+ Logster::SuppressionPattern.new("testpattern").save
221
+
222
+ Logster.store.report(Logger::INFO, "test", "mysmalltest")
223
+ Logster.store.report(Logger::INFO, "test", "another test")
224
+
225
+ response = request.post("/logsie/clear")
226
+
227
+ assert_equal(200, response.status)
228
+ assert_equal(0, Logster.store.latest.size)
229
+ records = Logster::SuppressionPattern.find_all
230
+ assert_equal(1, records.size)
231
+ assert_equal(/testpattern/, records.first)
232
+ end
233
+
234
+ def test_linking_to_a_valid_js_files
235
+ %w(
236
+ /logsie/javascript/client-app.js
237
+ /logsie/javascript/vendor.js
238
+ ).each do |path|
239
+ response = request.get(path)
240
+ assert_equal(200, response.status)
241
+ assert_equal('application/javascript', response.headers['Content-Type'])
242
+ end
243
+ end
244
+
245
+ def test_linking_to_a_valid_css_files
246
+ %w(
247
+ /logsie/stylesheets/client-app.css
248
+ /logsie/stylesheets/vendor.css
249
+ ).each do |path|
250
+ response = request.get(path)
251
+ assert_equal(200, response.status)
252
+ assert_equal('text/css', response.headers['Content-Type'])
253
+ end
254
+ end
255
+
256
+ def test_linking_to_an_invalid_ember_component_or_template
257
+ %w(
258
+ /logsie/javascript/templates/application.hbs
259
+ /logsie/javascript/templates/does_not_exist.js
260
+ /logsie/javascript/components/does_not_exist.js
261
+ /logsie/javascript/templates/../../app.js
262
+ ).each do |path|
263
+ response = request.get(path)
264
+ assert_equal(404, response.status, "#{path} should have 404'ed")
265
+ end
266
+ end
267
+ end