Skip to content

Commit 50bf3b6

Browse files
alespourbednar
andauthored
feat: create Client from connection string or environment variables (#46)
* feat: add client creation from connection string and env vars * chore: fix markdown MD024 rule check * test: add more tests * style: formatting * test: add more tests * docs: update CHANGELOG * docs: example update * docs: fix docs string --------- Co-authored-by: Jakub Bednář <[email protected]>
1 parent b26e715 commit 50bf3b6

8 files changed

+439
-49
lines changed

.markdownlint.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
{
22
"MD013": false,
3-
"MD024": false,
3+
"MD024": {
4+
"siblings_only": true
5+
},
46
"MD033": {
57
"allowed_elements": [ "a", "img", "p" ]
68
},
79
"MD041": false,
8-
}
10+
}

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
### Features
44

5+
1. [#36](https://github.com/InfluxCommunity/influxdb3-csharp/pull/46): Add client creation from connection string
6+
and environment variables.
57
1. [#52](https://github.com/InfluxCommunity/influxdb3-csharp/pull/52): Add structured query support
68

79
### Docs
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using InfluxDB3.Client.Write;
4+
5+
namespace InfluxDB3.Client.Config.Test;
6+
7+
public class ClientConfigTest
8+
{
9+
[Test]
10+
public void RequiredConfig()
11+
{
12+
var ae = Assert.Throws<ArgumentNullException>(() => { new InfluxDBClient((ClientConfig)null); });
13+
14+
Assert.That(ae, Is.Not.Null);
15+
Assert.That(ae.Message, Is.EqualTo("Value cannot be null. (Parameter 'config')"));
16+
}
17+
18+
[Test]
19+
public void CreateFromConnectionStringMinimal()
20+
{
21+
var cfg = new ClientConfig("http://localhost:8086?token=my-token");
22+
Assert.That(cfg, Is.Not.Null);
23+
cfg.Validate();
24+
Assert.Multiple(() =>
25+
{
26+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
27+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
28+
Assert.That(cfg.Organization, Is.EqualTo(null));
29+
Assert.That(cfg.Database, Is.EqualTo(null));
30+
Assert.That(cfg.WriteOptions, Is.EqualTo(null));
31+
});
32+
}
33+
34+
[Test]
35+
public void CreateFromConnectionStringBasic()
36+
{
37+
var cfg = new ClientConfig("http://localhost:8086?token=my-token&org=my-org&database=my-database");
38+
Assert.That(cfg, Is.Not.Null);
39+
cfg.Validate();
40+
Assert.Multiple(() =>
41+
{
42+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
43+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
44+
Assert.That(cfg.Organization, Is.EqualTo("my-org"));
45+
Assert.That(cfg.Database, Is.EqualTo("my-database"));
46+
Assert.That(cfg.WriteOptions, Is.EqualTo(null));
47+
});
48+
}
49+
50+
[Test]
51+
public void CreateFromConnectionStringWithWriteOptions()
52+
{
53+
var cfg = new ClientConfig("http://localhost:8086?token=my-token&org=my-org&database=my-database&precision=s&gzipThreshold=64");
54+
Assert.That(cfg, Is.Not.Null);
55+
cfg.Validate();
56+
Assert.Multiple(() =>
57+
{
58+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
59+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
60+
Assert.That(cfg.Organization, Is.EqualTo("my-org"));
61+
Assert.That(cfg.Database, Is.EqualTo("my-database"));
62+
Assert.That(cfg.WriteOptions.Precision, Is.EqualTo(WritePrecision.S));
63+
Assert.That(cfg.WriteOptions.GzipThreshold, Is.EqualTo(64));
64+
});
65+
}
66+
67+
[Test]
68+
public void CreateFromConnectionStringPrecisions()
69+
{
70+
var precisions = new[]
71+
{
72+
("ns", WritePrecision.Ns),
73+
("us", WritePrecision.Us),
74+
("ms", WritePrecision.Ms),
75+
("s", WritePrecision.S),
76+
};
77+
foreach (var precision in precisions)
78+
{
79+
var cfg = new ClientConfig($"http://localhost:8086?token=my-token&precision={precision.Item1}");
80+
Assert.That(cfg, Is.Not.Null);
81+
cfg.Validate();
82+
Assert.Multiple(() =>
83+
{
84+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
85+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
86+
Assert.That(cfg.WriteOptions.Precision, Is.EqualTo(precision.Item2));
87+
});
88+
}
89+
}
90+
91+
[Test]
92+
public void CreateFromConnectionStringInvalidPrecision()
93+
{
94+
var ae = Assert.Throws<ArgumentException>(() => { new ClientConfig("http://localhost:8086?token=my-token&precision=xs"); });
95+
96+
Assert.That(ae, Is.Not.Null);
97+
Assert.That(ae.Message, Is.EqualTo("Unsupported precision 'xs'"));
98+
}
99+
100+
[Test]
101+
public void CreateFromEnvMinimal()
102+
{
103+
var env = new Dictionary<String, String>
104+
{
105+
{"INFLUX_HOST", "http://localhost:8086"},
106+
{"INFLUX_TOKEN", "my-token"},
107+
};
108+
SetEnv(env);
109+
var cfg = new ClientConfig(env);
110+
Assert.That(cfg, Is.Not.Null);
111+
cfg.Validate();
112+
Assert.Multiple(() =>
113+
{
114+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
115+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
116+
Assert.That(cfg.Organization, Is.EqualTo(null));
117+
Assert.That(cfg.Database, Is.EqualTo(null));
118+
Assert.That(cfg.WriteOptions, Is.EqualTo(null));
119+
});
120+
}
121+
122+
[Test]
123+
public void CreateFromEnvBasic()
124+
{
125+
var env = new Dictionary<String, String>
126+
{
127+
{"INFLUX_HOST", "http://localhost:8086"},
128+
{"INFLUX_TOKEN", "my-token"},
129+
{"INFLUX_ORG", "my-org"},
130+
{"INFLUX_DATABASE", "my-database"},
131+
};
132+
SetEnv(env);
133+
var cfg = new ClientConfig(env);
134+
Assert.That(cfg, Is.Not.Null);
135+
cfg.Validate();
136+
Assert.Multiple(() =>
137+
{
138+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
139+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
140+
Assert.That(cfg.Organization, Is.EqualTo("my-org"));
141+
Assert.That(cfg.Database, Is.EqualTo("my-database"));
142+
Assert.That(cfg.WriteOptions, Is.EqualTo(null));
143+
});
144+
}
145+
146+
[Test]
147+
public void CreateFromEnvWithWriteOptions()
148+
{
149+
var env = new Dictionary<String, String>
150+
{
151+
{"INFLUX_HOST", "http://localhost:8086"},
152+
{"INFLUX_TOKEN", "my-token"},
153+
{"INFLUX_ORG", "my-org"},
154+
{"INFLUX_DATABASE", "my-database"},
155+
{"INFLUX_PRECISION", "s"},
156+
{"INFLUX_GZIP_THRESHOLD", "64"},
157+
};
158+
SetEnv(env);
159+
var cfg = new ClientConfig(env);
160+
Assert.That(cfg, Is.Not.Null);
161+
cfg.Validate();
162+
Assert.Multiple(() =>
163+
{
164+
Assert.That(cfg.Host, Is.EqualTo("http://localhost:8086/"));
165+
Assert.That(cfg.Token, Is.EqualTo("my-token"));
166+
Assert.That(cfg.Organization, Is.EqualTo("my-org"));
167+
Assert.That(cfg.Database, Is.EqualTo("my-database"));
168+
Assert.That(cfg.WriteOptions.Precision, Is.EqualTo(WritePrecision.S));
169+
Assert.That(cfg.WriteOptions.GzipThreshold, Is.EqualTo(64));
170+
});
171+
}
172+
173+
private static void SetEnv(IDictionary<String, String> dict)
174+
{
175+
foreach (var entry in dict)
176+
{
177+
Environment.SetEnvironmentVariable(entry.Key, entry.Value, EnvironmentVariableTarget.Process);
178+
}
179+
}
180+
181+
[TearDown]
182+
public void Cleanup()
183+
{
184+
var envVars = new List<String>
185+
{
186+
ClientConfig.EnvInfluxHost,
187+
ClientConfig.EnvInfluxToken,
188+
ClientConfig.EnvInfluxOrg,
189+
ClientConfig.EnvInfluxDatabase,
190+
ClientConfig.EnvInfluxPrecision,
191+
ClientConfig.EnvInfluxGzipThreshold
192+
};
193+
foreach (var envVar in envVars)
194+
{
195+
Environment.SetEnvironmentVariable(envVar, null, EnvironmentVariableTarget.Process);
196+
}
197+
}
198+
}

Client.Test/InfluxDBClientTest.cs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23

34
// ReSharper disable ObjectCreationAsStatement
45
// ReSharper disable AssignNullToNotNullAttribute
@@ -10,26 +11,63 @@ public class InfluxDBClientTest
1011
[Test]
1112
public void Create()
1213
{
13-
using var client = new InfluxDBClient("http://localhost:8086", organization: "org", database: "database");
14+
using var client = new InfluxDBClient("http://localhost:8086", token: "my-token", organization: "my-org", database: "my-database");
1415

1516
Assert.That(client, Is.Not.Null);
1617
}
1718

1819
[Test]
19-
public void RequiredHost()
20+
public void CreateFromConnectionString()
2021
{
21-
var ae = Assert.Throws<ArgumentException>(() => { new InfluxDBClient(host: null); });
22+
using var client = new InfluxDBClient("http://localhost:8086?token=my-token&org=my-org&database=my-db");
2223

23-
Assert.That(ae, Is.Not.Null);
24-
Assert.That(ae.Message, Is.EqualTo("The URL of the InfluxDB server has to be defined."));
24+
Assert.That(client, Is.Not.Null);
2525
}
2626

2727
[Test]
28-
public void RequiredConfigs()
28+
public void CreateFromEnv()
2929
{
30-
var ae = Assert.Throws<ArgumentException>(() => { new InfluxDBClient(null); });
30+
var env = new Dictionary<String, String>
31+
{
32+
{"INFLUX_HOST", "http://localhost:8086"},
33+
{"INFLUX_TOKEN", "my-token"},
34+
{"INFLUX_ORG", "my-org"},
35+
{"INFLUX_DATABASE", "my-database"},
36+
};
37+
SetEnv(env);
38+
39+
using var client = new InfluxDBClient();
40+
41+
Assert.That(client, Is.Not.Null);
42+
}
43+
44+
[Test]
45+
public void RequiredHost()
46+
{
47+
var ae = Assert.Throws<ArgumentException>(() => { new InfluxDBClient(host: null, token: ""); });
3148

3249
Assert.That(ae, Is.Not.Null);
33-
Assert.That(ae.Message, Is.EqualTo("The configuration of the client has to be defined."));
50+
Assert.That(ae.Message, Is.EqualTo("The URL of the InfluxDB server has to be defined"));
51+
}
52+
53+
private static void SetEnv(IDictionary<String, String> dict)
54+
{
55+
foreach (var entry in dict)
56+
{
57+
Environment.SetEnvironmentVariable(entry.Key, entry.Value, EnvironmentVariableTarget.Process);
58+
}
59+
}
60+
61+
[TearDown]
62+
public void Cleanup()
63+
{
64+
var env = Environment.GetEnvironmentVariables(EnvironmentVariableTarget.Process);
65+
foreach (var key in env.Keys)
66+
{
67+
if (((string)key).StartsWith("INFLUX_"))
68+
{
69+
Environment.SetEnvironmentVariable((string)key, null, EnvironmentVariableTarget.Process);
70+
}
71+
}
3472
}
3573
}

0 commit comments

Comments
 (0)