rabl 0.3.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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