diff --git a/Gemfile b/Gemfile index c668e4a..0b57a87 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,7 @@ source 'https://rubygems.org' group :test do gem 'rake' gem 'rspec' + gem 'coveralls' gem 'covered' end diff --git a/lib/nice_http.rb b/lib/nice_http.rb index 419bd2c..0ba7938 100644 --- a/lib/nice_http.rb +++ b/lib/nice_http.rb @@ -237,8 +237,8 @@ def initialize(args = {}) @logger.level = Logger::INFO self.class.log_files << log_filename if mode == 'w' rescue Exception => stack - raise InfoMissing, :log @logger = Logger.new nil + raise InfoMissing, :log end @@ -309,8 +309,9 @@ def close if conn.object_id == self.object_id found = true break + else + pos += 1 end - pos += 1 } if found self.class.connections.delete_at(pos) diff --git a/lib/nice_http/manage_request.rb b/lib/nice_http/manage_request.rb index 9f3f6c0..aee0043 100644 --- a/lib/nice_http/manage_request.rb +++ b/lib/nice_http/manage_request.rb @@ -103,10 +103,11 @@ def manage_request(*arguments) if data.kind_of?(String) if arguments[0].include?(:values_for) arguments[0][:values_for].each { |key, value| - data.gsub!(/(( *|^)"?#{key.to_s()}"? *: *")(.*)(" *, *$)/, '\1' + value + '\4') # "key":"value", or key:"value", - data.gsub!(/(( *|^)"?#{key.to_s()}"? *: *")(.*)(" *$)/, '\1' + value + '\4') # "key":"value" or key:"value" - data.gsub!(/(( *|^)"?#{key.to_s()}"? *: *[^"])([^"].*)([^"] *, *$)/, '\1' + value + '\4') # "key":456, or key:456, - data.gsub!(/(( *|^)"?#{key.to_s()}"? *: *[^"])([^"].*)([^"] * *$)/, '\1' + value + '\4') # "key":456 or key:456 + data.gsub!(/"(#{key})":\s*"([^"]*)"/,'"\1": "'+value+'"') # "key":"value" + data.gsub!(/(#{key}):\s*"([^"]*)"/,'\1: "'+value+'"') # key:"value" + data.gsub!(/(#{key}):\s*'([^']*)'/,'\1: \''+value+"'") # key:'value' + data.gsub!(/"(#{key})":\s*(\w+)/,'"\1": '+value) # "key":456 + data.gsub!(/(#{key}):\s*(\w+)/,'\1: '+value) # key:456 } end elsif data.kind_of?(Hash) diff --git a/nice_http.gemspec b/nice_http.gemspec index d60329c..d9dea55 100644 --- a/nice_http.gemspec +++ b/nice_http.gemspec @@ -13,7 +13,6 @@ Gem::Specification.new do |s| s.license = 'MIT' s.add_runtime_dependency 'nice_hash', '~> 1.9', '>= 1.9.0' s.add_development_dependency 'rspec', '~> 3.8', '>= 3.8.0' - s.add_development_dependency 'coveralls', '~> 0.8', '>= 0.8.22' s.test_files = s.files.grep(%r{^(test|spec|features)/}) s.require_paths = ["lib"] s.required_ruby_version = ['>= 2.4'] diff --git a/spec/nice_http/nice_http_post_spec.rb b/spec/nice_http/nice_http_post_spec.rb index 83e30c0..e534fa5 100644 --- a/spec/nice_http/nice_http_post_spec.rb +++ b/spec/nice_http/nice_http_post_spec.rb @@ -131,6 +131,78 @@ end + it 'changes data to empty string if data is nil' do + req = { + path: "/api/users", + data: nil + } + resp = @http.post req + expect(NiceHttp.last_request).to match /data=\s*$/ + end + + it 'accepts values as an alias for values_for' do + request = { + path: "/api/users", + data: { name: "morpheus", job: "leader" } + } + + request[:values] = {name: "peter"} + resp = @http.post(request) + expect(resp.code).to eq 201 + expect(resp.data.json(:name)).to eq 'peter' + end + + it 'change xml value when supplied values_for' do + request = { + path: "/api/users", + headers: {"Content-Type": "text/xml"}, + data: "morpheusleader" + } + + request.values_for = {name: "peter"} + resp = @http.post(request) + expect(NiceHttp.last_request).to match /name>peter/ + end + + it 'changes json string values when values_for supplied and json is a string' do + request = { + path: "/api/users", + headers: {"Content-Type": "application/json"}, + data: '{"name": "morpheus","job": "leader"}' + } + request.values_for = {name: "peter"} + resp = @http.post(request) + expect(NiceHttp.last_request).to match /"name": "peter"/ + end + + it 'accepts an array as data' do + request = { + path: "/api/users", + headers: {"Content-Type": "application/json"}, + data: [ + {name: 'morpheus', job: 'leader'}, + {name: 'peter', job: 'vicepresident'} + ] + } + resp = @http.post(request) + expect(resp.code).to eq 201 + expect(resp.data.json(:name)).to eq ['morpheus','peter'] + end + + it 'changes all values on array request when values_for' do + request = { + path: "/api/users", + headers: {"Content-Type": "application/json"}, + data: [ + {name: 'morpheus', job: 'leader'}, + {name: 'peter', job: 'vicepresident'} + ] + } + request.values_for = {job: ['dev','cleaner']} + resp = @http.post(request) + expect(resp.code).to eq 201 + expect(resp.data.json(:job)).to eq ['dev','cleaner'] + end #todo: add tests encoding and cookies diff --git a/spec/nice_http/nice_http_spec.rb b/spec/nice_http/nice_http_spec.rb index e24b1a9..f2fee1f 100644 --- a/spec/nice_http/nice_http_spec.rb +++ b/spec/nice_http/nice_http_spec.rb @@ -308,6 +308,7 @@ expect(klass.connections.size).to eq 1 expect(klass.connections[0]).to eq http2 end + end describe 'log files' do @@ -347,6 +348,31 @@ files = Dir["./*.log"] expect(files.size).to eq 0 end + + it "raises error if log file not possible to be created" do + Dir.glob('./*.log').each { |file| File.delete(file)} + klass.log = "./" + klass.new("https://example.com") rescue err = $ERROR_INFO + expect(err.class).to eq NiceHttp::InfoMissing + expect(err.attribute).to eq :log + expect(err.message).to match /wrong log/i + end + + it "doesn't create any log file when exception on creating" do + klass.log = "./" + klass.new("https://example.com") rescue err = $ERROR_INFO + files = Dir["./*.log"] + expect(files.size).to eq 0 + end + + it 'cannot close a connection that is already closed' do + http = klass.new("https://example.com") + http.close + http.close + content = File.read('./nice_http.log') + expect(content).to match /It was not possible to close the HTTP connection, already closed/ + end + end describe 'proxys' do