diff --git a/CHANGELOG b/CHANGELOG index c6caabe..1df0ff5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Allow WEBrick to simulate slow or dropped connections and to ease Ajax request inspection. [Tobie Langel] + * Ensure Ajax.Response#getHeader returns null for missing headers. [Tobie Langel] * Ensure $A creates an empty array when its argument's length is undefined. Closes #10574. [henryju, Tobie Langel] diff --git a/test/lib/jstest.rb b/test/lib/jstest.rb index 0a25bff..1ebe6b9 100644 --- a/test/lib/jstest.rb +++ b/test/lib/jstest.rb @@ -168,31 +168,103 @@ class ::WEBrick::HTTPServer # nop end end + class ::WEBrick::BasicLog def log(level, data) # nop end end -class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler - def do_GET(req, res) - super - - res['Content-Type'] = case req.path - when /\.js$/ then 'text/javascript' - when /\.html$/ then 'text/html' - when /\.css$/ then 'text/css' - else 'text/plain' - end - +class WEBrick::HTTPResponse + alias send send_response + def send_response(socket) + send(socket) unless fail_silently? + end + + def fail_silently? + @fail_silently + end + + def fail_silently + @fail_silently = true + end +end + +class WEBrick::HTTPRequest + def to_json + headers = [] + each { |k, v| headers.push "#{k.inspect}: #{v.inspect}" } + headers = "{" << headers.join(', ') << "}" + %({ "headers": #{headers}, "body": #{body.inspect}, "method": #{request_method.inspect} }) + end +end + +class WEBrick::HTTPServlet::AbstractServlet + def prevent_caching(res) res['ETag'] = nil res['Last-Modified'] = Time.now + 100**4 res['Cache-Control'] = 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0' res['Pragma'] = 'no-cache' res['Expires'] = Time.now - 100**4 end + + def set_default_content_type(res, path) + res['Content-Type'] = case path + when /\.js$/ then 'text/javascript' + when /\.html$/ then 'text/html' + when /\.css$/ then 'text/css' + else 'text/plain' + end + end end +class BasicServlet < WEBrick::HTTPServlet::AbstractServlet + def do_GET(req, res) + set_default_content_type(res, req.path) + prevent_caching(res) + + req.query.each do |k, v| + res[k] = v unless k == 'responseBody' + end + res.body = req.query["responseBody"] + + raise WEBrick::HTTPStatus::OK + end + + def do_POST(req, res) + do_GET(req, res) + end +end + +class SlowServlet < BasicServlet + def do_GET(req, res) + sleep(2) + super + end +end + +class DownServlet < BasicServlet + def do_GET(req, res) + res.fail_silently + end +end + +class InspectionServlet < BasicServlet + def do_GET(req, res) + prevent_caching(res) + res['Content-Type'] = "application/json" + res.body = req.to_json + raise WEBrick::HTTPStatus::OK + end +end + +class NonCachingFileHandler < WEBrick::HTTPServlet::FileHandler + def do_GET(req, res) + super + set_default_content_type(res, req.path) + prevent_caching(res) + end +end class JavaScriptTestTask < ::Rake::TaskLib @@ -213,13 +285,10 @@ class JavaScriptTestTask < ::Rake::TaskLib }) res.body = "OK" end - @server.mount_proc("/content-type") do |req, res| - res.body = req["content-type"] - end - @server.mount_proc("/response") do |req, res| - req.query.each {|k, v| res[k] = v unless k == 'responseBody'} - res.body = req.query["responseBody"] - end + @server.mount("/response", BasicServlet) + @server.mount("/slow", SlowServlet) + @server.mount("/down", DownServlet) + @server.mount("/inspect", InspectionServlet) yield self if block_given? define end diff --git a/test/unit/ajax.html b/test/unit/ajax.html index 7cf836f..051daab 100644 --- a/test/unit/ajax.html +++ b/test/unit/ajax.html @@ -230,11 +230,11 @@ testContentTypeSetForSimulatedVerbs: function() {with(this) { if (isRunningFromRake) { - new Ajax.Request('/content-type', extendDefault({ + new Ajax.Request('/inspect', extendDefault({ method: 'put', contentType: 'application/bogus', onComplete: function(response) { - assertEqual('application/bogus; charset=UTF-8', response.responseText); + assertEqual('application/bogus; charset=UTF-8', response.responseJSON.headers['content-type']); } })); } else {