rabl 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +2 -0
- data/.travis.yml +10 -0
- data/CHANGELOG.md +34 -0
- data/Gemfile +14 -1
- data/README.md +53 -4
- data/Rakefile +26 -1
- data/fixtures/ashared/NOTES +35 -0
- data/fixtures/ashared/README +35 -0
- data/fixtures/ashared/migrate/20111002092016_create_users.rb +15 -0
- data/fixtures/ashared/migrate/20111002092019_create_posts.rb +14 -0
- data/fixtures/ashared/migrate/20111002092024_create_phone_numbers.rb +16 -0
- data/fixtures/ashared/models/phone_number.rb +7 -0
- data/fixtures/ashared/models/post.rb +3 -0
- data/fixtures/ashared/models/user.rb +3 -0
- data/fixtures/ashared/views/layouts/application.html.erb +6 -0
- data/fixtures/ashared/views/posts/date.json.rabl +3 -0
- data/fixtures/ashared/views/posts/index.json.rabl +11 -0
- data/fixtures/ashared/views/posts/show.json.rabl +16 -0
- data/fixtures/ashared/views/users/index.rabl +3 -0
- data/fixtures/ashared/views/users/phone_number.rabl +6 -0
- data/fixtures/ashared/views/users/show.rabl +16 -0
- data/fixtures/padrino_test/.components +7 -0
- data/fixtures/padrino_test/.gitignore +7 -0
- data/fixtures/padrino_test/Gemfile +17 -0
- data/fixtures/padrino_test/Rakefile +3 -0
- data/fixtures/padrino_test/app/app.rb +59 -0
- data/fixtures/padrino_test/app/controllers/posts.rb +11 -0
- data/fixtures/padrino_test/app/controllers/users.rb +11 -0
- data/fixtures/padrino_test/app/helpers/posts_helper.rb +7 -0
- data/fixtures/padrino_test/app/helpers/users_helper.rb +7 -0
- data/fixtures/padrino_test/config.ru +9 -0
- data/fixtures/padrino_test/config/apps.rb +34 -0
- data/fixtures/padrino_test/config/boot.rb +29 -0
- data/fixtures/padrino_test/config/database.rb +43 -0
- data/fixtures/padrino_test/db/schema.rb +42 -0
- data/fixtures/padrino_test/public/favicon.ico +0 -0
- data/fixtures/padrino_test/test/app/controllers/posts_controller_test.rb +108 -0
- data/fixtures/padrino_test/test/app/controllers/users_controller_test.rb +87 -0
- data/fixtures/padrino_test/test/test.rake +18 -0
- data/fixtures/padrino_test/test/test_config.rb +18 -0
- data/fixtures/rails2/.gitignore +1 -0
- data/fixtures/rails2/Gemfile +8 -0
- data/fixtures/rails2/Rakefile +14 -0
- data/fixtures/rails2/app/controllers/application_controller.rb +10 -0
- data/fixtures/rails2/app/controllers/posts_controller.rb +15 -0
- data/fixtures/rails2/app/controllers/users_controller.rb +15 -0
- data/fixtures/rails2/config/boot.rb +129 -0
- data/fixtures/rails2/config/database.yml +16 -0
- data/fixtures/rails2/config/environment.rb +42 -0
- data/fixtures/rails2/config/environments/development.rb +17 -0
- data/fixtures/rails2/config/environments/production.rb +28 -0
- data/fixtures/rails2/config/environments/test.rb +28 -0
- data/fixtures/rails2/config/initializers/backtrace_silencers.rb +7 -0
- data/fixtures/rails2/config/initializers/cookie_verification_secret.rb +7 -0
- data/fixtures/rails2/config/initializers/inflections.rb +10 -0
- data/fixtures/rails2/config/initializers/mime_types.rb +5 -0
- data/fixtures/rails2/config/initializers/new_rails_defaults.rb +21 -0
- data/fixtures/rails2/config/initializers/session_store.rb +15 -0
- data/fixtures/rails2/config/locales/en.yml +5 -0
- data/fixtures/rails2/config/preinitializer.rb +20 -0
- data/fixtures/rails2/config/routes.rb +45 -0
- data/fixtures/rails2/db/schema.rb +40 -0
- data/fixtures/rails2/db/seeds.rb +7 -0
- data/fixtures/rails2/public/404.html +30 -0
- data/fixtures/rails2/public/422.html +30 -0
- data/fixtures/rails2/public/500.html +30 -0
- data/fixtures/rails2/public/favicon.ico +0 -0
- data/fixtures/rails2/public/images/rails.png +0 -0
- data/fixtures/rails2/public/index.html +275 -0
- data/fixtures/rails2/public/robots.txt +5 -0
- data/fixtures/rails2/script/about +4 -0
- data/fixtures/rails2/script/console +3 -0
- data/fixtures/rails2/script/dbconsole +3 -0
- data/fixtures/rails2/script/destroy +3 -0
- data/fixtures/rails2/script/generate +3 -0
- data/fixtures/rails2/script/performance/benchmarker +3 -0
- data/fixtures/rails2/script/performance/profiler +3 -0
- data/fixtures/rails2/script/plugin +3 -0
- data/fixtures/rails2/script/runner +3 -0
- data/fixtures/rails2/script/server +3 -0
- data/fixtures/rails2/test/functionals/posts_controller_test.rb +108 -0
- data/fixtures/rails2/test/functionals/users_controller_test.rb +87 -0
- data/fixtures/rails2/test/test_helper.rb +33 -0
- data/fixtures/rails3/.gitignore +4 -0
- data/fixtures/rails3/Gemfile +37 -0
- data/fixtures/rails3/Rakefile +12 -0
- data/fixtures/rails3/app/controllers/application_controller.rb +14 -0
- data/fixtures/rails3/app/controllers/posts_controller.rb +11 -0
- data/fixtures/rails3/app/controllers/users_controller.rb +11 -0
- data/fixtures/rails3/config.ru +4 -0
- data/fixtures/rails3/config/application.rb +42 -0
- data/fixtures/rails3/config/boot.rb +6 -0
- data/fixtures/rails3/config/database.yml +22 -0
- data/fixtures/rails3/config/environment.rb +5 -0
- data/fixtures/rails3/config/environments/development.rb +26 -0
- data/fixtures/rails3/config/environments/production.rb +49 -0
- data/fixtures/rails3/config/environments/test.rb +35 -0
- data/fixtures/rails3/config/initializers/backtrace_silencers.rb +7 -0
- data/fixtures/rails3/config/initializers/inflections.rb +10 -0
- data/fixtures/rails3/config/initializers/mime_types.rb +5 -0
- data/fixtures/rails3/config/initializers/secret_token.rb +7 -0
- data/fixtures/rails3/config/initializers/session_store.rb +8 -0
- data/fixtures/rails3/config/locales/en.yml +5 -0
- data/fixtures/rails3/config/routes.rb +61 -0
- data/fixtures/rails3/db/seeds.rb +7 -0
- data/fixtures/rails3/lib/tasks/.gitkeep +0 -0
- data/fixtures/rails3/public/404.html +26 -0
- data/fixtures/rails3/public/422.html +26 -0
- data/fixtures/rails3/public/500.html +26 -0
- data/fixtures/rails3/public/favicon.ico +0 -0
- data/fixtures/rails3/public/images/rails.png +0 -0
- data/fixtures/rails3/public/index.html +239 -0
- data/fixtures/rails3/public/robots.txt +5 -0
- data/fixtures/rails3/public/stylesheets/.gitkeep +0 -0
- data/fixtures/rails3/script/rails +6 -0
- data/fixtures/rails3/test/functional/posts_controller_test.rb +108 -0
- data/fixtures/rails3/test/functional/users_controller_test.rb +87 -0
- data/fixtures/rails3/test/test_helper.rb +26 -0
- data/fixtures/sinatra_test/Gemfile +13 -0
- data/fixtures/sinatra_test/Rakefile +6 -0
- data/fixtures/sinatra_test/app.rb +44 -0
- data/fixtures/sinatra_test/config.ru +7 -0
- data/fixtures/sinatra_test/test/functional/posts_controller_test.rb +108 -0
- data/fixtures/sinatra_test/test/functional/users_controller_test.rb +87 -0
- data/fixtures/sinatra_test/test/test_helper.rb +19 -0
- data/lib/rabl.rb +13 -1
- data/lib/rabl/builder.rb +14 -7
- data/lib/rabl/configuration.rb +41 -1
- data/lib/rabl/engine.rb +29 -19
- data/lib/rabl/helpers.rb +45 -18
- data/lib/rabl/template.rb +1 -1
- data/lib/rabl/version.rb +1 -1
- data/rabl.gemspec +6 -5
- data/test/builder_test.rb +4 -4
- data/test/configuration_test.rb +7 -22
- data/test/engine_test.rb +63 -44
- data/test/helpers_test.rb +68 -0
- data/test/integration/posts_controller_test.rb +108 -0
- data/test/integration/test_init.rb +35 -0
- data/test/integration/users_controller_test.rb +87 -0
- data/test/models/ormless.rb +2 -0
- data/test/models/user.rb +17 -6
- data/test/msgpack_engine_test.rb +332 -0
- data/test/silence.rb +21 -0
- data/test/teststrap.rb +22 -6
- metadata +160 -14
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
source :rubygems
|
|
2
|
+
|
|
3
|
+
# Project requirements
|
|
4
|
+
gem 'rake'
|
|
5
|
+
|
|
6
|
+
# Component requirements
|
|
7
|
+
gem 'activerecord', :require => "active_record"
|
|
8
|
+
gem 'sqlite3'
|
|
9
|
+
|
|
10
|
+
# Test requirements
|
|
11
|
+
gem 'riot', :group => "test"
|
|
12
|
+
gem 'rack-test', :require => "rack/test", :group => "test"
|
|
13
|
+
|
|
14
|
+
# Padrino
|
|
15
|
+
gem 'padrino', '0.10.2'
|
|
16
|
+
gem 'json'
|
|
17
|
+
gem 'rabl', :path => File.expand_path(File.dirname(__FILE__) + "/../../")
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
class PadrinoTest < Padrino::Application
|
|
2
|
+
register Padrino::Rendering
|
|
3
|
+
register Padrino::Mailer
|
|
4
|
+
register Padrino::Helpers
|
|
5
|
+
|
|
6
|
+
enable :sessions
|
|
7
|
+
|
|
8
|
+
##
|
|
9
|
+
# Caching support
|
|
10
|
+
#
|
|
11
|
+
# register Padrino::Cache
|
|
12
|
+
# enable :caching
|
|
13
|
+
#
|
|
14
|
+
# You can customize caching store engines:
|
|
15
|
+
#
|
|
16
|
+
# set :cache, Padrino::Cache::Store::Memcache.new(::Memcached.new('127.0.0.1:11211', :exception_retry_limit => 1))
|
|
17
|
+
# set :cache, Padrino::Cache::Store::Memcache.new(::Dalli::Client.new('127.0.0.1:11211', :exception_retry_limit => 1))
|
|
18
|
+
# set :cache, Padrino::Cache::Store::Redis.new(::Redis.new(:host => '127.0.0.1', :port => 6379, :db => 0))
|
|
19
|
+
# set :cache, Padrino::Cache::Store::Memory.new(50)
|
|
20
|
+
# set :cache, Padrino::Cache::Store::File.new(Padrino.root('tmp', app_name.to_s, 'cache')) # default choice
|
|
21
|
+
#
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Application configuration options
|
|
25
|
+
#
|
|
26
|
+
# set :raise_errors, true # Raise exceptions (will stop application) (default for test)
|
|
27
|
+
# set :dump_errors, true # Exception backtraces are written to STDERR (default for production/development)
|
|
28
|
+
# set :show_exceptions, true # Shows a stack trace in browser (default for development)
|
|
29
|
+
# set :logging, true # Logging in STDOUT for development and file for production (default only for development)
|
|
30
|
+
# set :public, "foo/bar" # Location for static assets (default root/public)
|
|
31
|
+
# set :reload, false # Reload application files (default in development)
|
|
32
|
+
# set :default_builder, "foo" # Set a custom form builder (default 'StandardFormBuilder')
|
|
33
|
+
# set :locale_path, "bar" # Set path for I18n translations (default your_app/locales)
|
|
34
|
+
# disable :sessions # Disabled sessions by default (enable if needed)
|
|
35
|
+
# disable :flash # Disables rack-flash (enabled by default if Rack::Flash is defined)
|
|
36
|
+
# layout :my_layout # Layout can be in views/layouts/foo.ext or views/foo.ext (default :application)
|
|
37
|
+
#
|
|
38
|
+
|
|
39
|
+
##
|
|
40
|
+
# You can configure for a specified environment like:
|
|
41
|
+
#
|
|
42
|
+
# configure :development do
|
|
43
|
+
# set :foo, :bar
|
|
44
|
+
# disable :asset_stamp # no asset timestamping for dev
|
|
45
|
+
# end
|
|
46
|
+
#
|
|
47
|
+
|
|
48
|
+
##
|
|
49
|
+
# You can manage errors like:
|
|
50
|
+
#
|
|
51
|
+
# error 404 do
|
|
52
|
+
# render 'errors/404'
|
|
53
|
+
# end
|
|
54
|
+
#
|
|
55
|
+
# error 505 do
|
|
56
|
+
# render 'errors/505'
|
|
57
|
+
# end
|
|
58
|
+
#
|
|
59
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
##
|
|
2
|
+
# This file mounts each app in the Padrino project to a specified sub-uri.
|
|
3
|
+
# You can mount additional applications using any of these commands below:
|
|
4
|
+
#
|
|
5
|
+
# Padrino.mount("blog").to('/blog')
|
|
6
|
+
# Padrino.mount("blog", :app_class => "BlogApp").to('/blog')
|
|
7
|
+
# Padrino.mount("blog", :app_file => "path/to/blog/app.rb").to('/blog')
|
|
8
|
+
#
|
|
9
|
+
# You can also map apps to a specified host:
|
|
10
|
+
#
|
|
11
|
+
# Padrino.mount("Admin").host("admin.example.org")
|
|
12
|
+
# Padrino.mount("WebSite").host(/.*\.?example.org/)
|
|
13
|
+
# Padrino.mount("Foo").to("/foo").host("bar.example.org")
|
|
14
|
+
#
|
|
15
|
+
# Note 1: Mounted apps (by default) should be placed into the project root at '/app_name'.
|
|
16
|
+
# Note 2: If you use the host matching remember to respect the order of the rules.
|
|
17
|
+
#
|
|
18
|
+
# By default, this file mounts the primary app which was generated with this project.
|
|
19
|
+
# However, the mounted app can be modified as needed:
|
|
20
|
+
#
|
|
21
|
+
# Padrino.mount("AppName", :app_file => "path/to/file", :app_class => "BlogApp").to('/')
|
|
22
|
+
#
|
|
23
|
+
|
|
24
|
+
##
|
|
25
|
+
# Setup global project settings for your apps. These settings are inherited by every subapp. You can
|
|
26
|
+
# override these settings in the subapps as needed.
|
|
27
|
+
#
|
|
28
|
+
Padrino.configure_apps do
|
|
29
|
+
# enable :sessions
|
|
30
|
+
set :session_secret, '1559bdc5e1f33a0d1c9a597580a189080b39ab7d06eed1a7db12e90f9d269e89'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Mounts the core application for this project
|
|
34
|
+
Padrino.mount("PadrinoTest").to('/')
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Defines our constants
|
|
2
|
+
PADRINO_ENV = ENV["PADRINO_ENV"] ||= ENV["RACK_ENV"] ||= "development" unless defined?(PADRINO_ENV)
|
|
3
|
+
PADRINO_ROOT = File.expand_path('../..', __FILE__) unless defined?(PADRINO_ROOT)
|
|
4
|
+
|
|
5
|
+
# Load our dependencies
|
|
6
|
+
require 'rubygems' unless defined?(Gem)
|
|
7
|
+
require 'bundler/setup'
|
|
8
|
+
Bundler.require(:default, PADRINO_ENV)
|
|
9
|
+
|
|
10
|
+
##
|
|
11
|
+
# Enable devel logging
|
|
12
|
+
#
|
|
13
|
+
# Padrino::Logger::Config[:development] = { :log_level => :devel, :stream => :stdout }
|
|
14
|
+
# Padrino::Logger.log_static = true
|
|
15
|
+
#
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# Add your before load hooks here
|
|
19
|
+
#
|
|
20
|
+
Padrino.before_load do
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Add your after load hooks here
|
|
25
|
+
#
|
|
26
|
+
Padrino.after_load do
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
Padrino.load!
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
##
|
|
2
|
+
# You can use other adapters like:
|
|
3
|
+
#
|
|
4
|
+
# ActiveRecord::Base.configurations[:development] = {
|
|
5
|
+
# :adapter => 'mysql',
|
|
6
|
+
# :encoding => 'utf8',
|
|
7
|
+
# :reconnect => true,
|
|
8
|
+
# :database => 'your_database',
|
|
9
|
+
# :pool => 5,
|
|
10
|
+
# :username => 'root',
|
|
11
|
+
# :password => '',
|
|
12
|
+
# :host => 'localhost',
|
|
13
|
+
# :socket => '/tmp/mysql.sock'
|
|
14
|
+
# }
|
|
15
|
+
#
|
|
16
|
+
ActiveRecord::Base.configurations[:development] = {
|
|
17
|
+
:adapter => 'sqlite3',
|
|
18
|
+
:database => ":memory:"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
ActiveRecord::Base.configurations[:test] = {
|
|
22
|
+
:adapter => 'sqlite3',
|
|
23
|
+
:database => ":memory:"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
# Setup our logger
|
|
27
|
+
ActiveRecord::Base.logger = logger
|
|
28
|
+
|
|
29
|
+
# Include Active Record class name as root for JSON serialized output.
|
|
30
|
+
ActiveRecord::Base.include_root_in_json = true
|
|
31
|
+
|
|
32
|
+
# Store the full class name (including module namespace) in STI type column.
|
|
33
|
+
ActiveRecord::Base.store_full_sti_class = true
|
|
34
|
+
|
|
35
|
+
# Use ISO 8601 format for JSON serialized times and dates.
|
|
36
|
+
ActiveSupport.use_standard_json_time_format = true
|
|
37
|
+
|
|
38
|
+
# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
|
|
39
|
+
# if you're including raw json in an HTML page.
|
|
40
|
+
ActiveSupport.escape_html_entities_in_json = false
|
|
41
|
+
|
|
42
|
+
# Now we can estabilish connection with our db
|
|
43
|
+
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations[Padrino.env])
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# encoding: UTF-8
|
|
2
|
+
# This file is auto-generated from the current state of the database. Instead
|
|
3
|
+
# of editing this file, please use the migrations feature of Active Record to
|
|
4
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
|
5
|
+
#
|
|
6
|
+
# Note that this schema.rb definition is the authoritative source for your
|
|
7
|
+
# database schema. If you need to create the application database on another
|
|
8
|
+
# system, you should be using db:schema:load, not running all the migrations
|
|
9
|
+
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
|
10
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
|
11
|
+
#
|
|
12
|
+
# It's strongly recommended to check this file into your version control system.
|
|
13
|
+
|
|
14
|
+
ActiveRecord::Schema.define(:version => 3) do
|
|
15
|
+
|
|
16
|
+
create_table "phone_numbers", :force => true do |t|
|
|
17
|
+
t.integer "user_id"
|
|
18
|
+
t.boolean "is_primary"
|
|
19
|
+
t.string "area_code"
|
|
20
|
+
t.string "prefix"
|
|
21
|
+
t.string "suffix"
|
|
22
|
+
t.string "name"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
create_table "posts", :force => true do |t|
|
|
26
|
+
t.integer "user_id"
|
|
27
|
+
t.string "title"
|
|
28
|
+
t.text "body"
|
|
29
|
+
t.datetime "created_at"
|
|
30
|
+
t.datetime "updated_at"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
create_table "users", :force => true do |t|
|
|
34
|
+
t.string "username"
|
|
35
|
+
t.string "email"
|
|
36
|
+
t.string "location"
|
|
37
|
+
t.boolean "is_admin"
|
|
38
|
+
t.datetime "created_at"
|
|
39
|
+
t.datetime "updated_at"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
File without changes
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
# Lives in <rabl>/test/integration/posts_controller_test.rb
|
|
2
|
+
# Symlinked to fixture applications
|
|
3
|
+
|
|
4
|
+
begin # Padrino
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
|
6
|
+
rescue LoadError # Rails
|
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "PostsController" do
|
|
11
|
+
helper(:json_output) { JSON.parse(last_response.body) }
|
|
12
|
+
|
|
13
|
+
setup do
|
|
14
|
+
create_users!
|
|
15
|
+
Post.delete_all
|
|
16
|
+
@post1 = Post.create(:title => "Foo", :body => "Bar", :user_id => @user1.id)
|
|
17
|
+
@post2 = Post.create(:title => "Baz", :body => "Bah", :user_id => @user2.id)
|
|
18
|
+
@post3 = Post.create(:title => "Kaz", :body => "Paz", :user_id => @user3.id)
|
|
19
|
+
@posts = [@post1, @post2, @post3]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
context "for index action" do
|
|
23
|
+
setup do
|
|
24
|
+
get "/posts"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Attributes (regular)
|
|
28
|
+
asserts("contains post titles") do
|
|
29
|
+
json_output['articles'].map { |o| o["article"]["title"] }
|
|
30
|
+
end.equals { @posts.map(&:title) }
|
|
31
|
+
|
|
32
|
+
asserts("contains post bodies") do
|
|
33
|
+
json_output['articles'].map { |o| o["article"]["body"] }
|
|
34
|
+
end.equals { @posts.map(&:body) }
|
|
35
|
+
|
|
36
|
+
# Attributes (custom name)
|
|
37
|
+
asserts("contains post posted_at") do
|
|
38
|
+
json_output['articles'].map { |o| o["article"]["posted_at"] }
|
|
39
|
+
end.equals { @posts.map(&:created_at).map(&:iso8601) }
|
|
40
|
+
|
|
41
|
+
# Child
|
|
42
|
+
asserts("contains post user child username") do
|
|
43
|
+
json_output['articles'].map { |o| o["article"]["user"]["username"] }
|
|
44
|
+
end.equals { @posts.map(&:user).map(&:username) }
|
|
45
|
+
|
|
46
|
+
asserts("contains post user child role") do
|
|
47
|
+
json_output['articles'].map { |o| o["article"]["user"]["role"] }
|
|
48
|
+
end.equals { ["normal", "normal", "admin"] }
|
|
49
|
+
|
|
50
|
+
# Child Numbers of the Child User
|
|
51
|
+
asserts("contains post user child numbers") do
|
|
52
|
+
json_output['articles'].map { |o| o["article"]["user"]["pnumbers"][0]["pnumber"]["formatted"] }
|
|
53
|
+
end.equals { @posts.map(&:user).map(&:phone_numbers).map(&:first).map(&:formatted) }
|
|
54
|
+
|
|
55
|
+
# Glue (username to article)
|
|
56
|
+
asserts("contains glued usernames") do
|
|
57
|
+
json_output['articles'].map { |o| o["article"]["author_name"] }
|
|
58
|
+
end.equals { @posts.map(&:user).map(&:username) }
|
|
59
|
+
|
|
60
|
+
# Conditional Child (admin)
|
|
61
|
+
asserts("contains admin child only for admins") do
|
|
62
|
+
json_output['articles'].map { |o| o["article"]["admin"]["username"] if o["article"].has_key?("admin") }.compact
|
|
63
|
+
end.equals { [@user3.username] }
|
|
64
|
+
|
|
65
|
+
# Conditional Node (created_by_admin)
|
|
66
|
+
asserts("contains created_by_admin node for admins") do
|
|
67
|
+
json_output['articles'].last['article']['created_by_admin']
|
|
68
|
+
end.equals { true }
|
|
69
|
+
|
|
70
|
+
denies("contains no created_by_admin node for non-admins") do
|
|
71
|
+
json_output['articles'].first['article']
|
|
72
|
+
end.includes(:created_by_admin)
|
|
73
|
+
end # index action
|
|
74
|
+
|
|
75
|
+
context "for show action" do
|
|
76
|
+
setup do
|
|
77
|
+
get "/posts/#{@post1.id}"
|
|
78
|
+
json_output['post']
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# Attributes (regular)
|
|
82
|
+
asserts("contains post title") { topic['title'] }.equals { @post1.title }
|
|
83
|
+
asserts("contains post body") { topic['body'] }.equals { @post1.body }
|
|
84
|
+
|
|
85
|
+
# Attributes (custom name)
|
|
86
|
+
asserts("contains post posted_at") { topic['posted_at'] }.equals { @post1.created_at.iso8601 }
|
|
87
|
+
|
|
88
|
+
# Child
|
|
89
|
+
asserts("contains post user child username") { topic["user"]["username"] }.equals { @post1.user.username }
|
|
90
|
+
asserts("contains post user child role") { topic["user"]["role"] }.equals { "normal" }
|
|
91
|
+
|
|
92
|
+
# Child Numbers of the Child User
|
|
93
|
+
asserts("contains post user child numbers") do
|
|
94
|
+
topic["user"]["pnumbers"][0]["pnumber"]["formatted"]
|
|
95
|
+
end.equals { @post1.user.phone_numbers[0].formatted }
|
|
96
|
+
|
|
97
|
+
# Glue (username to article)
|
|
98
|
+
asserts("contains glued username") { topic["author_name"] }.equals { @post1.user.username }
|
|
99
|
+
|
|
100
|
+
# Non-ORM Date Node Partial
|
|
101
|
+
context "for date node" do
|
|
102
|
+
setup { json_output['post']['created_date'] }
|
|
103
|
+
asserts("contains date partial with day") { topic['day'] }.equals { @post1.created_at.day }
|
|
104
|
+
asserts("contains date partial with hour") { topic['hour'] }.equals { @post1.created_at.hour }
|
|
105
|
+
asserts("contains date partial with full") { topic['full'] }.equals { @post1.created_at.iso8601 }
|
|
106
|
+
end # date node
|
|
107
|
+
end # show action
|
|
108
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# Lives in <rabl>/test/integration/users_controller_test.rb
|
|
2
|
+
# Symlinked to fixture applications
|
|
3
|
+
|
|
4
|
+
begin # Sinatra
|
|
5
|
+
require File.expand_path(File.dirname(__FILE__) + '/../../test_config.rb')
|
|
6
|
+
rescue LoadError # Rails
|
|
7
|
+
require File.expand_path(File.dirname(__FILE__) + '/../test_helper.rb')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
context "UsersController" do
|
|
11
|
+
helper(:json_output) { JSON.parse(last_response.body) }
|
|
12
|
+
|
|
13
|
+
setup do
|
|
14
|
+
create_users!
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "for index action" do
|
|
18
|
+
# Tests `collection @users` extending from 'show' template
|
|
19
|
+
|
|
20
|
+
setup do
|
|
21
|
+
get "/users"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Attributes (regular)
|
|
25
|
+
asserts("contains user usernames") do
|
|
26
|
+
json_output.map { |u| u["user"]["username"] }
|
|
27
|
+
end.equals { @users.map(&:username) }
|
|
28
|
+
asserts("contains email") do
|
|
29
|
+
json_output.map { |u| u["user"]["email"] }
|
|
30
|
+
end.equals { @users.map(&:email) }
|
|
31
|
+
asserts("contains location") do
|
|
32
|
+
json_output.map { |u| u["user"]["location"] }
|
|
33
|
+
end.equals { @users.map(&:location) }
|
|
34
|
+
|
|
35
|
+
# Attributes (custom name)
|
|
36
|
+
asserts("contains registered_at") do
|
|
37
|
+
json_output.map { |u| u["user"]["registered_at"] }
|
|
38
|
+
end.equals { @users.map(&:created_at).map(&:iso8601) }
|
|
39
|
+
|
|
40
|
+
# Node (renders based on attribute)
|
|
41
|
+
asserts("contains role") do
|
|
42
|
+
json_output.map { |u| u["user"]["role"] }
|
|
43
|
+
end.equals ['normal', 'normal', 'admin']
|
|
44
|
+
|
|
45
|
+
# Child (custom collection name)
|
|
46
|
+
asserts("contains formatted phone numbers") do
|
|
47
|
+
json_output.map { |u| u["user"]["pnumbers"].map { |n| n["pnumber"]["formatted"] } }
|
|
48
|
+
end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
|
|
49
|
+
|
|
50
|
+
# Node (renders collection partial)
|
|
51
|
+
asserts("contains formatted node numbers") do
|
|
52
|
+
json_output.map { |u| u["user"]["node_numbers"].map { |n| n["formatted"] } }
|
|
53
|
+
end.equals { @users.map { |u| u.phone_numbers.map(&:formatted) } }
|
|
54
|
+
end # index
|
|
55
|
+
|
|
56
|
+
context "for show action" do
|
|
57
|
+
# Tests `object :user => :person` custom parent node name
|
|
58
|
+
setup do
|
|
59
|
+
get "/users/#{@user1.id}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Attributes (regular)
|
|
63
|
+
asserts("contains username") { json_output["person"]["username"] }.equals { @user1.username }
|
|
64
|
+
asserts("contains email") { json_output["person"]["email"] }.equals { @user1.email }
|
|
65
|
+
asserts("contains location") { json_output["person"]["location"] }.equals { @user1.location }
|
|
66
|
+
# Attributes (custom name)
|
|
67
|
+
asserts("contains registered_at") { json_output["person"]["registered_at"] }.equals { @user1.created_at.iso8601 }
|
|
68
|
+
# Node (renders based on attribute)
|
|
69
|
+
asserts("contains role node") { json_output["person"]["role"] }.equals "normal"
|
|
70
|
+
|
|
71
|
+
# Child (custom collection name)
|
|
72
|
+
asserts("contains first phone number") {
|
|
73
|
+
json_output["person"]["pnumbers"][0]["pnumber"]["formatted"]
|
|
74
|
+
}.equals { @user1.phone_numbers[0].formatted }
|
|
75
|
+
asserts("contains second phone number") {
|
|
76
|
+
json_output["person"]["pnumbers"][1]["pnumber"]["formatted"]
|
|
77
|
+
}.equals { @user1.phone_numbers[1].formatted }
|
|
78
|
+
|
|
79
|
+
# Node (renders collection partial)
|
|
80
|
+
asserts("contains first node number") {
|
|
81
|
+
json_output["person"]["node_numbers"][0]["formatted"]
|
|
82
|
+
}.equals { @user1.phone_numbers[0].formatted }
|
|
83
|
+
asserts("contains second node number") {
|
|
84
|
+
json_output["person"]["node_numbers"][1]["formatted"]
|
|
85
|
+
}.equals { @user1.phone_numbers[1].formatted }
|
|
86
|
+
end # show
|
|
87
|
+
end
|