rabl 0.13.0 → 0.13.1

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 (133) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/CHANGELOG.md +4 -0
  4. data/Gemfile +2 -1
  5. data/Rakefile +2 -2
  6. data/fixtures/ashared/views_rails_3/users/phone_number.xml.rabl +1 -0
  7. data/fixtures/padrino_test/app/views +1 -0
  8. data/fixtures/padrino_test/db/migrate +1 -0
  9. data/fixtures/padrino_test/models +1 -0
  10. data/fixtures/padrino_test/test/app/controllers/posts_controller_test.rb +1 -0
  11. data/fixtures/padrino_test/test/app/controllers/users_controller_test.rb +1 -0
  12. data/fixtures/rails2/app/models +1 -0
  13. data/fixtures/rails2/app/views +1 -0
  14. data/fixtures/rails2/db/migrate +1 -0
  15. data/fixtures/rails2/test/functionals/posts_controller_test.rb +1 -0
  16. data/fixtures/rails2/test/functionals/users_controller_test.rb +1 -0
  17. data/fixtures/rails3/app/models +1 -0
  18. data/fixtures/rails3/app/views +1 -0
  19. data/fixtures/rails3/db/migrate +1 -0
  20. data/fixtures/rails3/test/functional/posts_controller_test.rb +1 -0
  21. data/fixtures/rails3/test/functional/users_controller_test.rb +1 -0
  22. data/fixtures/rails3_2/app/models +1 -0
  23. data/fixtures/rails3_2/app/views +1 -0
  24. data/fixtures/rails3_2/db/migrate +1 -0
  25. data/fixtures/rails3_2/test/functional/posts_controller_test.rb +1 -0
  26. data/fixtures/rails3_2/test/functional/users_controller_test.rb +1 -0
  27. data/fixtures/rails4/app/models +1 -0
  28. data/fixtures/rails4/app/views +1 -0
  29. data/fixtures/rails4/db/migrate +1 -0
  30. data/fixtures/rails4/test/functional/posts_controller_test.rb +1 -0
  31. data/fixtures/rails4/test/functional/users_controller_test.rb +1 -0
  32. data/fixtures/rails5/.gitignore +21 -0
  33. data/fixtures/rails5/Gemfile +52 -0
  34. data/fixtures/rails5/README.md +24 -0
  35. data/fixtures/rails5/Rakefile +13 -0
  36. data/fixtures/rails5/app/assets/config/manifest.js +3 -0
  37. data/fixtures/rails5/app/assets/images/.keep +0 -0
  38. data/fixtures/rails5/app/assets/javascripts/application.js +16 -0
  39. data/fixtures/rails5/app/assets/javascripts/cable.js +13 -0
  40. data/fixtures/rails5/app/assets/javascripts/channels/.keep +0 -0
  41. data/fixtures/rails5/app/assets/stylesheets/application.css +15 -0
  42. data/fixtures/rails5/app/channels/application_cable/channel.rb +4 -0
  43. data/fixtures/rails5/app/channels/application_cable/connection.rb +4 -0
  44. data/fixtures/rails5/app/controllers/application_controller.rb +3 -0
  45. data/fixtures/rails5/app/controllers/concerns/.keep +0 -0
  46. data/fixtures/rails5/app/controllers/posts_controller.rb +17 -0
  47. data/fixtures/rails5/app/controllers/users_controller.rb +11 -0
  48. data/fixtures/rails5/app/helpers/application_helper.rb +5 -0
  49. data/fixtures/rails5/app/jobs/application_job.rb +2 -0
  50. data/fixtures/rails5/app/mailers/application_mailer.rb +4 -0
  51. data/fixtures/rails5/app/models +1 -0
  52. data/fixtures/rails5/app/views +1 -0
  53. data/fixtures/rails5/bin/bundle +3 -0
  54. data/fixtures/rails5/bin/rails +9 -0
  55. data/fixtures/rails5/bin/rake +9 -0
  56. data/fixtures/rails5/bin/setup +34 -0
  57. data/fixtures/rails5/bin/spring +15 -0
  58. data/fixtures/rails5/bin/update +29 -0
  59. data/fixtures/rails5/config.ru +5 -0
  60. data/fixtures/rails5/config/application.rb +15 -0
  61. data/fixtures/rails5/config/boot.rb +3 -0
  62. data/fixtures/rails5/config/cable.yml +9 -0
  63. data/fixtures/rails5/config/database.yml +25 -0
  64. data/fixtures/rails5/config/environment.rb +5 -0
  65. data/fixtures/rails5/config/environments/development.rb +54 -0
  66. data/fixtures/rails5/config/environments/production.rb +86 -0
  67. data/fixtures/rails5/config/environments/test.rb +42 -0
  68. data/fixtures/rails5/config/initializers/application_controller_renderer.rb +6 -0
  69. data/fixtures/rails5/config/initializers/assets.rb +11 -0
  70. data/fixtures/rails5/config/initializers/backtrace_silencers.rb +7 -0
  71. data/fixtures/rails5/config/initializers/cookies_serializer.rb +5 -0
  72. data/fixtures/rails5/config/initializers/filter_parameter_logging.rb +4 -0
  73. data/fixtures/rails5/config/initializers/inflections.rb +16 -0
  74. data/fixtures/rails5/config/initializers/mime_types.rb +4 -0
  75. data/fixtures/rails5/config/initializers/new_framework_defaults.rb +24 -0
  76. data/fixtures/rails5/config/initializers/session_store.rb +3 -0
  77. data/fixtures/rails5/config/initializers/wrap_parameters.rb +14 -0
  78. data/fixtures/rails5/config/locales/en.yml +23 -0
  79. data/fixtures/rails5/config/puma.rb +47 -0
  80. data/fixtures/rails5/config/routes.rb +8 -0
  81. data/fixtures/rails5/config/secrets.yml +22 -0
  82. data/fixtures/rails5/config/spring.rb +6 -0
  83. data/fixtures/rails5/db/migrate +1 -0
  84. data/fixtures/rails5/db/schema.rb +41 -0
  85. data/fixtures/rails5/db/seeds.rb +7 -0
  86. data/fixtures/rails5/lib/assets/.keep +0 -0
  87. data/fixtures/rails5/lib/tasks/.keep +0 -0
  88. data/fixtures/rails5/log/.keep +0 -0
  89. data/fixtures/rails5/public/404.html +67 -0
  90. data/fixtures/rails5/public/422.html +67 -0
  91. data/fixtures/rails5/public/500.html +66 -0
  92. data/fixtures/rails5/public/apple-touch-icon-precomposed.png +0 -0
  93. data/fixtures/rails5/public/apple-touch-icon.png +0 -0
  94. data/fixtures/rails5/public/favicon.ico +0 -0
  95. data/fixtures/rails5/public/robots.txt +5 -0
  96. data/fixtures/rails5/test/controllers/.keep +0 -0
  97. data/fixtures/rails5/test/fixtures/.keep +0 -0
  98. data/fixtures/rails5/test/fixtures/files/.keep +0 -0
  99. data/fixtures/rails5/test/helpers/.keep +0 -0
  100. data/fixtures/rails5/test/integration/.keep +0 -0
  101. data/fixtures/rails5/test/mailers/.keep +0 -0
  102. data/fixtures/rails5/test/models/.keep +0 -0
  103. data/fixtures/rails5/test/test_helper.rb +26 -0
  104. data/fixtures/rails5/tmp/.keep +0 -0
  105. data/fixtures/rails5/vendor/assets/javascripts/.keep +0 -0
  106. data/fixtures/rails5/vendor/assets/stylesheets/.keep +0 -0
  107. data/fixtures/sinatra_test/db/migrate +1 -0
  108. data/fixtures/sinatra_test/models +1 -0
  109. data/fixtures/sinatra_test/test/functional/posts_controller_test.rb +1 -0
  110. data/fixtures/sinatra_test/test/functional/users_controller_test.rb +1 -0
  111. data/fixtures/sinatra_test/views +1 -0
  112. data/lib/rabl.rb +1 -1
  113. data/lib/rabl/configuration.rb +1 -1
  114. data/lib/rabl/digestor.rb +3 -37
  115. data/lib/rabl/digestor/rails3.rb +10 -0
  116. data/lib/rabl/digestor/rails41.rb +10 -0
  117. data/lib/rabl/digestor/rails5.rb +4 -0
  118. data/lib/rabl/engine.rb +1 -1
  119. data/lib/rabl/version.rb +1 -1
  120. metadata +99 -3
  121. data/fixtures/ashared/views_rails_3/users/phone_number.xml.rabl +0 -8
  122. data/fixtures/padrino_test/test/app/controllers/posts_controller_test.rb +0 -108
  123. data/fixtures/padrino_test/test/app/controllers/users_controller_test.rb +0 -87
  124. data/fixtures/rails2/test/functionals/posts_controller_test.rb +0 -108
  125. data/fixtures/rails2/test/functionals/users_controller_test.rb +0 -87
  126. data/fixtures/rails3/test/functional/posts_controller_test.rb +0 -108
  127. data/fixtures/rails3/test/functional/users_controller_test.rb +0 -87
  128. data/fixtures/rails3_2/test/functional/posts_controller_test.rb +0 -263
  129. data/fixtures/rails3_2/test/functional/users_controller_test.rb +0 -87
  130. data/fixtures/rails4/test/functional/posts_controller_test.rb +0 -248
  131. data/fixtures/rails4/test/functional/users_controller_test.rb +0 -87
  132. data/fixtures/sinatra_test/test/functional/posts_controller_test.rb +0 -108
  133. data/fixtures/sinatra_test/test/functional/users_controller_test.rb +0 -87
@@ -1,108 +0,0 @@
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", :format => :json
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}", :format => :json
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
@@ -1,87 +0,0 @@
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
@@ -1,108 +0,0 @@
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", :format => :json
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}", :format => :json
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
@@ -1,87 +0,0 @@
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
@@ -1,263 +0,0 @@
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
- require 'rexml/document'
11
-
12
- context "PostsController" do
13
- helper(:json_output) { JSON.parse(last_response.body) }
14
-
15
- setup do
16
- create_users!
17
- Post.delete_all
18
- @post1 = Post.create(:title => "Foo", :body => "Bar", :user_id => @user1.id)
19
- @post2 = Post.create(:title => "Baz", :body => "Bah", :user_id => @user2.id)
20
- @post3 = Post.create(:title => "Kaz", :body => "<script>alert('xss & test');</script>", :user_id => @user3.id)
21
- @posts = [@post1, @post2, @post3]
22
- end
23
-
24
- context "for index action" do
25
- setup do
26
- get "/posts", format: :json
27
- end
28
-
29
- # Attributes (regular)
30
- asserts("contains post titles") do
31
- json_output['articles'].map { |o| o["article"]["title"] }
32
- end.equals { @posts.map(&:title) }
33
-
34
- asserts("contains post bodies") do
35
- json_output['articles'].map { |o| o["article"]["body"] }
36
- end.equals { @posts.map(&:body) }
37
-
38
- # Attributes (custom name)
39
- asserts("contains post posted_at") do
40
- json_output['articles'].map { |o| o["article"]["posted_at"] }
41
- end.equals { @posts.map(&:created_at).map(&:iso8601) }
42
-
43
- # Child
44
- asserts("contains post user child username") do
45
- json_output['articles'].map { |o| o["article"]["user"]["username"] }
46
- end.equals { @posts.map(&:user).map(&:username) }
47
-
48
- asserts("contains post user child role") do
49
- json_output['articles'].map { |o| o["article"]["user"]["role"] }
50
- end.equals { ["normal", "normal", "admin"] }
51
-
52
- # Child Numbers of the Child User
53
- asserts("contains post user child numbers") do
54
- json_output['articles'].map { |o| o["article"]["user"]["pnumbers"][0]["pnumber"]["formatted"] }
55
- end.equals { @posts.map(&:user).map(&:phone_numbers).map(&:first).map(&:formatted) }
56
-
57
- # Glue (username to article)
58
- asserts("contains glued usernames") do
59
- json_output['articles'].map { |o| o["article"]["author_name"] }
60
- end.equals { @posts.map(&:user).map(&:username) }
61
-
62
- # Conditional Child (admin)
63
- asserts("contains admin child only for admins") do
64
- json_output['articles'].map { |o| o["article"]["admin"]["username"] if o["article"].has_key?("admin") }.compact
65
- end.equals { [@user3.username] }
66
-
67
- # Conditional Node (created_by_admin)
68
- asserts("contains created_by_admin node for admins") do
69
- json_output['articles'].last['article']['created_by_admin']
70
- end.equals { true }
71
-
72
- denies("contains no created_by_admin node for non-admins") do
73
- json_output['articles'].first['article']
74
- end.includes(:created_by_admin)
75
-
76
- context "mime types" do
77
- setup do
78
- get "/posts", format: :rabl_test_v1
79
- end
80
-
81
- asserts("contains post title") do
82
- json_output['articles'].first['article']
83
- end.includes("title_v1")
84
-
85
- asserts("contains post user child username") do
86
- json_output['articles'].first['article']["user"]
87
- end.includes("username_v1")
88
- end
89
- end
90
-
91
-
92
- context "escaping output in index action" do
93
- context "for first post" do
94
- setup do
95
- Rabl.configuration.escape_all_output = true
96
- get "/posts/#{@post1.id}", format: :json
97
- json_output['post']
98
- end
99
-
100
- # Attributes (regular)
101
- asserts("contains post title") { topic['title'] }.equals { @post1.title }
102
- asserts("contains post body") { topic['body'] }.equals { @post1.body }
103
- end
104
-
105
- context "for third post with script tags" do
106
- setup do
107
- Rabl.configuration.escape_all_output = true
108
- get "/posts/#{@post3.id}", format: :json
109
- json_output['post']
110
- end
111
-
112
- # Attributes (regular)
113
- asserts("contains post title") { topic['title'] }.equals { @post3.title }
114
- asserts("contains escaped post body") { topic['body'] }.equals { ERB::Util.h(@post3.body) }
115
- end
116
- end # escaping output
117
-
118
- context "for show action" do
119
- setup do
120
- get "/posts/#{@post1.id}", format: :json
121
- json_output['post']
122
- end
123
-
124
- # Attributes (regular)
125
- asserts("contains post title") { topic['title'] }.equals { @post1.title }
126
- asserts("contains post body") { topic['body'] }.equals { @post1.body }
127
-
128
- # Attributes (custom name)
129
- asserts("contains post posted_at") { topic['posted_at'] }.equals { @post1.created_at.iso8601 }
130
-
131
- # Child
132
- asserts("contains post user child username") { topic["user"]["username"] }.equals { @post1.user.username }
133
- asserts("contains post user child role") { topic["user"]["role"] }.equals { "normal" }
134
-
135
- # Child Numbers of the Child User
136
- asserts("contains post user child numbers") do
137
- topic["user"]["pnumbers"][0]["pnumber"]["formatted"]
138
- end.equals { @post1.user.phone_numbers[0].formatted }
139
-
140
- # Glue (username to article)
141
- asserts("contains glued username") { topic["author_name"] }.equals { @post1.user.username }
142
-
143
- # Non-ORM Date Node Partial
144
- context "for date node" do
145
- setup { json_output['post']['created_date'] }
146
- asserts("contains date partial with day") { topic['day'] }.equals { @post1.created_at.day }
147
- asserts("contains date partial with hour") { topic['hour'] }.equals { @post1.created_at.hour }
148
- asserts("contains date partial with full") { topic['full'] }.equals { @post1.created_at.iso8601 }
149
- end # date node
150
-
151
- asserts("contains helper action") { topic["foo"] }.equals { "BAR!" }
152
- denies("contains helper action") { topic["created_at_in_words"] }.nil
153
-
154
- asserts("contains post attributes via node") { topic["post"] }.equals { [@post1.title, @post1.body] }
155
- end # show action, json
156
-
157
- context "renderer" do
158
- setup do
159
- mock(ActionController::Base).perform_caching.any_number_of_times { true }
160
- get "/posts/#{@post1.id}/renderer"
161
- json_output['post']
162
- end
163
-
164
- # Attributes (regular)
165
- asserts("contains post title") { topic['title'] }.equals { @post1.title }
166
- asserts("contains post body") { topic['body'] }.equals { @post1.body }
167
-
168
- # Attributes (partial)
169
- asserts("contains post partial title") { topic['partial']['title'] }.equals { @post1.title }
170
- asserts("contains post partial body") { topic['partial']['body'] }.equals { @post1.body }
171
- end # renderer action, json
172
-
173
- context "for index action rendering JSON within HTML" do
174
- setup do
175
- get "/posts", format: :html
176
- end
177
-
178
- asserts(:body).includes { "<html>" }
179
- end # index action, html
180
-
181
- context "for show action rendering JSON within HTML" do
182
- setup do
183
- get "/posts/#{@post1.id}", format: :html
184
- end
185
-
186
- asserts(:body).includes { "<html>" }
187
- end # show action, html
188
-
189
- context "mime_type" do
190
- setup do
191
- get "/posts/#{@post1.id}", format: :rabl_test_v1
192
- end
193
-
194
- asserts("contains post title") { json_output['post']['title_v1'] }.equals { @post1.title }
195
- asserts("contains username") { json_output['post']['user']['username_v1'] }.equals { @post1.user.username }
196
- end
197
-
198
- context "caching" do
199
- helper(:cache_hit) do |key|
200
- Rails.cache.read(ActiveSupport::Cache.expand_cache_key(key, :rabl))
201
- end
202
-
203
- setup do
204
- mock(ActionController::Base).perform_caching.any_number_of_times { true }
205
- Rails.cache.clear
206
- end
207
-
208
- context "for index action with caching in json" do
209
- setup do
210
- get "/posts", format: :json
211
- end
212
-
213
- asserts("contains post titles") do
214
- json_output['articles'].map { |o| o['article']['title'] }
215
- end.equals { @posts.map(&:title) }
216
-
217
- asserts(:body).equals { cache_hit ['kittens!', @posts, nil, 'json'] }
218
-
219
- asserts("contains cache hits per object (posts by title)") do
220
- json_output['articles'].map { |o| o['article']['title'] }
221
- end.equals { @posts.map{ |p| cache_hit([p, nil, 'hash'])[:title] } }
222
- end # index action, caching, json
223
-
224
- context "for index action with caching in xml" do
225
- setup do
226
- get "/posts", format: :xml
227
- end
228
-
229
- asserts("contains post titles") do
230
- doc = REXML::Document.new topic.body
231
- doc.elements.inject('articles/article/title', []) {|arr, ele| arr << ele.text}
232
- end.equals { @posts.map(&:title) }
233
-
234
- asserts(:body).equals { cache_hit ['kittens!', @posts, nil, 'xml'] }
235
- end # index action, caching, xml
236
-
237
- context "for show action with caching" do
238
- setup do
239
- get "/posts/#{@post1.id}", format: :json
240
- end
241
-
242
- asserts("contains post title") { json_output['post']['title'] }.equals { @post1.title }
243
-
244
- asserts(:body).equals { cache_hit [@post1, nil, 'json'] }
245
- end # show action, caching, json
246
-
247
- context "cache_all_output" do
248
- helper(:cache_hit) do |key|
249
- Rails.cache.read(ActiveSupport::Cache.expand_cache_key([key, 'article', 'json'], :rabl))
250
- end
251
-
252
- setup do
253
- Rabl.configuration.cache_all_output = true
254
- get "/posts", format: :json
255
- end
256
-
257
- asserts("contains cache hits per object (posts by title)") do
258
- json_output['articles'].map { |o| o['article']['title'] }
259
- end.equals { @posts.map{ |p| cache_hit(p)['article'][:title] } }
260
- end # index action, cache_all_output
261
- end
262
-
263
- end