|
13 | 13 | end |
14 | 14 | let(:esql_executor) { described_class.new(plugin, logger) } |
15 | 15 |
|
16 | | - describe "when initializes" do |
| 16 | + context "when initializes" do |
17 | 17 | it "sets up the ESQL client with correct parameters" do |
| 18 | + allow(logger).to receive(:debug) |
18 | 19 | expect(esql_executor.instance_variable_get(:@query)).to eq(plugin_config["query"]) |
19 | 20 | expect(esql_executor.instance_variable_get(:@named_params)).to eq([]) |
20 | | - expect(esql_executor.instance_variable_get(:@drop_null_columns)).to eq(false) |
21 | 21 | expect(esql_executor.instance_variable_get(:@fields)).to eq({}) |
22 | 22 | expect(esql_executor.instance_variable_get(:@tag_on_failure)).to eq(["_elasticsearch_lookup_failure"]) |
23 | 23 | end |
24 | 24 | end |
25 | 25 |
|
26 | | - describe "when processes" do |
| 26 | + context "when processes" do |
27 | 27 | let(:plugin_config) { |
28 | 28 | super() |
29 | 29 | .merge( |
30 | 30 | { |
31 | 31 | "query" => "FROM my-index | WHERE field = ?foo | LIMIT 5", |
32 | | - "query_params" => { "named_params" => [{ "foo" => "%{bar}" }] }, |
33 | | - "fields" => { "val" => "val_new" } |
| 32 | + "query_params" => { "named_params" => [{ "foo" => "[bar]" }] }, |
| 33 | + "fields" => { "val" => "val_new", "odd" => "new_odd" } |
34 | 34 | }) |
35 | 35 | } |
36 | 36 | let(:event) { LogStash::Event.new({}) } |
37 | | - let(:response) { { 'values' => [%w[foo bar]], 'columns' => [{ 'name' => 'id' }, { 'name' => 'val' }] } } |
| 37 | + let(:response) { { 'values' => [["foo", "bar", nil]], 'columns' => [{ 'name' => 'id' }, { 'name' => 'val' }, { 'name' => 'odd' }] } } |
38 | 38 |
|
39 | 39 | before do |
40 | | - allow(event).to receive(:sprintf).and_return("resolved_value") |
| 40 | + allow(logger).to receive(:debug) |
41 | 41 | end |
42 | 42 |
|
43 | 43 | it "resolves parameters" do |
44 | | - expect(event).to receive(:sprintf).with("%{bar}").and_return("resolved_value") |
| 44 | + expect(event).to receive(:get).with("[bar]").and_return("resolved_value") |
45 | 45 | resolved_params = esql_executor.send(:resolve_parameters, event) |
46 | 46 | expect(resolved_params).to include("foo" => "resolved_value") |
47 | 47 | end |
48 | 48 |
|
49 | 49 | it "executes the query with resolved parameters" do |
50 | 50 | allow(logger).to receive(:debug) |
| 51 | + expect(event).to receive(:get).with("[bar]").and_return("resolved_value") |
51 | 52 | expect(client).to receive(:search).with( |
52 | | - { body: { query: plugin_config["query"], params: [{ "foo" => "resolved_value" }] }, format: 'json', drop_null_columns: false, }, |
| 53 | + { body: { query: plugin_config["query"], params: [{ "foo" => "resolved_value" }] }, format: 'json', drop_null_columns: true, }, |
53 | 54 | 'esql') |
54 | 55 | resolved_params = esql_executor.send(:resolve_parameters, event) |
55 | 56 | esql_executor.send(:execute_query, client, resolved_params) |
|
62 | 63 | end |
63 | 64 |
|
64 | 65 | it "processes the response and adds metadata" do |
65 | | - expect(event).to receive(:set).with("[@metadata][total_values]", 1) |
| 66 | + expect(event).to receive(:set).with("[@metadata][total_hits]", 1) |
66 | 67 | expect(event).to receive(:set).with("val_new", "bar") |
67 | 68 | esql_executor.send(:process_response, event, response) |
68 | 69 | end |
|
73 | 74 | allow(response).to receive(:headers).and_return({}) |
74 | 75 | expect(client).to receive(:search).with( |
75 | 76 | { |
76 | | - body: { query: plugin_config["query"], params: plugin_config["query_params"]["named_params"] }, |
| 77 | + body: { query: plugin_config["query"], params: [{"foo"=>"resolve_me"}] }, |
77 | 78 | format: 'json', |
78 | | - drop_null_columns: false, |
| 79 | + drop_null_columns: true, |
79 | 80 | }, |
80 | 81 | 'esql' |
81 | 82 | ).and_return(response) |
82 | | - expect { esql_executor.process(client, LogStash::Event.new({ "hello" => "world" })) }.to_not raise_error |
| 83 | + |
| 84 | + event = LogStash::Event.new({ "hello" => "world", "bar" => "resolve_me" }) |
| 85 | + expect { esql_executor.process(client, event) }.to_not raise_error |
| 86 | + expect(event.get("[@metadata][total_hits]")).to eq(1) |
| 87 | + expect(event.get("hello")).to eq("world") |
| 88 | + expect(event.get("val_new")).to eq("bar") |
| 89 | + expect(event.get("new_odd")).to be_nil # filters out non-exist fields |
83 | 90 | end |
84 | 91 |
|
85 | 92 | it "tags on plugin failures" do |
86 | | - expect(event).to receive(:sprintf).with("%{bar}").and_raise("Event#sprintf error") |
| 93 | + expect(event).to receive(:get).with("[bar]").and_raise("Event#get Invalid FieldReference error") |
87 | 94 |
|
88 | | - expect(logger).to receive(:error).with("Failed to resolve parameter", {:error=>"Event#sprintf error", :key=>"foo", :value=>"%{bar}"}) |
| 95 | + expect(logger).to receive(:error).with("Failed to resolve parameter", {:error=>"Event#get Invalid FieldReference error", :key=>"foo", :value=>"[bar]"}) |
89 | 96 | expect(logger).to receive(:error).with("Failed to process ES|QL filter", exception: instance_of(RuntimeError)) |
90 | 97 | expect(event).to receive(:tag).with("_elasticsearch_lookup_failure") |
91 | 98 | esql_executor.process(client, event) |
|
0 commit comments