mirror of
https://github.com/zhigang1992/RestKit.git
synced 2026-03-30 23:24:06 +08:00
337 lines
7.4 KiB
Ruby
Executable File
337 lines
7.4 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
# RestKit Test Server
|
|
|
|
require 'rubygems'
|
|
require 'bundler/setup'
|
|
require 'sinatra/base'
|
|
require 'json'
|
|
begin
|
|
require 'ruby-debug'
|
|
Debugger.start
|
|
rescue LoadError
|
|
# No debugging...
|
|
end
|
|
|
|
# Import the RestKit Test server
|
|
$: << File.join(File.expand_path(File.dirname(__FILE__)), 'lib')
|
|
require File.expand_path(File.dirname(__FILE__)) + '/fixtures'
|
|
require 'restkit/network/authentication'
|
|
require 'restkit/network/etags'
|
|
require 'restkit/network/timeout'
|
|
require 'restkit/network/redirection'
|
|
|
|
class Person < Struct.new(:name, :age)
|
|
def to_json(*args)
|
|
{:name => name, :age => age}.to_json
|
|
end
|
|
end
|
|
|
|
class RestKitTestServer < Sinatra::Base
|
|
self.app_file = __FILE__
|
|
|
|
configure do
|
|
enable :logging, :dump_errors
|
|
set :public_folder, Proc.new { File.expand_path(File.join(root, '../Fixtures')) }
|
|
set :uploads_path, Proc.new { File.expand_path(File.join(root, '../Fixtures/Uploads')) }
|
|
end
|
|
|
|
use RestKit::Network::Authentication
|
|
use RestKit::Network::ETags
|
|
use RestKit::Network::Timeout
|
|
use RestKit::Network::Redirection
|
|
|
|
def render_fixture(path, options = {})
|
|
send_file File.join(settings.public_folder, path), options
|
|
end
|
|
|
|
get '/' do
|
|
content_type 'application/json'
|
|
{'status' => 'ok'}.to_json
|
|
end
|
|
|
|
post '/photo' do
|
|
content_type 'application/json'
|
|
"OK"
|
|
end
|
|
|
|
get '/errors.json' do
|
|
content_type 'application/json'
|
|
render_fixture('/JSON/errors.json', :status => 400)
|
|
end
|
|
|
|
post '/humans' do
|
|
status 201
|
|
content_type 'application/json'
|
|
{:human => {:name => "My Name", :id => 1, :website => "http://restkit.org/"}}.to_json
|
|
end
|
|
|
|
post '/humans/fail' do
|
|
content_type 'application/json'
|
|
render_fixture('/JSON/errors.json', :status => 500)
|
|
end
|
|
|
|
get '/humans/1' do
|
|
etag('2cdd0a2b329541d81e82ab20aff6281b')
|
|
status 200
|
|
content_type 'application/json'
|
|
{:human => {:name => "Blake Watters", :id => 1}}.merge(params).to_json
|
|
end
|
|
|
|
delete '/humans/1' do
|
|
status 200
|
|
content_type 'application/json'
|
|
"{}"
|
|
end
|
|
|
|
delete '/humans/204' do
|
|
status 204
|
|
content_type 'application/json'
|
|
end
|
|
|
|
delete '/humans/empty' do
|
|
status 200
|
|
content_type 'application/json'
|
|
""
|
|
end
|
|
|
|
delete '/humans/success' do
|
|
status 200
|
|
content_type 'application/json'
|
|
{:human => {:status => 'OK'}}.to_json
|
|
end
|
|
|
|
post '/echo_params' do
|
|
status 200
|
|
content_type 'application/json'
|
|
params.to_json
|
|
end
|
|
|
|
post '/204' do
|
|
status 204
|
|
content_type 'application/json'
|
|
"".to_json
|
|
end
|
|
|
|
get '/204' do
|
|
status 204
|
|
content_type 'application/json'
|
|
"".to_json
|
|
end
|
|
|
|
get '/403' do
|
|
status 403
|
|
content_type 'application/json'
|
|
"{}"
|
|
end
|
|
|
|
get '/404' do
|
|
status 404
|
|
content_type 'text/html'
|
|
"File Not Found"
|
|
end
|
|
|
|
get '/503' do
|
|
status 503
|
|
"Internal Server Error"
|
|
end
|
|
|
|
get '/encoding' do
|
|
status 200
|
|
content_type 'text/plain; charset=us-ascii'
|
|
"ASCII Charset"
|
|
end
|
|
|
|
post '/notNestedUser' do
|
|
content_type 'application/json'
|
|
{ 'email' => 'changed', 'ID' => 31337 }.to_json
|
|
end
|
|
|
|
delete '/humans/1234' do
|
|
content_type 'application/json'
|
|
status 200
|
|
end
|
|
|
|
get '/users/empty' do
|
|
content_type 'application/json'
|
|
status 200
|
|
{ :firstUser => {}, :secondUser => {}}.to_json
|
|
end
|
|
|
|
put '/ping' do
|
|
status 200
|
|
content_type 'application/json'
|
|
params.to_json
|
|
end
|
|
|
|
get '/timeout' do
|
|
# We need to leave this around 4 seconds so we don't hold up the
|
|
# process too long and cause the tests launched after to fail.
|
|
sleep 4
|
|
status 200
|
|
content_type 'application/json'
|
|
params.to_json
|
|
end
|
|
|
|
post '/timeout' do
|
|
sleep 2
|
|
status 200
|
|
content_type 'application/json'
|
|
params.to_json
|
|
end
|
|
|
|
get '/empty/array' do
|
|
status 200
|
|
content_type 'application/json'
|
|
[].to_json
|
|
end
|
|
|
|
get '/empty/dictionary' do
|
|
status 200
|
|
content_type 'application/json'
|
|
{}.to_json
|
|
end
|
|
|
|
get '/empty/string' do
|
|
status 200
|
|
content_type 'application/json'
|
|
""
|
|
end
|
|
|
|
get '/fail' do
|
|
content_type 'application/json'
|
|
render_fixture('/JSON/errors.json', :status => 500)
|
|
end
|
|
|
|
get '/500' do
|
|
status 500
|
|
content_type 'application/json'
|
|
end
|
|
|
|
# Expects an uploaded 'file' param
|
|
post '/api/upload/' do
|
|
unless params['file']
|
|
status 500
|
|
return "No file parameter was provided"
|
|
end
|
|
upload_path = File.join(settings.uploads_path, params['file'][:filename])
|
|
File.open(upload_path, "w") do |f|
|
|
f.write(params['file'][:tempfile].read)
|
|
end
|
|
status 200
|
|
content_type 'application/json'
|
|
{ :name => "Blake" }.to_json
|
|
end
|
|
|
|
# Return 200 after a delay
|
|
get '/ok-with-delay/:delay' do
|
|
sleep params[:delay].to_f
|
|
status 200
|
|
content_type 'application/json'
|
|
""
|
|
end
|
|
|
|
get '/paginate' do
|
|
status 200
|
|
content_type 'application/json'
|
|
|
|
per_page = 3
|
|
total_entries = 6
|
|
current_page = params[:page].to_i
|
|
entries = []
|
|
|
|
case current_page
|
|
when 1
|
|
entries << Person.new('Blake', 29)
|
|
entries << Person.new('Sarah', 30)
|
|
entries << Person.new('Colin', 27)
|
|
when 2
|
|
entries << Person.new('Asia', 8)
|
|
entries << Person.new('Roy', 2)
|
|
entries << Person.new('Lola', 9)
|
|
when 3
|
|
# Return an error payload
|
|
status 422
|
|
return {:error => "Invalid page number."}
|
|
else
|
|
status 404
|
|
return ""
|
|
end
|
|
|
|
{:per_page => per_page, :total_entries => total_entries,
|
|
:current_page => current_page, :entries => entries, :total_pages => 3}.to_json
|
|
end
|
|
|
|
get '/paginate/' do
|
|
status 200
|
|
content_type 'application/json'
|
|
{:per_page => 10, :total_entries => 0,
|
|
:current_page => 1, :entries => [], :total_pages => 0}.to_json
|
|
end
|
|
|
|
get '/coredata/etag' do
|
|
content_type 'application/json'
|
|
tag = '2cdd0a2b329541d81e82ab20aff6281b'
|
|
cache_control(:private, :must_revalidate, :max_age => 0)
|
|
if tag == request.env["HTTP_IF_NONE_MATCH"]
|
|
status 304
|
|
""
|
|
else
|
|
etag(tag)
|
|
render_fixture '/JSON/humans/all.json'
|
|
end
|
|
end
|
|
|
|
get '/object_manager/cancel' do
|
|
sleep 0.05
|
|
status 204
|
|
end
|
|
|
|
get '/object_manager/:objectID/cancel' do
|
|
sleep 0.05
|
|
status 204
|
|
end
|
|
|
|
get '/304' do
|
|
status 304
|
|
end
|
|
|
|
delete '/humans/1234/whitespace' do
|
|
content_type 'application/json'
|
|
status 200
|
|
' '
|
|
end
|
|
|
|
post '/ComplexUser' do
|
|
content_type 'application/json'
|
|
render_fixture('/JSON/ComplexNestedUser.json', :status => 200)
|
|
end
|
|
|
|
get '/posts.json' do
|
|
content_type 'application/json'
|
|
{ :posts => [{:title => 'Post Title', :body => 'Some body.', :tags => [{ :name => 'development' }, { :name => 'restkit' }] }] }.to_json
|
|
end
|
|
|
|
post '/posts.json' do
|
|
content_type 'application/json'
|
|
{ :post => { :title => 'Post Title', :body => 'Some body.', :tags => [{ :name => 'development' }, { :name => 'restkit' }] } }.to_json
|
|
end
|
|
|
|
get '/posts_with_invalid.json' do
|
|
content_type 'application/json'
|
|
{ :posts => [{:title => 'Post Title', :body => 'Some body.'}, {:title => '', :body => 'Some body.'} ] }.to_json
|
|
end
|
|
|
|
get '/posts/:post_id/tags' do
|
|
content_type 'application/json'
|
|
[{ :name => 'development' }, { :name => 'restkit' }].to_json
|
|
end
|
|
|
|
post '/tags' do
|
|
content_type 'application/json'
|
|
[{ :name => 'development' }, { :name => 'restkit' }].to_json
|
|
end
|
|
|
|
# start the server if ruby file executed directly
|
|
run! if app_file == $0
|
|
end
|