|
26 | 26 |
|
27 | 27 | describe '#initialize' do |
28 | 28 | it 'raises an error for empty options' do |
29 | | - expect { described_class.new({}) }.to raise_error(Exception) |
| 29 | + expect { described_class.new }.to raise_error(Exception) |
30 | 30 | end |
31 | 31 |
|
32 | 32 | it 'raises an error for invalid INFLUX_SCHEMA' do |
33 | 33 | expect do |
34 | | - described_class.new(valid_local_options.merge(influx_schema: 'foo')) |
| 34 | + described_class.new(**valid_local_options, influx_schema: 'foo') |
35 | 35 | end.to raise_error(Exception, /URL is invalid/) |
36 | 36 | end |
37 | 37 |
|
38 | 38 | it 'raises an error for missing INFLUX_HOST' do |
39 | 39 | expect do |
40 | | - described_class.new(valid_local_options.merge(influx_host: nil)) |
| 40 | + described_class.new(**valid_local_options, influx_host: nil) |
41 | 41 | end.to raise_error(Exception, /INFLUX_HOST is missing/) |
42 | 42 | end |
43 | 43 |
|
44 | 44 | it 'raises an error for missing INFLUX_ORG' do |
45 | 45 | expect do |
46 | | - described_class.new(valid_local_options.merge(influx_org: nil)) |
| 46 | + described_class.new(**valid_local_options, influx_org: nil) |
47 | 47 | end.to raise_error(Exception, /INFLUX_ORG is missing/) |
48 | 48 | end |
49 | 49 |
|
50 | 50 | it 'raises an error for missing INFLUX_BUCKET' do |
51 | 51 | expect do |
52 | | - described_class.new(valid_local_options.merge(influx_bucket: nil)) |
| 52 | + described_class.new(**valid_local_options, influx_bucket: nil) |
53 | 53 | end.to raise_error(Exception, /INFLUX_BUCKET is missing/) |
54 | 54 | end |
55 | 55 |
|
56 | 56 | it 'raises an error for missing INFLUX_TOKEN' do |
57 | 57 | expect do |
58 | | - described_class.new(valid_local_options.merge(influx_token: nil)) |
| 58 | + described_class.new(**valid_local_options, influx_token: nil) |
59 | 59 | end.to raise_error(Exception, /INFLUX_TOKEN is missing/) |
60 | 60 | end |
61 | 61 |
|
62 | 62 | context 'when local' do |
63 | 63 | it 'initializes with valid options' do |
64 | | - expect { described_class.new(valid_local_options) }.not_to raise_error |
| 64 | + expect { described_class.new(**valid_local_options) }.not_to raise_error |
65 | 65 | end |
66 | 66 |
|
67 | 67 | it 'raises an error for invalid SENEC_SCHEMA' do |
68 | 68 | expect do |
69 | | - described_class.new(valid_local_options.merge(senec_schema: 'httpss')) |
| 69 | + described_class.new(**valid_local_options, senec_schema: 'httpss') |
70 | 70 | end.to raise_error(Exception, /URL is invalid/) |
71 | 71 | end |
72 | 72 |
|
73 | 73 | it 'limits SENEC_INTERVAL for local adapter' do |
74 | | - config = described_class.new(valid_local_options.merge(senec_adapter: :local, senec_interval: 1)) |
| 74 | + config = described_class.new(**valid_local_options, senec_adapter: :local, senec_interval: 1) |
75 | 75 |
|
76 | 76 | expect(config.senec_interval).to eq(5) |
77 | 77 | end |
78 | 78 |
|
79 | 79 | it 'limits SENEC_INTERVAL for cloud adapter' do |
80 | | - config = described_class.new(valid_cloud_options.merge(senec_adapter: :cloud, senec_interval: 1)) |
| 80 | + config = described_class.new(**valid_cloud_options, senec_adapter: :cloud, senec_interval: 1) |
81 | 81 |
|
82 | 82 | expect(config.senec_interval).to eq(60) |
83 | 83 | end |
|
86 | 86 | context 'when cloud' do |
87 | 87 | it 'raises an error for missing SENEC_USERNAME' do |
88 | 88 | expect do |
89 | | - described_class.new(valid_cloud_options.merge(senec_username: nil)) |
| 89 | + described_class.new(**valid_cloud_options, senec_username: nil) |
90 | 90 | end.to raise_error(Exception, /SENEC_USERNAME is missing/) |
91 | 91 | end |
92 | 92 |
|
93 | 93 | it 'raises an error for invalid SENEC_USERNAME' do |
94 | 94 | expect do |
95 | | - described_class.new(valid_cloud_options.merge(senec_username: 'foo')) |
| 95 | + described_class.new(**valid_cloud_options, senec_username: 'foo') |
96 | 96 | end.to raise_error(Exception, /SENEC_USERNAME is invalid/) |
97 | 97 | end |
98 | 98 |
|
99 | 99 | it 'raises an error for missing SENEC_PASSWORD' do |
100 | 100 | expect do |
101 | | - described_class.new(valid_cloud_options.merge(senec_password: nil)) |
| 101 | + described_class.new(**valid_cloud_options, senec_password: nil) |
102 | 102 | end.to raise_error(Exception, /SENEC_PASSWORD is missing/) |
103 | 103 | end |
104 | 104 |
|
105 | 105 | it 'raises an error for invalid SENEC_TOTP_URI' do |
106 | 106 | expect do |
107 | | - described_class.new(valid_cloud_options.merge(senec_totp_uri: 'this is not a URI')) |
| 107 | + described_class.new(**valid_cloud_options, senec_totp_uri: 'this is not a URI') |
108 | 108 | end.to raise_error(Exception, /SENEC_TOTP_URI is not a valid URI/) |
109 | 109 |
|
110 | 110 | expect do |
111 | | - described_class.new(valid_cloud_options.merge(senec_totp_uri: 'ftp://example.com')) |
| 111 | + described_class.new(**valid_cloud_options, senec_totp_uri: 'ftp://example.com') |
112 | 112 | end.to raise_error(Exception, %r{SENEC_TOTP_URI must start with otpauth://}) |
113 | 113 |
|
114 | 114 | expect do |
115 | | - described_class.new(valid_cloud_options.merge(senec_totp_uri: 'otpauth://totp/SENEC:mail%40example.com')) |
| 115 | + described_class.new(**valid_cloud_options, senec_totp_uri: 'otpauth://totp/SENEC:mail%40example.com') |
116 | 116 | end.to raise_error(Exception, /SENEC_TOTP_URI must contain a secret parameter/) |
117 | 117 | end |
118 | 118 |
|
|
125 | 125 | '&issuer=SENEC' \ |
126 | 126 | '&period=30' |
127 | 127 |
|
128 | | - config = described_class.new( |
129 | | - valid_cloud_options.merge(senec_totp_uri:), |
130 | | - ) |
| 128 | + config = described_class.new(**valid_cloud_options, senec_totp_uri:) |
131 | 129 |
|
132 | 130 | expect(config.senec_totp_uri).to eq(senec_totp_uri) |
133 | 131 | end |
|
136 | 134 |
|
137 | 135 | describe 'senec methods' do |
138 | 136 | context 'when local' do |
139 | | - subject(:config) { described_class.new(valid_local_options) } |
| 137 | + subject(:config) { described_class.new(**valid_local_options) } |
140 | 138 |
|
141 | 139 | it 'returns correct senec_adapter' do |
142 | 140 | expect(config.senec_adapter).to eq(:local) |
|
164 | 162 | end |
165 | 163 |
|
166 | 164 | context 'when cloud' do |
167 | | - subject(:config) { described_class.new(valid_cloud_options) } |
| 165 | + subject(:config) { described_class.new(**valid_cloud_options) } |
168 | 166 |
|
169 | 167 | it 'returns correct senec_adapter' do |
170 | 168 | expect(config.senec_adapter).to eq(:cloud) |
|
188 | 186 |
|
189 | 187 | context 'when senec_request_mode is minimal' do |
190 | 188 | subject(:config) do |
191 | | - described_class.new( |
192 | | - valid_cloud_options.merge(senec_request_mode: 'minimal'), |
193 | | - ) |
| 189 | + described_class.new(**valid_cloud_options, senec_request_mode: 'minimal') |
194 | 190 | end |
195 | 191 |
|
196 | 192 | it 'returns senec_request_mode as minimal' do |
|
200 | 196 |
|
201 | 197 | context 'when senec_request_mode is full' do |
202 | 198 | subject(:config) do |
203 | | - described_class.new( |
204 | | - valid_cloud_options.merge(senec_request_mode: 'full'), |
205 | | - ) |
| 199 | + described_class.new(**valid_cloud_options, senec_request_mode: 'full') |
206 | 200 | end |
207 | 201 |
|
208 | 202 | it 'returns senec_request_mode as full' do |
|
213 | 207 |
|
214 | 208 | context 'when ignoring single field' do |
215 | 209 | subject(:config) do |
216 | | - described_class.new( |
217 | | - valid_cloud_options.merge(senec_ignore: 'wallbox_charge_power'), |
218 | | - ) |
| 210 | + described_class.new(**valid_cloud_options, senec_ignore: 'wallbox_charge_power') |
219 | 211 | end |
220 | 212 |
|
221 | 213 | it 'returns senec_ignore with single element' do |
|
225 | 217 |
|
226 | 218 | context 'when ignoring multiple fields' do |
227 | 219 | subject(:config) do |
228 | | - described_class.new( |
229 | | - valid_cloud_options.merge(senec_ignore: 'wallbox_charge_power,house_power'), |
230 | | - ) |
| 220 | + described_class.new(**valid_cloud_options, senec_ignore: 'wallbox_charge_power,house_power') |
231 | 221 | end |
232 | 222 |
|
233 | 223 | it 'returns senec_ignore with multiple elements' do |
|
236 | 226 | end |
237 | 227 |
|
238 | 228 | context 'when ignoring non-existing field' do |
239 | | - subject(:config) { described_class.new(valid_cloud_options.merge(senec_ignore: 'foo')) } |
| 229 | + subject(:config) { described_class.new(**valid_cloud_options, senec_ignore: 'foo') } |
240 | 230 |
|
241 | 231 | it 'fails' do |
242 | 232 | expect { config.senec_ignore }.to raise_error(Exception, /SENEC_IGNORE contains unknown field: foo/) |
|
246 | 236 | context 'when senec_request_mode is invalid' do |
247 | 237 | it 'fails with invalid value' do |
248 | 238 | expect do |
249 | | - described_class.new( |
250 | | - valid_cloud_options.merge(senec_request_mode: 'invalid'), |
251 | | - ) |
| 239 | + described_class.new(**valid_cloud_options, senec_request_mode: 'invalid') |
252 | 240 | end.to raise_error(Exception, /SENEC_REQUEST_MODE is invalid: invalid/) |
253 | 241 | end |
254 | 242 | end |
255 | 243 |
|
256 | 244 | context 'when senec_request_mode is nil' do |
257 | 245 | subject(:config) do |
258 | | - described_class.new(valid_cloud_options.merge(senec_request_mode: nil)) |
| 246 | + described_class.new(**valid_cloud_options, senec_request_mode: nil) |
259 | 247 | end |
260 | 248 |
|
261 | 249 | it 'returns default senec_request_mode as minimal' do |
|
265 | 253 | end |
266 | 254 |
|
267 | 255 | describe 'influx methods' do |
268 | | - subject(:config) { described_class.new(valid_local_options) } |
| 256 | + subject(:config) { described_class.new(**valid_local_options) } |
269 | 257 |
|
270 | 258 | it 'returns correct influx_host' do |
271 | 259 | expect(config.influx_host).to eq('influx.example.com') |
|
0 commit comments