logster 2.1.2 → 2.2.0

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