fluent-plugin-elasticsearch-sm 1.4.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.
data/test/helper.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'simplecov'
2
+ SimpleCov.start do
3
+ add_filter do |src|
4
+ !(src.filename =~ /^#{SimpleCov.root}\/lib/)
5
+ end
6
+ end
7
+
8
+ require 'coveralls'
9
+ Coveralls.wear!
10
+
11
+ # needs to be after simplecov but before test/unit, because fluentd sets default
12
+ # encoding to ASCII-8BIT, but coverall might load git data which could contain a
13
+ # UTF-8 character
14
+ at_exit do
15
+ Encoding.default_internal = 'UTF-8' if defined?(Encoding) && Encoding.respond_to?(:default_internal)
16
+ Encoding.default_external = 'UTF-8' if defined?(Encoding) && Encoding.respond_to?(:default_external)
17
+ end
18
+
19
+ require 'test/unit'
20
+ require 'fluent/test'
21
+ require 'minitest/pride'
22
+
23
+ require 'webmock/test_unit'
24
+ WebMock.disable_net_connect!
@@ -0,0 +1,636 @@
1
+ require 'helper'
2
+ require 'date'
3
+
4
+ class ElasticsearchOutput < Test::Unit::TestCase
5
+ attr_accessor :index_cmds, :index_command_counts
6
+
7
+ def setup
8
+ Fluent::Test.setup
9
+ require 'fluent/plugin/out_elasticsearch'
10
+ @driver = nil
11
+ log = Fluent::Engine.log
12
+ log.out.logs.slice!(0, log.out.logs.length)
13
+ end
14
+
15
+ def driver(tag='test', conf='')
16
+ @driver ||= Fluent::Test::BufferedOutputTestDriver.new(Fluent::ElasticsearchOutput, tag).configure(conf)
17
+ end
18
+
19
+ def sample_record
20
+ {'age' => 26, 'request_id' => '42', 'parent_id' => 'parent', 'routing_id' => 'routing'}
21
+ end
22
+
23
+ def stub_elastic_ping(url="http://localhost:9200")
24
+ stub_request(:head, url).to_return(:status => 200, :body => "", :headers => {})
25
+ end
26
+
27
+ def stub_elastic(url="http://localhost:9200/_bulk")
28
+ stub_request(:post, url).with do |req|
29
+ @index_cmds = req.body.split("\n").map {|r| JSON.parse(r) }
30
+ end
31
+ end
32
+
33
+ def stub_elastic_unavailable(url="http://localhost:9200/_bulk")
34
+ stub_request(:post, url).to_return(:status => [503, "Service Unavailable"])
35
+ end
36
+
37
+ def stub_elastic_with_store_index_command_counts(url="http://localhost:9200/_bulk")
38
+ if @index_command_counts == nil
39
+ @index_command_counts = {}
40
+ @index_command_counts.default = 0
41
+ end
42
+
43
+ stub_request(:post, url).with do |req|
44
+ index_cmds = req.body.split("\n").map {|r| JSON.parse(r) }
45
+ @index_command_counts[url] += index_cmds.size
46
+ end
47
+ end
48
+
49
+ def test_configure
50
+ config = %{
51
+ host logs.google.com
52
+ port 777
53
+ scheme https
54
+ path /es/
55
+ user john
56
+ password doe
57
+ }
58
+ instance = driver('test', config).instance
59
+
60
+ assert_equal 'logs.google.com', instance.host
61
+ assert_equal 777, instance.port
62
+ assert_equal 'https', instance.scheme
63
+ assert_equal '/es/', instance.path
64
+ assert_equal 'john', instance.user
65
+ assert_equal 'doe', instance.password
66
+ end
67
+
68
+ def test_legacy_hosts_list
69
+ config = %{
70
+ hosts host1:50,host2:100,host3
71
+ scheme https
72
+ path /es/
73
+ port 123
74
+ }
75
+ instance = driver('test', config).instance
76
+
77
+ assert_equal 3, instance.get_connection_options[:hosts].length
78
+ host1, host2, host3 = instance.get_connection_options[:hosts]
79
+
80
+ assert_equal 'host1', host1[:host]
81
+ assert_equal 50, host1[:port]
82
+ assert_equal 'https', host1[:scheme]
83
+ assert_equal '/es/', host2[:path]
84
+ assert_equal 'host3', host3[:host]
85
+ assert_equal 123, host3[:port]
86
+ assert_equal 'https', host3[:scheme]
87
+ assert_equal '/es/', host3[:path]
88
+ end
89
+
90
+ def test_hosts_list
91
+ config = %{
92
+ hosts https://john:password@host1:443/elastic/,http://host2
93
+ path /default_path
94
+ user default_user
95
+ password default_password
96
+ }
97
+ instance = driver('test', config).instance
98
+
99
+ assert_equal 2, instance.get_connection_options[:hosts].length
100
+ host1, host2 = instance.get_connection_options[:hosts]
101
+
102
+ assert_equal 'host1', host1[:host]
103
+ assert_equal 443, host1[:port]
104
+ assert_equal 'https', host1[:scheme]
105
+ assert_equal 'john', host1[:user]
106
+ assert_equal 'password', host1[:password]
107
+ assert_equal '/elastic/', host1[:path]
108
+
109
+ assert_equal 'host2', host2[:host]
110
+ assert_equal 'http', host2[:scheme]
111
+ assert_equal 'default_user', host2[:user]
112
+ assert_equal 'default_password', host2[:password]
113
+ assert_equal '/default_path', host2[:path]
114
+ end
115
+
116
+ def test_single_host_params_and_defaults
117
+ config = %{
118
+ host logs.google.com
119
+ user john
120
+ password doe
121
+ }
122
+ instance = driver('test', config).instance
123
+
124
+ assert_equal 1, instance.get_connection_options[:hosts].length
125
+ host1 = instance.get_connection_options[:hosts][0]
126
+
127
+ assert_equal 'logs.google.com', host1[:host]
128
+ assert_equal 9200, host1[:port]
129
+ assert_equal 'http', host1[:scheme]
130
+ assert_equal 'john', host1[:user]
131
+ assert_equal 'doe', host1[:password]
132
+ assert_equal nil, host1[:path]
133
+ end
134
+
135
+ def test_writes_to_default_index
136
+ stub_elastic_ping
137
+ stub_elastic
138
+ driver.emit(sample_record)
139
+ driver.run
140
+ assert_equal('fluentd', index_cmds.first['index']['_index'])
141
+ end
142
+
143
+ def test_writes_to_default_type
144
+ stub_elastic_ping
145
+ stub_elastic
146
+ driver.emit(sample_record)
147
+ driver.run
148
+ assert_equal('fluentd', index_cmds.first['index']['_type'])
149
+ end
150
+
151
+ def test_writes_to_speficied_index
152
+ driver.configure("index_name myindex\n")
153
+ stub_elastic_ping
154
+ stub_elastic
155
+ driver.emit(sample_record)
156
+ driver.run
157
+ assert_equal('myindex', index_cmds.first['index']['_index'])
158
+ end
159
+
160
+ def test_writes_to_target_index_key
161
+ driver.configure("target_index_key @target_index\n")
162
+ stub_elastic_ping
163
+ stub_elastic
164
+ record = sample_record.clone
165
+ driver.emit(sample_record.merge('@target_index' => 'local-override'))
166
+ driver.run
167
+ assert_equal('local-override', index_cmds.first['index']['_index'])
168
+ assert_nil(index_cmds[1]['@target_index'])
169
+ end
170
+
171
+ def test_writes_to_target_index_key_logstash
172
+ driver.configure("target_index_key @target_index\n")
173
+ driver.configure("logstash_format true\n")
174
+ time = Time.parse Date.today.to_s
175
+ stub_elastic_ping
176
+ stub_elastic
177
+ driver.emit(sample_record.merge('@target_index' => 'local-override'), time)
178
+ driver.run
179
+ assert_equal('local-override', index_cmds.first['index']['_index'])
180
+ end
181
+
182
+ def test_writes_to_target_index_key_fallack
183
+ driver.configure("target_index_key @target_index\n")
184
+ stub_elastic_ping
185
+ stub_elastic
186
+ driver.emit(sample_record)
187
+ driver.run
188
+ assert_equal('fluentd', index_cmds.first['index']['_index'])
189
+ end
190
+
191
+ def test_writes_to_target_index_key_fallack_logstash
192
+ driver.configure("target_index_key @target_index\n")
193
+ driver.configure("logstash_format true\n")
194
+ time = Time.parse Date.today.to_s
195
+ logstash_index = "logstash-#{time.getutc.strftime("%Y.%m.%d")}"
196
+ stub_elastic_ping
197
+ stub_elastic
198
+ driver.emit(sample_record, time)
199
+ driver.run
200
+ assert_equal(logstash_index, index_cmds.first['index']['_index'])
201
+ end
202
+
203
+ def test_writes_to_speficied_type
204
+ driver.configure("type_name mytype\n")
205
+ stub_elastic_ping
206
+ stub_elastic
207
+ driver.emit(sample_record)
208
+ driver.run
209
+ assert_equal('mytype', index_cmds.first['index']['_type'])
210
+ end
211
+
212
+ def test_writes_to_speficied_host
213
+ driver.configure("host 192.168.33.50\n")
214
+ stub_elastic_ping("http://192.168.33.50:9200")
215
+ elastic_request = stub_elastic("http://192.168.33.50:9200/_bulk")
216
+ driver.emit(sample_record)
217
+ driver.run
218
+ assert_requested(elastic_request)
219
+ end
220
+
221
+ def test_writes_to_speficied_port
222
+ driver.configure("port 9201\n")
223
+ stub_elastic_ping("http://localhost:9201")
224
+ elastic_request = stub_elastic("http://localhost:9201/_bulk")
225
+ driver.emit(sample_record)
226
+ driver.run
227
+ assert_requested(elastic_request)
228
+ end
229
+
230
+ def test_writes_to_multi_hosts
231
+ hosts = [['192.168.33.50', 9201], ['192.168.33.51', 9201], ['192.168.33.52', 9201]]
232
+ hosts_string = hosts.map {|x| "#{x[0]}:#{x[1]}"}.compact.join(',')
233
+
234
+ driver.configure("hosts #{hosts_string}")
235
+
236
+ hosts.each do |host_info|
237
+ host, port = host_info
238
+ stub_elastic_ping("http://#{host}:#{port}")
239
+ stub_elastic_with_store_index_command_counts("http://#{host}:#{port}/_bulk")
240
+ end
241
+
242
+ 1000.times do
243
+ driver.emit(sample_record.merge('age'=>rand(100)))
244
+ end
245
+
246
+ driver.run
247
+
248
+ # @note: we cannot make multi chunks with options (flush_interval, buffer_chunk_limit)
249
+ # it's Fluentd test driver's constraint
250
+ # so @index_command_counts.size is always 1
251
+
252
+ assert(@index_command_counts.size > 0, "not working with hosts options")
253
+
254
+ total = 0
255
+ @index_command_counts.each do |url, count|
256
+ total += count
257
+ end
258
+ assert_equal(2000, total)
259
+ end
260
+
261
+ def test_makes_bulk_request
262
+ stub_elastic_ping
263
+ stub_elastic
264
+ driver.emit(sample_record)
265
+ driver.emit(sample_record.merge('age' => 27))
266
+ driver.run
267
+ assert_equal(4, index_cmds.count)
268
+ end
269
+
270
+ def test_all_records_are_preserved_in_bulk
271
+ stub_elastic_ping
272
+ stub_elastic
273
+ driver.emit(sample_record)
274
+ driver.emit(sample_record.merge('age' => 27))
275
+ driver.run
276
+ assert_equal(26, index_cmds[1]['age'])
277
+ assert_equal(27, index_cmds[3]['age'])
278
+ end
279
+
280
+ def test_writes_to_logstash_index
281
+ driver.configure("logstash_format true\n")
282
+ #
283
+ # This is 1 second past midnight in BST, so the UTC index should be the day before
284
+ dt = DateTime.new(2015, 6, 1, 0, 0, 1, "+01:00")
285
+ logstash_index = "logstash-2015.05.31"
286
+ stub_elastic_ping
287
+ stub_elastic
288
+ driver.emit(sample_record, dt.to_time)
289
+ driver.run
290
+ assert_equal(logstash_index, index_cmds.first['index']['_index'])
291
+ end
292
+
293
+ def test_writes_to_logstash_non_utc_index
294
+ driver.configure("logstash_format true
295
+ utc_index false")
296
+ # When using `utc_index false` the index time will be the local day of
297
+ # ingestion time
298
+ time = Date.today.to_time
299
+ index = "logstash-#{time.strftime("%Y.%m.%d")}"
300
+ stub_elastic_ping
301
+ stub_elastic
302
+ driver.emit(sample_record, time)
303
+ driver.run
304
+ assert_equal(index, index_cmds.first['index']['_index'])
305
+ end
306
+
307
+ def test_writes_to_logstash_index_with_specified_prefix
308
+ driver.configure("logstash_format true
309
+ logstash_prefix myprefix")
310
+ time = Time.parse Date.today.to_s
311
+ logstash_index = "myprefix-#{time.getutc.strftime("%Y.%m.%d")}"
312
+ stub_elastic_ping
313
+ stub_elastic
314
+ driver.emit(sample_record, time)
315
+ driver.run
316
+ assert_equal(logstash_index, index_cmds.first['index']['_index'])
317
+ end
318
+
319
+ def test_writes_to_logstash_index_with_specified_dateformat
320
+ driver.configure("logstash_format true
321
+ logstash_dateformat %Y.%m")
322
+ time = Time.parse Date.today.to_s
323
+ logstash_index = "logstash-#{time.getutc.strftime("%Y.%m")}"
324
+ stub_elastic_ping
325
+ stub_elastic
326
+ driver.emit(sample_record, time)
327
+ driver.run
328
+ assert_equal(logstash_index, index_cmds.first['index']['_index'])
329
+ end
330
+
331
+ def test_writes_to_logstash_index_with_specified_prefix_and_dateformat
332
+ driver.configure("logstash_format true
333
+ logstash_prefix myprefix
334
+ logstash_dateformat %Y.%m")
335
+ time = Time.parse Date.today.to_s
336
+ logstash_index = "myprefix-#{time.getutc.strftime("%Y.%m")}"
337
+ stub_elastic_ping
338
+ stub_elastic
339
+ driver.emit(sample_record, time)
340
+ driver.run
341
+ assert_equal(logstash_index, index_cmds.first['index']['_index'])
342
+ end
343
+
344
+ def test_doesnt_add_logstash_timestamp_by_default
345
+ stub_elastic_ping
346
+ stub_elastic
347
+ driver.emit(sample_record)
348
+ driver.run
349
+ assert_nil(index_cmds[1]['@timestamp'])
350
+ end
351
+
352
+ def test_adds_logstash_timestamp_when_configured
353
+ driver.configure("logstash_format true\n")
354
+ stub_elastic_ping
355
+ stub_elastic
356
+ ts = DateTime.now.to_s
357
+ driver.emit(sample_record)
358
+ driver.run
359
+ assert(index_cmds[1].has_key? '@timestamp')
360
+ assert_equal(index_cmds[1]['@timestamp'], ts)
361
+ end
362
+
363
+ def test_uses_custom_timestamp_when_included_in_record
364
+ driver.configure("logstash_format true\n")
365
+ stub_elastic_ping
366
+ stub_elastic
367
+ ts = DateTime.new(2001,2,3).to_s
368
+ driver.emit(sample_record.merge!('@timestamp' => ts))
369
+ driver.run
370
+ assert(index_cmds[1].has_key? '@timestamp')
371
+ assert_equal(index_cmds[1]['@timestamp'], ts)
372
+ end
373
+
374
+ def test_uses_custom_time_key
375
+ driver.configure("logstash_format true
376
+ time_key vtm\n")
377
+ stub_elastic_ping
378
+ stub_elastic
379
+ ts = DateTime.new(2001,2,3).to_s
380
+ driver.emit(sample_record.merge!('vtm' => ts))
381
+ driver.run
382
+ assert(index_cmds[1].has_key? '@timestamp')
383
+ assert_equal(index_cmds[1]['@timestamp'], ts)
384
+ end
385
+
386
+ def test_uses_custom_time_key_exclude_timekey
387
+ driver.configure("logstash_format true
388
+ time_key vtm
389
+ time_key_exclude_timestamp true\n")
390
+ stub_elastic_ping
391
+ stub_elastic
392
+ ts = DateTime.new(2001,2,3).to_s
393
+ driver.emit(sample_record.merge!('vtm' => ts))
394
+ driver.run
395
+ assert(!index_cmds[1].key?('@timestamp'), '@timestamp should be messing')
396
+ end
397
+
398
+ def test_uses_custom_time_key_format
399
+ driver.configure("logstash_format true
400
+ time_key_format %Y-%m-%dT%H:%M:%S.%N%z\n")
401
+ stub_elastic_ping
402
+ stub_elastic
403
+ ts = "2001-02-03T13:14:01.673+02:00"
404
+ driver.emit(sample_record.merge!('@timestamp' => ts))
405
+ driver.run
406
+ assert_equal("logstash-2001.02.03", index_cmds[0]['index']['_index'])
407
+ assert(index_cmds[1].has_key? '@timestamp')
408
+ assert_equal(index_cmds[1]['@timestamp'], ts)
409
+ end
410
+
411
+ def test_uses_custom_time_key_format_logs_an_error
412
+ driver.configure("logstash_format true
413
+ time_key_format %Y-%m-%dT%H:%M:%S.%N%z\n")
414
+ stub_elastic_ping
415
+ stub_elastic
416
+
417
+ ts = "2001/02/03 13:14:01,673+02:00"
418
+ index = "logstash-#{Date.today.strftime("%Y.%m.%d")}"
419
+
420
+ driver.emit(sample_record.merge!('@timestamp' => ts))
421
+ driver.run
422
+
423
+ log = driver.instance.router.emit_error_handler.log
424
+ errors = log.out.logs.grep /tag="Fluent::ElasticsearchOutput::TimeParser.error"/
425
+ assert_equal(1, errors.length, "Error was logged for timestamp parse failure")
426
+
427
+ assert_equal(index, index_cmds[0]['index']['_index'])
428
+ assert(index_cmds[1].has_key? '@timestamp')
429
+ assert_equal(index_cmds[1]['@timestamp'], ts)
430
+ end
431
+
432
+
433
+ def test_uses_custom_time_key_format_obscure_format
434
+ driver.configure("logstash_format true
435
+ time_key_format %a %b %d %H:%M:%S %Z %Y\n")
436
+ stub_elastic_ping
437
+ stub_elastic
438
+ ts = "Thu Nov 29 14:33:20 GMT 2001"
439
+ driver.emit(sample_record.merge!('@timestamp' => ts))
440
+ driver.run
441
+ assert_equal("logstash-2001.11.29", index_cmds[0]['index']['_index'])
442
+ assert(index_cmds[1].has_key? '@timestamp')
443
+ assert_equal(index_cmds[1]['@timestamp'], ts)
444
+ end
445
+
446
+ def test_doesnt_add_tag_key_by_default
447
+ stub_elastic_ping
448
+ stub_elastic
449
+ driver.emit(sample_record)
450
+ driver.run
451
+ assert_nil(index_cmds[1]['tag'])
452
+ end
453
+
454
+ def test_adds_tag_key_when_configured
455
+ driver('mytag').configure("include_tag_key true\n")
456
+ stub_elastic_ping
457
+ stub_elastic
458
+ driver.emit(sample_record)
459
+ driver.run
460
+ assert(index_cmds[1].has_key?('tag'))
461
+ assert_equal(index_cmds[1]['tag'], 'mytag')
462
+ end
463
+
464
+ def test_adds_id_key_when_configured
465
+ driver.configure("id_key request_id\n")
466
+ stub_elastic_ping
467
+ stub_elastic
468
+ driver.emit(sample_record)
469
+ driver.run
470
+ assert_equal(index_cmds[0]['index']['_id'], '42')
471
+ end
472
+
473
+ def test_doesnt_add_id_key_if_missing_when_configured
474
+ driver.configure("id_key another_request_id\n")
475
+ stub_elastic_ping
476
+ stub_elastic
477
+ driver.emit(sample_record)
478
+ driver.run
479
+ assert(!index_cmds[0]['index'].has_key?('_id'))
480
+ end
481
+
482
+ def test_adds_id_key_when_not_configured
483
+ stub_elastic_ping
484
+ stub_elastic
485
+ driver.emit(sample_record)
486
+ driver.run
487
+ assert(!index_cmds[0]['index'].has_key?('_id'))
488
+ end
489
+
490
+ def test_adds_parent_key_when_configured
491
+ driver.configure("parent_key parent_id\n")
492
+ stub_elastic_ping
493
+ stub_elastic
494
+ driver.emit(sample_record)
495
+ driver.run
496
+ assert_equal(index_cmds[0]['index']['_parent'], 'parent')
497
+ end
498
+
499
+ def test_doesnt_add_parent_key_if_missing_when_configured
500
+ driver.configure("parent_key another_parent_id\n")
501
+ stub_elastic_ping
502
+ stub_elastic
503
+ driver.emit(sample_record)
504
+ driver.run
505
+ assert(!index_cmds[0]['index'].has_key?('_parent'))
506
+ end
507
+
508
+ def test_adds_parent_key_when_not_configured
509
+ stub_elastic_ping
510
+ stub_elastic
511
+ driver.emit(sample_record)
512
+ driver.run
513
+ assert(!index_cmds[0]['index'].has_key?('_parent'))
514
+ end
515
+
516
+ def test_adds_routing_key_when_configured
517
+ driver.configure("routing_key routing_id\n")
518
+ stub_elastic_ping
519
+ stub_elastic
520
+ driver.emit(sample_record)
521
+ driver.run
522
+ assert_equal(index_cmds[0]['index']['_routing'], 'routing')
523
+ end
524
+
525
+ def test_doesnt_add_routing_key_if_missing_when_configured
526
+ driver.configure("routing_key another_routing_id\n")
527
+ stub_elastic_ping
528
+ stub_elastic
529
+ driver.emit(sample_record)
530
+ driver.run
531
+ assert(!index_cmds[0]['index'].has_key?('_routing'))
532
+ end
533
+
534
+ def test_adds_routing_key_when_not_configured
535
+ stub_elastic_ping
536
+ stub_elastic
537
+ driver.emit(sample_record)
538
+ driver.run
539
+ assert(!index_cmds[0]['index'].has_key?('_routing'))
540
+ end
541
+
542
+ def test_request_error
543
+ stub_elastic_ping
544
+ stub_elastic_unavailable
545
+ driver.emit(sample_record)
546
+ assert_raise(Elasticsearch::Transport::Transport::Errors::ServiceUnavailable) {
547
+ driver.run
548
+ }
549
+ end
550
+
551
+ def test_garbage_record_error
552
+ stub_elastic_ping
553
+ stub_elastic
554
+ driver.emit("some garbage string")
555
+ driver.run
556
+ end
557
+
558
+ def test_connection_failed_retry
559
+ connection_resets = 0
560
+
561
+ stub_elastic_ping(url="http://localhost:9200").with do |req|
562
+ connection_resets += 1
563
+ end
564
+
565
+ stub_request(:post, "http://localhost:9200/_bulk").with do |req|
566
+ raise Faraday::ConnectionFailed, "Test message"
567
+ end
568
+
569
+ driver.emit(sample_record)
570
+
571
+ assert_raise(Fluent::ElasticsearchOutput::ConnectionFailure) {
572
+ driver.run
573
+ }
574
+ assert_equal(connection_resets, 3)
575
+ end
576
+
577
+ def test_update_should_not_write_if_theres_no_id
578
+ driver.configure("write_operation update\n")
579
+ stub_elastic_ping
580
+ stub_elastic
581
+ driver.emit(sample_record)
582
+ driver.run
583
+ assert_nil(index_cmds)
584
+ end
585
+
586
+ def test_upsert_should_not_write_if_theres_no_id
587
+ driver.configure("write_operation upsert\n")
588
+ stub_elastic_ping
589
+ stub_elastic
590
+ driver.emit(sample_record)
591
+ driver.run
592
+ assert_nil(index_cmds)
593
+ end
594
+
595
+ def test_create_should_not_write_if_theres_no_id
596
+ driver.configure("write_operation create\n")
597
+ stub_elastic_ping
598
+ stub_elastic
599
+ driver.emit(sample_record)
600
+ driver.run
601
+ assert_nil(index_cmds)
602
+ end
603
+
604
+ def test_update_should_write_update_op_and_doc_as_upsert_is_false
605
+ driver.configure("write_operation update
606
+ id_key request_id")
607
+ stub_elastic_ping
608
+ stub_elastic
609
+ driver.emit(sample_record)
610
+ driver.run
611
+ assert(index_cmds[0].has_key?("update"))
612
+ assert(!index_cmds[1]["doc_as_upsert"])
613
+ end
614
+
615
+ def test_upsert_should_write_update_op_and_doc_as_upsert_is_true
616
+ driver.configure("write_operation upsert
617
+ id_key request_id")
618
+ stub_elastic_ping
619
+ stub_elastic
620
+ driver.emit(sample_record)
621
+ driver.run
622
+ assert(index_cmds[0].has_key?("update"))
623
+ assert(index_cmds[1]["doc_as_upsert"])
624
+ end
625
+
626
+ def test_create_should_write_create_op
627
+ driver.configure("write_operation create
628
+ id_key request_id")
629
+ stub_elastic_ping
630
+ stub_elastic
631
+ driver.emit(sample_record)
632
+ driver.run
633
+ assert(index_cmds[0].has_key?("create"))
634
+ end
635
+
636
+ end