rearview 1.1.2-jruby → 1.2.0-jruby

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 (106) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +11 -3
  3. data/app/controllers/rearview/application_controller.rb +11 -0
  4. data/app/controllers/rearview/dashboard_children_controller.rb +1 -1
  5. data/app/controllers/rearview/dashboards_controller.rb +1 -1
  6. data/app/controllers/rearview/home_controller.rb +1 -1
  7. data/app/controllers/rearview/jobs_controller.rb +33 -29
  8. data/app/controllers/rearview/monitor_controller.rb +16 -2
  9. data/app/controllers/rearview/user_controller.rb +2 -2
  10. data/app/helpers/rearview/application_helper.rb +3 -3
  11. data/app/mailers/rearview/alert_mailer.rb +0 -2
  12. data/app/mailers/rearview/metrics_validation_mailer.rb +12 -0
  13. data/app/models/rearview/job.rb +17 -13
  14. data/app/views/rearview/home/show.html.erb +2 -0
  15. data/app/views/rearview/jobs/_job.json.jbuilder +1 -0
  16. data/app/views/rearview/metrics_validation_mailer/validation_failed_email.text.erb +13 -0
  17. data/app/views/rearview/monitor/create.json.jbuilder +1 -0
  18. data/db/migrate/20131106162900_base_schema.rb +2 -2
  19. data/lib/generators/templates/rearview.rb +24 -7
  20. data/lib/graphite.rb +13 -0
  21. data/lib/graphite/cacerts.pem +2184 -0
  22. data/lib/graphite/client.rb +44 -0
  23. data/lib/graphite/graph.rb +35 -0
  24. data/lib/{rearview/graphite_parser.rb → graphite/raw_parser.rb} +2 -3
  25. data/lib/graphite/target.rb +9 -0
  26. data/lib/graphite/target_grammer.rb +114 -0
  27. data/lib/graphite/target_grammer.treetop +53 -0
  28. data/lib/graphite/target_parser.rb +50 -0
  29. data/lib/graphite/treetop_ext.rb +14 -0
  30. data/lib/rearview.rb +11 -3
  31. data/lib/rearview/alerts_handler.rb +2 -6
  32. data/lib/rearview/configuration.rb +44 -19
  33. data/lib/rearview/cron_expression_validator.rb +11 -0
  34. data/lib/rearview/metrics_validator.rb +52 -0
  35. data/lib/rearview/metrics_validator_service.rb +24 -0
  36. data/lib/rearview/metrics_validator_task.rb +56 -0
  37. data/lib/rearview/monitor_runner.rb +9 -7
  38. data/lib/rearview/monitor_service.rb +2 -0
  39. data/lib/rearview/stats_service.rb +4 -2
  40. data/lib/rearview/version.rb +1 -1
  41. data/lib/tasks/rearview_tasks.rake +7 -1
  42. data/public/{help → rearview-src/help}/alert.html +0 -0
  43. data/public/{help → rearview-src/help}/quick.html +0 -0
  44. data/public/rearview-src/js/app.js +9 -0
  45. data/public/rearview-src/js/model/user.js +6 -2
  46. data/public/rearview-src/js/view/addmonitor.js +13 -8
  47. data/public/rearview-src/js/view/alert.js +11 -4
  48. data/public/rearview-src/js/view/dashboard.js +4 -2
  49. data/public/rearview-src/js/view/expandedmonitor.js +22 -9
  50. data/public/rearview-src/js/view/settings.js +84 -0
  51. data/public/rearview-src/less/login.less +4 -4
  52. data/public/rearview-src/less/rearview.less +17 -10
  53. data/public/{monitors → rearview-src/monitors}/index.json +1 -1
  54. data/public/{monitors → rearview-src/monitors}/outage.rb +0 -0
  55. data/public/rearview-src/templates/alert.hbs +10 -2
  56. data/public/rearview-src/templates/primarynav.hbs +6 -6
  57. data/public/rearview-src/templates/schedulemonitor.hbs +2 -1
  58. data/public/rearview-src/templates/settings.hbs +23 -0
  59. data/public/rearview/build.txt +1 -0
  60. data/public/rearview/help/alert.html +20 -0
  61. data/public/rearview/help/quick.html +34 -0
  62. data/public/rearview/js/app.js +1 -1
  63. data/public/rearview/js/main.js +21 -21
  64. data/public/rearview/js/model/user.js +1 -1
  65. data/public/rearview/js/view/addmonitor.js +1 -1
  66. data/public/rearview/js/view/alert.js +1 -1
  67. data/public/rearview/js/view/dashboard.js +1 -1
  68. data/public/rearview/js/view/expandedmonitor.js +1 -1
  69. data/public/rearview/js/view/settings.js +1 -0
  70. data/public/rearview/less/login.less +4 -4
  71. data/public/rearview/less/rearview.less +17 -10
  72. data/public/rearview/monitors/index.json +3 -0
  73. data/public/rearview/monitors/outage.rb +2 -0
  74. data/public/rearview/templates/alert.hbs +10 -2
  75. data/public/rearview/templates/primarynav.hbs +6 -6
  76. data/public/rearview/templates/schedulemonitor.hbs +2 -1
  77. data/public/rearview/templates/settings.hbs +23 -0
  78. data/spec/controllers/jobs_controller_spec.rb +1 -0
  79. data/spec/controllers/monitor_controller_spec.rb +3 -0
  80. data/spec/controllers/user_controller_spec.rb +5 -2
  81. data/spec/data/metrics.yml +598 -0
  82. data/spec/dummy/log/development.log +1044 -0
  83. data/spec/dummy/log/test.log +171716 -0
  84. data/spec/helpers/application_helper_spec.rb +33 -0
  85. data/spec/lib/graphite/client_spec.rb +126 -0
  86. data/spec/lib/graphite/graph_spec.rb +17 -0
  87. data/spec/lib/graphite/graphite_spec.rb +4 -0
  88. data/spec/lib/{rearview/graphite_parser_spec.rb → graphite/raw_parser.rb} +6 -5
  89. data/spec/lib/graphite/target_grammer_spec.rb +106 -0
  90. data/spec/lib/graphite/target_parser_spec.rb +124 -0
  91. data/spec/lib/graphite/target_spec.rb +5 -0
  92. data/spec/lib/rearview/configuration_spec.rb +69 -48
  93. data/spec/lib/rearview/metrics_validator_service_spec.rb +43 -0
  94. data/spec/lib/rearview/metrics_validator_spec.rb +84 -0
  95. data/spec/lib/rearview/metrics_validator_task_spec.rb +62 -0
  96. data/spec/lib/rearview/monitor_runner_spec.rb +3 -3
  97. data/spec/lib/rearview/stats_task_spec.rb +21 -0
  98. data/spec/mailers/metrics_validation_mailer_spec.rb +46 -0
  99. data/spec/models/job_spec.rb +82 -9
  100. data/spec/spec_helper.rb +15 -4
  101. data/spec/support/json_factory.rb +1 -1
  102. data/spec/views/dashboards/show.json.jbuilder_spec.rb +3 -1
  103. data/spec/views/jobs/show.json.jbuilder_spec.rb +2 -1
  104. metadata +98 -11
  105. data/public/rearview-src/templates/test.txt +0 -1
  106. data/public/rearview/templates/test.txt +0 -1
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Rearview::ApplicationHelper do
4
+ context '#rearview_static_path' do
5
+ context 'development' do
6
+ it 'returns the non-compiled path' do
7
+ Rails.env.stubs(:development?).returns(true)
8
+ expect(helper.rearview_static_path).to eq('/rearview-src')
9
+ end
10
+ end
11
+ context 'non-development' do
12
+ it 'returns the compiled path' do
13
+ Rails.env.stubs(:development?).returns(false)
14
+ expect(helper.rearview_static_path).to eq('/rearview')
15
+ end
16
+ end
17
+ context 'segment' do
18
+ it 'prepends if present' do
19
+ expect(helper.rearview_static_path('/foo')).to eq('/rearview/foo')
20
+ end
21
+ end
22
+ end
23
+ context '#rearview_link_tag' do
24
+ it 'creates a link tag prepended with rearview_static_path' do
25
+ expect(helper.rearview_link_tag('/foo/bar.css')).to eq(%q{<link href="/rearview/foo/bar.css" />})
26
+ end
27
+ end
28
+ context '#rearview_img_tag' do
29
+ it 'creates a img tag prepended with rearview_static_path and img' do
30
+ expect(helper.rearview_img_tag('/foo/bar.gif')).to eq(%q{<img src="/rearview/img/foo/bar.gif" />})
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,126 @@
1
+ require 'spec_helper'
2
+
3
+ describe Graphite::Client do
4
+ context '.initialize' do
5
+ let(:default_client) { Graphite::Client.new }
6
+ context 'ca_file' do
7
+ it 'uses the cacerts in graphite lib by default' do
8
+ cacerts = File.expand_path("../../../../lib/graphite/cacerts.pem",__FILE__)
9
+ expect(default_client.connection.ssl.ca_file).to eq(cacerts)
10
+ end
11
+ it 'can be specified' do
12
+ expect(Graphite::Client.new({ssl: {ca_file: "cacerts.pem" }}).connection.ssl.ca_file).to eq("cacerts.pem")
13
+ end
14
+ end
15
+ context 'ssl_verify' do
16
+ it 'is true by default' do
17
+ expect(default_client.connection.ssl.verify).to be_true
18
+ end
19
+ it 'can be specified' do
20
+ expect(Graphite::Client.new({ssl: {verify: false}}).connection.ssl.verify).to be_false
21
+ end
22
+ end
23
+ context 'basic_auth' do
24
+ it 'is not enabled by default' do
25
+ expect(default_client.connection.headers['Authorization']).to be_nil
26
+ end
27
+ it 'can be specified' do
28
+ expect(Graphite::Client.new({basic_auth: {user: "foo", password: "bar"}}).connection.headers['Authorization']).not_to be_nil
29
+ end
30
+ end
31
+ end
32
+ context '#find_metric' do
33
+ before do
34
+ @client = Graphite::Client.new(url: 'http://graphite1.graphitehosting.com')
35
+ @connection = mock
36
+ @client.stubs(:connection).returns(@connection)
37
+ end
38
+ it 'makes the correct graphite API query' do
39
+ @connection.expects(:get).with('/metrics/find',{ query: 'stats.my_count' })
40
+ @client.find_metric('stats.my_count')
41
+ end
42
+ end
43
+ context '#render' do
44
+ before do
45
+ @client = Graphite::Client.new(url: 'http://graphite1.graphitehosting.com')
46
+ @connection = mock
47
+ @client.stubs(:connection).returns(@connection)
48
+ end
49
+ it 'makes the correct graphite API query' do
50
+ @connection.expects(:get).with('/render',{ foo: 'bar' })
51
+ @client.render({ foo: 'bar' })
52
+ end
53
+ end
54
+ context '#metric_exists?' do
55
+ before do
56
+ @client = Graphite::Client.new(url: 'http://graphite1.graphitehosting.com')
57
+ @request_stubs = Faraday::Adapter::Test::Stubs.new
58
+ @connection_stub = Faraday.new do |builder|
59
+ builder.adapter :test, @request_stubs
60
+ end
61
+ @client.stubs(:connection).returns(@connection_stub)
62
+ end
63
+ context 'true' do
64
+ it 'when response is 200, content-type is application/json, and json is a non-empty array' do
65
+ @request_stubs.get('/metrics/find?query=stats.my_count') {[ 200, { 'content-type' => 'application/json' }, '[ {"leaf": 1, "context": {}, "text": "my_count", "expandable": 0, "id": "stats.my_count", "allowChildren": 0} ]' ]}
66
+ expect(@client.metric_exists?('stats.my_count')).to be_true
67
+ end
68
+ end
69
+ context 'false' do
70
+ it 'when response is not 200' do
71
+ @request_stubs.get('/metrics/find?query=stats.my_count') {[ 406, { 'content-type' => 'application/json' }, '[ {"leaf": 1, "context": {}, "text": "my_count", "expandable": 0, "id": "stats.my_count", "allowChildren": 0} ]' ]}
72
+ expect(@client.metric_exists?('stats.my_count')).to be_false
73
+ end
74
+ it 'when content-type is not application/json' do
75
+ @request_stubs.get('/metrics/find?query=stats.my_count') {[ 200, { 'content-type' => 'image/png' }, '[ {"leaf": 1, "context": {}, "text": "my_count", "expandable": 0, "id": "stats.my_count", "allowChildren": 0} ]' ]}
76
+ expect(@client.metric_exists?('stats.my_count')).to be_false
77
+ end
78
+ it 'when json is an empty array' do
79
+ @request_stubs.get('/metrics/find?query=stats.my_count') {[ 200, { 'content-type' => 'application/json' }, '[ ]' ]}
80
+ expect(@client.metric_exists?('stats.my_count')).to be_false
81
+ end
82
+ end
83
+ end
84
+ context '#reachable?' do
85
+ before do
86
+ @client = Graphite::Client.new(url: 'http://graphite1.graphitehosting.com')
87
+ @request_stubs = Faraday::Adapter::Test::Stubs.new
88
+ @connection_stub = Faraday.new do |builder|
89
+ builder.adapter :test, @request_stubs
90
+ end
91
+ @client.stubs(:connection).returns(@connection_stub)
92
+ end
93
+ it 'is true when response is 200, content is image/png, and content-length > 0' do
94
+ @request_stubs.get('/render') {[ 200, { 'content-type' => 'image/png', 'content-length' => '123' }, '' ]}
95
+ expect(@client.reachable?).to be_true
96
+ end
97
+ it 'is false when response is not 200' do
98
+ @request_stubs.get('/render') {[ 500, { }, '' ]}
99
+ expect(@client.reachable?).to be_false
100
+ end
101
+ it 'is false when content-type is not image/png' do
102
+ @request_stubs.get('/render') {[ 200, { 'content-type' => 'text/html', 'content-length' => '123' }, '' ]}
103
+ expect(@client.reachable?).to be_false
104
+ end
105
+ it 'is false when content-length is 0' do
106
+ @request_stubs.get('/render') {[ 200, { 'content-type' => 'image/png', 'content-length' => '0' }, '' ]}
107
+ expect(@client.reachable?).to be_false
108
+ end
109
+ end
110
+ context 'forwardable' do
111
+ before do
112
+ @connection_stub = mock
113
+ Faraday.stubs(:new).returns(@connection_stub)
114
+ @client = Graphite::Client.new(url: 'http://graphite1.graphitehosting.com')
115
+ end
116
+ it 'to connection.get' do
117
+ @connection_stub.expects(:get).with('/render')
118
+ @client.get('/render')
119
+ end
120
+ it 'to connection.post' do
121
+ @connection_stub.expects(:post).with('/render')
122
+ @client.post('/render')
123
+ end
124
+ end
125
+ end
126
+
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Graphite::Graph do
4
+
5
+ context '.with_url' do
6
+ it 'should create a graph from the url' do
7
+ url = '/render?width=600&from=-1days&until=now&height=400&target=alias(summarize(stats_counts.deals.payment.sale.sent%2C%221min%22)%2C%22Sent%22)&target=alias(summarize(stats_counts.deals.payment.sale.notification_received%2C%221min%22)%2C%22Received%22)&target=alias(diffSeries(summarize(stats_counts.deals.payment.sale.notification_received%2C%221min%22)%2Csummarize(stats_counts.deals.payment.sale.sent%2C%221min%22))%2C%22Difference%22)&title=Payment_Sale_Per_Minute&yMin=&yMax=&_uniq=0.8545389957472919'
8
+ graph = Graphite::Graph.from_url(url)
9
+ expect(graph.targets.size).to eq(3)
10
+ expect(graph.from).to eq('-1days')
11
+ expect(graph.until).to eq('now')
12
+ expect(graph.title).to eq('Payment_Sale_Per_Minute')
13
+ end
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,4 @@
1
+ require 'spec_helper'
2
+
3
+ describe Graphite do
4
+ end
@@ -1,24 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Rearview::GraphiteParser do
3
+ describe Graphite::RawParser do
4
4
 
5
5
  artifact = open("spec/data/test.dat").read
6
6
  nanPayload = open("spec/data/nan.dat").read
7
7
 
8
- describe 'GraphiteParser' do
8
+ describe '.parse' do
9
9
  it "handles graphite data" do
10
- data = Rearview::GraphiteParser.parse(artifact)
10
+ data = Graphite::RawParser.parse(artifact)
11
11
  data.length.should == 3
12
12
  end
13
13
 
14
14
  it "handles NaN in graphite data" do
15
- data = Rearview::GraphiteParser.parse(nanPayload)
15
+ data = Graphite::RawParser.parse(nanPayload)
16
16
  data.length.should === 3
17
17
  end
18
18
 
19
19
  it "handles no data" do
20
- data = Rearview::GraphiteParser.parse("")
20
+ data = Graphite::RawParser.parse("")
21
21
  data.length.should === 0
22
22
  end
23
23
  end
24
+
24
25
  end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+
3
+ describe Graphite::TargetGrammer do
4
+
5
+ example_targets = {
6
+ simple_method: %q[alias(stats.x.y,"processed")],
7
+ nested_method: %q[color(alias(stats.x.y,"processed"),"red")],
8
+ color_only: %q[color(stats.x.y,"blue")],
9
+ very_nested: %q[alias(color(summarize(sumSeries(stats.*.y),"1min"),"orange"),"processed")]
10
+ }
11
+
12
+ describe Graphite::TargetGrammer::Target do
13
+ context '#expressions' do
14
+ it 'should contain all the expressions' do
15
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
16
+ expect(p.tree.expressions.count).to eq(2)
17
+ end
18
+ it 'should be empty if there are no expressions' do
19
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
20
+ expect(p.tree.expressions).to eq([])
21
+ end
22
+ end
23
+ context '#color' do
24
+ it 'should return the color when its present' do
25
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
26
+ expect(p.tree.color).to eq("red")
27
+ end
28
+ it 'should return nil if there is no color' do
29
+ p = Graphite::TargetParser.parse(example_targets[:simple_method])
30
+ expect(p.tree.color).to be_nil
31
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
32
+ expect(p.tree.color).to be_nil
33
+ end
34
+ end
35
+ context '#alias' do
36
+ it 'should return the alias when its present' do
37
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
38
+ expect(p.tree.alias).to eq("processed")
39
+ end
40
+ it 'should return nil if there is no alias' do
41
+ p = Graphite::TargetParser.parse(example_targets[:color_only])
42
+ expect(p.tree.alias).to be_nil
43
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
44
+ expect(p.tree.alias).to be_nil
45
+ end
46
+ end
47
+ context '#metric' do
48
+ it 'should return the metric for nested expressions' do
49
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
50
+ expect(p.tree.metric).to eq("stats.x.y")
51
+ end
52
+ it 'should return the metric for a path only target' do
53
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
54
+ expect(p.tree.metric).to eq("seg1_seg2.seg3")
55
+ end
56
+ it 'should return the metric for very nested expressions' do
57
+ p = Graphite::TargetParser.parse(example_targets[:very_nested])
58
+ expect(p.tree.metric).to eq("stats.*.y")
59
+ end
60
+ end
61
+ context '#functions' do
62
+ it 'should return all functions when present' do
63
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
64
+ expect(p.tree.functions).to include("color")
65
+ expect(p.tree.functions).to include("alias")
66
+ end
67
+ it 'should be empty if there are no functions' do
68
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
69
+ expect(p.tree.functions).to eq([])
70
+ end
71
+ end
72
+ context '#path?' do
73
+ it 'should be true if the target is a path' do
74
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
75
+ expect(p.tree.path?).to be_true
76
+ end
77
+ it 'should be false if the target is not a path' do
78
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
79
+ expect(p.tree.path?).to be_false
80
+ end
81
+ end
82
+ context '#expression?' do
83
+ it 'should be true if the target is an expression' do
84
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
85
+ expect(p.tree.expression?).to be_true
86
+ end
87
+ it 'should be false if the target is not an expression' do
88
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
89
+ expect(p.tree.expression?).to be_false
90
+ end
91
+ end
92
+ context '#to_model' do
93
+ it 'should create a model from a target' do
94
+ p = Graphite::TargetParser.parse(example_targets[:nested_method])
95
+ model = p.tree.to_model
96
+ expect(model.color).to eq("red")
97
+ expect(model.alias).to eq("processed")
98
+ expect(model.metric).to eq("stats.x.y")
99
+ expect(model.functions).to include("color")
100
+ expect(model.functions).to include("alias")
101
+ end
102
+ end
103
+ end
104
+
105
+ end
106
+
@@ -0,0 +1,124 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec::Matchers.define :be_parsed do |expected|
4
+
5
+ match do |actual|
6
+ !actual.error?
7
+ end
8
+
9
+ failure_message_for_should do |actual|
10
+ "expected that #{actual.data} would be parseable (#{actual.error})"
11
+ end
12
+
13
+ failure_message_for_should_not do |actual|
14
+ "expected that #{actual.data} would not be parseable"
15
+ end
16
+
17
+ description do
18
+ "be parseable"
19
+ end
20
+
21
+ end
22
+
23
+ describe Graphite::TargetParser do
24
+
25
+ context '.error?' do
26
+ let(:invalid_target) { %q[alias@(stats.x.y,"processed")] }
27
+ let(:valid_target) { %q[alias(stats.x.y,"processed")] }
28
+ it 'should be true if there is an error' do
29
+ p = Graphite::TargetParser.parse(invalid_target)
30
+ expect(p.error?).to be_true
31
+ end
32
+ it 'should be false if there is no error' do
33
+ p = Graphite::TargetParser.parse(valid_target)
34
+ expect(p.error?).to be_false
35
+ end
36
+ end
37
+
38
+ context '.error' do
39
+ let(:invalid_target) { %q[alias@(stats.x.y,"processed")] }
40
+ it 'should return the parsing failure message, line, and column' do
41
+ p = Graphite::TargetParser.parse(invalid_target)
42
+ expect(p.error[:message].present?).to be_true
43
+ expect(p.error[:line].present?).to be_true
44
+ expect(p.error[:column].present?).to be_true
45
+ end
46
+ end
47
+
48
+ context '.grammer' do
49
+ it 'should return a valid grammer file' do
50
+ grammer = Graphite::TargetParser.grammer
51
+ expect(grammer).not_to be_nil
52
+ expect(File.exists?(grammer)).to be_true
53
+ end
54
+ end
55
+
56
+ context '.parse!' do
57
+ let(:invalid_target) { %q[alias@(stats.x.y,"processed")] }
58
+ it 'should raise a typed exception when the text is unparseable' do
59
+ p = Graphite::TargetParser.new
60
+ expect { p.parse!(invalid_target) }.to raise_error(Graphite::TargetParser::TargetParserError)
61
+ end
62
+ end
63
+
64
+ context 'expression' do
65
+ context 'is parseable' do
66
+ it 'for all values in metrics.yml' do
67
+ metrics = YAML.load_file("spec/data/metrics.yml")
68
+ parser = Graphite::TargetParser.new
69
+ metrics.each do |m|
70
+ parser.parse(m)
71
+ expect(parser).to be_parsed
72
+ end
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'string' do
78
+ context 'is valid' do
79
+ it 'with single quoted strings' do
80
+ p = Graphite::TargetParser.parse(%q[alias(summarize(stats_counts.message_center.consumer_replies.created, '12h'), 'Consumer replies')])
81
+ expect(p).to be_parsed
82
+ end
83
+ it 'with double quoted strings' do
84
+ p = Graphite::TargetParser.parse(%q[alias(summarize(stats_counts.message_center.consumer_replies.created, "12h"), "Consumer replies")])
85
+ expect(p).to be_parsed
86
+ end
87
+ end
88
+ end
89
+
90
+ context 'path' do
91
+ context 'is valid' do
92
+ it 'with seg1' do
93
+ p = Graphite::TargetParser.parse("seg1")
94
+ expect(p).to be_parsed
95
+ end
96
+ it 'with seg1.*' do
97
+ p = Graphite::TargetParser.parse("seg1.*")
98
+ expect(p).to be_parsed
99
+ end
100
+ it 'with seg1.seg2' do
101
+ p = Graphite::TargetParser.parse("seg1.seg2")
102
+ expect(p).to be_parsed
103
+ end
104
+ it 'with seg1_seg2' do
105
+ p = Graphite::TargetParser.parse("seg1_seg2")
106
+ expect(p).to be_parsed
107
+ end
108
+ it 'with seg1_seg2.seg3' do
109
+ p = Graphite::TargetParser.parse("seg1_seg2.seg3")
110
+ expect(p).to be_parsed
111
+ end
112
+ it 'with *.seg3' do
113
+ p = Graphite::TargetParser.parse("*.seg3")
114
+ expect(p).to be_parsed
115
+ end
116
+ it 'with *' do
117
+ p = Graphite::TargetParser.parse("*")
118
+ expect(p).to be_parsed
119
+ end
120
+ end
121
+ end
122
+
123
+ end
124
+