rails_admin-lbgraham 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (416) hide show
  1. data/Gemfile +51 -0
  2. data/LICENSE.md +20 -0
  3. data/README.md +175 -0
  4. data/Rakefile +19 -0
  5. data/app/assets/images/rails_admin/aristo/images/bg_fallback.png +0 -0
  6. data/app/assets/images/rails_admin/aristo/images/icon_sprite.png +0 -0
  7. data/app/assets/images/rails_admin/aristo/images/progress_bar.gif +0 -0
  8. data/app/assets/images/rails_admin/aristo/images/slider_handles.png +0 -0
  9. data/app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  10. data/app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  11. data/app/assets/images/rails_admin/bullet_black.png +0 -0
  12. data/app/assets/images/rails_admin/bullet_white.png +0 -0
  13. data/app/assets/images/rails_admin/calendar.png +0 -0
  14. data/app/assets/images/rails_admin/clock.png +0 -0
  15. data/app/assets/images/rails_admin/colorpicker/colorpicker_background.png +0 -0
  16. data/app/assets/images/rails_admin/colorpicker/colorpicker_hex.png +0 -0
  17. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png +0 -0
  18. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png +0 -0
  19. data/app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png +0 -0
  20. data/app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif +0 -0
  21. data/app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png +0 -0
  22. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png +0 -0
  23. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png +0 -0
  24. data/app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png +0 -0
  25. data/app/assets/images/rails_admin/colorpicker/colorpicker_select.gif +0 -0
  26. data/app/assets/images/rails_admin/colorpicker/colorpicker_submit.png +0 -0
  27. data/app/assets/images/rails_admin/colorpicker/custom_background.png +0 -0
  28. data/app/assets/images/rails_admin/colorpicker/custom_hex.png +0 -0
  29. data/app/assets/images/rails_admin/colorpicker/custom_hsb_b.png +0 -0
  30. data/app/assets/images/rails_admin/colorpicker/custom_hsb_h.png +0 -0
  31. data/app/assets/images/rails_admin/colorpicker/custom_hsb_s.png +0 -0
  32. data/app/assets/images/rails_admin/colorpicker/custom_indic.gif +0 -0
  33. data/app/assets/images/rails_admin/colorpicker/custom_rgb_b.png +0 -0
  34. data/app/assets/images/rails_admin/colorpicker/custom_rgb_g.png +0 -0
  35. data/app/assets/images/rails_admin/colorpicker/custom_rgb_r.png +0 -0
  36. data/app/assets/images/rails_admin/colorpicker/custom_submit.png +0 -0
  37. data/app/assets/images/rails_admin/colorpicker/select.png +0 -0
  38. data/app/assets/images/rails_admin/colorpicker/select2.png +0 -0
  39. data/app/assets/images/rails_admin/colorpicker/slider.png +0 -0
  40. data/app/assets/images/rails_admin/logo.png +0 -0
  41. data/app/assets/images/rails_admin/magnifier.png +0 -0
  42. data/app/assets/images/rails_admin/multiselect/icon_sprite.png +0 -0
  43. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png +0 -0
  44. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png +0 -0
  45. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png +0 -0
  46. data/app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png +0 -0
  47. data/app/assets/javascripts/rails_admin/custom/ui.js +12 -0
  48. data/app/assets/javascripts/rails_admin/jquery.colorpicker.js +484 -0
  49. data/app/assets/javascripts/rails_admin/jquery.pjax.js +743 -0
  50. data/app/assets/javascripts/rails_admin/jquery.ui.timepicker.js +1371 -0
  51. data/app/assets/javascripts/rails_admin/ra.datetimepicker.js +67 -0
  52. data/app/assets/javascripts/rails_admin/ra.filter-box.js +142 -0
  53. data/app/assets/javascripts/rails_admin/ra.filtering-multiselect.js +292 -0
  54. data/app/assets/javascripts/rails_admin/ra.filtering-select.js +190 -0
  55. data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee +41 -0
  56. data/app/assets/javascripts/rails_admin/ra.remote-form.js +151 -0
  57. data/app/assets/javascripts/rails_admin/ra.widgets.coffee +210 -0
  58. data/app/assets/javascripts/rails_admin/rails_admin.js.erb +28 -0
  59. data/app/assets/javascripts/rails_admin/themes/cerulean/ui.js +0 -0
  60. data/app/assets/javascripts/rails_admin/themes/default/ui.js +12 -0
  61. data/app/assets/javascripts/rails_admin/ui.js.coffee +66 -0
  62. data/app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png +0 -0
  63. data/app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png +0 -0
  64. data/app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif +0 -0
  65. data/app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png +0 -0
  66. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png +0 -0
  67. data/app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png +0 -0
  68. data/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.css.scss +733 -0
  69. data/app/assets/stylesheets/rails_admin/base/README.txt +2 -0
  70. data/app/assets/stylesheets/rails_admin/base/mixins.css.scss +1 -0
  71. data/app/assets/stylesheets/rails_admin/base/theming.css.scss +270 -0
  72. data/app/assets/stylesheets/rails_admin/base/variables.css.scss +1 -0
  73. data/app/assets/stylesheets/rails_admin/custom/mixins.css.scss +12 -0
  74. data/app/assets/stylesheets/rails_admin/custom/theming.css.scss +13 -0
  75. data/app/assets/stylesheets/rails_admin/custom/variables.css.scss +15 -0
  76. data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +82 -0
  77. data/app/assets/stylesheets/rails_admin/jquery.colorpicker.css.scss +182 -0
  78. data/app/assets/stylesheets/rails_admin/jquery.ui.timepicker.css.scss +69 -0
  79. data/app/assets/stylesheets/rails_admin/ra.calendar-additions.css.scss +25 -0
  80. data/app/assets/stylesheets/rails_admin/ra.filtering-multiselect.css.scss +90 -0
  81. data/app/assets/stylesheets/rails_admin/ra.widgets.css.scss +8 -0
  82. data/app/assets/stylesheets/rails_admin/rails_admin.css +4 -0
  83. data/app/assets/stylesheets/rails_admin/themes/cerulean/mixins.css.scss +0 -0
  84. data/app/assets/stylesheets/rails_admin/themes/cerulean/theming.css.scss +97 -0
  85. data/app/assets/stylesheets/rails_admin/themes/cerulean/variables.css.scss +168 -0
  86. data/app/assets/stylesheets/rails_admin/themes/default/mixins.css.scss +8 -0
  87. data/app/assets/stylesheets/rails_admin/themes/default/theming.css.scss +11 -0
  88. data/app/assets/stylesheets/rails_admin/themes/default/variables.css.scss +12 -0
  89. data/app/controllers/rails_admin/application_controller.rb +84 -0
  90. data/app/controllers/rails_admin/main_controller.rb +153 -0
  91. data/app/helpers/rails_admin/application_helper.rb +147 -0
  92. data/app/helpers/rails_admin/form_builder.rb +117 -0
  93. data/app/helpers/rails_admin/main_helper.rb +36 -0
  94. data/app/views/kaminari/twitter-bootstrap/_gap.html.haml +2 -0
  95. data/app/views/kaminari/twitter-bootstrap/_next_page.html.haml +4 -0
  96. data/app/views/kaminari/twitter-bootstrap/_page.html.haml +4 -0
  97. data/app/views/kaminari/twitter-bootstrap/_paginator.html.haml +10 -0
  98. data/app/views/kaminari/twitter-bootstrap/_prev_page.html.haml +4 -0
  99. data/app/views/layouts/rails_admin/_secondary_navigation.html.haml +12 -0
  100. data/app/views/layouts/rails_admin/application.html.haml +27 -0
  101. data/app/views/layouts/rails_admin/pjax.html.haml +16 -0
  102. data/app/views/rails_admin/main/_dashboard_history.html.haml +20 -0
  103. data/app/views/rails_admin/main/_delete_notice.html.haml +19 -0
  104. data/app/views/rails_admin/main/_form_colorpicker.html.haml +1 -0
  105. data/app/views/rails_admin/main/_form_datetime.html.haml +1 -0
  106. data/app/views/rails_admin/main/_form_enumeration.html.haml +18 -0
  107. data/app/views/rails_admin/main/_form_field.html.haml +1 -0
  108. data/app/views/rails_admin/main/_form_file_upload.html.haml +13 -0
  109. data/app/views/rails_admin/main/_form_filtering_multiselect.html.haml +47 -0
  110. data/app/views/rails_admin/main/_form_filtering_select.html.haml +37 -0
  111. data/app/views/rails_admin/main/_form_nested_many.html.haml +14 -0
  112. data/app/views/rails_admin/main/_form_nested_one.html.haml +10 -0
  113. data/app/views/rails_admin/main/_form_polymorphic_association.html.haml +10 -0
  114. data/app/views/rails_admin/main/_form_text.html.haml +31 -0
  115. data/app/views/rails_admin/main/_submit_buttons.html.haml +15 -0
  116. data/app/views/rails_admin/main/bulk_delete.html.haml +11 -0
  117. data/app/views/rails_admin/main/dashboard.html.haml +35 -0
  118. data/app/views/rails_admin/main/delete.html.haml +18 -0
  119. data/app/views/rails_admin/main/edit.html.haml +2 -0
  120. data/app/views/rails_admin/main/export.html.haml +75 -0
  121. data/app/views/rails_admin/main/history.html.haml +49 -0
  122. data/app/views/rails_admin/main/index.html.haml +140 -0
  123. data/app/views/rails_admin/main/new.html.haml +2 -0
  124. data/app/views/rails_admin/main/show.html.haml +16 -0
  125. data/config/initializers/active_record_extensions.rb +19 -0
  126. data/config/initializers/devise_patch.rb +9 -0
  127. data/config/initializers/haml.rb +2 -0
  128. data/config/initializers/mongoid_extensions.rb +4 -0
  129. data/config/locales/rails_admin.en.yml +130 -0
  130. data/config/routes.rb +12 -0
  131. data/lib/generators/rails_admin/install_generator.rb +85 -0
  132. data/lib/generators/rails_admin/templates/drop.rb +18 -0
  133. data/lib/generators/rails_admin/templates/initializer.erb +100 -0
  134. data/lib/generators/rails_admin/templates/migration.rb +18 -0
  135. data/lib/generators/rails_admin/uninstall_generator.rb +22 -0
  136. data/lib/generators/rails_admin/utils.rb +30 -0
  137. data/lib/rails_admin.rb +34 -0
  138. data/lib/rails_admin/abstract_model.rb +128 -0
  139. data/lib/rails_admin/adapters/active_record.rb +296 -0
  140. data/lib/rails_admin/adapters/active_record/abstract_object.rb +32 -0
  141. data/lib/rails_admin/adapters/mongoid.rb +430 -0
  142. data/lib/rails_admin/adapters/mongoid/abstract_object.rb +43 -0
  143. data/lib/rails_admin/adapters/mongoid/extension.rb +45 -0
  144. data/lib/rails_admin/config.rb +333 -0
  145. data/lib/rails_admin/config/actions.rb +121 -0
  146. data/lib/rails_admin/config/actions/base.rb +132 -0
  147. data/lib/rails_admin/config/actions/bulk_delete.rb +55 -0
  148. data/lib/rails_admin/config/actions/dashboard.rb +52 -0
  149. data/lib/rails_admin/config/actions/delete.rb +56 -0
  150. data/lib/rails_admin/config/actions/edit.rb +55 -0
  151. data/lib/rails_admin/config/actions/export.rb +40 -0
  152. data/lib/rails_admin/config/actions/history_index.rb +38 -0
  153. data/lib/rails_admin/config/actions/history_show.rb +38 -0
  154. data/lib/rails_admin/config/actions/index.rb +85 -0
  155. data/lib/rails_admin/config/actions/new.rb +65 -0
  156. data/lib/rails_admin/config/actions/show.rb +34 -0
  157. data/lib/rails_admin/config/actions/show_in_app.rb +27 -0
  158. data/lib/rails_admin/config/configurable.rb +92 -0
  159. data/lib/rails_admin/config/fields.rb +87 -0
  160. data/lib/rails_admin/config/fields/association.rb +107 -0
  161. data/lib/rails_admin/config/fields/base.rb +320 -0
  162. data/lib/rails_admin/config/fields/factories/association.rb +32 -0
  163. data/lib/rails_admin/config/fields/factories/carrierwave.rb +31 -0
  164. data/lib/rails_admin/config/fields/factories/devise.rb +27 -0
  165. data/lib/rails_admin/config/fields/factories/dragonfly.rb +27 -0
  166. data/lib/rails_admin/config/fields/factories/enum.rb +11 -0
  167. data/lib/rails_admin/config/fields/factories/paperclip.rb +26 -0
  168. data/lib/rails_admin/config/fields/factories/password.rb +17 -0
  169. data/lib/rails_admin/config/fields/group.rb +78 -0
  170. data/lib/rails_admin/config/fields/types.rb +27 -0
  171. data/lib/rails_admin/config/fields/types/all.rb +25 -0
  172. data/lib/rails_admin/config/fields/types/belongs_to_association.rb +41 -0
  173. data/lib/rails_admin/config/fields/types/boolean.rb +38 -0
  174. data/lib/rails_admin/config/fields/types/bson_object_id.rb +45 -0
  175. data/lib/rails_admin/config/fields/types/carrierwave.rb +31 -0
  176. data/lib/rails_admin/config/fields/types/color.rb +37 -0
  177. data/lib/rails_admin/config/fields/types/date.rb +24 -0
  178. data/lib/rails_admin/config/fields/types/datetime.rb +164 -0
  179. data/lib/rails_admin/config/fields/types/decimal.rb +14 -0
  180. data/lib/rails_admin/config/fields/types/dragonfly.rb +41 -0
  181. data/lib/rails_admin/config/fields/types/enum.rb +39 -0
  182. data/lib/rails_admin/config/fields/types/file_upload.rb +65 -0
  183. data/lib/rails_admin/config/fields/types/float.rb +14 -0
  184. data/lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb +14 -0
  185. data/lib/rails_admin/config/fields/types/has_many_association.rb +32 -0
  186. data/lib/rails_admin/config/fields/types/has_one_association.rb +39 -0
  187. data/lib/rails_admin/config/fields/types/hidden.rb +27 -0
  188. data/lib/rails_admin/config/fields/types/integer.rb +22 -0
  189. data/lib/rails_admin/config/fields/types/paperclip.rb +28 -0
  190. data/lib/rails_admin/config/fields/types/password.rb +39 -0
  191. data/lib/rails_admin/config/fields/types/polymorphic_association.rb +80 -0
  192. data/lib/rails_admin/config/fields/types/serialized.rb +22 -0
  193. data/lib/rails_admin/config/fields/types/string.rb +43 -0
  194. data/lib/rails_admin/config/fields/types/text.rb +97 -0
  195. data/lib/rails_admin/config/fields/types/time.rb +36 -0
  196. data/lib/rails_admin/config/fields/types/timestamp.rb +18 -0
  197. data/lib/rails_admin/config/groupable.rb +18 -0
  198. data/lib/rails_admin/config/has_fields.rb +136 -0
  199. data/lib/rails_admin/config/has_groups.rb +23 -0
  200. data/lib/rails_admin/config/hideable.rb +28 -0
  201. data/lib/rails_admin/config/lazy_model.rb +21 -0
  202. data/lib/rails_admin/config/model.rb +109 -0
  203. data/lib/rails_admin/config/proxyable.rb +12 -0
  204. data/lib/rails_admin/config/proxyable/proxy.rb +43 -0
  205. data/lib/rails_admin/config/sections.rb +39 -0
  206. data/lib/rails_admin/config/sections/base.rb +46 -0
  207. data/lib/rails_admin/config/sections/create.rb +11 -0
  208. data/lib/rails_admin/config/sections/edit.rb +11 -0
  209. data/lib/rails_admin/config/sections/export.rb +11 -0
  210. data/lib/rails_admin/config/sections/list.rb +27 -0
  211. data/lib/rails_admin/config/sections/modal.rb +10 -0
  212. data/lib/rails_admin/config/sections/nested.rb +10 -0
  213. data/lib/rails_admin/config/sections/show.rb +10 -0
  214. data/lib/rails_admin/config/sections/update.rb +10 -0
  215. data/lib/rails_admin/engine.rb +27 -0
  216. data/lib/rails_admin/extension.rb +29 -0
  217. data/lib/rails_admin/extensions/cancan.rb +5 -0
  218. data/lib/rails_admin/extensions/cancan/authorization_adapter.rb +59 -0
  219. data/lib/rails_admin/extensions/history.rb +5 -0
  220. data/lib/rails_admin/extensions/history/auditing_adapter.rb +37 -0
  221. data/lib/rails_admin/extensions/history/history.rb +36 -0
  222. data/lib/rails_admin/extensions/paper_trail.rb +5 -0
  223. data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +93 -0
  224. data/lib/rails_admin/i18n_support.rb +43 -0
  225. data/lib/rails_admin/support/core_extensions.rb +44 -0
  226. data/lib/rails_admin/support/csv_converter.rb +105 -0
  227. data/lib/rails_admin/version.rb +18 -0
  228. data/lib/tasks/rails_admin.rake +48 -0
  229. data/spec/ci.sh +2 -0
  230. data/spec/controllers/rails_admin/application_controller_spec.rb +30 -0
  231. data/spec/controllers/rails_admin/main_controller_spec.rb +337 -0
  232. data/spec/dummy_app/Gemfile +48 -0
  233. data/spec/dummy_app/Rakefile +7 -0
  234. data/spec/dummy_app/app/active_record/abstract.rb +5 -0
  235. data/spec/dummy_app/app/active_record/another_field_test.rb +4 -0
  236. data/spec/dummy_app/app/active_record/ball.rb +9 -0
  237. data/spec/dummy_app/app/active_record/carrierwave_uploader.rb +53 -0
  238. data/spec/dummy_app/app/active_record/category.rb +5 -0
  239. data/spec/dummy_app/app/active_record/cms.rb +5 -0
  240. data/spec/dummy_app/app/active_record/cms/basic_page.rb +9 -0
  241. data/spec/dummy_app/app/active_record/cms/unscoped_page.rb +3 -0
  242. data/spec/dummy_app/app/active_record/comment.rb +5 -0
  243. data/spec/dummy_app/app/active_record/comment/confirmed.rb +3 -0
  244. data/spec/dummy_app/app/active_record/division.rb +15 -0
  245. data/spec/dummy_app/app/active_record/draft.rb +13 -0
  246. data/spec/dummy_app/app/active_record/fan.rb +7 -0
  247. data/spec/dummy_app/app/active_record/field_test.rb +19 -0
  248. data/spec/dummy_app/app/active_record/hardball.rb +2 -0
  249. data/spec/dummy_app/app/active_record/image.rb +6 -0
  250. data/spec/dummy_app/app/active_record/league.rb +12 -0
  251. data/spec/dummy_app/app/active_record/nested_field_test.rb +8 -0
  252. data/spec/dummy_app/app/active_record/player.rb +27 -0
  253. data/spec/dummy_app/app/active_record/team.rb +28 -0
  254. data/spec/dummy_app/app/active_record/user.rb +25 -0
  255. data/spec/dummy_app/app/assets/images/rails.png +0 -0
  256. data/spec/dummy_app/app/assets/javascripts/application.js +15 -0
  257. data/spec/dummy_app/app/assets/stylesheets/application.css +13 -0
  258. data/spec/dummy_app/app/controllers/application_controller.rb +3 -0
  259. data/spec/dummy_app/app/controllers/players_controller.rb +5 -0
  260. data/spec/dummy_app/app/locales/models.en.yml +20 -0
  261. data/spec/dummy_app/app/mongoid/another_field_test.rb +6 -0
  262. data/spec/dummy_app/app/mongoid/ball.rb +14 -0
  263. data/spec/dummy_app/app/mongoid/carrierwave_uploader.rb +53 -0
  264. data/spec/dummy_app/app/mongoid/category.rb +7 -0
  265. data/spec/dummy_app/app/mongoid/cms.rb +5 -0
  266. data/spec/dummy_app/app/mongoid/cms/basic_page.rb +12 -0
  267. data/spec/dummy_app/app/mongoid/cms/unscoped_page.rb +5 -0
  268. data/spec/dummy_app/app/mongoid/comment.rb +9 -0
  269. data/spec/dummy_app/app/mongoid/comment/confirmed.rb +3 -0
  270. data/spec/dummy_app/app/mongoid/division.rb +14 -0
  271. data/spec/dummy_app/app/mongoid/draft.rb +22 -0
  272. data/spec/dummy_app/app/mongoid/embed.rb +6 -0
  273. data/spec/dummy_app/app/mongoid/fan.rb +12 -0
  274. data/spec/dummy_app/app/mongoid/field_test.rb +57 -0
  275. data/spec/dummy_app/app/mongoid/hardball.rb +2 -0
  276. data/spec/dummy_app/app/mongoid/image.rb +9 -0
  277. data/spec/dummy_app/app/mongoid/league.rb +16 -0
  278. data/spec/dummy_app/app/mongoid/nested_field_test.rb +13 -0
  279. data/spec/dummy_app/app/mongoid/player.rb +41 -0
  280. data/spec/dummy_app/app/mongoid/team.rb +47 -0
  281. data/spec/dummy_app/app/mongoid/user.rb +61 -0
  282. data/spec/dummy_app/app/views/layouts/application.html.erb +14 -0
  283. data/spec/dummy_app/app/views/players/show.html.haml +1 -0
  284. data/spec/dummy_app/config.ru +4 -0
  285. data/spec/dummy_app/config/application.rb +69 -0
  286. data/spec/dummy_app/config/boot.rb +9 -0
  287. data/spec/dummy_app/config/database.yml +25 -0
  288. data/spec/dummy_app/config/environment.rb +5 -0
  289. data/spec/dummy_app/config/environments/development.rb +37 -0
  290. data/spec/dummy_app/config/environments/production.rb +67 -0
  291. data/spec/dummy_app/config/environments/test.rb +37 -0
  292. data/spec/dummy_app/config/initializers/backtrace_silencers.rb +7 -0
  293. data/spec/dummy_app/config/initializers/devise.rb +216 -0
  294. data/spec/dummy_app/config/initializers/dragonfly.rb +11 -0
  295. data/spec/dummy_app/config/initializers/inflections.rb +15 -0
  296. data/spec/dummy_app/config/initializers/mime_types.rb +5 -0
  297. data/spec/dummy_app/config/initializers/rails_admin.rb +8 -0
  298. data/spec/dummy_app/config/initializers/secret_token.rb +7 -0
  299. data/spec/dummy_app/config/initializers/session_patch.rb +16 -0
  300. data/spec/dummy_app/config/initializers/session_store.rb +8 -0
  301. data/spec/dummy_app/config/initializers/strong_parameters.rb +2 -0
  302. data/spec/dummy_app/config/initializers/wrap_parameters.rb +14 -0
  303. data/spec/dummy_app/config/locales/fr.yml +24 -0
  304. data/spec/dummy_app/config/mongoid.yml +22 -0
  305. data/spec/dummy_app/config/routes.rb +10 -0
  306. data/spec/dummy_app/db/migrate/00000000000001_create_divisions_migration.rb +13 -0
  307. data/spec/dummy_app/db/migrate/00000000000002_create_drafts_migration.rb +19 -0
  308. data/spec/dummy_app/db/migrate/00000000000003_create_leagues_migration.rb +12 -0
  309. data/spec/dummy_app/db/migrate/00000000000004_create_players_migration.rb +20 -0
  310. data/spec/dummy_app/db/migrate/00000000000005_create_teams_migration.rb +22 -0
  311. data/spec/dummy_app/db/migrate/00000000000006_devise_create_users.rb +49 -0
  312. data/spec/dummy_app/db/migrate/00000000000007_create_histories_table.rb +16 -0
  313. data/spec/dummy_app/db/migrate/00000000000008_create_fans_migration.rb +12 -0
  314. data/spec/dummy_app/db/migrate/00000000000009_create_fans_teams_migration.rb +11 -0
  315. data/spec/dummy_app/db/migrate/00000000000010_add_revenue_to_team_migration.rb +9 -0
  316. data/spec/dummy_app/db/migrate/00000000000011_add_suspended_to_player_migration.rb +9 -0
  317. data/spec/dummy_app/db/migrate/00000000000012_add_avatar_columns_to_user.rb +16 -0
  318. data/spec/dummy_app/db/migrate/00000000000013_add_roles_to_user.rb +9 -0
  319. data/spec/dummy_app/db/migrate/00000000000014_add_color_to_team_migration.rb +9 -0
  320. data/spec/dummy_app/db/migrate/20101223222233_create_rel_tests.rb +15 -0
  321. data/spec/dummy_app/db/migrate/20110103205808_create_comments.rb +15 -0
  322. data/spec/dummy_app/db/migrate/20110123042530_rename_histories_to_rails_admin_histories.rb +9 -0
  323. data/spec/dummy_app/db/migrate/20110224184303_create_field_tests.rb +22 -0
  324. data/spec/dummy_app/db/migrate/20110328193014_create_cms_basic_pages.rb +14 -0
  325. data/spec/dummy_app/db/migrate/20110329183136_remove_league_id_from_teams.rb +9 -0
  326. data/spec/dummy_app/db/migrate/20110607152842_add_format_to_field_test.rb +9 -0
  327. data/spec/dummy_app/db/migrate/20110714095433_create_balls.rb +12 -0
  328. data/spec/dummy_app/db/migrate/20110831090841_add_protected_field_and_restricted_field_to_field_tests.rb +6 -0
  329. data/spec/dummy_app/db/migrate/20110901131551_change_division_primary_key.rb +19 -0
  330. data/spec/dummy_app/db/migrate/20110901142530_rename_league_id_foreign_key_on_divisions.rb +5 -0
  331. data/spec/dummy_app/db/migrate/20110901150912_set_primary_key_not_null_for_divisions.rb +21 -0
  332. data/spec/dummy_app/db/migrate/20110901154834_change_length_for_rails_admin_histories.rb +9 -0
  333. data/spec/dummy_app/db/migrate/20111103174459_create_unscoped_pages.rb +9 -0
  334. data/spec/dummy_app/db/migrate/20111108143642_add_dragonfly_and_carrierwave_to_field_tests.rb +7 -0
  335. data/spec/dummy_app/db/migrate/20111115041025_add_type_to_balls.rb +5 -0
  336. data/spec/dummy_app/db/migrate/20111123092549_create_nested_field_tests.rb +10 -0
  337. data/spec/dummy_app/db/migrate/20111130075338_add_dragonfly_asset_name_to_field_tests.rb +5 -0
  338. data/spec/dummy_app/db/migrate/20111215083258_create_foo_bars.rb +8 -0
  339. data/spec/dummy_app/db/migrate/20120117151733_add_custom_field_to_teams.rb +5 -0
  340. data/spec/dummy_app/db/migrate/20120118122004_add_categories.rb +7 -0
  341. data/spec/dummy_app/db/migrate/20120319041705_drop_rel_tests.rb +15 -0
  342. data/spec/dummy_app/db/migrate/20120720075608_create_another_field_tests.rb +8 -0
  343. data/spec/dummy_app/db/migrate/20120928075608_create_images.rb +8 -0
  344. data/spec/dummy_app/db/seeds.rb +29 -0
  345. data/spec/dummy_app/doc/README_FOR_APP +2 -0
  346. data/spec/dummy_app/public/404.html +26 -0
  347. data/spec/dummy_app/public/422.html +26 -0
  348. data/spec/dummy_app/public/500.html +25 -0
  349. data/spec/dummy_app/public/favicon.ico +0 -0
  350. data/spec/dummy_app/public/robots.txt +5 -0
  351. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg +0 -0
  352. data/spec/dummy_app/public/system/dragonfly/development/2011/11/24/10_36_27_888_Pensive_Parakeet.jpg.meta +1 -0
  353. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg +0 -0
  354. data/spec/dummy_app/public/system/dragonfly/development/2011/11/30/08_54_39_906_Costa_Rican_Frog.jpg.meta +1 -0
  355. data/spec/dummy_app/public/system/paperclip_assets/1/original/Boston City Flow.jpg +0 -0
  356. data/spec/dummy_app/public/system/paperclip_assets/1/thumb/Boston City Flow.jpg +0 -0
  357. data/spec/dummy_app/public/system/paperclip_assets/3/original/Costa Rican Frog.jpg +0 -0
  358. data/spec/dummy_app/public/system/paperclip_assets/3/thumb/Costa Rican Frog.jpg +0 -0
  359. data/spec/dummy_app/public/system/paperclip_assets/6/original/liste-electorale.pdf +0 -0
  360. data/spec/dummy_app/public/system/paperclip_assets/6/thumb/liste-electorale.pdf +148 -0
  361. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/Boston_City_Flow.jpg +0 -0
  362. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/3/thumb_Boston_City_Flow.jpg +0 -0
  363. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/Costa_Rican_Frog.jpg +0 -0
  364. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/4/thumb_Costa_Rican_Frog.jpg +0 -0
  365. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/Pensive_Parakeet.jpg +0 -0
  366. data/spec/dummy_app/public/uploads/field_test/carrierwave_asset/6/thumb_Pensive_Parakeet.jpg +0 -0
  367. data/spec/dummy_app/script/rails +6 -0
  368. data/spec/factories.rb +75 -0
  369. data/spec/helpers/rails_admin/application_helper_spec.rb +353 -0
  370. data/spec/helpers/rails_admin/form_builder_spec.rb +17 -0
  371. data/spec/integration/authorization/cancan_spec.rb +366 -0
  372. data/spec/integration/basic/bulk_action/rails_admin_basic_bulk_action_spec.rb +25 -0
  373. data/spec/integration/basic/bulk_destroy/rails_admin_basic_bulk_destroy_spec.rb +53 -0
  374. data/spec/integration/basic/create/rails_admin_basic_create_spec.rb +140 -0
  375. data/spec/integration/basic/create/rails_admin_namespaced_model_create_spec.rb +16 -0
  376. data/spec/integration/basic/delete/rails_admin_basic_delete_spec.rb +64 -0
  377. data/spec/integration/basic/destroy/rails_admin_basic_destroy_spec.rb +84 -0
  378. data/spec/integration/basic/edit/rails_admin_basic_edit_spec.rb +109 -0
  379. data/spec/integration/basic/export/rails_admin_basic_export_spec.rb +106 -0
  380. data/spec/integration/basic/list/rails_admin_basic_list_spec.rb +444 -0
  381. data/spec/integration/basic/new/rails_admin_basic_new_spec.rb +73 -0
  382. data/spec/integration/basic/new/rails_admin_namespaced_model_new_spec.rb +31 -0
  383. data/spec/integration/basic/show/rails_admin_basic_show_spec.rb +82 -0
  384. data/spec/integration/basic/update/rails_admin_basic_update_spec.rb +229 -0
  385. data/spec/integration/config/edit/rails_admin_config_edit_spec.rb +1026 -0
  386. data/spec/integration/config/list/rails_admin_config_list_spec.rb +441 -0
  387. data/spec/integration/config/show/rails_admin_config_show_spec.rb +331 -0
  388. data/spec/integration/history/rails_admin_history_spec.rb +88 -0
  389. data/spec/integration/rails_admin_spec.rb +150 -0
  390. data/spec/integration/relation_spec.rb +35 -0
  391. data/spec/orm/active_record.rb +42 -0
  392. data/spec/orm/mongoid.rb +21 -0
  393. data/spec/rails_admin/abstract_model_spec.rb +75 -0
  394. data/spec/rails_admin/active_record_extension_spec.rb +16 -0
  395. data/spec/rails_admin/adapters/active_record/abstract_object_spec.rb +132 -0
  396. data/spec/rails_admin/adapters/active_record_spec.rb +409 -0
  397. data/spec/rails_admin/adapters/mongoid/abstract_object_spec.rb +31 -0
  398. data/spec/rails_admin/adapters/mongoid_spec.rb +776 -0
  399. data/spec/rails_admin/config/actions/base_spec.rb +32 -0
  400. data/spec/rails_admin/config/actions_spec.rb +180 -0
  401. data/spec/rails_admin/config/fields/base_spec.rb +421 -0
  402. data/spec/rails_admin/config/fields/date_spec.rb +74 -0
  403. data/spec/rails_admin/config/fields/datetime_spec.rb +55 -0
  404. data/spec/rails_admin/config/fields/file_upload_spec.rb +21 -0
  405. data/spec/rails_admin/config/fields/time_spec.rb +39 -0
  406. data/spec/rails_admin/config/fields/timestamp_spec.rb +20 -0
  407. data/spec/rails_admin/config/fields/types/datetime_spec.rb +18 -0
  408. data/spec/rails_admin/config/fields_spec.rb +15 -0
  409. data/spec/rails_admin/config/has_fields_spec.rb +30 -0
  410. data/spec/rails_admin/config/lazy_model_spec.rb +29 -0
  411. data/spec/rails_admin/config/model_spec.rb +75 -0
  412. data/spec/rails_admin/config/sections_spec.rb +123 -0
  413. data/spec/rails_admin/config_spec.rb +277 -0
  414. data/spec/rails_admin/support/csv_converter_spec.rb +16 -0
  415. data/spec/spec_helper.rb +84 -0
  416. metadata +868 -0
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Namespaced Model Create" do
4
+
5
+ subject { page }
6
+
7
+ it "creates object with correct attributes" do
8
+ visit new_path(:model_name => "cms~basic_page")
9
+
10
+ fill_in "cms_basic_page[title]", :with => "Hello"
11
+ fill_in "cms_basic_page[content]", :with => "World"
12
+ expect {
13
+ click_button "Save" # first(:button, "Save").click
14
+ }.to change(Cms::BasicPage, :count).by(1)
15
+ end
16
+ end
@@ -0,0 +1,64 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Delete" do
4
+
5
+ subject { page }
6
+
7
+ describe "delete" do
8
+ it "shows \"Delete model\"" do
9
+ @draft = FactoryGirl.create :draft
10
+ @player = @draft.player
11
+ @comment = @player.comments.create
12
+ visit delete_path(:model_name => "player", :id => @player.id)
13
+ should have_content("delete this player")
14
+ should have_link(@player.name, :href => "/admin/player/#{@player.id}")
15
+ should have_link("Draft ##{@draft.id}", :href => "/admin/draft/#{@draft.id}")
16
+ should have_link("Comment ##{@comment.id}", :href => "/admin/comment/#{@comment.id}")
17
+ end
18
+ end
19
+
20
+ describe "delete with missing object" do
21
+ before(:each) do
22
+ visit delete_path(:model_name => "player", :id => 1)
23
+ end
24
+
25
+ it "raises NotFound" do
26
+ expect(page.driver.status_code).to eq(404)
27
+ end
28
+ end
29
+
30
+ describe "with show action disabled" do
31
+ before(:each) do
32
+ RailsAdmin.config.actions do
33
+ dashboard
34
+ index
35
+ delete
36
+ end
37
+ @draft = FactoryGirl.create :draft
38
+ @player = @draft.player
39
+ @comment = @player.comments.create
40
+ visit delete_path(:model_name => "player", :id => @player.id)
41
+ end
42
+
43
+ it "shows \"Delete model\"" do
44
+ should have_content("delete this player")
45
+ should_not have_selector("a[href=\"/admin/player/#{@player.id}\"]")
46
+ should_not have_selector("a[href=\"/admin/draft/#{@draft.id}\"]")
47
+ should_not have_selector("a[href=\"/admin/comment/#{@comment.id}\"]")
48
+ end
49
+ end
50
+
51
+ describe "delete of an object which has an associated item without id" do
52
+ before(:each) do
53
+ @player = FactoryGirl.create :player
54
+ Player.any_instance.stub(:draft).and_return(Draft.new)
55
+ visit delete_path(:model_name => "player", :id => @player.id)
56
+ end
57
+
58
+ it "shows \"Delete model\"" do
59
+ should_not have_content("Routing Error")
60
+ should have_content("delete this player")
61
+ should have_link(@player.name, :href => "/admin/player/#{@player.id}")
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,84 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Destroy" do
4
+
5
+ subject { page }
6
+
7
+ describe "destroy" do
8
+ before(:each) do
9
+ @player = FactoryGirl.create :player
10
+ visit delete_path(:model_name => "player", :id => @player.id)
11
+ click_button "Yes, I'm sure"
12
+ @player = RailsAdmin::AbstractModel.new("Player").first
13
+ end
14
+
15
+ it "destroys an object" do
16
+ expect(@player).to be_nil
17
+ end
18
+
19
+ it "shows success message" do
20
+ should have_content('Player successfully deleted')
21
+ end
22
+ end
23
+
24
+ describe "handle destroy errors" do
25
+ before(:each) do
26
+ Player.any_instance.stub(:destroy_hook).and_return false
27
+ @player = FactoryGirl.create :player
28
+ visit delete_path(:model_name => "player", :id => @player.id)
29
+ click_button "Yes, I'm sure"
30
+ end
31
+
32
+ it "does not destroy an object" do
33
+ expect(@player.reload).to be
34
+ end
35
+
36
+ it "shows error message" do
37
+ should have_content('Player failed to be deleted')
38
+ end
39
+ end
40
+
41
+ describe "destroy" do
42
+ before(:each) do
43
+ @player = FactoryGirl.create :player
44
+ visit delete_path(:model_name => "player", :id => @player.id)
45
+ click_button "Cancel"
46
+ @player = RailsAdmin::AbstractModel.new("Player").first
47
+ end
48
+
49
+ it "does not destroy an object" do
50
+ expect(@player).to be
51
+ end
52
+ end
53
+
54
+ describe "destroy with missing object" do
55
+ before(:each) do
56
+ delete delete_path(:model_name => "player", :id => 1)
57
+ end
58
+
59
+ it "raises NotFound" do
60
+ expect(response.code).to eq("404")
61
+ end
62
+ end
63
+
64
+ describe "destroy from show page" do
65
+ it "redirects to the index instead of trying to show the deleted object" do
66
+ @player = FactoryGirl.create :player
67
+ visit show_path(:model_name => 'player', :id => @player.id)
68
+ click_link "Delete"
69
+ click_button "Yes, I'm sure"
70
+
71
+ expect(URI.parse(page.current_url).path).to eq(index_path(:model_name => 'player'))
72
+ end
73
+
74
+ it "redirects back to the object on error" do
75
+ Player.any_instance.stub(:destroy_hook).and_return false
76
+ @player = FactoryGirl.create :player
77
+ visit show_path(:model_name => 'player', :id => @player.id)
78
+ click_link "Delete"
79
+ click_button "Yes, I'm sure"
80
+
81
+ expect(URI.parse(page.current_url).path).to eq(show_path(:model_name => 'player', :id => @player.id))
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,109 @@
1
+ require 'spec_helper'
2
+
3
+ describe "RailsAdmin Basic Edit" do
4
+
5
+ subject { page }
6
+
7
+ describe "edit" do
8
+ before(:each) do
9
+ @player = FactoryGirl.create :player
10
+ visit edit_path(:model_name => "player", :id => @player.id)
11
+ end
12
+
13
+ it "shows \"Edit model\"" do
14
+ should have_content("Edit Player")
15
+ end
16
+
17
+ it "shows required fields as \"Required\"" do
18
+ should have_selector("div", :text => /Name\s*Required/)
19
+ should have_selector("div", :text => /Number\s*Required/)
20
+ end
21
+
22
+ it "shows non-required fields as \"Optional\"" do
23
+ expect(find("#player_position_field .help-block")).to have_content("Optional")
24
+ expect(find("#player_born_on_field .help-block")).to have_content("Optional")
25
+ expect(find("#player_notes_field .help-block")).to have_content("Optional")
26
+ end
27
+ end
28
+
29
+ describe "association with inverse_of option" do
30
+ it "adds a related id to the belongs_to create team link" do
31
+ @player = FactoryGirl.create :player
32
+ visit edit_path(:model_name => "player", :id => @player.id)
33
+ should have_selector("a[data-link='/admin/team/new?associations%5Bplayers%5D=#{@player.id.to_s}&modal=true']")
34
+ end
35
+
36
+ it "adds a related id to the has_many create team link" do
37
+ @team = FactoryGirl.create :team
38
+ visit edit_path(:model_name => "team", :id => @team.id)
39
+ should have_selector("a[data-link='/admin/player/new?associations%5Bteam%5D=#{@team.id.to_s}&modal=true']")
40
+ end
41
+ end
42
+
43
+ describe "readonly associations" do
44
+
45
+ it "is not editable" do
46
+ @league = FactoryGirl.create :league
47
+ visit edit_path(:model_name => "league", :id => @league.id)
48
+ should_not have_selector('select#league_team_ids')
49
+ should have_selector('select#league_division_ids') # decoy, fails if naming scheme changes
50
+ end
51
+ end
52
+
53
+ describe "edit with has-and-belongs-to-many association" do
54
+ before(:each) do
55
+ @teams = 3.times.map { FactoryGirl.create :team }
56
+ @fan = FactoryGirl.create :fan, :teams => [@teams[0]]
57
+ visit edit_path(:model_name => "fan", :id => @fan.id)
58
+ end
59
+
60
+ it "shows associated objects" do
61
+ should have_selector "#fan_team_ids" do |select|
62
+ expect(select[0]).to have_selector 'option[selected="selected"]'
63
+ expect(select[1]).not_to have_selector 'option[selected="selected"]'
64
+ expect(select[2]).not_to have_selector 'option[selected="selected"]'
65
+ end
66
+ end
67
+ end
68
+
69
+ describe "edit with missing object" do
70
+ before(:each) do
71
+ visit edit_path(:model_name => "player", :id => 1)
72
+ end
73
+
74
+ it "raises NotFound" do
75
+ expect(page.driver.status_code).to eq(404)
76
+ end
77
+ end
78
+
79
+ describe "edit with missing label", :given => ["a player exists", "three teams with no name exist"] do
80
+ before(:each) do
81
+ @player = FactoryGirl.create :player
82
+ @teams = 3.times.map { FactoryGirl.create :team, :name => "" }
83
+ visit edit_path(:model_name => "player", :id => @player.id)
84
+ end
85
+ end
86
+
87
+ describe "edit object with overridden to_param" do
88
+ before(:each) do
89
+ @ball = FactoryGirl.create :ball
90
+ visit edit_path(:model_name => "ball", :id => @ball.id)
91
+ end
92
+
93
+ it "displays a link to the delete page" do
94
+ should have_selector "a[href='/admin/ball/#{@ball.id}/delete']"
95
+ end
96
+
97
+ end
98
+
99
+ describe "clicking cancel when editing an object" do
100
+
101
+ it "sends back to previous URL" do
102
+ @ball = FactoryGirl.create :ball
103
+ visit '/admin/ball?sort=color'
104
+ click_link 'Edit'
105
+ click_button 'Cancel'
106
+ expect(page.current_url).to eq('http://www.example.com/admin/ball?sort=color')
107
+ end
108
+ end
109
+ end
@@ -0,0 +1,106 @@
1
+ require 'spec_helper'
2
+ require 'csv'
3
+
4
+ describe "RailsAdmin Export" do
5
+
6
+ subject { page }
7
+
8
+ before(:each) do
9
+ Comment.all.map &:destroy # rspec bug => doesn't get destroyed with transaction
10
+
11
+ @players = 4.times.map { FactoryGirl.create :player }
12
+ @player = @players.first
13
+ @player.team = FactoryGirl.create :team
14
+ @player.draft = FactoryGirl.create :draft
15
+ @player.comments = (@comments = 2.times.map { FactoryGirl.create(:comment) })
16
+ @player.save
17
+
18
+ @abstract_model = RailsAdmin::AbstractModel.new(Player)
19
+
20
+ # removed schema=>only=>created_at
21
+ @non_default_schema = {
22
+ "only"=>[PK_COLUMN.to_s, "updated_at", "deleted_at", "name", "position", "number", "retired", "injured", "born_on", "notes", "suspended"],
23
+ "include"=>{
24
+ "team"=>{"only"=>[PK_COLUMN.to_s, "created_at", "updated_at", "name", "logo_url", "manager", "ballpark", "mascot", "founded", "wins", "losses", "win_percentage", "revenue", "color"]},
25
+ "draft"=>{"only"=>[PK_COLUMN.to_s, "created_at", "updated_at", "date", "round", "pick", "overall", "college", "notes"]},
26
+ "comments"=>{"only"=>[PK_COLUMN.to_s, "content", "created_at", "updated_at"]}
27
+ }
28
+ }
29
+ end
30
+
31
+ describe "POST /admin/players/export (prompt)" do
32
+
33
+ it "allows to export to CSV with associations and default schema, containing properly translated header and follow configuration" do
34
+ RailsAdmin.config do |c|
35
+ c.model Player do
36
+ include_all_fields
37
+ field :name do
38
+ export_value do
39
+ "#{value} exported"
40
+ end
41
+ end
42
+ end
43
+ end
44
+
45
+ visit export_path(:model_name => 'player')
46
+ should have_content 'Select fields to export'
47
+ select "<comma> ','", :from => "csv_options_generator_col_sep"
48
+ click_button 'Export to csv'
49
+ csv = CSV.parse page.driver.response.body.force_encoding("utf-8") # comes through as us-ascii on some platforms
50
+ expect(csv[0]).to match_array ["Id", "Created at", "Updated at", "Deleted at", "Name", "Position",
51
+ "Number", "Retired", "Injured", "Born on", "Notes", "Suspended", "Id [Team]", "Created at [Team]",
52
+ "Updated at [Team]", "Name [Team]", "Logo url [Team]", "Team Manager [Team]", "Ballpark [Team]",
53
+ "Mascot [Team]", "Founded [Team]", "Wins [Team]", "Losses [Team]", "Win percentage [Team]",
54
+ "Revenue [Team]", "Color [Team]", "Custom field [Team]", "Id [Draft]", "Created at [Draft]",
55
+ "Updated at [Draft]", "Date [Draft]", "Round [Draft]", "Pick [Draft]", "Overall [Draft]",
56
+ "College [Draft]", "Notes [Draft]", "Id [Comments]", "Content [Comments]", "Created at [Comments]",
57
+ "Updated at [Comments]"]
58
+ expect(csv.flatten).to include(@player.name + " exported")
59
+ expect(csv.flatten).to include(@player.team.name)
60
+ expect(csv.flatten).to include(@player.draft.college)
61
+
62
+ expect(csv.flatten.join(' ')).to include(@player.comments.first.content.split("\n").first.strip)
63
+ expect(csv.flatten.join(' ')).to include(@player.comments.second.content.split("\n").first.strip)
64
+ end
65
+
66
+ it "allows to export to JSON" do
67
+ visit export_path(:model_name => 'player')
68
+ click_button 'Export to json'
69
+ should have_content @player.team.name
70
+ end
71
+
72
+ it "allows to export to XML" do
73
+ visit export_path(:model_name => 'player')
74
+ click_button 'Export to xml'
75
+
76
+ # spec fails on non 1.9 mri rubies because of this https://github.com/rails/rails/pull/2076
77
+ # waiting for fix (rails-3.1.4?)
78
+ # and Mongoid with ActiveModel 3.1 does not support to_xml's :include options
79
+ # (due change of implementation in ActiveModel::Serializers between 3.1 and 3.2)
80
+ if RUBY_VERSION =~ /1\.9/ &&
81
+ (CI_ORM != :mongoid || (CI_ORM == :mongoid && ActiveModel::VERSION::STRING >= "3.2"))
82
+ should have_content @player.team.name
83
+ end
84
+ end
85
+
86
+ it "exports polymorphic fields the easy way for now" do
87
+ visit export_path(:model_name => 'comment')
88
+ select "<comma> ','", :from => "csv_options_generator_col_sep"
89
+ click_button 'Export to csv'
90
+ csv = CSV.parse page.driver.response.body
91
+ expect(csv[0]).to match_array ["Id", "Commentable", "Commentable type", "Content", "Created at", "Updated at"]
92
+ csv[1..-1].each do |line|
93
+ expect(line[csv[0].index('Commentable')]).to eq(@player.id.to_s)
94
+ expect(line[csv[0].index('Commentable type')]).to eq(@player.class.to_s)
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "POST /admin/players/export :format => :csv" do
100
+ it "exports with modified schema" do
101
+ page.driver.post(export_path(:model_name => 'player', :schema => @non_default_schema, :csv => true, :all => true, :csv_options => { :generator => { :col_sep => "," } }))
102
+ csv = CSV.parse find('body').text
103
+ expect(csv[0]).not_to include('Created at')
104
+ end
105
+ end
106
+ end
@@ -0,0 +1,444 @@
1
+ # coding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe "RailsAdmin Basic List" do
6
+
7
+ subject { page }
8
+
9
+ describe "GET /admin" do
10
+ it "responds successfully" do
11
+ visit dashboard_path
12
+ end
13
+ end
14
+
15
+ describe "GET /admin/typo" do
16
+ it "redirects to dashboard and inform the user the model wasn't found" do
17
+ visit '/admin/whatever'
18
+ expect(page.driver.status_code).to eq(404)
19
+ expect(find('.alert-error')).to have_content("Model 'Whatever' could not be found")
20
+ end
21
+ end
22
+
23
+ describe "GET /admin/balls/545-typo" do
24
+ it "redirects to balls index and inform the user the id wasn't found" do
25
+ visit '/admin/ball/545-typo'
26
+ expect(page.driver.status_code).to eq(404)
27
+ expect(find('.alert-error')).to have_content("Ball with id '545-typo' could not be found")
28
+ end
29
+ end
30
+
31
+ describe "GET /admin/player as list" do
32
+ it "shows \"List of Models\", should show filters and should show column headers" do
33
+ RailsAdmin.config.default_items_per_page = 1
34
+ 2.times { FactoryGirl.create :player } # two pages of players
35
+ visit index_path(:model_name => "player")
36
+ should have_content("List of Players")
37
+ should have_content("Created at")
38
+ should have_content("Updated at")
39
+
40
+ # it "shows the show, edit and delete links" do
41
+ should have_selector("li[title='Show'] a")
42
+ should have_selector("li[title='Edit'] a")
43
+ should have_selector("li[title='Delete'] a")
44
+
45
+ # it "has the search box with some prompt text" do
46
+ should have_selector("input[placeholder='Filter']")
47
+
48
+ # https://github.com/sferik/rails_admin/issues/362
49
+ # test that no link uses the "wildcard route" with the main
50
+ # controller and list method
51
+ # it "does not use the 'wildcard route'" do
52
+ should have_selector("a[href*='all=true']") # make sure we're fully testing pagination
53
+ should have_no_selector("a[href^='/rails_admin/main/list']")
54
+ end
55
+ end
56
+
57
+ describe "GET /admin/player" do
58
+ before do
59
+ @teams = 2.times.map do
60
+ FactoryGirl.create(:team)
61
+ end
62
+ @players = [
63
+ FactoryGirl.create(:player, :retired => true, :injured => true, :team => @teams[0]),
64
+ FactoryGirl.create(:player, :retired => true, :injured => false, :team => @teams[0]),
65
+ FactoryGirl.create(:player, :retired => false, :injured => true, :team => @teams[1]),
66
+ FactoryGirl.create(:player, :retired => false, :injured => false, :team => @teams[1]),
67
+ ]
68
+ end
69
+
70
+ it "allows to query on any attribute" do
71
+ RailsAdmin.config Player do
72
+ list do
73
+ field :name
74
+ field :team
75
+ field :injured
76
+ field :retired
77
+ end
78
+ end
79
+
80
+ visit index_path(:model_name => "player", :query => @players[0].name)
81
+ should have_content(@players[0].name)
82
+ (1..3).each do |i|
83
+ should have_no_content(@players[i].name)
84
+ end
85
+ end
86
+
87
+ it "allows to filter on one attribute" do
88
+ RailsAdmin.config Player do
89
+ list do
90
+ field :name
91
+ field :team
92
+ field :injured
93
+ field :retired
94
+ end
95
+ end
96
+
97
+ visit index_path(:model_name => "player", :f => {:injured => {"1" => {:v => "true"}}})
98
+ should have_content(@players[0].name)
99
+ should have_no_content(@players[1].name)
100
+ should have_content(@players[2].name)
101
+ should have_no_content(@players[3].name)
102
+ end
103
+
104
+ it "allows to combine filters on two different attributes" do
105
+ RailsAdmin.config Player do
106
+ list do
107
+ field :name
108
+ field :team
109
+ field :injured
110
+ field :retired
111
+ end
112
+ end
113
+
114
+ visit index_path(:model_name => "player", :f => {:retired => {"1" => {:v => "true"}}, :injured => {"1" => {:v => "true"}}})
115
+ should have_content(@players[0].name)
116
+ (1..3).each do |i|
117
+ should have_no_content(@players[i].name)
118
+ end
119
+ end
120
+
121
+ it "allows to filter on belongs_to relationships" do
122
+ RailsAdmin.config Player do
123
+ list do
124
+ field :name
125
+ field :team
126
+ field :injured
127
+ field :retired
128
+ end
129
+ end
130
+
131
+ visit index_path(:model_name => "player", :f => {:team => {"1" => { :v => @teams[0].name }}})
132
+ should have_content(@players[0].name)
133
+ should have_content(@players[1].name)
134
+ should have_no_content(@players[2].name)
135
+ should have_no_content(@players[3].name)
136
+ end
137
+
138
+ it "allows to disable search on attributes" do
139
+ RailsAdmin.config Player do
140
+ list do
141
+ field :position
142
+ field :name do
143
+ searchable false
144
+ end
145
+ end
146
+ end
147
+ visit index_path(:model_name => "player", :query => @players[0].name)
148
+ should have_no_content(@players[0].name)
149
+ end
150
+
151
+ it "allows to search a belongs_to attribute over the base table" do
152
+ RailsAdmin.config Player do
153
+ list do
154
+ field PK_COLUMN
155
+ field :name
156
+ field :team do
157
+ searchable Player => :team_id
158
+ end
159
+ end
160
+ end
161
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.id}}})
162
+ should have_content(@players[0].name)
163
+ should have_content(@players[1].name)
164
+ should have_no_content(@players[2].name)
165
+ should have_no_content(@players[3].name)
166
+ end
167
+
168
+
169
+ it "allows to search a belongs_to attribute over the target table" do
170
+ RailsAdmin.config Player do
171
+ list do
172
+ field PK_COLUMN
173
+ field :name
174
+ field :team do
175
+ searchable Team => :name
176
+ end
177
+ end
178
+ end
179
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
180
+ should have_content(@players[0].name)
181
+ should have_content(@players[1].name)
182
+ should have_no_content(@players[2].name)
183
+ should have_no_content(@players[3].name)
184
+ end
185
+
186
+ it "allows to search a belongs_to attribute over the target table with a table name specified as a hash" do
187
+ RailsAdmin.config Player do
188
+ list do
189
+ field PK_COLUMN
190
+ field :name
191
+ field :team do
192
+ searchable :teams => :name
193
+ end
194
+ end
195
+ end
196
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
197
+ should have_content(@players[0].name)
198
+ should have_content(@players[1].name)
199
+ should have_no_content(@players[2].name)
200
+ should have_no_content(@players[3].name)
201
+ end
202
+
203
+ it "allows to search a belongs_to attribute over the target table with a table name specified as a string" do
204
+ RailsAdmin.config Player do
205
+ list do
206
+ field PK_COLUMN
207
+ field :name
208
+ field :team do
209
+ searchable 'teams.name'
210
+ end
211
+ end
212
+ end
213
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
214
+ should have_content(@players[0].name)
215
+ should have_content(@players[1].name)
216
+ should have_no_content(@players[2].name)
217
+ should have_no_content(@players[3].name)
218
+ end
219
+
220
+ it "allows to search a belongs_to attribute over the label method by default" do
221
+ RailsAdmin.config Player do
222
+ list do
223
+ field PK_COLUMN
224
+ field :name
225
+ field :team
226
+ end
227
+ end
228
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
229
+ should have_content(@players[0].name)
230
+ should have_content(@players[1].name)
231
+ should have_no_content(@players[2].name)
232
+ should have_no_content(@players[3].name)
233
+ end
234
+
235
+ it "allows to search a belongs_to attribute over the target table when an attribute is specified" do
236
+ RailsAdmin.config Player do
237
+ list do
238
+ field PK_COLUMN
239
+ field :name
240
+ field :team do
241
+ searchable :name
242
+ end
243
+ end
244
+ end
245
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}}})
246
+ should have_content(@players[0].name)
247
+ should have_content(@players[1].name)
248
+ should have_no_content(@players[2].name)
249
+ should have_no_content(@players[3].name)
250
+ end
251
+
252
+ it "allows to search over more than one attribute" do
253
+ RailsAdmin.config Player do
254
+ list do
255
+ field PK_COLUMN
256
+ field :name
257
+ field :team do
258
+ searchable [:name, {Player => :team_id}]
259
+ end
260
+ end
261
+ end
262
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}, "2" => {:v => @teams.first.id, :o => 'is'}}})
263
+ should have_content(@players[0].name)
264
+ should have_content(@players[1].name)
265
+ should have_no_content(@players[2].name)
266
+ should have_no_content(@players[3].name)
267
+ # same with a different id
268
+ visit index_path(:model_name => "player", :f => {:team => {"1" => {:v => @teams.first.name}, "2" => {:v => @teams.last.id, :o => 'is'}}})
269
+ should have_no_content(@players[0].name)
270
+ should have_no_content(@players[1].name)
271
+ should have_no_content(@players[2].name)
272
+ should have_no_content(@players[3].name)
273
+ end
274
+
275
+ it "displays base filters when no filters are present in the params" do
276
+ RailsAdmin.config Player do
277
+ list do
278
+ filters [:name, :team]
279
+ end
280
+ end
281
+
282
+ get index_path(:model_name => "player")
283
+ expect(response.body).to include(%{$.filters.append("Name", "name", "string", "", null, "", 1);})
284
+ expect(response.body).to include(%{$.filters.append("Team", "team", "belongs_to_association", "", null, "", 2);})
285
+ end
286
+ end
287
+
288
+ describe "GET /admin/player with 2 objects" do
289
+ before(:each) do
290
+ @players = 2.times.map { FactoryGirl.create :player }
291
+ visit index_path(:model_name => "player")
292
+ end
293
+
294
+ it "shows \"2 results\"" do
295
+ should have_content("2 players")
296
+ end
297
+ end
298
+
299
+ describe "GET /admin/player with 2 objects" do
300
+ before(:each) do
301
+ @players = 2.times.map { FactoryGirl.create :player }
302
+ visit index_path(:model_name => "player")
303
+ end
304
+
305
+ it "shows \"2 results\"" do
306
+ should have_content("2 players")
307
+ end
308
+ end
309
+
310
+ describe "GET /admin/player with 3 pages, page 2" do
311
+ before do
312
+ RailsAdmin.config.default_items_per_page = 1
313
+ items_per_page = RailsAdmin.config.default_items_per_page
314
+ (items_per_page * 3).times { FactoryGirl.create(:player) }
315
+ visit index_path(:model_name => "player", :page => 2)
316
+ end
317
+
318
+ it "paginates correctly" do
319
+ expect(find('.pagination ul li:first')).to have_content("« Prev")
320
+ expect(find('.pagination ul li:last')).to have_content("Next »")
321
+ expect(find('.pagination ul li.active')).to have_content("2")
322
+ end
323
+ end
324
+
325
+ describe "list with 3 pages, page 3" do
326
+ before(:each) do
327
+ items_per_page = RailsAdmin.config.default_items_per_page
328
+ @players = (items_per_page * 3).times.map { FactoryGirl.create(:player) }
329
+ visit index_path(:model_name => "player", :page => 3)
330
+ end
331
+
332
+ it "paginates correctly and contain the right item" do
333
+ expect(find('.pagination ul li:first')).to have_content("« Prev")
334
+ expect(find('.pagination ul li:last')).to have_content("Next »")
335
+ expect(find('.pagination ul li.active')).to have_content("3")
336
+ end
337
+ end
338
+
339
+ describe "GET /admin/player show all" do
340
+ it "responds successfully with a single model" do
341
+ FactoryGirl.create :player
342
+ visit index_path(:model_name => "player", :all => true)
343
+ expect(find('div.total-count')).to have_content("1 player")
344
+ expect(find('div.total-count')).not_to have_content("1 players")
345
+ end
346
+
347
+ it "responds successfully with multiple models" do
348
+ 2.times.map { FactoryGirl.create :player }
349
+ visit index_path(:model_name => "player", :all => true)
350
+ expect(find('div.total-count')).to have_content("2 players")
351
+ end
352
+ end
353
+
354
+ describe "GET /admin/player show with pagination disabled by :associated_collection" do
355
+ it "responds successfully" do
356
+ @team = FactoryGirl.create :team
357
+ 2.times.map { FactoryGirl.create :player, :team => @team }
358
+ visit index_path(:model_name => "player", :associated_collection => "players", :compact => true, :current_action => 'update', :source_abstract_model => 'team', :source_object_id => @team.id)
359
+ expect(find('div.total-count')).to have_content("2 players")
360
+ end
361
+ end
362
+
363
+ describe "list as compact json" do
364
+ it "has_content an array with 2 elements and contain an array of elements with keys id and label" do
365
+ 2.times.map { FactoryGirl.create :player }
366
+ get index_path(:model_name => "player", :compact => true, :format => :json)
367
+ expect(ActiveSupport::JSON.decode(response.body).length).to eq(2)
368
+ ActiveSupport::JSON.decode(response.body).each do |object|
369
+ expect(object).to have_key("id")
370
+ expect(object).to have_key("label")
371
+ end
372
+ end
373
+ end
374
+
375
+ describe "search operator" do
376
+ let(:player) { FactoryGirl.create :player }
377
+
378
+ before do
379
+ expect(Player.count).to eq(0)
380
+ end
381
+
382
+ it "finds the player if the query matches the default search opeartor" do
383
+ RailsAdmin.config do |config|
384
+ config.default_search_operator = 'ends_with'
385
+ config.model Player do
386
+ list { field :name }
387
+ end
388
+ end
389
+ visit index_path(:model_name => "player", :query => player.name[2, -1])
390
+ should have_content(player.name)
391
+ end
392
+
393
+ it "does not find the player if the query does not match the default search opeartor" do
394
+ RailsAdmin.config do |config|
395
+ config.default_search_operator = 'ends_with'
396
+ config.model Player do
397
+ list { field :name }
398
+ end
399
+ end
400
+ visit index_path(:model_name => "player", :query => player.name[0, 2])
401
+ should have_no_content(player.name)
402
+ end
403
+
404
+ it "finds the player if the query matches the specified search operator" do
405
+ RailsAdmin.config Player do
406
+ list do
407
+ field :name do
408
+ search_operator 'starts_with'
409
+ end
410
+ end
411
+ end
412
+ visit index_path(:model_name => "player", :query => player.name[0, 2])
413
+ should have_content(player.name)
414
+ end
415
+
416
+ it "does not find the player if the query does not match the specified search operator" do
417
+ RailsAdmin.config Player do
418
+ list do
419
+ field :name do
420
+ search_operator 'starts_with'
421
+ end
422
+ end
423
+ end
424
+ visit index_path(:model_name => "player", :query => player.name[1..-1])
425
+ should have_no_content(player.name)
426
+ end
427
+ end
428
+
429
+ describe "list for objects with overridden to_param" do
430
+ before(:each) do
431
+ @ball = FactoryGirl.create :ball
432
+
433
+ visit index_path(:model_name => "ball")
434
+ end
435
+
436
+ it "shows the show, edit and delete links with valid url" do
437
+ should have_selector("td a[href='/admin/ball/#{@ball.id}']")
438
+ should have_selector("td a[href='/admin/ball/#{@ball.id}/edit']")
439
+ should have_selector("td a[href='/admin/ball/#{@ball.id}/delete']")
440
+ end
441
+
442
+ end
443
+
444
+ end