Files
RestKit/Tests/Server/server.rb

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