From a10a7eb8c6dbbe215b7823e14afce1e3343d7bcb Mon Sep 17 00:00:00 2001 From: Armin Date: Mon, 12 Jun 2017 14:12:26 +0200 Subject: [PATCH] #6828 port some tests to json-schema instead of self-made json matching Fixes #7419 --- .../spec/logstash/api/modules/logging_spec.rb | 20 +++++--- .../logstash/api/modules/node_plugins_spec.rb | 28 +++++++++-- .../spec/logstash/api/modules/node_spec.rb | 29 +++++------ .../logstash/api/modules/node_stats_spec.rb | 1 - .../spec/logstash/api/modules/plugins_spec.rb | 49 +++++++++++++++---- .../spec/logstash/api/modules/root_spec.rb | 1 - .../spec/logstash/api/rack_app_spec.rb | 3 +- 7 files changed, 93 insertions(+), 38 deletions(-) diff --git a/logstash-core/spec/logstash/api/modules/logging_spec.rb b/logstash-core/spec/logstash/api/modules/logging_spec.rb index 952cdf872..9d67a4fe1 100644 --- a/logstash-core/spec/logstash/api/modules/logging_spec.rb +++ b/logstash-core/spec/logstash/api/modules/logging_spec.rb @@ -1,8 +1,8 @@ # encoding: utf-8 require "spec_helper" +require "json-schema" require "sinatra" require "logstash/api/modules/logging" -require "logstash/json" describe LogStash::Api::Modules::Logging do include_context "api setup" @@ -12,20 +12,26 @@ describe LogStash::Api::Modules::Logging do context "when setting a logger's log level" do it "should return a positive acknowledgement on success" do put '/', '{"logger.logstash": "ERROR"}' - payload = LogStash::Json.load(last_response.body) - expect(payload['acknowledged']).to eq(true) + expect(JSON::Validator.fully_validate( + { "properties" => { "acknowledged" => { "enum" => [true] } } }, + last_response.body) + ).to be_empty end it "should throw error when level is invalid" do put '/', '{"logger.logstash": "invalid"}' - payload = LogStash::Json.load(last_response.body) - expect(payload['error']).to eq("invalid level[invalid] for logger[logstash]") + expect(JSON::Validator.fully_validate( + { "properties" => { "error" => { "enum" => ["invalid level[invalid] for logger[logstash]"] } } }, + last_response.body) + ).to be_empty end it "should throw error when key logger is invalid" do put '/', '{"invalid" : "ERROR"}' - payload = LogStash::Json.load(last_response.body) - expect(payload['error']).to eq("unrecognized option [invalid]") + expect(JSON::Validator.fully_validate( + { "properties" => { "error" => { "enum" => ["unrecognized option [invalid]"] } } }, + last_response.body) + ).to be_empty end end end diff --git a/logstash-core/spec/logstash/api/modules/node_plugins_spec.rb b/logstash-core/spec/logstash/api/modules/node_plugins_spec.rb index 4cfb30e5e..01eede56d 100644 --- a/logstash-core/spec/logstash/api/modules/node_plugins_spec.rb +++ b/logstash-core/spec/logstash/api/modules/node_plugins_spec.rb @@ -1,8 +1,8 @@ # encoding: utf-8 require "spec_helper" +require "json-schema" require "sinatra" require "logstash/api/modules/plugins" -require "logstash/json" describe LogStash::Api::Modules::Plugins do include_context "api setup" @@ -14,19 +14,37 @@ describe LogStash::Api::Modules::Plugins do get "/" end - let(:payload) { LogStash::Json.load(last_response.body) } - describe "retrieving plugins" do it "should return OK" do expect(last_response).to be_ok end it "should return a list of plugins" do - expect(payload["plugins"]).to be_a(Array) + expect(JSON::Validator.fully_validate( + { + "properties" => { + "plugins" => { + "type" => "array" + }, + "required" => ["plugins"] + } + }, + last_response.body) + ).to be_empty end it "should return the total number of plugins" do - expect(payload["total"]).to be_a(Numeric) + expect(JSON::Validator.fully_validate( + { + "properties" => { + "total" => { + "type" => "number" + }, + "required" => ["total"] + } + }, + last_response.body) + ).to be_empty end end end diff --git a/logstash-core/spec/logstash/api/modules/node_spec.rb b/logstash-core/spec/logstash/api/modules/node_spec.rb index d81c6bc82..0321e1056 100644 --- a/logstash-core/spec/logstash/api/modules/node_spec.rb +++ b/logstash-core/spec/logstash/api/modules/node_spec.rb @@ -1,8 +1,8 @@ # encoding: utf-8 require "spec_helper" +require "json-schema" require "sinatra" require "logstash/api/modules/node" -require "logstash/json" describe LogStash::Api::Modules::Node do include_context "api setup" @@ -19,7 +19,7 @@ describe LogStash::Api::Modules::Node do end it "should return a JSON object" do - expect{ LogStash::Json.load(last_response.body) }.not_to raise_error + expect(JSON::Validator.validate({}, last_response.body)).to eq(true) end context "#threads count" do @@ -28,14 +28,21 @@ describe LogStash::Api::Modules::Node do get "/hot_threads?threads=5" end - let(:payload) { LogStash::Json.load(last_response.body) } - it "should return a json payload content type" do expect(last_response.content_type).to eq("application/json") end it "should return information for <= # requested threads" do - expect(payload["hot_threads"]["threads"].count).to be <= 5 + expect(JSON::Validator.fully_validate( + { + "properties" => { + "hot_threads" => { + "properties" => { "threads" => { "type" => "array", "maxItems" => 5 } } + } + } + }, + last_response.body + )).to be_empty end end @@ -51,14 +58,12 @@ describe LogStash::Api::Modules::Node do get path end - let(:payload) { last_response.body } - it "should return a text/plain content type" do expect(last_response.content_type).to eq("text/plain;charset=utf-8") end it "should return a plain text payload" do - expect{ JSON.parse(payload) }.to raise_error + expect {JSON::Validator.fully_validate({}, payload)}.to raise_error end end end @@ -76,10 +81,8 @@ describe LogStash::Api::Modules::Node do @threads.each { |t| t.kill } rescue nil end - let(:payload) { last_response.body } - it "should return information for <= # requested threads" do - expect(payload.scan(/thread name/).size).to eq(2) + expect(last_response.body.scan(/thread name/).size).to eq(2) end end @@ -97,10 +100,8 @@ describe LogStash::Api::Modules::Node do expect(last_response.content_type).to eq("application/json") end - let(:payload) { last_response.body } - it "should return a json payload" do - expect{ JSON.parse(payload) }.not_to raise_error + expect(JSON::Validator.validate({}, last_response.body)).to eq(true) end end end diff --git a/logstash-core/spec/logstash/api/modules/node_stats_spec.rb b/logstash-core/spec/logstash/api/modules/node_stats_spec.rb index a6c9b5061..340c680f3 100644 --- a/logstash-core/spec/logstash/api/modules/node_stats_spec.rb +++ b/logstash-core/spec/logstash/api/modules/node_stats_spec.rb @@ -3,7 +3,6 @@ require "spec_helper" require "sinatra" require "logstash/api/modules/node_stats" -require "logstash/json" describe LogStash::Api::Modules::NodeStats do include_context "api setup" diff --git a/logstash-core/spec/logstash/api/modules/plugins_spec.rb b/logstash-core/spec/logstash/api/modules/plugins_spec.rb index 506633a14..265a7b2b9 100644 --- a/logstash-core/spec/logstash/api/modules/plugins_spec.rb +++ b/logstash-core/spec/logstash/api/modules/plugins_spec.rb @@ -1,5 +1,6 @@ # encoding: utf-8 require "spec_helper" +require "json-schema" require "sinatra" require "logstash/api/modules/plugins" require "logstash/json" @@ -12,8 +13,6 @@ describe LogStash::Api::Modules::Plugins do get "/" end - let(:payload) { LogStash::Json.load(last_response.body) } - it "respond to plugins resource" do expect(last_response).to be_ok end @@ -24,15 +23,31 @@ describe LogStash::Api::Modules::Plugins do context "#schema" do it "return the expected schema" do - expect(payload.keys).to include("plugins", "total") - payload["plugins"].each do |plugin| - expect(plugin.keys).to include("name", "version") - end + expect(JSON::Validator.fully_validate( + { + "properties" => { + "plugins" => { + "type" => "array", + "items" => [ + { + "type" => "object", + "required" => ["version", "name"] + } + ] + }, + "total" => { "type" => "number" } + }, + "required" => ["plugins", "total"] + }, + last_response.body) + ).to be_empty end end context "#values" do + let(:payload) { LogStash::Json.load(last_response.body) } + it "return totals of plugins" do expect(payload["total"]).to eq(payload["plugins"].count) end @@ -46,9 +61,25 @@ describe LogStash::Api::Modules::Plugins do end it "return non empty version values" do - payload["plugins"].each do |plugin| - expect(plugin["version"]).not_to be_empty - end + expect(JSON::Validator.fully_validate( + { "properties" => { "plugins" => { + "type" => "array", + "items" => [ + { + "type" => "object", + "properties" => { + "version" => { + "type" => "string", + "minLength" => 1 + } + }, + "required" => ["version"] + } + ], + "minItems" => 1 + } } }, + last_response.body) + ).to be_empty end end end diff --git a/logstash-core/spec/logstash/api/modules/root_spec.rb b/logstash-core/spec/logstash/api/modules/root_spec.rb index 88cac6d40..6c2d950b9 100644 --- a/logstash-core/spec/logstash/api/modules/root_spec.rb +++ b/logstash-core/spec/logstash/api/modules/root_spec.rb @@ -3,7 +3,6 @@ require "spec_helper" require "sinatra" require "logstash/api/modules/root" -require "logstash/json" describe LogStash::Api::Modules::Root do include_context "api setup" diff --git a/logstash-core/spec/logstash/api/rack_app_spec.rb b/logstash-core/spec/logstash/api/rack_app_spec.rb index 9c6af8679..5b31dc8c8 100644 --- a/logstash-core/spec/logstash/api/rack_app_spec.rb +++ b/logstash-core/spec/logstash/api/rack_app_spec.rb @@ -1,4 +1,5 @@ require "logstash/api/rack_app" +require "json-schema" require "rack/test" describe LogStash::Api::RackApp do @@ -55,7 +56,7 @@ describe LogStash::Api::RackApp do end it "should return valid JSON" do - expect { LogStash::Json.load(last_response.body) }.not_to raise_error + expect(JSON::Validator.validate({}, last_response.body)).to eq(true) end it "should log the error" do