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.
Files changed (146) hide show
  1. data/.gitignore +2 -0
  2. data/.travis.yml +10 -0
  3. data/CHANGELOG.md +34 -0
  4. data/Gemfile +14 -1
  5. data/README.md +53 -4
  6. data/Rakefile +26 -1
  7. data/fixtures/ashared/NOTES +35 -0
  8. data/fixtures/ashared/README +35 -0
  9. data/fixtures/ashared/migrate/20111002092016_create_users.rb +15 -0
  10. data/fixtures/ashared/migrate/20111002092019_create_posts.rb +14 -0
  11. data/fixtures/ashared/migrate/20111002092024_create_phone_numbers.rb +16 -0
  12. data/fixtures/ashared/models/phone_number.rb +7 -0
  13. data/fixtures/ashared/models/post.rb +3 -0
  14. data/fixtures/ashared/models/user.rb +3 -0
  15. data/fixtures/ashared/views/layouts/application.html.erb +6 -0
  16. data/fixtures/ashared/views/posts/date.json.rabl +3 -0
  17. data/fixtures/ashared/views/posts/index.json.rabl +11 -0
  18. data/fixtures/ashared/views/posts/show.json.rabl +16 -0
  19. data/fixtures/ashared/views/users/index.rabl +3 -0
  20. data/fixtures/ashared/views/users/phone_number.rabl +6 -0
  21. data/fixtures/ashared/views/users/show.rabl +16 -0
  22. data/fixtures/padrino_test/.components +7 -0
  23. data/fixtures/padrino_test/.gitignore +7 -0
  24. data/fixtures/padrino_test/Gemfile +17 -0
  25. data/fixtures/padrino_test/Rakefile +3 -0
  26. data/fixtures/padrino_test/app/app.rb +59 -0
  27. data/fixtures/padrino_test/app/controllers/posts.rb +11 -0
  28. data/fixtures/padrino_test/app/controllers/users.rb +11 -0
  29. data/fixtures/padrino_test/app/helpers/posts_helper.rb +7 -0
  30. data/fixtures/padrino_test/app/helpers/users_helper.rb +7 -0
  31. data/fixtures/padrino_test/config.ru +9 -0
  32. data/fixtures/padrino_test/config/apps.rb +34 -0
  33. data/fixtures/padrino_test/config/boot.rb +29 -0
  34. data/fixtures/padrino_test/config/database.rb +43 -0
  35. data/fixtures/padrino_test/db/schema.rb +42 -0
  36. data/fixtures/padrino_test/public/favicon.ico +0 -0
  37. data/fixtures/padrino_test/test/app/controllers/posts_controller_test.rb +108 -0
  38. data/fixtures/padrino_test/test/app/controllers/users_controller_test.rb +87 -0
  39. data/fixtures/padrino_test/test/test.rake +18 -0
  40. data/fixtures/padrino_test/test/test_config.rb +18 -0
  41. data/fixtures/rails2/.gitignore +1 -0
  42. data/fixtures/rails2/Gemfile +8 -0
  43. data/fixtures/rails2/Rakefile +14 -0
  44. data/fixtures/rails2/app/controllers/application_controller.rb +10 -0
  45. data/fixtures/rails2/app/controllers/posts_controller.rb +15 -0
  46. data/fixtures/rails2/app/controllers/users_controller.rb +15 -0
  47. data/fixtures/rails2/config/boot.rb +129 -0
  48. data/fixtures/rails2/config/database.yml +16 -0
  49. data/fixtures/rails2/config/environment.rb +42 -0
  50. data/fixtures/rails2/config/environments/development.rb +17 -0
  51. data/fixtures/rails2/config/environments/production.rb +28 -0
  52. data/fixtures/rails2/config/environments/test.rb +28 -0
  53. data/fixtures/rails2/config/initializers/backtrace_silencers.rb +7 -0
  54. data/fixtures/rails2/config/initializers/cookie_verification_secret.rb +7 -0
  55. data/fixtures/rails2/config/initializers/inflections.rb +10 -0
  56. data/fixtures/rails2/config/initializers/mime_types.rb +5 -0
  57. data/fixtures/rails2/config/initializers/new_rails_defaults.rb +21 -0
  58. data/fixtures/rails2/config/initializers/session_store.rb +15 -0
  59. data/fixtures/rails2/config/locales/en.yml +5 -0
  60. data/fixtures/rails2/config/preinitializer.rb +20 -0
  61. data/fixtures/rails2/config/routes.rb +45 -0
  62. data/fixtures/rails2/db/schema.rb +40 -0
  63. data/fixtures/rails2/db/seeds.rb +7 -0
  64. data/fixtures/rails2/public/404.html +30 -0
  65. data/fixtures/rails2/public/422.html +30 -0
  66. data/fixtures/rails2/public/500.html +30 -0
  67. data/fixtures/rails2/public/favicon.ico +0 -0
  68. data/fixtures/rails2/public/images/rails.png +0 -0
  69. data/fixtures/rails2/public/index.html +275 -0
  70. data/fixtures/rails2/public/robots.txt +5 -0
  71. data/fixtures/rails2/script/about +4 -0
  72. data/fixtures/rails2/script/console +3 -0
  73. data/fixtures/rails2/script/dbconsole +3 -0
  74. data/fixtures/rails2/script/destroy +3 -0
  75. data/fixtures/rails2/script/generate +3 -0
  76. data/fixtures/rails2/script/performance/benchmarker +3 -0
  77. data/fixtures/rails2/script/performance/profiler +3 -0
  78. data/fixtures/rails2/script/plugin +3 -0
  79. data/fixtures/rails2/script/runner +3 -0
  80. data/fixtures/rails2/script/server +3 -0
  81. data/fixtures/rails2/test/functionals/posts_controller_test.rb +108 -0
  82. data/fixtures/rails2/test/functionals/users_controller_test.rb +87 -0
  83. data/fixtures/rails2/test/test_helper.rb +33 -0
  84. data/fixtures/rails3/.gitignore +4 -0
  85. data/fixtures/rails3/Gemfile +37 -0
  86. data/fixtures/rails3/Rakefile +12 -0
  87. data/fixtures/rails3/app/controllers/application_controller.rb +14 -0
  88. data/fixtures/rails3/app/controllers/posts_controller.rb +11 -0
  89. data/fixtures/rails3/app/controllers/users_controller.rb +11 -0
  90. data/fixtures/rails3/config.ru +4 -0
  91. data/fixtures/rails3/config/application.rb +42 -0
  92. data/fixtures/rails3/config/boot.rb +6 -0
  93. data/fixtures/rails3/config/database.yml +22 -0
  94. data/fixtures/rails3/config/environment.rb +5 -0
  95. data/fixtures/rails3/config/environments/development.rb +26 -0
  96. data/fixtures/rails3/config/environments/production.rb +49 -0
  97. data/fixtures/rails3/config/environments/test.rb +35 -0
  98. data/fixtures/rails3/config/initializers/backtrace_silencers.rb +7 -0
  99. data/fixtures/rails3/config/initializers/inflections.rb +10 -0
  100. data/fixtures/rails3/config/initializers/mime_types.rb +5 -0
  101. data/fixtures/rails3/config/initializers/secret_token.rb +7 -0
  102. data/fixtures/rails3/config/initializers/session_store.rb +8 -0
  103. data/fixtures/rails3/config/locales/en.yml +5 -0
  104. data/fixtures/rails3/config/routes.rb +61 -0
  105. data/fixtures/rails3/db/seeds.rb +7 -0
  106. data/fixtures/rails3/lib/tasks/.gitkeep +0 -0
  107. data/fixtures/rails3/public/404.html +26 -0
  108. data/fixtures/rails3/public/422.html +26 -0
  109. data/fixtures/rails3/public/500.html +26 -0
  110. data/fixtures/rails3/public/favicon.ico +0 -0
  111. data/fixtures/rails3/public/images/rails.png +0 -0
  112. data/fixtures/rails3/public/index.html +239 -0
  113. data/fixtures/rails3/public/robots.txt +5 -0
  114. data/fixtures/rails3/public/stylesheets/.gitkeep +0 -0
  115. data/fixtures/rails3/script/rails +6 -0
  116. data/fixtures/rails3/test/functional/posts_controller_test.rb +108 -0
  117. data/fixtures/rails3/test/functional/users_controller_test.rb +87 -0
  118. data/fixtures/rails3/test/test_helper.rb +26 -0
  119. data/fixtures/sinatra_test/Gemfile +13 -0
  120. data/fixtures/sinatra_test/Rakefile +6 -0
  121. data/fixtures/sinatra_test/app.rb +44 -0
  122. data/fixtures/sinatra_test/config.ru +7 -0
  123. data/fixtures/sinatra_test/test/functional/posts_controller_test.rb +108 -0
  124. data/fixtures/sinatra_test/test/functional/users_controller_test.rb +87 -0
  125. data/fixtures/sinatra_test/test/test_helper.rb +19 -0
  126. data/lib/rabl.rb +13 -1
  127. data/lib/rabl/builder.rb +14 -7
  128. data/lib/rabl/configuration.rb +41 -1
  129. data/lib/rabl/engine.rb +29 -19
  130. data/lib/rabl/helpers.rb +45 -18
  131. data/lib/rabl/template.rb +1 -1
  132. data/lib/rabl/version.rb +1 -1
  133. data/rabl.gemspec +6 -5
  134. data/test/builder_test.rb +4 -4
  135. data/test/configuration_test.rb +7 -22
  136. data/test/engine_test.rb +63 -44
  137. data/test/helpers_test.rb +68 -0
  138. data/test/integration/posts_controller_test.rb +108 -0
  139. data/test/integration/test_init.rb +35 -0
  140. data/test/integration/users_controller_test.rb +87 -0
  141. data/test/models/ormless.rb +2 -0
  142. data/test/models/user.rb +17 -6
  143. data/test/msgpack_engine_test.rb +332 -0
  144. data/test/silence.rb +21 -0
  145. data/test/teststrap.rb +22 -6
  146. metadata +160 -14
@@ -0,0 +1,7 @@
1
+ .DS_Store
2
+ log/**/*
3
+ tmp/**/*
4
+ bin/*
5
+ vendor/gems/*
6
+ !vendor/gems/cache/
7
+ .sass-cache/*
@@ -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,3 @@
1
+ require File.expand_path('../config/boot.rb', __FILE__)
2
+ require 'padrino-core/cli/rake'
3
+ PadrinoTasks.init
@@ -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,11 @@
1
+ PadrinoTest.controllers :posts do
2
+ get :index do
3
+ @posts = Post.order("id ASC")
4
+ render "posts/index"
5
+ end
6
+
7
+ get :show, :map => "/posts", :with => :id do
8
+ @post = Post.find(params[:id])
9
+ render "posts/show"
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ PadrinoTest.controllers :users do
2
+ get :index do
3
+ @users = User.order("username ASC")
4
+ render "users/index"
5
+ end
6
+
7
+ get :show, :map => "/users", :with => :id do
8
+ @user = User.find(params[:id])
9
+ render "users/show"
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ # Helper methods defined here can be accessed in any controller or view in the application
2
+
3
+ PadrinoTest.helpers do
4
+ # def simple_helper_method
5
+ # ...
6
+ # end
7
+ end
@@ -0,0 +1,7 @@
1
+ # Helper methods defined here can be accessed in any controller or view in the application
2
+
3
+ PadrinoTest.helpers do
4
+ # def simple_helper_method
5
+ # ...
6
+ # end
7
+ end
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env rackup
2
+ # encoding: utf-8
3
+
4
+ # This file can be used to start Padrino,
5
+ # just execute it from the command line.
6
+
7
+ require File.expand_path("../config/boot.rb", __FILE__)
8
+
9
+ run Padrino.application
@@ -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