influxdb 0.6.2 → 0.8.1

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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/tests.yml +92 -0
  3. data/.rubocop.yml +4 -0
  4. data/CHANGELOG.md +34 -0
  5. data/README.md +80 -34
  6. data/Rakefile +1 -1
  7. data/bin/provision.sh +3 -3
  8. data/influxdb.gemspec +2 -2
  9. data/lib/influxdb/client.rb +15 -9
  10. data/lib/influxdb/client/http.rb +11 -1
  11. data/lib/influxdb/config.rb +7 -5
  12. data/lib/influxdb/errors.rb +1 -0
  13. data/lib/influxdb/point_value.rb +4 -1
  14. data/lib/influxdb/query/batch.rb +9 -3
  15. data/lib/influxdb/query/cluster.rb +2 -2
  16. data/lib/influxdb/query/continuous_query.rb +1 -1
  17. data/lib/influxdb/query/core.rb +11 -7
  18. data/lib/influxdb/query/database.rb +2 -2
  19. data/lib/influxdb/query/series.rb +6 -2
  20. data/lib/influxdb/query/user.rb +8 -8
  21. data/lib/influxdb/timestamp_conversion.rb +52 -12
  22. data/lib/influxdb/version.rb +1 -1
  23. data/lib/influxdb/writer/async.rb +38 -11
  24. data/lib/influxdb/writer/udp.rb +3 -0
  25. data/spec/influxdb/cases/async_client_spec.rb +59 -35
  26. data/spec/influxdb/cases/query_cluster_spec.rb +3 -3
  27. data/spec/influxdb/cases/query_continuous_query_spec.rb +1 -1
  28. data/spec/influxdb/cases/query_database_spec.rb +4 -4
  29. data/spec/influxdb/cases/query_series_spec.rb +24 -8
  30. data/spec/influxdb/cases/query_user_spec.rb +8 -8
  31. data/spec/influxdb/cases/querying_issue_7000_spec.rb +1 -1
  32. data/spec/influxdb/cases/querying_spec.rb +1 -1
  33. data/spec/influxdb/cases/retry_requests_spec.rb +1 -1
  34. data/spec/influxdb/cases/udp_client_spec.rb +8 -14
  35. data/spec/influxdb/client_spec.rb +2 -2
  36. data/spec/influxdb/config_spec.rb +44 -14
  37. data/spec/influxdb/logging_spec.rb +3 -0
  38. data/spec/influxdb/point_value_spec.rb +11 -1
  39. data/spec/influxdb/time_conversion_spec.rb +19 -0
  40. data/spec/smoke/smoke_spec.rb +2 -2
  41. data/spec/spec_helper.rb +4 -4
  42. metadata +13 -14
  43. data/.travis.yml +0 -55
@@ -2,7 +2,7 @@ require "spec_helper"
2
2
  require "timeout"
3
3
 
4
4
  describe InfluxDB::Client do
5
- let(:async_options) { true }
5
+ let(:async_options) { { sleep_interval: 0.1 } }
6
6
  let(:client) { described_class.new(async: async_options) }
7
7
  let(:subject) { client }
8
8
  let(:stub_url) { "http://localhost:8086/write?db=&p=root&precision=s&u=root" }
@@ -14,18 +14,13 @@ describe InfluxDB::Client do
14
14
  it "sends writes to client" do
15
15
  post_request = stub_request(:post, stub_url).to_return(status: 204)
16
16
 
17
- (worker.max_post_points + 100).times do
18
- subject.write_point('a', {})
17
+ (worker.max_post_points + 100).times do |i|
18
+ subject.write_point('a', values: { i: i })
19
19
  end
20
20
 
21
- # The timout code is fragile, and heavily dependent on system load
22
- # (and scheduler decisions). On the CI, the system is less
23
- # responsive and needs a bit more time.
24
- timeout_stretch = ENV["TRAVIS"] == "true" ? 10 : 3
21
+ sleep 1 until worker.threads.none? { |t| t[:influxdb].nil? }
25
22
 
26
- Timeout.timeout(timeout_stretch * worker.sleep_interval) do
27
- subject.stop!
28
- end
23
+ subject.stop!
29
24
 
30
25
  worker.threads.each do |t|
31
26
  expect(t.stop?).to be true
@@ -41,6 +36,7 @@ describe InfluxDB::Client do
41
36
  let(:precision) { 'test_precision' }
42
37
  let(:retention_policy) { 'test_period' }
43
38
  let(:database) { 'test_database' }
39
+ let(:async_options) { { num_worker_threads: 1, sleep_interval: 0.1 } }
44
40
 
45
41
  it "writes aggregate payload to the client" do
46
42
  queue = Queue.new
@@ -51,9 +47,11 @@ describe InfluxDB::Client do
51
47
  subject.write_point(series, { values: { t: 60 } }, precision, retention_policy, database)
52
48
  subject.write_point(series, { values: { t: 61 } }, precision, retention_policy, database)
53
49
 
54
- Timeout.timeout(worker.sleep_interval) do
55
- expect(queue.pop).to eq ["#{series} t=60i\n#{series} t=61i", precision, retention_policy, database]
56
- end
50
+ sleep 1 until worker.threads.none? { |t| t[:influxdb].nil? }
51
+
52
+ subject.stop!
53
+
54
+ expect(queue.pop).to eq ["#{series} t=60i\n#{series} t=61i", precision, retention_policy, database]
57
55
  end
58
56
 
59
57
  context 'when different precision, retention_policy and database are given' do
@@ -72,36 +70,62 @@ describe InfluxDB::Client do
72
70
  subject.write_point(series, { values: { t: 62 } }, precision, retention_policy2, database)
73
71
  subject.write_point(series, { values: { t: 63 } }, precision, retention_policy, database2)
74
72
 
75
- Timeout.timeout(worker.sleep_interval) do
76
- expect(queue.pop).to eq ["#{series} t=60i", precision, retention_policy, database]
77
- expect(queue.pop).to eq ["#{series} t=61i", precision2, retention_policy, database]
78
- expect(queue.pop).to eq ["#{series} t=62i", precision, retention_policy2, database]
79
- expect(queue.pop).to eq ["#{series} t=63i", precision, retention_policy, database2]
80
- end
73
+ sleep 1 until worker.threads.none? { |t| t[:influxdb].nil? }
74
+
75
+ subject.stop!
76
+
77
+ expect(queue.pop).to eq ["#{series} t=60i", precision, retention_policy, database]
78
+ expect(queue.pop).to eq ["#{series} t=61i", precision2, retention_policy, database]
79
+ expect(queue.pop).to eq ["#{series} t=62i", precision, retention_policy2, database]
80
+ expect(queue.pop).to eq ["#{series} t=63i", precision, retention_policy, database2]
81
81
  end
82
82
  end
83
83
  end
84
84
  end
85
85
 
86
86
  describe "async options" do
87
- let(:async_options) do
88
- {
89
- max_post_points: 10,
90
- max_queue_size: 100,
91
- num_worker_threads: 1,
92
- sleep_interval: 0.5,
93
- block_on_full_queue: false
94
- }
95
- end
96
-
97
87
  subject { worker }
98
88
  before { worker.stop! }
99
89
 
100
- specify { expect(subject.max_post_points).to be 10 }
101
- specify { expect(subject.max_queue_size).to be 100 }
102
- specify { expect(subject.num_worker_threads).to be 1 }
103
- specify { expect(subject.sleep_interval).to be_within(0.0001).of(0.5) }
104
- specify { expect(subject.block_on_full_queue).to be false }
105
- specify { expect(subject.queue).to be_kind_of(InfluxDB::MaxQueue) }
90
+ context 'when all options are given' do
91
+ let(:async_options) do
92
+ {
93
+ max_post_points: 10,
94
+ max_queue_size: 100,
95
+ num_worker_threads: 1,
96
+ sleep_interval: 0.5,
97
+ block_on_full_queue: false,
98
+ shutdown_timeout: 0.6,
99
+ }
100
+ end
101
+
102
+ it "uses the specified values" do
103
+ expect(subject.max_post_points).to be 10
104
+ expect(subject.max_queue_size).to be 100
105
+ expect(subject.num_worker_threads).to be 1
106
+ expect(subject.sleep_interval).to be_within(0.0001).of(0.5)
107
+ expect(subject.block_on_full_queue).to be false
108
+ expect(subject.queue).to be_kind_of(InfluxDB::MaxQueue)
109
+ expect(subject.shutdown_timeout).to be_within(0.0001).of(0.6)
110
+ end
111
+ end
112
+
113
+ context 'when only sleep_interval is given' do
114
+ let(:async_options) { { sleep_interval: 0.2 } }
115
+
116
+ it "uses a value for shutdown_timeout that is 2x sleep_interval" do
117
+ expect(subject.sleep_interval).to be_within(0.0001).of(0.2)
118
+ expect(subject.shutdown_timeout).to be_within(0.0001).of(0.4)
119
+ end
120
+ end
121
+
122
+ context 'when only shutdown_timeout is given' do
123
+ let(:async_options) { { shutdown_timeout: 0.3 } }
124
+
125
+ it "uses that value" do
126
+ expect(subject.sleep_interval).to be_within(0.0001).of(5)
127
+ expect(subject.shutdown_timeout).to be_within(0.0001).of(0.3)
128
+ end
129
+ end
106
130
  end
107
131
  end
@@ -3,7 +3,7 @@ require "json"
3
3
 
4
4
  describe InfluxDB::Client do
5
5
  let(:subject) do
6
- described_class.new "database", {
6
+ described_class.new "database", **{
7
7
  host: "influxdb.test",
8
8
  port: 9999,
9
9
  username: "username",
@@ -17,7 +17,7 @@ describe InfluxDB::Client do
17
17
  describe "#create_cluster_admin" do
18
18
  let(:user) { 'adminadmin' }
19
19
  let(:pass) { 'passpass' }
20
- let(:query) { "CREATE USER #{user} WITH PASSWORD '#{pass}' WITH ALL PRIVILEGES" }
20
+ let(:query) { "CREATE USER \"#{user}\" WITH PASSWORD '#{pass}' WITH ALL PRIVILEGES" }
21
21
 
22
22
  context 'with existing admin user' do
23
23
  before do
@@ -67,7 +67,7 @@ describe InfluxDB::Client do
67
67
 
68
68
  describe "#revoke_cluster_admin_privileges" do
69
69
  let(:user) { 'useruser' }
70
- let(:query) { "REVOKE ALL PRIVILEGES FROM #{user}" }
70
+ let(:query) { "REVOKE ALL PRIVILEGES FROM \"#{user}\"" }
71
71
 
72
72
  before do
73
73
  stub_request(:get, "http://influxdb.test:9999/query").with(
@@ -104,7 +104,7 @@ describe InfluxDB::Client do
104
104
  describe "#delete_continuous_query" do
105
105
  let(:name) { "event_counts_per_10m_by_type" }
106
106
  let(:database) { "testdb" }
107
- let(:query) { "DROP CONTINUOUS QUERY #{name} ON #{database}" }
107
+ let(:query) { "DROP CONTINUOUS QUERY \"#{name}\" ON \"#{database}\"" }
108
108
 
109
109
  before do
110
110
  stub_request(:get, "http://influxdb.test:9999/query")
@@ -23,7 +23,7 @@ describe InfluxDB::Client do
23
23
 
24
24
  describe "#create_database" do
25
25
  describe "from param" do
26
- let(:query) { "CREATE DATABASE foo" }
26
+ let(:query) { "CREATE DATABASE \"foo\"" }
27
27
 
28
28
  it "should GET to create a new database" do
29
29
  expect(subject.create_database("foo")).to be_a(Net::HTTPOK)
@@ -31,7 +31,7 @@ describe InfluxDB::Client do
31
31
  end
32
32
 
33
33
  describe "from config" do
34
- let(:query) { "CREATE DATABASE database" }
34
+ let(:query) { "CREATE DATABASE \"database\"" }
35
35
 
36
36
  it "should GET to create a new database using database name from config" do
37
37
  expect(subject.create_database).to be_a(Net::HTTPOK)
@@ -41,7 +41,7 @@ describe InfluxDB::Client do
41
41
 
42
42
  describe "#delete_database" do
43
43
  describe "from param" do
44
- let(:query) { "DROP DATABASE foo" }
44
+ let(:query) { "DROP DATABASE \"foo\"" }
45
45
 
46
46
  it "should GET to remove a database" do
47
47
  expect(subject.delete_database("foo")).to be_a(Net::HTTPOK)
@@ -49,7 +49,7 @@ describe InfluxDB::Client do
49
49
  end
50
50
 
51
51
  describe "from config" do
52
- let(:query) { "DROP DATABASE database" }
52
+ let(:query) { "DROP DATABASE \"database\"" }
53
53
 
54
54
  it "should GET to remove a database using database name from config" do
55
55
  expect(subject.delete_database).to be_a(Net::HTTPOK)
@@ -5,7 +5,7 @@ describe InfluxDB::Client do
5
5
  let(:subject) do
6
6
  described_class.new(
7
7
  "database",
8
- {
8
+ **{
9
9
  host: "influxdb.test",
10
10
  port: 9999,
11
11
  username: "username",
@@ -49,16 +49,32 @@ describe InfluxDB::Client do
49
49
  end
50
50
 
51
51
  describe "#delete_series" do
52
- let(:name) { "events" }
53
- let(:query) { "DROP SERIES FROM #{name}" }
52
+ describe "without a where clause" do
53
+ let(:name) { "events" }
54
+ let(:query) { "DROP SERIES FROM \"#{name}\"" }
54
55
 
55
- before do
56
- stub_request(:get, "http://influxdb.test:9999/query")
57
- .with(query: { u: "username", p: "password", q: query, db: "database" })
56
+ before do
57
+ stub_request(:get, "http://influxdb.test:9999/query")
58
+ .with(query: { u: "username", p: "password", q: query, db: "database" })
59
+ end
60
+
61
+ it "should GET to remove a database" do
62
+ expect(subject.delete_series(name)).to be_a(Net::HTTPOK)
63
+ end
58
64
  end
59
65
 
60
- it "should GET to remove a database" do
61
- expect(subject.delete_series(name)).to be_a(Net::HTTPOK)
66
+ describe "with a where clause" do
67
+ let(:name) { "events" }
68
+ let(:query) { "DROP SERIES FROM \"#{name}\" WHERE \"tag\"='value'" }
69
+
70
+ before do
71
+ stub_request(:get, "http://influxdb.test:9999/query")
72
+ .with(query: { u: "username", p: "password", q: query, db: "database" })
73
+ end
74
+
75
+ it "should GET to remove a database" do
76
+ expect(subject.delete_series(name, where: "\"tag\"='value'")).to be_a(Net::HTTPOK)
77
+ end
62
78
  end
63
79
  end
64
80
  end
@@ -24,7 +24,7 @@ describe InfluxDB::Client do
24
24
  describe "#update user password" do
25
25
  let(:user) { 'useruser' }
26
26
  let(:pass) { 'passpass' }
27
- let(:query) { "SET PASSWORD FOR #{user} = '#{pass}'" }
27
+ let(:query) { "SET PASSWORD FOR \"#{user}\" = '#{pass}'" }
28
28
 
29
29
  it "should GET to update user password" do
30
30
  expect(subject.update_user_password(user, pass)).to be_a(Net::HTTPOK)
@@ -35,7 +35,7 @@ describe InfluxDB::Client do
35
35
  let(:user) { 'useruser' }
36
36
  let(:perm) { :write }
37
37
  let(:db) { 'foo' }
38
- let(:query) { "GRANT #{perm.to_s.upcase} ON #{db} TO #{user}" }
38
+ let(:query) { "GRANT #{perm.to_s.upcase} ON \"#{db}\" TO \"#{user}\"" }
39
39
 
40
40
  it "should GET to grant privileges for a user on a database" do
41
41
  expect(subject.grant_user_privileges(user, db, perm)).to be_a(Net::HTTPOK)
@@ -44,7 +44,7 @@ describe InfluxDB::Client do
44
44
 
45
45
  describe "#grant_user_admin_privileges" do
46
46
  let(:user) { 'useruser' }
47
- let(:query) { "GRANT ALL PRIVILEGES TO #{user}" }
47
+ let(:query) { "GRANT ALL PRIVILEGES TO \"#{user}\"" }
48
48
 
49
49
  it "should GET to grant privileges for a user on a database" do
50
50
  expect(subject.grant_user_admin_privileges(user)).to be_a(Net::HTTPOK)
@@ -55,7 +55,7 @@ describe InfluxDB::Client do
55
55
  let(:user) { 'useruser' }
56
56
  let(:perm) { :write }
57
57
  let(:db) { 'foo' }
58
- let(:query) { "REVOKE #{perm.to_s.upcase} ON #{db} FROM #{user}" }
58
+ let(:query) { "REVOKE #{perm.to_s.upcase} ON \"#{db}\" FROM \"#{user}\"" }
59
59
 
60
60
  it "should GET to revoke privileges from a user on a database" do
61
61
  expect(subject.revoke_user_privileges(user, db, perm)).to be_a(Net::HTTPOK)
@@ -66,7 +66,7 @@ describe InfluxDB::Client do
66
66
  let(:user) { 'useruser' }
67
67
  let(:pass) { 'passpass' }
68
68
  let(:db) { 'foo' }
69
- let(:query) { "CREATE user #{user} WITH PASSWORD '#{pass}'; GRANT ALL ON #{db} TO #{user}" }
69
+ let(:query) { "CREATE user \"#{user}\" WITH PASSWORD '#{pass}'; GRANT ALL ON \"#{db}\" TO \"#{user}\"" }
70
70
 
71
71
  context "without specifying permissions" do
72
72
  it "should GET to create a new database user with all permissions" do
@@ -76,7 +76,7 @@ describe InfluxDB::Client do
76
76
 
77
77
  context "with passing permission as argument" do
78
78
  let(:permission) { :read }
79
- let(:query) { "CREATE user #{user} WITH PASSWORD '#{pass}'; GRANT #{permission.to_s.upcase} ON #{db} TO #{user}" }
79
+ let(:query) { "CREATE user \"#{user}\" WITH PASSWORD '#{pass}'; GRANT #{permission.to_s.upcase} ON \"#{db}\" TO \"#{user}\"" }
80
80
 
81
81
  it "should GET to create a new database user with permission set" do
82
82
  expect(subject.create_database_user(db, user, pass, permissions: permission)).to be_a(Net::HTTPOK)
@@ -86,7 +86,7 @@ describe InfluxDB::Client do
86
86
 
87
87
  describe "#delete_user" do
88
88
  let(:user) { 'useruser' }
89
- let(:query) { "DROP USER #{user}" }
89
+ let(:query) { "DROP USER \"#{user}\"" }
90
90
 
91
91
  it "should GET to delete a user" do
92
92
  expect(subject.delete_user(user)).to be_a(Net::HTTPOK)
@@ -105,7 +105,7 @@ describe InfluxDB::Client do
105
105
 
106
106
  describe "#list_user_grants" do
107
107
  let(:user) { 'useruser' }
108
- let(:list_query) { "SHOW GRANTS FOR #{user}" }
108
+ let(:list_query) { "SHOW GRANTS FOR \"#{user}\"" }
109
109
 
110
110
  before do
111
111
  stub_request(:get, "http://influxdb.test:9999/query")
@@ -6,7 +6,7 @@ require "json"
6
6
 
7
7
  describe InfluxDB::Client do
8
8
  let(:subject) do
9
- described_class.new "database", {
9
+ described_class.new "database", **{
10
10
  host: "influxdb.test",
11
11
  port: 9999,
12
12
  username: "username",
@@ -3,7 +3,7 @@ require "json"
3
3
 
4
4
  describe InfluxDB::Client do
5
5
  let(:subject) do
6
- described_class.new "database", {
6
+ described_class.new "database", **{
7
7
  host: "influxdb.test",
8
8
  port: 9999,
9
9
  username: "username",
@@ -5,7 +5,7 @@ describe InfluxDB::Client do
5
5
  let(:client) do
6
6
  described_class.new(
7
7
  "database",
8
- {
8
+ **{
9
9
  host: "influxdb.test",
10
10
  port: 9999,
11
11
  username: "username",
@@ -1,7 +1,10 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe InfluxDB::Client do
4
- let(:client) { described_class.new(udp: { host: "localhost", port: 44_444 }) }
4
+ let(:socket) { UDPSocket.new.tap { |s| s.bind "localhost", 0 } }
5
+ after { socket.close rescue nil }
6
+
7
+ let(:client) { described_class.new(udp: { host: "localhost", port: socket.addr[1] }) }
5
8
 
6
9
  specify { expect(client.writer).to be_a(InfluxDB::Writer::UDP) }
7
10
 
@@ -9,32 +12,23 @@ describe InfluxDB::Client do
9
12
  let(:message) { 'responses,region=eu value=5i' }
10
13
 
11
14
  it "sends a UDP packet" do
12
- s = UDPSocket.new
13
- s.bind("localhost", 44_444)
14
-
15
15
  client.write_point("responses", values: { value: 5 }, tags: { region: 'eu' })
16
16
 
17
- rec_message = s.recvfrom(30).first
17
+ rec_message = socket.recvfrom(30).first
18
18
  expect(rec_message).to eq message
19
-
20
- s.close
21
19
  end
22
20
  end
23
21
 
24
22
  describe "#write with discard_write_errors" do
25
23
  let(:client) do
26
- described_class.new(
27
- udp: { host: "localhost", port: 44_444 },
24
+ described_class.new \
25
+ udp: { host: "localhost", port: socket.addr[1] },
28
26
  discard_write_errors: true
29
- )
30
27
  end
31
28
 
32
29
  it "doesn't raise" do
33
- s = UDPSocket.new
34
- s.bind("localhost", 44_444)
35
-
36
30
  client.write_point("responses", values: { value: 5 }, tags: { region: 'eu' })
37
- s.close
31
+ socket.close
38
32
 
39
33
  client.write_point("responses", values: { value: 7 }, tags: { region: 'eu' })
40
34
 
@@ -5,7 +5,7 @@ describe InfluxDB::Client do
5
5
  let(:subject) do
6
6
  described_class.new(
7
7
  "database",
8
- {
8
+ **{
9
9
  host: "influxdb.test",
10
10
  port: 9999,
11
11
  username: "username",
@@ -47,7 +47,7 @@ describe InfluxDB::Client do
47
47
  it "escapes params" do
48
48
  url = subject.send(:full_url, "/unknown", value: ' !@#$%^&*()/\\_+-=?|`~')
49
49
  encoded_fragment = "value=+%21%40%23%24%25%5E%26%2A%28%29%2F%5C_%2B-%3D%3F%7C%60"
50
- encoded_fragment << (RUBY_ENGINE == "ruby" && RUBY_VERSION >= "2.5.0" ? "~" : "%7E")
50
+ encoded_fragment << (RUBY_VERSION >= "2.5.0" ? "~" : "%7E")
51
51
  expect(url).to include(encoded_fragment)
52
52
  end
53
53
 
@@ -1,11 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe InfluxDB::Config do
4
- let(:conf) do
5
- InfluxDB::Client.new(*args).config
4
+ after { client.stop! }
5
+
6
+ let(:client) do
7
+ kwargs = args.last.is_a?(Hash) ? args.pop : {}
8
+ InfluxDB::Client.new(*args, **kwargs)
6
9
  end
10
+ let(:conf) { client.config }
7
11
 
8
- let(:args) { {} }
12
+ let(:args) { [] }
9
13
 
10
14
  context "with no parameters specified" do
11
15
  specify { expect(conf.database).to be_nil }
@@ -20,17 +24,19 @@ describe InfluxDB::Config do
20
24
  specify { expect(conf).not_to be_udp }
21
25
  specify { expect(conf).not_to be_async }
22
26
  specify { expect(conf.epoch).to be_falsey }
27
+ specify { expect(conf.proxy_addr).to be_nil }
28
+ specify { expect(conf.proxy_port).to be_nil }
23
29
  end
24
30
 
25
31
  context "with no database specified" do
26
32
  let(:args) do
27
- [{
33
+ [
28
34
  host: "host",
29
35
  port: "port",
30
36
  username: "username",
31
37
  password: "password",
32
38
  time_precision: "m"
33
- }]
39
+ ]
34
40
  end
35
41
 
36
42
  specify { expect(conf.database).to be_nil }
@@ -64,7 +70,7 @@ describe InfluxDB::Config do
64
70
  end
65
71
 
66
72
  context "with ssl option specified" do
67
- let(:args) { [{ use_ssl: true }] }
73
+ let(:args) { [use_ssl: true] }
68
74
 
69
75
  specify { expect(conf.database).to be_nil }
70
76
  specify { expect(conf.hosts).to eq ["localhost"] }
@@ -75,7 +81,7 @@ describe InfluxDB::Config do
75
81
  end
76
82
 
77
83
  context "with multiple hosts specified" do
78
- let(:args) { [{ hosts: ["1.1.1.1", "2.2.2.2"] }] }
84
+ let(:args) { [hosts: ["1.1.1.1", "2.2.2.2"]] }
79
85
 
80
86
  specify { expect(conf.database).to be_nil }
81
87
  specify { expect(conf.port).to eq 8086 }
@@ -85,7 +91,7 @@ describe InfluxDB::Config do
85
91
  end
86
92
 
87
93
  context "with auth_method basic auth specified" do
88
- let(:args) { [{ auth_method: 'basic_auth' }] }
94
+ let(:args) { [auth_method: 'basic_auth'] }
89
95
 
90
96
  specify { expect(conf.database).to be_nil }
91
97
  specify { expect(conf.hosts).to eq ["localhost"] }
@@ -96,38 +102,38 @@ describe InfluxDB::Config do
96
102
  end
97
103
 
98
104
  context "with udp specified with params" do
99
- let(:args) { [{ udp: { host: 'localhost', port: 4444 } }] }
105
+ let(:args) { [udp: { host: 'localhost', port: 4444 }] }
100
106
 
101
107
  specify { expect(conf).to be_udp }
102
108
  end
103
109
 
104
110
  context "with udp specified as true" do
105
- let(:args) { [{ udp: true }] }
111
+ let(:args) { [udp: true] }
106
112
 
107
113
  specify { expect(conf).to be_udp }
108
114
  end
109
115
 
110
116
  context "with async specified with params" do
111
- let(:args) { [{ async: { max_queue: 20_000 } }] }
117
+ let(:args) { [async: { max_queue: 20_000 }] }
112
118
 
113
119
  specify { expect(conf).to be_async }
114
120
  end
115
121
 
116
122
  context "with async specified as true" do
117
- let(:args) { [{ async: true }] }
123
+ let(:args) { [async: true] }
118
124
 
119
125
  specify { expect(conf).to be_async }
120
126
  end
121
127
 
122
128
  context "with epoch specified as seconds" do
123
- let(:args) { [{ epoch: 's' }] }
129
+ let(:args) { [epoch: 's'] }
124
130
 
125
131
  specify { expect(conf.epoch).to eq 's' }
126
132
  end
127
133
 
128
134
  context "given a config URL" do
129
135
  let(:url) { "https://foo:bar@influx.example.com:8765/testdb?open_timeout=42&unknown=false&denormalize=false" }
130
- let(:args) { [{ url: url }] }
136
+ let(:args) { [url: url] }
131
137
 
132
138
  it "applies values found in URL" do
133
139
  expect(conf.database).to eq "testdb"
@@ -156,6 +162,15 @@ describe InfluxDB::Config do
156
162
  expect(conf).not_to be_async
157
163
  end
158
164
 
165
+ context "with encoded values" do
166
+ let(:url) { "https://weird%24user:weird%25pass@influx.example.com:8765/testdb" }
167
+
168
+ it "decode encoded values" do
169
+ expect(conf.username).to eq "weird$user"
170
+ expect(conf.password).to eq "weird%pass"
171
+ end
172
+ end
173
+
159
174
  context "UDP" do
160
175
  let(:url) { "udp://test.localhost:2345?discard_write_errors=1" }
161
176
  specify { expect(conf).to be_udp }
@@ -205,4 +220,19 @@ describe InfluxDB::Config do
205
220
  expect(conf).not_to be_async
206
221
  end
207
222
  end
223
+
224
+ context "given explicit proxy information" do
225
+ let(:args) do
226
+ [host: "host",
227
+ port: "port",
228
+ username: "username",
229
+ password: "password",
230
+ time_precision: "m",
231
+ proxy_addr: "my.proxy.addr",
232
+ proxy_port: 8080]
233
+ end
234
+
235
+ specify { expect(conf.proxy_addr).to eq("my.proxy.addr") }
236
+ specify { expect(conf.proxy_port).to eq(8080) }
237
+ end
208
238
  end