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,86 +1,100 @@
1
- require_relative '../test_helper'
2
- require 'logster/logger'
3
- require 'logger'
4
-
5
- class TestStore
6
- attr_accessor :calls
7
-
8
- def report(*args)
9
- (@calls ||= []) << args
10
- end
11
- end
12
-
13
- class TestLogger < Minitest::Test
14
-
15
- def setup
16
- @store = TestStore.new
17
- @logger = Logster::Logger.new(@store)
18
- end
19
-
20
- def test_only_logs_valid_encoding
21
- @logger.add(4, "a \xE4 test", "prog")
22
- _, _, message = @store.calls[0]
23
- assert_equal true, message.valid_encoding?
24
- end
25
-
26
- def test_per_thread_override
27
- @logger.override_level = 2
28
-
29
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
30
- Thread.new do
31
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
32
- end.join
33
-
34
- @logger.override_level = nil
35
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
36
-
37
- assert_equal 2, @store.calls.length
38
- end
39
-
40
- def test_backtrace
41
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
42
- assert_equal "backtrace", @store.calls[0][3][:backtrace]
43
- end
44
-
45
- def test_chain
46
- io = StringIO.new
47
- @logger.chain Logger.new(io)
48
- @logger.warn "boom"
49
-
50
- assert_match(/W,.*boom/, io.string)
51
- end
52
-
53
- def test_backtrace_with_chain
54
- @other_store = TestStore.new
55
- @logger.chain(Logster::Logger.new(@other_store))
56
-
57
- @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
58
-
59
- [@store, @other_store].each do |store|
60
- assert_equal "backtrace", store.calls[0][3][:backtrace]
61
- end
62
- end
63
-
64
- def test_progname_parameter
65
- @logger.add(0, "test")
66
- progname = @store.calls[0][1]
67
- assert_nil progname
68
- end
69
-
70
- class PlayLogger
71
- attr_accessor :skip_store
72
- def initialize(tester)
73
- @tester = tester
74
- end
75
-
76
- def add(s, m, p, &block)
77
- @tester.assert(skip_store)
78
- end
79
- end
80
-
81
- def test_chain_with_ignore
82
- @logger.chain PlayLogger.new(self)
83
- @logger.skip_store = true
84
- @logger.warn("testing")
85
- end
86
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/logger'
3
+ require 'logger'
4
+
5
+ class TestStore
6
+ attr_accessor :calls
7
+
8
+ def report(*args)
9
+ (@calls ||= []) << args
10
+ end
11
+ end
12
+
13
+ class TestLogger < Minitest::Test
14
+
15
+ def setup
16
+ @store = TestStore.new
17
+ @logger = Logster::Logger.new(@store)
18
+ end
19
+
20
+ def test_only_logs_valid_encoding
21
+ @logger.add(4, "a \xE4 test", "prog")
22
+ _, _, message = @store.calls[0]
23
+ assert_equal true, message.valid_encoding?
24
+ end
25
+
26
+ def test_per_thread_override
27
+ @logger.override_level = 2
28
+
29
+ @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
30
+ Thread.new do
31
+ @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
32
+ end.join
33
+
34
+ @logger.override_level = nil
35
+ @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
36
+
37
+ assert_equal 2, @store.calls.length
38
+ end
39
+
40
+ def test_backtrace
41
+ @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
42
+ assert_equal "backtrace", @store.calls[0][3][:backtrace]
43
+ end
44
+
45
+ def test_chain
46
+ io = StringIO.new
47
+ @logger.chain Logger.new(io)
48
+ @logger.warn "boom"
49
+
50
+ assert_match(/W,.*boom/, io.string)
51
+ end
52
+
53
+ def test_backtrace_with_chain
54
+ @other_store = TestStore.new
55
+ @logger.chain(Logster::Logger.new(@other_store))
56
+
57
+ @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
58
+
59
+ [@store, @other_store].each do |store|
60
+ assert_equal "backtrace", store.calls[0][3][:backtrace]
61
+ end
62
+ end
63
+
64
+ class NewLogger < Logster::Logger; end
65
+
66
+ def test_inherited_logger_backtrace_with_chain
67
+ @other_store = TestStore.new
68
+ @logger = NewLogger.new(@store)
69
+ @logger.chain(Logster::Logger.new(@other_store))
70
+
71
+ @logger.add(0, "test", "prog", backtrace: "backtrace", env: { a: "x" })
72
+
73
+ [@store, @other_store].each do |store|
74
+ assert_equal "backtrace", store.calls[0][3][:backtrace]
75
+ end
76
+ end
77
+
78
+ def test_progname_parameter
79
+ @logger.add(0, "test")
80
+ progname = @store.calls[0][1]
81
+ assert_nil progname
82
+ end
83
+
84
+ class PlayLogger
85
+ attr_accessor :skip_store
86
+ def initialize(tester)
87
+ @tester = tester
88
+ end
89
+
90
+ def add(s, m, p, &block)
91
+ @tester.assert(skip_store)
92
+ end
93
+ end
94
+
95
+ def test_chain_with_ignore
96
+ @logger.chain PlayLogger.new(self)
97
+ @logger.skip_store = true
98
+ @logger.warn("testing")
99
+ end
100
+ end
@@ -1,119 +1,119 @@
1
- require_relative '../test_helper'
2
- require 'logster/message'
3
-
4
- class TestMessage < MiniTest::Test
5
-
6
- def test_merge_similar
7
- msg1 = Logster::Message.new(0, '', 'test', 10)
8
- msg1.populate_from_env(a: "1", b: "2")
9
-
10
- msg2 = Logster::Message.new(0, '', 'test', 20)
11
- msg2.populate_from_env(a: "2", c: "3")
12
-
13
- assert_equal(msg2.grouping_key, msg1.grouping_key)
14
-
15
- msg1.merge_similar_message(msg2)
16
-
17
- assert_equal(20, msg1.timestamp)
18
- assert_equal(10, msg1.first_timestamp)
19
-
20
- assert Array === msg1.env
21
- assert_equal(msg1.env.size, 2)
22
- assert({ a: "1", b: "2" } <= msg1.env[0])
23
- assert({ "a" => "2", "c" => "3" } <= msg1.env[1])
24
- end
25
-
26
- def test_merge_messages_both_with_array_envs
27
- msg1 = Logster::Message.new(0, '', 'test', 10)
28
- msg1.env = [{ a: "aa", b: "bb" }, { c: "cc", d: "dd" }]
29
-
30
- msg2 = Logster::Message.new(0, '', 'test', 20)
31
- msg2.env = [{ e: "ee", f: "ff" }, { g: "gg", h: "hh" }]
32
-
33
- msg1.merge_similar_message(msg2)
34
-
35
- # new env should be an array, but it should never have
36
- # another array of envs within itself (hence flatten(1))
37
- assert_equal(msg1.env.size, 4)
38
- assert_equal(msg1.env.map(&:keys).flatten(1).map(&:to_s), %w{a b c d e f g h})
39
- assert_equal(msg1.env.map(&:values).flatten(1).map(&:to_s), %w{aa bb cc dd ee ff gg hh})
40
- end
41
-
42
- def test_merge_messages_one_with_array_envs
43
- msg1 = Logster::Message.new(0, '', 'test', 10)
44
- msg1.env = [{ a: "aa", b: "bb" }, { c: "cc", d: "dd" }]
45
-
46
- msg2 = Logster::Message.new(0, '', 'test', 20)
47
- msg2.env = { e: "ee", f: "ff" }
48
-
49
- msg1.merge_similar_message(msg2)
50
-
51
- assert_equal(msg1.env.size, 3)
52
- assert_equal(msg1.env.map(&:keys).flatten(1).map(&:to_s), %w{a b c d e f})
53
- assert_equal(msg1.env.map(&:values).flatten(1).map(&:to_s), %w{aa bb cc dd ee ff})
54
- end
55
-
56
- def test_adds_application_version
57
- Logster.config.application_version = "abc"
58
- msg = Logster::Message.new(0, '', 'test', 10)
59
- msg.populate_from_env({})
60
-
61
- assert_equal("abc", msg.env["application_version"])
62
-
63
- ensure
64
- Logster.config.application_version = nil
65
- end
66
-
67
- def test_merging_sums_count_for_both_messages
68
- msg1 = Logster::Message.new(0, '', 'test', 10, count: 15)
69
- msg2 = Logster::Message.new(0, '', 'test', 20, count: 13)
70
- msg2.env = {}
71
-
72
- assert_equal(msg1.grouping_key, msg2.grouping_key)
73
-
74
- save_env = msg1.merge_similar_message(msg2)
75
- assert(save_env)
76
- assert_equal(msg1.count, 15 + 13)
77
- end
78
-
79
- def test_populate_from_env_works_on_array
80
- msg = Logster::Message.new(0, '', 'test', 10)
81
- hash = { "custom_key" => "key" }
82
- msg.populate_from_env([hash])
83
-
84
- assert Array === msg.env
85
- assert_equal(msg.env.size, 1)
86
- assert hash <= msg.env[0]
87
- end
88
-
89
- def test_ensure_env_samples_dont_exceed_50
90
- msg1 = Logster::Message.new(0, '', 'test', 10, count: 50)
91
- msg1.env = [{ a: 1 }]
92
- msg2 = Logster::Message.new(0, '', 'test', 20, count: 13)
93
- msg2.env = { b: 2 }
94
-
95
- assert_equal(msg1.grouping_key, msg2.grouping_key)
96
-
97
- save_env = msg1.merge_similar_message(msg2)
98
-
99
- refute(save_env)
100
- assert_equal(63, msg1.count) # update count
101
- assert_equal([{ a: 1 }], msg1.env) # but don't merge msg2's env into msg1's
102
- end
103
-
104
- def test_message_to_h_respects_params
105
- msg = Logster::Message.new(0, "", "test")
106
- test_hash = { test_key: "this is a test" }
107
- msg.env = test_hash
108
- assert_equal(test_hash, msg.to_h[:env])
109
- assert_nil(msg.to_h(exclude_env: true)[:env])
110
- end
111
-
112
- def test_message_to_json_respects_params
113
- msg = Logster::Message.new(0, "", "test")
114
- test_hash = { test_key: "this is a test" }
115
- msg.env = test_hash
116
- assert_includes(msg.to_json, test_hash.to_json)
117
- refute_includes(msg.to_json(exclude_env: true), test_hash.to_json)
118
- end
119
- end
1
+ require_relative '../test_helper'
2
+ require 'logster/message'
3
+
4
+ class TestMessage < MiniTest::Test
5
+
6
+ def test_merge_similar
7
+ msg1 = Logster::Message.new(0, '', 'test', 10)
8
+ msg1.populate_from_env(a: "1", b: "2")
9
+
10
+ msg2 = Logster::Message.new(0, '', 'test', 20)
11
+ msg2.populate_from_env(a: "2", c: "3")
12
+
13
+ assert_equal(msg2.grouping_key, msg1.grouping_key)
14
+
15
+ msg1.merge_similar_message(msg2)
16
+
17
+ assert_equal(20, msg1.timestamp)
18
+ assert_equal(10, msg1.first_timestamp)
19
+
20
+ assert Array === msg1.env
21
+ assert_equal(msg1.env.size, 2)
22
+ assert({ a: "1", b: "2" } <= msg1.env[0])
23
+ assert({ "a" => "2", "c" => "3" } <= msg1.env[1])
24
+ end
25
+
26
+ def test_merge_messages_both_with_array_envs
27
+ msg1 = Logster::Message.new(0, '', 'test', 10)
28
+ msg1.env = [{ a: "aa", b: "bb" }, { c: "cc", d: "dd" }]
29
+
30
+ msg2 = Logster::Message.new(0, '', 'test', 20)
31
+ msg2.env = [{ e: "ee", f: "ff" }, { g: "gg", h: "hh" }]
32
+
33
+ msg1.merge_similar_message(msg2)
34
+
35
+ # new env should be an array, but it should never have
36
+ # another array of envs within itself (hence flatten(1))
37
+ assert_equal(msg1.env.size, 4)
38
+ assert_equal(msg1.env.map(&:keys).flatten(1).map(&:to_s), %w{a b c d e f g h})
39
+ assert_equal(msg1.env.map(&:values).flatten(1).map(&:to_s), %w{aa bb cc dd ee ff gg hh})
40
+ end
41
+
42
+ def test_merge_messages_one_with_array_envs
43
+ msg1 = Logster::Message.new(0, '', 'test', 10)
44
+ msg1.env = [{ a: "aa", b: "bb" }, { c: "cc", d: "dd" }]
45
+
46
+ msg2 = Logster::Message.new(0, '', 'test', 20)
47
+ msg2.env = { e: "ee", f: "ff" }
48
+
49
+ msg1.merge_similar_message(msg2)
50
+
51
+ assert_equal(msg1.env.size, 3)
52
+ assert_equal(msg1.env.map(&:keys).flatten(1).map(&:to_s), %w{a b c d e f})
53
+ assert_equal(msg1.env.map(&:values).flatten(1).map(&:to_s), %w{aa bb cc dd ee ff})
54
+ end
55
+
56
+ def test_adds_application_version
57
+ Logster.config.application_version = "abc"
58
+ msg = Logster::Message.new(0, '', 'test', 10)
59
+ msg.populate_from_env({})
60
+
61
+ assert_equal("abc", msg.env["application_version"])
62
+
63
+ ensure
64
+ Logster.config.application_version = nil
65
+ end
66
+
67
+ def test_merging_sums_count_for_both_messages
68
+ msg1 = Logster::Message.new(0, '', 'test', 10, count: 15)
69
+ msg2 = Logster::Message.new(0, '', 'test', 20, count: 13)
70
+ msg2.env = {}
71
+
72
+ assert_equal(msg1.grouping_key, msg2.grouping_key)
73
+
74
+ save_env = msg1.merge_similar_message(msg2)
75
+ assert(save_env)
76
+ assert_equal(msg1.count, 15 + 13)
77
+ end
78
+
79
+ def test_populate_from_env_works_on_array
80
+ msg = Logster::Message.new(0, '', 'test', 10)
81
+ hash = { "custom_key" => "key" }
82
+ msg.populate_from_env([hash])
83
+
84
+ assert Array === msg.env
85
+ assert_equal(msg.env.size, 1)
86
+ assert hash <= msg.env[0]
87
+ end
88
+
89
+ def test_ensure_env_samples_dont_exceed_50
90
+ msg1 = Logster::Message.new(0, '', 'test', 10, count: 50)
91
+ msg1.env = [{ a: 1 }]
92
+ msg2 = Logster::Message.new(0, '', 'test', 20, count: 13)
93
+ msg2.env = { b: 2 }
94
+
95
+ assert_equal(msg1.grouping_key, msg2.grouping_key)
96
+
97
+ save_env = msg1.merge_similar_message(msg2)
98
+
99
+ refute(save_env)
100
+ assert_equal(63, msg1.count) # update count
101
+ assert_equal([{ a: 1 }], msg1.env) # but don't merge msg2's env into msg1's
102
+ end
103
+
104
+ def test_message_to_h_respects_params
105
+ msg = Logster::Message.new(0, "", "test")
106
+ test_hash = { test_key: "this is a test" }
107
+ msg.env = test_hash
108
+ assert_equal(test_hash, msg.to_h[:env])
109
+ assert_nil(msg.to_h(exclude_env: true)[:env])
110
+ end
111
+
112
+ def test_message_to_json_respects_params
113
+ msg = Logster::Message.new(0, "", "test")
114
+ test_hash = { test_key: "this is a test" }
115
+ msg.env = test_hash
116
+ assert_includes(msg.to_json, test_hash.to_json)
117
+ refute_includes(msg.to_json(exclude_env: true), test_hash.to_json)
118
+ end
119
+ end
@@ -0,0 +1,152 @@
1
+ require_relative '../test_helper'
2
+ require 'logster/redis_store'
3
+ require 'logster/pattern'
4
+
5
+ class TestPattern < Minitest::Test
6
+ class FakePattern < Logster::Pattern
7
+ def self.set_name
8
+ "__LOGSTER__fake_patterns_set".freeze
9
+ end
10
+ end
11
+
12
+ Logster::PATTERNS << FakePattern
13
+
14
+ class TestRedisStore < Logster::BaseStore
15
+ def get_patterns(set_name)
16
+ ["/differentstore/"]
17
+ end
18
+ end
19
+
20
+ def setup
21
+ Logster.store = Logster::RedisStore.new
22
+ Logster.store.clear_all
23
+ end
24
+
25
+ def teardown
26
+ Logster.store.clear_all
27
+ Logster.store = nil
28
+ end
29
+
30
+ def test_parse_pattern_works_correctly
31
+ assert_equal(/osama/i, klass.parse_pattern(/osama/i))
32
+ assert_equal(/osama/i, klass.parse_pattern("/osama/i"))
33
+ assert_equal(/osama/, klass.parse_pattern("/osama/"))
34
+ assert_equal(/osama/, klass.parse_pattern("osama"))
35
+ assert_equal(/[a-zA-Z]/, klass.parse_pattern("[a-zA-Z]"))
36
+ assert_equal(/[a-zA-Z]/, klass.parse_pattern("/[a-zA-Z]/"))
37
+
38
+ assert_nil(klass.parse_pattern("/osama"))
39
+ assert_nil(klass.parse_pattern("["))
40
+ assert_nil(klass.parse_pattern("/[/"))
41
+ end
42
+
43
+ def test_validity_checks_are_correct
44
+ assert(klass.valid?(/osama/))
45
+ refute(klass.valid?(//))
46
+ refute(klass.valid?(//i))
47
+ refute(klass.valid?(/ /))
48
+ end
49
+
50
+ def test_find_all_works_correctly
51
+ patterns = ["/test/i", "tttt", "[d-y].*"]
52
+ patterns.each { |p| FakePattern.new(p).save }
53
+
54
+ results = FakePattern.find_all
55
+ assert_equal(3, results.size)
56
+ assert_includes(results, /test/i)
57
+ assert_includes(results, /tttt/)
58
+ assert_includes(results, /[d-y].*/)
59
+
60
+ results = FakePattern.find_all(raw: true)
61
+ assert_equal(3, results.size)
62
+ assert_includes(results, "/test/i")
63
+ assert_includes(results, "/tttt/")
64
+ assert_includes(results, "/[d-y].*/")
65
+ end
66
+
67
+ def test_find_all_can_take_an_instance_of_store
68
+ results = FakePattern.find_all(store: TestRedisStore.new)
69
+ assert_equal(1, results.size)
70
+ assert_equal(/differentstore/, results.first)
71
+ end
72
+
73
+ def test_find_works_correctly
74
+ FakePattern.new("/wwwlll/").save
75
+
76
+ record = FakePattern.find("wwwlll")
77
+ assert_equal(/wwwlll/, record.pattern)
78
+ record = FakePattern.find(/wwwlll/)
79
+ assert_equal(/wwwlll/, record.pattern)
80
+
81
+ assert_nil(FakePattern.find("dfsdfsdf"))
82
+ assert_nil(FakePattern.find(nil))
83
+ end
84
+
85
+ def test_patterns_get_parsed_on_initialize
86
+ assert_equal(/mypattern/, FakePattern.new("mypattern").pattern)
87
+ assert_equal(/111333/, FakePattern.new(/111333/).pattern)
88
+ end
89
+
90
+ def test_save_works_correctly
91
+ bad_patterns = ["/bruken", nil, "[a-z", "/(osa|sss{1/"]
92
+ bad_patterns.each do |p|
93
+ assert_raises(Logster::Pattern::PatternError) do
94
+ FakePattern.new(p).save
95
+ end
96
+ end
97
+ assert_equal(0, FakePattern.find_all.size)
98
+
99
+ good_patterns = ["/logster/i", /logster/, "sssd", "(ccx|tqe){1,5}", "logster"]
100
+ good_patterns.each do |p|
101
+ FakePattern.new(p).save
102
+ end
103
+ results = FakePattern.find_all
104
+ assert_equal(4, results.size) # 4 because /logster/ and logster are the same
105
+ good_patterns_regex = [/logster/i, /logster/, /sssd/, /(ccx|tqe){1,5}/]
106
+ results.each do |p|
107
+ assert_includes(good_patterns_regex, p)
108
+ end
109
+ end
110
+
111
+ def test_modify_works_correctly
112
+ record = FakePattern.new(/logster/)
113
+ record.save
114
+
115
+ record.modify("/LoGsTEr/")
116
+ all_patterns = FakePattern.find_all
117
+ assert_equal(1, all_patterns.size)
118
+ assert_equal(/LoGsTEr/, all_patterns.first)
119
+ assert_equal(/LoGsTEr/, record.pattern)
120
+ end
121
+
122
+ def test_modify_doesnt_remove_old_pattern_when_new_is_bad
123
+ record = FakePattern.new(/LoGsTEr/)
124
+ record.save
125
+
126
+ assert_raises(Logster::Pattern::PatternError) do
127
+ record.modify("/badReg")
128
+ end
129
+ all_patterns = FakePattern.find_all
130
+ assert_equal(1, all_patterns.size)
131
+ assert_equal(/LoGsTEr/, all_patterns.first)
132
+ assert_equal(/LoGsTEr/, record.pattern)
133
+ end
134
+
135
+ def test_destroy_works_correctly
136
+ record = FakePattern.new(/somepattern/)
137
+ record.save
138
+
139
+ patterns = FakePattern.find_all
140
+ assert_equal(1, patterns.size)
141
+ assert_equal(/somepattern/, patterns.first)
142
+
143
+ record.destroy
144
+ assert_equal(0, FakePattern.find_all.size)
145
+ end
146
+
147
+ private
148
+
149
+ def klass
150
+ Logster::Pattern
151
+ end
152
+ end