activeadmin 0.6.6 → 1.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of activeadmin might be problematic. Click here for more details.

Files changed (512) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +11 -8
  3. data/.hound.yml +11 -0
  4. data/.travis.yml +36 -10
  5. data/.yardopts +2 -1
  6. data/CHANGELOG.md +118 -67
  7. data/CONTRIBUTING.md +96 -73
  8. data/Gemfile +35 -35
  9. data/Guardfile +1 -0
  10. data/LICENSE +1 -1
  11. data/README.md +98 -0
  12. data/Rakefile +12 -4
  13. data/activeadmin.gemspec +21 -24
  14. data/app/assets/javascripts/active_admin/application.js.coffee +32 -0
  15. data/app/assets/javascripts/active_admin/base.js.coffee +14 -0
  16. data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
  17. data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
  18. data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
  19. data/app/assets/javascripts/active_admin/{components/jquery.aa.checkbox-toggler.js.coffee → lib/checkbox-toggler.js.coffee} +3 -4
  20. data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
  21. data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
  22. data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
  23. data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +37 -0
  24. data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +27 -0
  25. data/app/assets/javascripts/active_admin/lib/popover.js.coffee +68 -0
  26. data/app/assets/javascripts/active_admin/{components/jquery.aa.table-checkbox-toggler.js.coffee → lib/table-checkbox-toggler.js.coffee} +2 -3
  27. data/app/assets/stylesheets/active_admin/{_base.css.scss → _base.scss} +3 -0
  28. data/app/assets/stylesheets/active_admin/{_forms.css.scss → _forms.scss} +61 -17
  29. data/app/assets/stylesheets/active_admin/{_header.css.scss → _header.scss} +9 -5
  30. data/app/assets/stylesheets/active_admin/{_mixins.css.scss → _mixins.scss} +0 -0
  31. data/app/assets/stylesheets/active_admin/{_typography.css.scss → _typography.scss} +0 -0
  32. data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
  33. data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +0 -1
  34. data/app/assets/stylesheets/active_admin/components/_buttons.scss +1 -1
  35. data/app/assets/stylesheets/active_admin/components/{_comments.css.scss → _comments.scss} +0 -0
  36. data/app/assets/stylesheets/active_admin/components/{_date_picker.css.scss → _date_picker.scss} +40 -14
  37. data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +5 -4
  38. data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
  39. data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
  40. data/app/assets/stylesheets/active_admin/components/_pagination.scss +10 -0
  41. data/app/assets/stylesheets/active_admin/components/{_popovers.css.scss → _popovers.scss} +2 -3
  42. data/app/assets/stylesheets/active_admin/components/_status_tags.scss +4 -0
  43. data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
  44. data/app/assets/stylesheets/active_admin/components/{_tables.css.scss → _tables.scss} +4 -2
  45. data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
  46. data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
  47. data/app/assets/stylesheets/active_admin/mixins/{_all.css.scss → _all.scss} +0 -0
  48. data/app/assets/stylesheets/active_admin/mixins/{_buttons.css.scss → _buttons.scss} +0 -1
  49. data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
  50. data/app/assets/stylesheets/active_admin/mixins/{_icons.css.scss → _icons.scss} +1 -2
  51. data/app/assets/stylesheets/active_admin/mixins/{_reset.css.scss → _reset.scss} +0 -0
  52. data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
  53. data/app/assets/stylesheets/active_admin/mixins/{_sections.css.scss → _sections.scss} +8 -2
  54. data/app/assets/stylesheets/active_admin/mixins/{_shadows.css.scss → _shadows.scss} +0 -7
  55. data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +0 -9
  56. data/app/assets/stylesheets/active_admin/mixins/{_variables.css.scss → _variables.scss} +10 -8
  57. data/app/assets/stylesheets/active_admin/{print.css.scss → print.scss} +4 -0
  58. data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +5 -2
  59. data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +11 -9
  60. data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
  61. data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +1 -1
  62. data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +1 -1
  63. data/app/views/active_admin/devise/passwords/edit.html.erb +9 -10
  64. data/app/views/active_admin/devise/passwords/new.html.erb +5 -4
  65. data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
  66. data/app/views/active_admin/devise/sessions/new.html.erb +9 -7
  67. data/app/views/active_admin/devise/shared/_links.erb +1 -1
  68. data/app/views/active_admin/devise/unlocks/new.html.erb +5 -4
  69. data/app/views/layouts/active_admin_logged_out.html.erb +3 -5
  70. data/config/locales/ar.yml +120 -0
  71. data/config/locales/bg.yml +26 -6
  72. data/config/locales/bs.yml +122 -0
  73. data/config/locales/ca.yml +10 -1
  74. data/config/locales/cs.yml +7 -2
  75. data/config/locales/da.yml +7 -3
  76. data/config/locales/de-CH.yml +14 -31
  77. data/config/locales/de.yml +33 -33
  78. data/config/locales/el.yml +28 -2
  79. data/config/locales/en-GB.yml +12 -4
  80. data/config/locales/en.yml +29 -3
  81. data/config/locales/{es_MX.yml → es-MX.yml} +9 -24
  82. data/config/locales/es.yml +32 -25
  83. data/config/locales/fa.yml +120 -0
  84. data/config/locales/fi.yml +113 -0
  85. data/config/locales/fr.yml +21 -11
  86. data/config/locales/he.yml +7 -3
  87. data/config/locales/hr.yml +42 -11
  88. data/config/locales/hu.yml +10 -3
  89. data/config/locales/it.yml +31 -3
  90. data/config/locales/ja.yml +8 -3
  91. data/config/locales/ko.yml +7 -1
  92. data/config/locales/lt.yml +42 -11
  93. data/config/locales/lv.yml +7 -3
  94. data/config/locales/{no-NB.yml → nb.yml} +46 -15
  95. data/config/locales/nl.yml +36 -5
  96. data/config/locales/pl.yml +13 -8
  97. data/config/locales/pt-BR.yml +37 -5
  98. data/config/locales/pt-PT.yml +8 -4
  99. data/config/locales/ro.yml +7 -3
  100. data/config/locales/ru.yml +26 -5
  101. data/config/locales/sv-SE.yml +9 -5
  102. data/config/locales/tr.yml +10 -3
  103. data/config/locales/uk.yml +36 -12
  104. data/config/locales/vi.yml +7 -3
  105. data/config/locales/zh-CN.yml +26 -10
  106. data/config/locales/zh-TW.yml +19 -13
  107. data/docs/0-installation.md +65 -29
  108. data/docs/1-general-configuration.md +92 -81
  109. data/docs/10-custom-pages.md +68 -68
  110. data/docs/11-decorators.md +48 -59
  111. data/docs/12-arbre-components.md +80 -74
  112. data/docs/13-authorization-adapter.md +128 -107
  113. data/docs/14-gotchas.md +92 -0
  114. data/docs/2-resource-customization.md +293 -178
  115. data/docs/3-index-pages.md +160 -86
  116. data/docs/3-index-pages/custom-index.md +31 -0
  117. data/docs/3-index-pages/index-as-block.md +14 -9
  118. data/docs/3-index-pages/index-as-blog.md +41 -31
  119. data/docs/3-index-pages/index-as-grid.md +16 -8
  120. data/docs/3-index-pages/index-as-table.md +129 -52
  121. data/docs/4-csv-format.md +31 -24
  122. data/docs/5-forms.md +133 -56
  123. data/docs/6-show-pages.md +89 -27
  124. data/docs/7-sidebars.md +48 -27
  125. data/docs/8-custom-actions.md +98 -77
  126. data/docs/9-batch-actions.md +210 -146
  127. data/docs/README.md +24 -0
  128. data/features/action_item.feature +3 -3
  129. data/features/authorization_pundit.feature +37 -0
  130. data/features/breadcrumb.feature +48 -0
  131. data/features/comments/commenting.feature +56 -13
  132. data/features/development_reloading.feature +17 -30
  133. data/features/edit_page.feature +12 -1
  134. data/features/favicon.feature +3 -3
  135. data/features/i18n.feature +5 -4
  136. data/features/index/batch_actions.feature +41 -0
  137. data/features/index/filters.feature +67 -0
  138. data/features/index/format_as_csv.feature +90 -4
  139. data/features/index/formats.feature +27 -0
  140. data/features/index/index_as_blog.feature +4 -4
  141. data/features/index/index_as_table.feature +102 -6
  142. data/features/index/index_blank_slate.feature +22 -0
  143. data/features/index/index_scope_to.feature +16 -16
  144. data/features/index/page_title.feature +11 -0
  145. data/features/index/pagination.feature +1 -1
  146. data/features/index/switch_index_view.feature +14 -14
  147. data/features/new_page.feature +13 -2
  148. data/features/registering_pages.feature +1 -1
  149. data/features/renamed_resource.feature +32 -0
  150. data/features/show/page_title.feature +11 -0
  151. data/features/show/tabs.feature +27 -0
  152. data/features/sidebar_sections.feature +12 -0
  153. data/features/site_title.feature +2 -2
  154. data/features/specifying_actions.feature +3 -3
  155. data/features/step_definitions/action_item_steps.rb +2 -2
  156. data/features/step_definitions/action_link_steps.rb +14 -1
  157. data/features/step_definitions/additional_web_steps.rb +19 -20
  158. data/features/step_definitions/asset_steps.rb +3 -3
  159. data/features/step_definitions/attribute_steps.rb +8 -3
  160. data/features/step_definitions/batch_action_steps.rb +26 -9
  161. data/features/step_definitions/blog_steps.rb +3 -0
  162. data/features/step_definitions/breadcrumb_steps.rb +1 -1
  163. data/features/step_definitions/comment_steps.rb +1 -1
  164. data/features/step_definitions/configuration_steps.rb +9 -2
  165. data/features/step_definitions/dashboard_steps.rb +2 -2
  166. data/features/step_definitions/factory_steps.rb +9 -8
  167. data/features/step_definitions/filter_steps.rb +25 -3
  168. data/features/step_definitions/flash_steps.rb +3 -3
  169. data/features/step_definitions/format_steps.rb +18 -18
  170. data/features/step_definitions/index_scope_steps.rb +5 -5
  171. data/features/step_definitions/layout_steps.rb +1 -1
  172. data/features/step_definitions/member_link_steps.rb +2 -2
  173. data/features/step_definitions/menu_steps.rb +3 -3
  174. data/features/step_definitions/pagination_steps.rb +2 -3
  175. data/features/step_definitions/sidebar_steps.rb +8 -3
  176. data/features/step_definitions/site_title_steps.rb +6 -4
  177. data/features/step_definitions/symbol_leak_steps.rb +3 -0
  178. data/features/step_definitions/tab_steps.rb +5 -0
  179. data/features/step_definitions/table_steps.rb +4 -4
  180. data/features/step_definitions/user_steps.rb +10 -7
  181. data/features/step_definitions/web_steps.rb +14 -11
  182. data/features/sti_resource.feature +6 -2
  183. data/features/strong_parameters.feature +73 -0
  184. data/features/support/env.rb +34 -9
  185. data/features/support/paths.rb +14 -6
  186. data/features/support/selectors.rb +1 -1
  187. data/features/symbol_leak.feature +35 -0
  188. data/features/users/resetting_password.feature +5 -6
  189. data/lib/active_admin.rb +26 -25
  190. data/lib/active_admin/abstract_view_factory.rb +7 -17
  191. data/lib/active_admin/application.rb +72 -59
  192. data/lib/active_admin/asset_registration.rb +2 -2
  193. data/lib/active_admin/authorization_adapter.rb +2 -2
  194. data/lib/active_admin/base_controller.rb +2 -3
  195. data/lib/active_admin/base_controller/authorization.rb +13 -31
  196. data/lib/active_admin/batch_actions.rb +1 -1
  197. data/lib/active_admin/batch_actions/controller.rb +24 -8
  198. data/lib/active_admin/batch_actions/resource_extension.rb +47 -18
  199. data/lib/active_admin/batch_actions/views/batch_action_form.rb +7 -4
  200. data/lib/active_admin/batch_actions/views/batch_action_popover.rb +3 -3
  201. data/lib/active_admin/batch_actions/views/batch_action_selector.rb +8 -17
  202. data/lib/active_admin/batch_actions/views/selection_cells.rb +4 -4
  203. data/lib/active_admin/callbacks.rb +25 -24
  204. data/lib/active_admin/cancan_adapter.rb +7 -11
  205. data/lib/active_admin/csv_builder.rb +92 -15
  206. data/lib/active_admin/dependency.rb +93 -0
  207. data/lib/active_admin/deprecation.rb +6 -7
  208. data/lib/active_admin/devise.rb +28 -18
  209. data/lib/active_admin/dsl.rb +18 -11
  210. data/lib/active_admin/engine.rb +10 -8
  211. data/lib/active_admin/error.rb +62 -0
  212. data/lib/active_admin/filters/dsl.rb +2 -2
  213. data/lib/active_admin/filters/forms.rb +17 -27
  214. data/lib/active_admin/filters/formtastic_addons.rb +49 -15
  215. data/lib/active_admin/filters/resource_extension.rb +43 -34
  216. data/lib/active_admin/form_builder.rb +93 -154
  217. data/lib/active_admin/helpers/collection.rb +7 -13
  218. data/lib/active_admin/helpers/i18n.rb +7 -0
  219. data/lib/active_admin/helpers/optional_display.rb +5 -5
  220. data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
  221. data/lib/active_admin/helpers/scope_chain.rb +1 -1
  222. data/lib/active_admin/helpers/settings.rb +16 -9
  223. data/lib/active_admin/iconic.rb +17 -15
  224. data/lib/active_admin/iconic/icons.rb +136 -136
  225. data/lib/active_admin/inputs.rb +11 -7
  226. data/lib/active_admin/inputs/datepicker_input.rb +12 -3
  227. data/lib/active_admin/inputs/filters/base.rb +42 -0
  228. data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
  229. data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
  230. data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
  231. data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
  232. data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
  233. data/lib/active_admin/inputs/filters/select_input.rb +54 -0
  234. data/lib/active_admin/inputs/filters/string_input.rb +26 -0
  235. data/lib/active_admin/menu.rb +6 -4
  236. data/lib/active_admin/menu_collection.rb +1 -4
  237. data/lib/active_admin/namespace.rb +55 -29
  238. data/lib/active_admin/order_clause.rb +26 -0
  239. data/lib/active_admin/orm/active_record.rb +5 -0
  240. data/lib/active_admin/orm/active_record/comments.rb +81 -0
  241. data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
  242. data/lib/active_admin/{comments → orm/active_record/comments}/namespace_helper.rb +2 -2
  243. data/lib/active_admin/{comments → orm/active_record/comments}/resource_helper.rb +1 -1
  244. data/lib/active_admin/{comments → orm/active_record/comments}/show_page_helper.rb +0 -0
  245. data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
  246. data/lib/active_admin/{comments → orm/active_record/comments}/views/active_admin_comments.rb +16 -14
  247. data/lib/active_admin/orm/mongoid.rb +1 -0
  248. data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
  249. data/lib/active_admin/page.rb +7 -3
  250. data/lib/active_admin/page_dsl.rb +1 -1
  251. data/lib/active_admin/page_presenter.rb +2 -2
  252. data/lib/active_admin/pundit_adapter.rb +68 -0
  253. data/lib/active_admin/resource.rb +16 -17
  254. data/lib/active_admin/resource/action_items.rb +23 -18
  255. data/lib/active_admin/resource/belongs_to.rb +7 -3
  256. data/lib/active_admin/resource/controllers.rb +1 -0
  257. data/lib/active_admin/resource/includes.rb +12 -0
  258. data/lib/active_admin/resource/menu.rb +5 -5
  259. data/lib/active_admin/resource/naming.rb +27 -43
  260. data/lib/active_admin/resource/page_presenters.rb +1 -1
  261. data/lib/active_admin/resource/routes.rb +27 -11
  262. data/lib/active_admin/resource/scope_to.rb +7 -7
  263. data/lib/active_admin/resource/sidebars.rb +1 -0
  264. data/lib/active_admin/resource_controller.rb +6 -7
  265. data/lib/active_admin/resource_controller/data_access.rb +101 -93
  266. data/lib/active_admin/resource_controller/decorators.rb +91 -9
  267. data/lib/active_admin/resource_controller/streaming.rb +37 -0
  268. data/lib/active_admin/resource_dsl.rb +53 -10
  269. data/lib/active_admin/router.rb +7 -7
  270. data/lib/active_admin/scope.rb +6 -6
  271. data/lib/active_admin/sidebar_section.rb +10 -2
  272. data/lib/active_admin/version.rb +1 -1
  273. data/lib/active_admin/view_factory.rb +17 -17
  274. data/lib/active_admin/view_helpers.rb +0 -1
  275. data/lib/active_admin/view_helpers/auto_link_helper.rb +23 -12
  276. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +4 -3
  277. data/lib/active_admin/view_helpers/display_helper.rb +30 -15
  278. data/lib/active_admin/view_helpers/download_format_links_helper.rb +21 -25
  279. data/lib/active_admin/view_helpers/fields_for.rb +4 -4
  280. data/lib/active_admin/view_helpers/flash_helper.rb +4 -3
  281. data/lib/active_admin/view_helpers/form_helper.rb +5 -9
  282. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +6 -6
  283. data/lib/active_admin/views/action_items.rb +2 -2
  284. data/lib/active_admin/views/components/action_list_popover.rb +1 -1
  285. data/lib/active_admin/views/components/active_admin_form.rb +123 -0
  286. data/lib/active_admin/views/components/attributes_table.rb +63 -21
  287. data/lib/active_admin/views/components/blank_slate.rb +1 -1
  288. data/lib/active_admin/views/components/columns.rb +13 -7
  289. data/lib/active_admin/views/components/dropdown_menu.rb +6 -6
  290. data/lib/active_admin/views/components/index_list.rb +7 -7
  291. data/lib/active_admin/views/components/paginated_collection.rb +38 -20
  292. data/lib/active_admin/views/components/panel.rb +8 -2
  293. data/lib/active_admin/views/components/popover.rb +1 -1
  294. data/lib/active_admin/views/components/scopes.rb +5 -4
  295. data/lib/active_admin/views/components/sidebar_section.rb +3 -2
  296. data/lib/active_admin/views/components/site_title.rb +2 -2
  297. data/lib/active_admin/views/components/status_tag.rb +34 -11
  298. data/lib/active_admin/views/components/table_for.rb +90 -45
  299. data/lib/active_admin/views/components/tabs.rb +28 -0
  300. data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
  301. data/lib/active_admin/views/footer.rb +3 -3
  302. data/lib/active_admin/views/header.rb +3 -3
  303. data/lib/active_admin/views/index_as_block.rb +10 -10
  304. data/lib/active_admin/views/index_as_blog.rb +45 -39
  305. data/lib/active_admin/views/index_as_grid.rb +14 -10
  306. data/lib/active_admin/views/index_as_table.rb +242 -129
  307. data/lib/active_admin/views/pages/base.rb +22 -18
  308. data/lib/active_admin/views/pages/form.rb +21 -11
  309. data/lib/active_admin/views/pages/index.rb +40 -35
  310. data/lib/active_admin/views/pages/layout.rb +1 -1
  311. data/lib/active_admin/views/pages/show.rb +4 -4
  312. data/lib/active_admin/views/tabbed_navigation.rb +7 -3
  313. data/lib/active_admin/views/title_bar.rb +10 -8
  314. data/lib/generators/active_admin/assets/assets_generator.rb +3 -28
  315. data/lib/generators/active_admin/assets/templates/{3.1/active_admin.css.scss → active_admin.css.scss} +0 -0
  316. data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
  317. data/lib/generators/active_admin/devise/devise_generator.rb +24 -26
  318. data/lib/generators/active_admin/install/install_generator.rb +8 -9
  319. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +28 -26
  320. data/lib/generators/active_admin/install/templates/admin_user.rb.erb +12 -2
  321. data/lib/generators/active_admin/install/templates/dashboard.rb +4 -4
  322. data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +3 -3
  323. data/lib/generators/active_admin/page/USAGE +8 -0
  324. data/lib/generators/active_admin/page/page_generator.rb +12 -0
  325. data/lib/generators/active_admin/page/templates/page.rb +5 -0
  326. data/lib/generators/active_admin/resource/resource_generator.rb +3 -5
  327. data/lib/generators/active_admin/resource/templates/admin.rb +15 -0
  328. data/lib/ransack_ext.rb +12 -0
  329. data/script/local +2 -2
  330. data/script/travis_cache +107 -0
  331. data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
  332. data/spec/javascripts/fixtures/flashes.html +2 -0
  333. data/spec/rails_helper.rb +154 -0
  334. data/spec/{integration → requests}/default_namespace_spec.rb +6 -6
  335. data/spec/{integration → requests}/javascript_spec.rb +5 -5
  336. data/spec/requests/memory_spec.rb +23 -0
  337. data/spec/requests/stylesheets_spec.rb +18 -0
  338. data/spec/spec_helper.rb +12 -173
  339. data/spec/support/detect_rails_version.rb +9 -17
  340. data/spec/support/rails_template.rb +64 -35
  341. data/spec/support/rails_template_with_data.rb +14 -14
  342. data/spec/support/templates/admin/stores.rb +5 -1
  343. data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
  344. data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
  345. data/spec/support/templates/policies/admin_user_policy.rb +11 -0
  346. data/spec/support/templates/policies/application_policy.rb +45 -0
  347. data/spec/support/templates/policies/category_policy.rb +7 -0
  348. data/spec/support/templates/policies/post_policy.rb +15 -0
  349. data/spec/support/templates/policies/store_policy.rb +11 -0
  350. data/spec/support/templates/policies/user_policy.rb +11 -0
  351. data/spec/support/templates/post_decorator.rb +4 -46
  352. data/spec/unit/abstract_view_factory_spec.rb +16 -16
  353. data/spec/unit/action_builder_spec.rb +24 -18
  354. data/spec/unit/active_admin_spec.rb +2 -2
  355. data/spec/unit/application_spec.rb +33 -34
  356. data/spec/unit/asset_registration_spec.rb +25 -29
  357. data/spec/unit/authorization/authorization_adapter_spec.rb +10 -10
  358. data/spec/unit/authorization/controller_authorization_spec.rb +11 -11
  359. data/spec/unit/authorization/index_overriding_spec.rb +22 -0
  360. data/spec/unit/auto_link_spec.rb +43 -13
  361. data/spec/unit/batch_actions/resource_spec.rb +15 -14
  362. data/spec/unit/batch_actions/settings_spec.rb +18 -18
  363. data/spec/unit/belongs_to_spec.rb +28 -19
  364. data/spec/unit/cancan_adapter_spec.rb +8 -8
  365. data/spec/unit/comments_spec.rb +99 -39
  366. data/spec/unit/component_spec.rb +3 -3
  367. data/spec/unit/config_shared_examples.rb +10 -10
  368. data/spec/unit/controller_filters_spec.rb +23 -16
  369. data/spec/unit/csv_builder_spec.rb +165 -24
  370. data/spec/unit/dependency_spec.rb +135 -0
  371. data/spec/unit/devise_spec.rb +17 -37
  372. data/spec/unit/dsl_spec.rb +70 -9
  373. data/spec/unit/event_spec.rb +11 -11
  374. data/spec/unit/filters/filter_form_builder_spec.rb +207 -148
  375. data/spec/unit/filters/resource_spec.rb +60 -26
  376. data/spec/unit/form_builder_spec.rb +419 -145
  377. data/spec/unit/generators/install_spec.rb +23 -0
  378. data/spec/unit/helpers/collection_spec.rb +18 -18
  379. data/spec/unit/helpers/scope_chain_spec.rb +6 -6
  380. data/spec/unit/helpers/settings_spec.rb +4 -4
  381. data/spec/unit/i18n_spec.rb +12 -0
  382. data/spec/unit/menu_collection_spec.rb +14 -14
  383. data/spec/unit/menu_item_spec.rb +42 -42
  384. data/spec/unit/menu_spec.rb +20 -20
  385. data/spec/unit/namespace/authorization_spec.rb +8 -8
  386. data/spec/unit/namespace/register_page_spec.rb +11 -11
  387. data/spec/unit/namespace/register_resource_spec.rb +28 -30
  388. data/spec/unit/namespace_spec.rb +20 -20
  389. data/spec/unit/order_clause_spec.rb +81 -0
  390. data/spec/unit/page_controller_spec.rb +1 -1
  391. data/spec/unit/page_spec.rb +18 -12
  392. data/spec/unit/pretty_format_spec.rb +42 -14
  393. data/spec/unit/pundit_adapter_spec.rb +98 -0
  394. data/spec/unit/resource/action_items_spec.rb +15 -12
  395. data/spec/unit/resource/includes_spec.rb +21 -0
  396. data/spec/unit/resource/menu_spec.rb +1 -1
  397. data/spec/unit/resource/naming_spec.rb +35 -21
  398. data/spec/unit/resource/page_presenters_spec.rb +8 -8
  399. data/spec/unit/resource/pagination_spec.rb +6 -6
  400. data/spec/unit/resource/routes_spec.rb +10 -10
  401. data/spec/unit/resource/scopes_spec.rb +14 -7
  402. data/spec/unit/resource/sidebars_spec.rb +6 -6
  403. data/spec/unit/resource_collection_spec.rb +31 -38
  404. data/spec/unit/resource_controller/data_access_spec.rb +96 -30
  405. data/spec/unit/resource_controller/decorators_spec.rb +83 -0
  406. data/spec/unit/resource_controller/sidebars_spec.rb +7 -8
  407. data/spec/unit/resource_controller_spec.rb +73 -70
  408. data/spec/unit/resource_registration_spec.rb +12 -12
  409. data/spec/unit/resource_spec.rb +77 -42
  410. data/spec/unit/routing_spec.rb +39 -31
  411. data/spec/unit/scope_spec.rb +112 -30
  412. data/spec/unit/settings_spec.rb +51 -21
  413. data/spec/unit/view_factory_spec.rb +2 -3
  414. data/spec/unit/view_helpers/breadcrumbs_spec.rb +71 -60
  415. data/spec/unit/view_helpers/display_name_spec.rb +49 -21
  416. data/spec/unit/view_helpers/download_format_links_helper_spec.rb +5 -5
  417. data/spec/unit/view_helpers/fields_for_spec.rb +18 -18
  418. data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
  419. data/spec/unit/view_helpers/form_helper_spec.rb +10 -23
  420. data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +64 -22
  421. data/spec/unit/views/components/action_list_popover_spec.rb +16 -6
  422. data/spec/unit/views/components/attributes_table_spec.rb +171 -30
  423. data/spec/unit/views/components/batch_action_popover_spec.rb +20 -6
  424. data/spec/unit/views/components/blank_slate_spec.rb +14 -4
  425. data/spec/unit/views/components/columns_spec.rb +52 -22
  426. data/spec/unit/views/components/index_list_spec.rb +11 -8
  427. data/spec/unit/views/components/index_table_for_spec.rb +46 -0
  428. data/spec/unit/views/components/paginated_collection_spec.rb +79 -90
  429. data/spec/unit/views/components/panel_spec.rb +32 -21
  430. data/spec/unit/views/components/popover_spec.rb +7 -7
  431. data/spec/unit/views/components/sidebar_section_spec.rb +18 -8
  432. data/spec/unit/views/components/site_title_spec.rb +26 -26
  433. data/spec/unit/views/components/status_tag_spec.rb +178 -38
  434. data/spec/unit/views/components/table_for_spec.rb +237 -35
  435. data/spec/unit/views/components/tabs_spec.rb +39 -0
  436. data/spec/unit/views/components/unsupported_browser_spec.rb +47 -0
  437. data/spec/unit/views/pages/form_spec.rb +17 -10
  438. data/spec/unit/views/pages/index_spec.rb +60 -0
  439. data/spec/unit/views/pages/layout_spec.rb +17 -21
  440. data/spec/unit/views/pages/show_spec.rb +18 -6
  441. data/spec/unit/views/tabbed_navigation_spec.rb +61 -52
  442. data/tasks/docs.rake +9 -11
  443. data/tasks/parallel_tests.rake +8 -2
  444. data/tasks/test.rake +13 -9
  445. data/tasks/yard.rake +7 -4
  446. metadata +219 -163
  447. data/.document +0 -5
  448. data/README.rdoc +0 -88
  449. data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
  450. data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
  451. data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
  452. data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
  453. data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
  454. data/app/assets/images/active_admin/index_list_icons/block_icon.svg +0 -10
  455. data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +0 -4
  456. data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +0 -13
  457. data/app/assets/images/active_admin/index_list_icons/table_icon.svg +0 -3
  458. data/app/assets/images/active_admin/loading.gif +0 -0
  459. data/app/assets/javascripts/active_admin/application.js +0 -3
  460. data/app/assets/javascripts/active_admin/base.js +0 -5
  461. data/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.coffee +0 -105
  462. data/app/assets/javascripts/active_admin/components/jquery.aa.popover.js.coffee +0 -97
  463. data/app/assets/javascripts/active_admin/lib/namespace.js.coffee +0 -4
  464. data/app/assets/javascripts/active_admin/pages/application.js.coffee +0 -21
  465. data/app/assets/javascripts/active_admin/pages/batch_actions.js.coffee +0 -26
  466. data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +0 -11
  467. data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +0 -41
  468. data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +0 -95
  469. data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +0 -38
  470. data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +0 -43
  471. data/app/views/active_admin/dashboard/index.html.arb +0 -1
  472. data/app/views/active_admin/resource/index.csv.erb +0 -23
  473. data/docs/3-index-pages/create-an-index.md +0 -29
  474. data/lib/active_admin/comments.rb +0 -83
  475. data/lib/active_admin/comments/comment.rb +0 -42
  476. data/lib/active_admin/comments/views.rb +0 -2
  477. data/lib/active_admin/dependency_checker.rb +0 -46
  478. data/lib/active_admin/inputs/filter_base.rb +0 -33
  479. data/lib/active_admin/inputs/filter_base/search_method_select.rb +0 -73
  480. data/lib/active_admin/inputs/filter_boolean_input.rb +0 -36
  481. data/lib/active_admin/inputs/filter_check_boxes_input.rb +0 -40
  482. data/lib/active_admin/inputs/filter_date_range_input.rb +0 -34
  483. data/lib/active_admin/inputs/filter_numeric_input.rb +0 -10
  484. data/lib/active_admin/inputs/filter_select_input.rb +0 -49
  485. data/lib/active_admin/inputs/filter_string_input.rb +0 -24
  486. data/lib/active_admin/reloader.rb +0 -130
  487. data/lib/active_admin/resource_controller/actions.rb +0 -81
  488. data/lib/active_admin/sass/active_admin.scss +0 -3
  489. data/lib/active_admin/sass/css_loader.rb +0 -16
  490. data/lib/active_admin/sass/helpers.rb +0 -45
  491. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +0 -7
  492. data/lib/active_admin/views/dashboard_section_renderer.rb +0 -19
  493. data/lib/active_admin/views/pages/dashboard.rb +0 -62
  494. data/lib/generators/active_admin/assets/templates/3.0/active_admin.js +0 -1
  495. data/lib/generators/active_admin/assets/templates/3.1/active_admin.js +0 -1
  496. data/lib/meta_search_ext.rb +0 -10
  497. data/spec/integration/memory_spec.rb +0 -29
  498. data/spec/integration/stylesheets_spec.rb +0 -41
  499. data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +0 -60
  500. data/spec/javascripts/compiled/jquery.aa.popover-spec.js +0 -106
  501. data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +0 -37
  502. data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +0 -108
  503. data/spec/javascripts/helpers/vendor/jasmine-jquery.js +0 -288
  504. data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +0 -2915
  505. data/spec/javascripts/support/jquery-ui-1.8.16.custom.min.js +0 -34
  506. data/spec/javascripts/support/jquery.min.js +0 -4
  507. data/spec/spec_helper_without_rails.rb +0 -11
  508. data/spec/unit/generators/install_rails_3_1_spec.rb +0 -16
  509. data/spec/unit/rails_spec.rb +0 -43
  510. data/spec/unit/reloader_spec.rb +0 -124
  511. data/spec/unit/sass/helpers_spec.rb +0 -47
  512. data/tasks/js.rake +0 -32
@@ -0,0 +1,135 @@
1
+ require 'rails_helper'
2
+
3
+ describe ActiveAdmin::Dependency do
4
+
5
+ k = ActiveAdmin::Dependency
6
+
7
+ describe 'method_missing' do
8
+ before do
9
+ allow(Gem).to receive(:loaded_specs)
10
+ .and_return 'foo' => Gem::Specification.new('foo', '1.2.3')
11
+ end
12
+
13
+ it 'returns a Matcher' do
14
+ expect(k.foo).to be_a ActiveAdmin::Dependency::Matcher
15
+ expect(k.foo.inspect).to eq '<ActiveAdmin::Dependency::Matcher for foo 1.2.3>'
16
+ expect(k.bar.inspect).to eq '<ActiveAdmin::Dependency::Matcher for (missing)>'
17
+ end
18
+
19
+ describe '`?`' do
20
+ it 'base' do
21
+ expect(k.foo?).to eq true
22
+ expect(k.bar?).to eq false
23
+ end
24
+ it '=' do
25
+ expect(k.foo? '= 1.2.3').to eq true
26
+ expect(k.foo? '= 1' ).to eq false
27
+ end
28
+ it '>' do
29
+ expect(k.foo? '> 1').to eq true
30
+ expect(k.foo? '> 2').to eq false
31
+ end
32
+ it '<' do
33
+ expect(k.foo? '< 2').to eq true
34
+ expect(k.foo? '< 1').to eq false
35
+ end
36
+ it '>=' do
37
+ expect(k.foo? '>= 1.2.3').to eq true
38
+ expect(k.foo? '>= 1.2.2').to eq true
39
+ expect(k.foo? '>= 1.2.4').to eq false
40
+ end
41
+ it '<=' do
42
+ expect(k.foo? '<= 1.2.3').to eq true
43
+ expect(k.foo? '<= 1.2.4').to eq true
44
+ expect(k.foo? '<= 1.2.2').to eq false
45
+ end
46
+ it '~>' do
47
+ expect(k.foo? '~> 1.2.0').to eq true
48
+ expect(k.foo? '~> 1.1' ).to eq true
49
+ expect(k.foo? '~> 1.2.4').to eq false
50
+ end
51
+ end
52
+
53
+ describe '`!`' do
54
+ it 'raises an error if requirement not met' do
55
+ expect{ k.foo! '5' }.to raise_error ActiveAdmin::DependencyError,
56
+ 'You provided foo 1.2.3 but we need: 5.'
57
+ end
58
+ it 'accepts multiple arguments' do
59
+ expect{ k.foo! '> 1', '< 1.2' }.to raise_error ActiveAdmin::DependencyError,
60
+ 'You provided foo 1.2.3 but we need: > 1, < 1.2.'
61
+ end
62
+ it 'raises an error if not provided' do
63
+ expect{ k.bar! }.to raise_error ActiveAdmin::DependencyError,
64
+ 'To use bar you need to specify it in your Gemfile.'
65
+ end
66
+ end
67
+ end
68
+
69
+ describe '[]' do
70
+ before do
71
+ allow(Gem).to receive(:loaded_specs)
72
+ .and_return 'a-b' => Gem::Specification.new('a-b', '1.2.3')
73
+ end
74
+
75
+ it 'allows access to gems with an arbitrary name' do
76
+ expect(k['a-b']).to be_a ActiveAdmin::Dependency::Matcher
77
+ expect(k['a-b'].inspect).to eq '<ActiveAdmin::Dependency::Matcher for a-b 1.2.3>'
78
+ expect(k['c-d'].inspect).to eq '<ActiveAdmin::Dependency::Matcher for (missing)>'
79
+ end
80
+
81
+ # Note: more extensive tests for match? and match! are above.
82
+
83
+ it 'match?' do
84
+ expect(k['a-b'].match? ).to eq true
85
+ expect(k['a-b'].match? '1.2.3').to eq true
86
+ expect(k['b-c'].match? ).to eq false
87
+ end
88
+
89
+ it 'match!' do
90
+ expect(k['a-b'].match! ).to eq nil
91
+ expect(k['a-b'].match! '1.2.3').to eq nil
92
+
93
+ expect{ k['a-b'].match! '2.5' }.to raise_error ActiveAdmin::DependencyError,
94
+ 'You provided a-b 1.2.3 but we need: 2.5.'
95
+
96
+ expect{ k['b-c'].match! }.to raise_error ActiveAdmin::DependencyError,
97
+ 'To use b-c you need to specify it in your Gemfile.'
98
+ end
99
+
100
+ # Note: Ruby comparison operators are separate from the `foo? '> 1'` syntax
101
+
102
+ describe 'Ruby comparison syntax' do
103
+
104
+ it '==' do
105
+ expect(k['a-b'] == '1.2.3').to eq true
106
+ expect(k['a-b'] == '1.2' ).to eq false
107
+ expect(k['a-b'] == 1 ).to eq false
108
+ end
109
+ it '>' do
110
+ expect(k['a-b'] > 1).to eq true
111
+ expect(k['a-b'] > 2).to eq false
112
+ end
113
+ it '<' do
114
+ expect(k['a-b'] < 2).to eq true
115
+ expect(k['a-b'] < 1).to eq false
116
+ end
117
+ it '>=' do
118
+ expect(k['a-b'] >= '1.2.3').to eq true
119
+ expect(k['a-b'] >= '1.2.2').to eq true
120
+ expect(k['a-b'] >= '1.2.4').to eq false
121
+ end
122
+ it '<=' do
123
+ expect(k['a-b'] <= '1.2.3').to eq true
124
+ expect(k['a-b'] <= '1.2.4').to eq true
125
+ expect(k['a-b'] <= '1.2.2').to eq false
126
+ end
127
+
128
+ it 'throws a custom error if the gem is missing' do
129
+ expect{ k['b-c'] < 23 }.to raise_error ActiveAdmin::DependencyError,
130
+ 'To use b-c you need to specify it in your Gemfile.'
131
+ end
132
+ end
133
+ end
134
+
135
+ end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  describe ActiveAdmin::Devise::Controller do
4
4
 
@@ -18,12 +18,12 @@ describe ActiveAdmin::Devise::Controller do
18
18
  before { Rails.configuration.action_controller[:relative_url_root] = '/foo' }
19
19
 
20
20
  it "should set the root path to the default namespace" do
21
- controller.root_path.should == "/foo/admin"
21
+ expect(controller.root_path).to eq "/foo/admin"
22
22
  end
23
23
 
24
24
  it "should set the root path to '/' when no default namespace" do
25
- ActiveAdmin.application.stub!(:default_namespace => false)
26
- controller.root_path.should == "/foo/"
25
+ allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
26
+ expect(controller.root_path).to eq "/foo/"
27
27
  end
28
28
 
29
29
  end
@@ -33,12 +33,12 @@ describe ActiveAdmin::Devise::Controller do
33
33
  before { Rails.configuration.action_controller[:relative_url_root] = nil }
34
34
 
35
35
  it "should set the root path to the default namespace" do
36
- controller.root_path.should == "/admin"
36
+ expect(controller.root_path).to eq "/admin"
37
37
  end
38
38
 
39
39
  it "should set the root path to '/' when no default namespace" do
40
- ActiveAdmin.application.stub!(:default_namespace => false)
41
- controller.root_path.should == "/"
40
+ allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
41
+ expect(controller.root_path).to eq "/"
42
42
  end
43
43
 
44
44
  end
@@ -54,7 +54,7 @@ describe ActiveAdmin::Devise::Controller do
54
54
 
55
55
  # Add scoped routes
56
56
  routes.draw do
57
- scope :path => SCOPE do
57
+ scope path: SCOPE do
58
58
  ActiveAdmin.routes(self)
59
59
  devise_for :admin_users, ActiveAdmin::Devise.config
60
60
  end
@@ -67,7 +67,7 @@ describe ActiveAdmin::Devise::Controller do
67
67
  end
68
68
 
69
69
  it "should include scope path in root_path" do
70
- controller.root_path.should == "#{SCOPE}/admin"
70
+ expect(controller.root_path).to eq "#{SCOPE}/admin"
71
71
  end
72
72
 
73
73
  end
@@ -76,38 +76,18 @@ describe ActiveAdmin::Devise::Controller do
76
76
  let(:config) { ActiveAdmin::Devise.config }
77
77
 
78
78
  describe ":sign_out_via option" do
79
+ it "should contain the application.logout_link_method" do
80
+ expect(::Devise).to receive(:sign_out_via).and_return(:delete)
81
+ expect(ActiveAdmin.application).to receive(:logout_link_method).and_return(:get)
79
82
 
80
- subject { config[:sign_out_via] }
81
-
82
- context "when Devise does not implement sign_out_via (version < 1.2)" do
83
- before do
84
- ::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(false)
85
- end
86
-
87
- it "should not contain any customization for sign_out_via" do
88
- config.should_not have_key(:sign_out_via)
89
- end
83
+ expect(config[:sign_out_via]).to include(:get)
90
84
  end
91
85
 
92
- context "when Devise implements sign_out_via (version >= 1.2)" do
93
- before do
94
- ::Devise.should_receive(:respond_to?).with(:sign_out_via).and_return(true)
95
- ::Devise.stub!(:sign_out_via) { :delete }
96
- end
97
-
98
- it "should contain the application.logout_link_method" do
99
- ::Devise.should_receive(:sign_out_via).and_return(:delete)
100
- ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
101
-
102
- config[:sign_out_via].should include(:get)
103
- end
86
+ it "should contain Devise's logout_via_method(s)" do
87
+ expect(::Devise).to receive(:sign_out_via).and_return([:delete, :post])
88
+ expect(ActiveAdmin.application).to receive(:logout_link_method).and_return(:get)
104
89
 
105
- it "should contain Devise's logout_via_method(s)" do
106
- ::Devise.should_receive(:sign_out_via).and_return([:delete, :post])
107
- ActiveAdmin.application.should_receive(:logout_link_method).and_return(:get)
108
-
109
- config[:sign_out_via].should == [:delete, :post, :get]
110
- end
90
+ expect(config[:sign_out_via]).to eq [:delete, :post, :get]
111
91
  end
112
92
 
113
93
  end # describe ":sign_out_via option"
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
 
4
4
  module MockModuleToInclude
@@ -8,16 +8,15 @@ end
8
8
 
9
9
  describe ActiveAdmin::DSL do
10
10
 
11
- let(:config){ mock }
12
11
  let(:application) { ActiveAdmin::Application.new }
13
12
  let(:namespace) { ActiveAdmin::Namespace.new application, :admin }
14
13
  let(:resource_config) { ActiveAdmin::Resource.new namespace, Post }
15
- let(:dsl){ ActiveAdmin::DSL.new(config) }
14
+ let(:dsl){ ActiveAdmin::DSL.new(resource_config) }
16
15
 
17
16
  describe "#include" do
18
17
 
19
18
  it "should call the included class method on the module that is included" do
20
- MockModuleToInclude.should_receive(:included).with(dsl)
19
+ expect(MockModuleToInclude).to receive(:included).with(dsl)
21
20
  dsl.run_registration_block do
22
21
  include MockModuleToInclude
23
22
  end
@@ -25,12 +24,45 @@ describe ActiveAdmin::DSL do
25
24
 
26
25
  end
27
26
 
27
+
28
+ describe '#action_item' do
29
+ before do
30
+ @default_items_count = resource_config.action_items.size
31
+
32
+ dsl.run_registration_block do
33
+ action_item :awesome, only: :show do
34
+ "Awesome ActionItem"
35
+ end
36
+ end
37
+ end
38
+
39
+ it "adds action_item to the action_items of config" do
40
+ expect(resource_config.action_items.size).to eq(@default_items_count + 1)
41
+ end
42
+
43
+ context 'DEPRECATED: when used without a name' do
44
+ it "is configured for only the show action" do
45
+ expect(ActiveAdmin::Deprecation).to receive(:warn).with(instance_of(String))
46
+
47
+ dsl.run_registration_block do
48
+ action_item only: :edit do
49
+ "Awesome ActionItem"
50
+ end
51
+ end
52
+
53
+ item = resource_config.action_items.last
54
+ expect(item.display_on?(:edit)).to be true
55
+ expect(item.display_on?(:index)).to be false
56
+ end
57
+ end
58
+ end
59
+
28
60
  describe "#menu" do
29
61
 
30
62
  it "should set the menu_item_options on the configuration" do
31
- config.should_receive(:menu_item_options=).with({:parent => "Admin"})
63
+ expect(resource_config).to receive(:menu_item_options=).with({parent: "Admin"})
32
64
  dsl.run_registration_block do
33
- menu :parent => "Admin"
65
+ menu parent: "Admin"
34
66
  end
35
67
  end
36
68
 
@@ -39,23 +71,52 @@ describe ActiveAdmin::DSL do
39
71
  describe "#navigation_menu" do
40
72
 
41
73
  it "should set the navigation_menu_name on the configuration" do
42
- config.should_receive(:navigation_menu_name=).with(:admin)
74
+ expect(resource_config).to receive(:navigation_menu_name=).with(:admin)
43
75
  dsl.run_registration_block do
44
76
  navigation_menu :admin
45
77
  end
46
78
  end
47
79
 
48
80
  it "should accept a block" do
49
-
50
81
  dsl = ActiveAdmin::DSL.new(resource_config)
51
82
  dsl.run_registration_block do
52
83
  navigation_menu { :dynamic_menu }
53
84
  end
85
+ expect(resource_config.navigation_menu_name).to eq :dynamic_menu
86
+ end
87
+
88
+ end
89
+
90
+ describe "#sidebar" do
54
91
 
55
- resource_config.navigation_menu_name.should == :dynamic_menu
92
+ before do
93
+ dsl.config.sidebar_sections << ActiveAdmin::SidebarSection.new(:email)
94
+ end
56
95
 
96
+ it "add sidebar_section to the sidebar_sections of config" do
97
+ dsl.run_registration_block do
98
+ sidebar :help
99
+ end
100
+ expect(dsl.config.sidebar_sections.map(&:name)).to match_array([:filters, :email, :help])
57
101
  end
58
102
 
59
103
  end
60
104
 
105
+ describe "#batch_action" do
106
+ it "should add a batch action by symbol" do
107
+ dsl.run_registration_block do
108
+ config.batch_actions = true
109
+ batch_action :foo
110
+ end
111
+ expect(resource_config.batch_actions.map(&:sym)).to eq [:foo, :destroy]
112
+ end
113
+
114
+ it "should add a batch action by title" do
115
+ dsl.run_registration_block do
116
+ config.batch_actions = true
117
+ batch_action "foo bar"
118
+ end
119
+ expect(resource_config.batch_actions.map(&:sym)).to eq [:foo_bar, :destroy]
120
+ end
121
+ end
61
122
  end
@@ -1,4 +1,4 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
  require 'active_admin/event'
3
3
 
4
4
  describe ActiveAdmin::EventDispatcher do
@@ -7,41 +7,41 @@ describe ActiveAdmin::EventDispatcher do
7
7
  let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
8
8
 
9
9
  it "should add a subscriber for an event" do
10
- dispatcher.subscribers(test_event).size.should == 0
10
+ expect(dispatcher.subscribers(test_event).size).to eq 0
11
11
  dispatcher.subscribe(test_event){ true }
12
- dispatcher.subscribers(test_event).size.should == 1
12
+ expect(dispatcher.subscribers(test_event).size).to eq 1
13
13
  end
14
14
 
15
15
  it "should add a subscriber for multiple events" do
16
16
  dispatcher.subscribe(test_event, test_event + "1"){ true }
17
- dispatcher.subscribers(test_event).size.should == 1
18
- dispatcher.subscribers(test_event + "1").size.should == 1
17
+ expect(dispatcher.subscribers(test_event).size).to eq 1
18
+ expect(dispatcher.subscribers(test_event + "1").size).to eq 1
19
19
  end
20
20
 
21
21
  it "should call the dispatch block with no arguments" do
22
22
  dispatcher.subscribe(test_event){ raise StandardError, "From Event Handler" }
23
- lambda {
23
+ expect {
24
24
  dispatcher.dispatch(test_event)
25
- }.should raise_error(StandardError, "From Event Handler")
25
+ }.to raise_error(StandardError, "From Event Handler")
26
26
  end
27
27
 
28
28
  it "should call the dispatch block with one argument" do
29
29
  arg = nil
30
30
  dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
31
31
  dispatcher.dispatch(test_event, "My Arg")
32
- arg.should == "My Arg"
32
+ expect(arg).to eq "My Arg"
33
33
  end
34
34
 
35
35
  it "should clear all subscribers" do
36
36
  dispatcher.subscribe(test_event){ false }
37
37
  dispatcher.subscribe(test_event + "_2"){ false }
38
38
  dispatcher.clear_all_subscribers!
39
- dispatcher.subscribers(test_event).size.should == 0
40
- dispatcher.subscribers(test_event + "_2").size.should == 0
39
+ expect(dispatcher.subscribers(test_event).size).to eq 0
40
+ expect(dispatcher.subscribers(test_event + "_2").size).to eq 0
41
41
  end
42
42
 
43
43
  it "should have a dispatcher available from ActiveAdmin::Event" do
44
- ActiveAdmin::Event.should be_an_instance_of(ActiveAdmin::EventDispatcher)
44
+ expect(ActiveAdmin::Event).to be_an_instance_of(ActiveAdmin::EventDispatcher)
45
45
  end
46
46
 
47
47
  end
@@ -1,8 +1,9 @@
1
- require 'spec_helper'
1
+ require 'rails_helper'
2
2
 
3
3
  class Post
4
- scope :custom_searcher, ->stuff { where(body: stuff) }
5
- search_method :custom_searcher
4
+ ransacker :custom_searcher do
5
+ # nothing to see here
6
+ end
6
7
  end
7
8
 
8
9
  describe ActiveAdmin::Filters::ViewHelper do
@@ -27,312 +28,359 @@ describe ActiveAdmin::Filters::ViewHelper do
27
28
  end
28
29
 
29
30
  def render_filter(search, filters)
30
- render_arbre_component({:filter_args => [search, filters]}, helpers) do
31
- text_node active_admin_filters_form_for(*assigns[:filter_args])
32
- end
31
+ render_arbre_component({filter_args: [search, filters]}, helpers) do
32
+ text_node active_admin_filters_form_for *assigns[:filter_args]
33
+ end.to_s
33
34
  end
34
35
 
35
36
  def filter(name, options = {})
36
- render_filter scope, @filters.push(options.merge(:attribute => name))
37
+ render_filter scope, name => options
37
38
  end
38
39
 
39
40
  let(:scope) { Post.search }
40
41
 
41
- before(:each) { @filters = [] }
42
-
43
-
44
42
  describe "the form in general" do
45
- let(:body) { filter :title }
43
+ let(:body) { Capybara.string(filter :title) }
46
44
 
47
45
  it "should generate a form which submits via get" do
48
- body.should have_tag("form", :attributes => { :method => 'get', :class => 'filter_form' })
46
+ expect(body).to have_selector("form.filter_form[method=get]")
49
47
  end
50
48
 
51
49
  it "should generate a filter button" do
52
- body.should have_tag("input", :attributes => { :type => "submit",
53
- :value => "Filter" })
50
+ expect(body).to have_selector("input[type=submit][value=Filter]")
54
51
  end
55
52
 
56
53
  it "should only generate the form once" do
57
- body.to_s.scan(/q\[title_contains\]/).size.should == 1
54
+ expect(body).to have_selector("form", count: 1)
58
55
  end
59
56
 
60
57
  it "should generate a clear filters link" do
61
- body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
58
+ expect(body).to have_selector("a.clear_filters_btn", text: "Clear Filters")
59
+ end
60
+
61
+ describe "label as proc" do
62
+ let(:body) { Capybara.string(filter :title, label: proc { 'Title from proc' }) }
63
+
64
+ it "should render proper label" do
65
+ expect(body).to have_selector("label", text: "Title from proc")
66
+ end
62
67
  end
63
68
  end
64
69
 
65
70
  describe "string attribute" do
66
- let(:body) { filter :title }
71
+ let(:body) { Capybara.string(filter :title) }
67
72
 
68
73
  it "should generate a select option for starts with" do
69
- body.should have_tag("option", "Starts with", :attributes => { :value => 'title_starts_with' })
74
+ expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
70
75
  end
71
76
 
72
77
  it "should generate a select option for ends with" do
73
- body.should have_tag("option", "Ends with", :attributes => { :value => 'title_ends_with' })
78
+ expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
74
79
  end
75
80
 
76
81
  it "should generate a select option for contains" do
77
- body.should have_tag("option", "Contains", :attributes => { :value => 'title_contains' })
82
+ expect(body).to have_selector("option[value=title_contains]", text: "Contains")
78
83
  end
79
84
 
80
85
  it "should generate a text field for input" do
81
- body.should have_tag("input", :attributes => { :name => 'q[title_contains]' })
86
+ expect(body).to have_selector("input[name='q[title_contains]']")
82
87
  end
83
-
88
+
84
89
  it "should have a proper label" do
85
- body.should have_tag('label', 'Title')
90
+ expect(body).to have_selector("label", text: "Title")
86
91
  end
87
92
 
88
93
  it "should translate the label for text field" do
89
- begin
90
- I18n.backend.store_translations(:en, :activerecord => { :attributes => { :post => { :title => "Name" } } })
91
- body.should have_tag('label', 'Name')
92
- ensure
93
- I18n.backend.reload!
94
+ with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
95
+ expect(body).to have_selector("label", text: "Name")
94
96
  end
95
97
  end
96
98
 
97
- it "should select the option which is currently being filtered"
98
-
99
- end
100
-
101
- describe "string attribute with sub filters" do
102
- let(:body) { filter :title_contains }
103
-
104
- it "should generate a search field for a string attribute with query contains" do
105
- body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
106
- body.should have_tag('label', 'Title contains')
107
- end
108
-
109
- it "should NOT generate a select option for contains" do
110
- body.should_not have_tag("option", "Contains", :attributes => { :value => 'title_contains' })
111
- end
112
-
113
- context "using starts_with and as" do
114
- let(:body) { filter :title_starts_with }
115
-
116
- it "should generate a search field for a string attribute with query starts_with" do
117
- body.should have_tag("input", :attributes => { :name => "q[title_starts_with]" })
118
- end
99
+ it "should select the option which is currently being filtered" do
100
+ scope = Post.search title_starts_with: "foo"
101
+ body = Capybara.string(render_filter scope, title: {})
102
+ expect(body).to have_selector("option[value=title_starts_with][selected=selected]", text: "Starts with")
119
103
  end
120
104
 
121
- context "using ends_with and as" do
122
- let(:body) { filter :title_ends_with }
105
+ context "with predicate" do
106
+ %w[eq equals cont contains start starts_with end ends_with].each do |predicate|
107
+ describe "'#{predicate}'" do
108
+ let(:body) { Capybara.string(filter :"title_#{predicate}") }
123
109
 
124
- it "should generate a search field for a string attribute with query starts_with" do
125
- body.should have_tag("input", :attributes => { :name => "q[title_ends_with]" })
126
- end
127
- end
128
-
129
- context "using contains and NO AS defined" do
130
- let(:body) { filter :title_contains }
110
+ it "shouldn't include a select field" do
111
+ expect(body).not_to have_selector("select")
112
+ end
131
113
 
132
- it "should generate a search field for a string attribute with query contains" do
133
- body.should have_tag("input", :attributes => { :name => "q[title_contains]" })
114
+ it "should build correctly" do
115
+ expect(body).to have_selector("input[name='q[title_#{predicate}]']")
116
+ end
117
+ end
134
118
  end
135
119
  end
136
120
  end
137
-
121
+
138
122
  describe "text attribute" do
139
- let(:body) { filter :body }
123
+ let(:body) { Capybara.string(filter :body) }
140
124
 
141
125
  it "should generate a search field for a text attribute" do
142
- body.should have_tag("input", :attributes => { :name => "q[body_contains]"})
126
+ expect(body).to have_selector("input[name='q[body_contains]']")
143
127
  end
144
128
 
145
129
  it "should have a proper label" do
146
- body.should have_tag('label', 'Body')
130
+ expect(body).to have_selector("label", text: "Body")
147
131
  end
148
132
  end
149
133
 
150
134
  describe "string attribute, as a select" do
151
135
  let(:body) { filter :title, as: :select }
152
- let(:builder) { ActiveAdmin::Inputs::FilterSelectInput }
136
+ let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
153
137
 
154
138
  context "when loading collection from DB" do
155
139
  it "should use pluck for efficiency" do
156
- builder.any_instance.should_receive(:pluck_column) { [] }
140
+ expect_any_instance_of(builder).to receive(:pluck_column) { [] }
157
141
  body
158
142
  end
159
143
 
160
144
  it "should remove original ordering to prevent PostgreSQL error" do
161
- scope.base.should_receive(:reorder).with('title asc') {
162
- m = mock uniq: mock(pluck: ['A Title'])
163
- m.uniq.should_receive(:pluck).with :title
145
+ expect(scope.object.klass).to receive(:reorder).with('title asc') {
146
+ m = double uniq: double(pluck: ['A Title'])
147
+ expect(m.uniq).to receive(:pluck).with :title
164
148
  m
165
149
  }
166
150
  body
167
151
  end
168
152
  end
169
- end unless Rails::VERSION::MAJOR == 3 && Rails::VERSION::MINOR < 2
153
+ end
170
154
 
171
155
  describe "datetime attribute" do
172
- let(:body) { filter :created_at }
156
+ let(:body) { Capybara.string(filter :created_at) }
173
157
 
174
158
  it "should generate a date greater than" do
175
- body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
159
+ expect(body).to have_selector("input.datepicker[name='q[created_at_gteq]']")
176
160
  end
177
161
  it "should generate a seperator" do
178
- body.should have_tag("span", :attributes => { :class => "seperator"})
162
+ expect(body).to have_selector("span.seperator")
179
163
  end
180
164
  it "should generate a date less than" do
181
- body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
165
+ expect(body).to have_selector("input.datepicker[name='q[created_at_lteq]']")
182
166
  end
183
167
  end
184
168
 
185
169
  describe "integer attribute" do
186
- let(:body) { filter :id }
170
+ let(:body) { Capybara.string(filter :id) }
187
171
 
188
172
  it "should generate a select option for equal to" do
189
- body.should have_tag("option", "Equals", :attributes => { :value => 'id_equals' })
173
+ expect(body).to have_selector("option[value=id_equals]", text: "Equals")
190
174
  end
191
175
  it "should generate a select option for greater than" do
192
- body.should have_tag("option", "Greater than")
176
+ expect(body).to have_selector("option", text: "Greater than")
193
177
  end
194
178
  it "should generate a select option for less than" do
195
- body.should have_tag("option", "Less than")
179
+ expect(body).to have_selector("option", text: "Less than")
196
180
  end
197
181
  it "should generate a text field for input" do
198
- body.should have_tag("input", :attributes => { :name => 'q[id_equals]' })
182
+ expect(body).to have_selector("input[name='q[id_equals]']")
183
+ end
184
+ it "should select the option which is currently being filtered" do
185
+ scope = Post.search id_greater_than: 1
186
+ body = Capybara.string(render_filter scope, id: {})
187
+ expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
199
188
  end
200
- it "should select the option which is currently being filtered"
201
189
  end
202
190
 
203
191
  describe "boolean attribute" do
204
192
  context "boolean datatypes" do
205
- let(:body) { filter :starred }
193
+ let(:body) { Capybara.string(filter :starred) }
206
194
 
207
- it "should create a check box for equals to" do
208
- body.should have_tag("input", :attributes => {
209
- :name => "q[starred_eq]",
210
- :type => "checkbox" })
195
+ it "should generate a select" do
196
+ expect(body).to have_selector("select[name='q[starred_eq]']")
197
+ end
198
+ it "should set the default text to 'Any'" do
199
+ expect(body).to have_selector("option[value='']", text: "Any")
200
+ end
201
+ it "should create an option for true and false" do
202
+ expect(body).to have_selector("option[value=true]", text: "Yes")
203
+ expect(body).to have_selector("option[value=false]", text: "No")
211
204
  end
212
205
 
213
206
  it "should translate the label for boolean field" do
214
- begin
215
- I18n.backend.store_translations(:en, :activerecord => { :attributes => { :post => { :starred => "Faved" } } })
216
- body.should have_tag('label', 'Faved')
217
- ensure
218
- I18n.backend.reload!
207
+ with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
208
+ expect(body).to have_selector("label", text: "Faved")
219
209
  end
220
210
  end
221
211
  end
222
212
 
223
213
  context "non-boolean data types" do
224
- let(:body) { filter :title_is_present, :as => :boolean }
214
+ let(:body) { Capybara.string(filter :title_present, as: :boolean) }
225
215
 
226
- it "should create a check box for equals to" do
227
- body.should have_tag("input", :attributes => {
228
- :name => "q[title_is_present]",
229
- :type => "checkbox" })
216
+ it "should generate a select" do
217
+ expect(body).to have_selector("select[name='q[title_present]']")
218
+ end
219
+ it "should set the default text to 'Any'" do
220
+ expect(body).to have_selector("option[value='']", text: "Any")
221
+ end
222
+ it "should create an option for true and false" do
223
+ expect(body).to have_selector("option[value=true]", text: "Yes")
224
+ expect(body).to have_selector("option[value=false]", text: "No")
230
225
  end
231
226
  end
232
227
  end
233
228
 
234
229
  describe "belongs_to" do
235
230
  before do
236
- @john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
237
- @jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
231
+ @john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
232
+ @jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
238
233
  end
239
234
 
240
235
  context "when given as the _id attribute name" do
241
- let(:body) { filter :author_id }
236
+ let(:body) { Capybara.string(filter :author_id) }
242
237
 
243
238
  it "should generate a numeric filter" do
244
- body.should have_tag 'label', 'Author' # really this should be Author ID :/
245
- body.should have_tag 'option', :attributes => { :value => 'author_id_less_than' }
246
- body.should have_tag 'input', :attributes => { :id => 'q_author_id', :name => 'q[author_id_equals]'}
239
+ expect(body).to have_selector("label", text: "Author") # really this should be Author ID :/)
240
+ expect(body).to have_selector("option[value=author_id_less_than]")
241
+ expect(body).to have_selector("input#q_author_id[name='q[author_id_equals]']")
247
242
  end
248
243
  end
249
244
 
250
245
  context "when given as the name of the relationship" do
251
- let(:body) { filter :author }
246
+ let(:body) { Capybara.string(filter :author) }
252
247
 
253
248
  it "should generate a select" do
254
- body.should have_tag "select", :attributes => { :name => "q[author_id_eq]" }
249
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
255
250
  end
256
251
  it "should set the default text to 'Any'" do
257
- body.should have_tag "option", "Any", :attributes => { :value => "" }
252
+ expect(body).to have_selector("option[value='']", text: "Any")
258
253
  end
259
254
  it "should create an option for each related object" do
260
- body.should have_tag "option", "John Doe", :attributes => { :value => @john.id }
261
- body.should have_tag "option", "Jane Doe", :attributes => { :value => @jane.id }
255
+ expect(body).to have_selector("option[value='#{@john.id}']", text: "John Doe")
256
+ expect(body).to have_selector("option[value='#{@jane.id}']", text: "Jane Doe")
262
257
  end
263
258
 
264
259
  context "with a proc" do
265
260
  let :body do
266
- filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
261
+ Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
267
262
  end
268
263
 
269
264
  it "should use call the proc as the collection" do
270
- body.should have_tag("option", "Title One")
271
- body.should have_tag("option", "Title Two")
265
+ expect(body).to have_selector("option", text: "Title One")
266
+ expect(body).to have_selector("option", text: "Title Two")
272
267
  end
273
268
 
274
269
  it "should render the collection in the context of the view" do
275
- body = filter(:title, :as => :select, :collection => proc{[a_helper_method]})
276
- body.should have_tag("option", "A Helper Method")
270
+ body = Capybara.string(filter(:title, as: :select, collection: proc{[a_helper_method]}))
271
+ expect(body).to have_selector("option", text: "A Helper Method")
277
272
  end
278
273
  end
279
274
  end
280
275
 
281
276
  context "as check boxes" do
282
- let(:body) { filter :author, :as => :check_boxes }
277
+ let(:body) { Capybara.string(filter :author, as: :check_boxes) }
283
278
 
284
279
  it "should create a check box for each related object" do
285
- body.should have_tag("input", :attributes => {
286
- :name => "q[author_id_in][]",
287
- :type => "checkbox",
288
- :value => @john.id })
289
- body.should have_tag("input", :attributes => {
290
- :name => "q[author_id_in][]",
291
- :type => "checkbox",
292
- :value => @jane.id })
280
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
281
+ expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
293
282
  end
294
283
  end
295
284
 
296
285
  context "when polymorphic relationship" do
286
+ let(:scope) { ActiveAdmin::Comment.search }
297
287
  it "should raise an error if a collection isn't provided" do
298
- expect {
299
- search = ActiveAdmin::Comment.search
300
- render_filter(search, [{:attribute => :resource}])
301
- }.to raise_error Formtastic::PolymorphicInputWithoutCollectionError
288
+ expect { filter :resource }.to raise_error \
289
+ Formtastic::PolymorphicInputWithoutCollectionError
290
+ end
291
+ end
292
+
293
+ context "when using a custom foreign key" do
294
+ let(:scope) { Post.search }
295
+ let(:body) { Capybara.string(filter :category) }
296
+ it "should ignore that foreign key and let Ransack handle it" do
297
+ expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
298
+ expect(body).to have_selector("select[name='q[category_id_eq]']")
302
299
  end
303
300
  end
304
301
  end # belongs to
305
302
 
306
303
  describe "has_and_belongs_to_many" do
307
- pending "add HABTM models so this can be mocked out"
304
+ skip "add HABTM models so this can be tested"
305
+ end
306
+
307
+ describe "has_many :through" do
308
+ # Setup an ActionView::Base object which can be used for
309
+ # generating the form for.
310
+ let(:helpers) do
311
+ view = action_view
312
+ def view.collection_path
313
+ "/categories"
314
+ end
315
+
316
+ def view.protect_against_forgery?
317
+ false
318
+ end
319
+
320
+ def view.a_helper_method
321
+ "A Helper Method"
322
+ end
323
+
324
+ view
325
+ end
326
+ let(:scope) { Category.search }
327
+
328
+ let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
329
+ let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
330
+
331
+ context "when given as the name of the relationship" do
332
+ let(:body) { Capybara.string(filter :authors) }
333
+
334
+ it "should generate a select" do
335
+ expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
336
+ end
337
+
338
+ it "should set the default text to 'Any'" do
339
+ expect(body).to have_selector("option[value='']", text: "Any")
340
+ end
341
+
342
+ it "should create an option for each related object" do
343
+ expect(body).to have_selector("option[value='#{john.id}']", text: "John Doe")
344
+ expect(body).to have_selector("option[value='#{jane.id}']", text: "Jane Doe")
345
+ end
346
+ end
347
+
348
+ context "as check boxes" do
349
+ let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
350
+
351
+ it "should create a check box for each related object" do
352
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{john.id}']")
353
+ expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{jane.id}']")
354
+ end
355
+ end
308
356
  end
309
357
 
310
358
  describe "conditional display" do
311
359
  [:if, :unless].each do |verb|
312
- should = verb == :if ? "should" : "shouldn't"
313
- if_true = verb == :if ? :should : :should_not
314
- if_false = verb == :if ? :should_not : :should
360
+ should = verb == :if ? "should" : "shouldn't"
361
+ if_true = verb == :if ? :to : :to_not
362
+ if_false = verb == :if ? :to_not : :to
315
363
  context "with #{verb.inspect} proc" do
316
364
  it "#{should} be displayed if true" do
317
- body = filter :body, verb => proc{ true }
318
- body.send if_true, have_tag("input", attributes: {name: "q[body_contains]"})
365
+ body = Capybara.string(filter :body, verb => proc{ true })
366
+ expect(body).send if_true, have_selector("input[name='q[body_contains]']")
319
367
  end
320
368
  it "#{should} be displayed if false" do
321
- body = filter :body, verb => proc{ false }
322
- body.send if_false, have_tag("input", attributes: {name: "q[body_contains]"})
369
+ body = Capybara.string(filter :body, verb => proc{ false })
370
+ expect(body).send if_false, have_selector("input[name='q[body_contains]']")
323
371
  end
324
372
  it "should still be hidden on the second render" do
325
- filters = [attribute: :body, verb => proc{ verb == :unless }]
373
+ filters = {body: { verb => proc{ verb == :unless }}}
326
374
  2.times do
327
- body = render_filter scope, filters
328
- body.should_not have_tag "input", attributes: {name: "q[body_contains]"}
375
+ body = Capybara.string(render_filter scope, filters)
376
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
329
377
  end
330
378
  end
331
379
  it "should successfully keep rendering other filters after one is hidden" do
332
- filters = [{attribute: :body, verb => proc{ verb == :unless }}, {attribute: :author}]
333
- body = render_filter scope, filters
334
- body.should_not have_tag "input", attributes: {name: "q[body_contains]"}
335
- body.should have_tag "select", attributes: {name: "q[author_id_eq]"}
380
+ filters = {body: { verb => proc{ verb == :unless }}, author: {}}
381
+ body = Capybara.string(render_filter scope, filters)
382
+ expect(body).not_to have_selector("input[name='q[body_contains]']")
383
+ expect(body).to have_selector("select[name='q[author_id_eq]']")
336
384
  end
337
385
  end
338
386
  end
@@ -341,32 +389,43 @@ describe ActiveAdmin::Filters::ViewHelper do
341
389
  describe "custom search methods" do
342
390
 
343
391
  it "should work as select" do
344
- body = filter :custom_searcher, as: :select, collection: ['foo']
345
- body.should have_tag "select", attributes: { name: "q[custom_searcher]" }
392
+ body = Capybara.string(filter :custom_searcher, as: :select, collection: ['foo'])
393
+ expect(body).to have_selector("select[name='q[custom_searcher]']")
346
394
  end
347
395
 
348
396
  it "should work as string" do
349
- body = filter :custom_searcher, as: :string
350
- body.should have_tag "input", attributes: { name: "q[custom_searcher]" }
397
+ body = Capybara.string(filter :custom_searcher, as: :string)
398
+ expect(body).to have_selector("input[name='q[custom_searcher]']")
399
+ end
400
+ end
401
+
402
+ describe "does not support some filter inputs" do
403
+ it "should fallback to use formtastic inputs" do
404
+ body = Capybara.string(filter :custom_searcher, as: :text)
405
+ expect(body).to have_selector("textarea[name='q[custom_searcher]']")
351
406
  end
352
407
  end
353
408
 
354
409
  describe "blank option" do
355
410
  context "for a select filter" do
356
411
  it "should be there by default" do
357
- filter(:author).should have_tag "option", "Any"
412
+ body = Capybara.string(filter(:author))
413
+ expect(body).to have_selector("option", text: "Any")
358
414
  end
359
415
  it "should be able to be disabled" do
360
- filter(:author, include_blank: false).should_not have_tag "option", "Any"
416
+ body = Capybara.string(filter(:author, include_blank: false))
417
+ expect(body).to_not have_selector("option", text: "Any")
361
418
  end
362
419
  end
363
420
 
364
421
  context "for a multi-select filter" do
365
422
  it "should not be there by default" do
366
- filter(:author, multiple: true).should_not have_tag "option", "Any"
423
+ body = Capybara.string(filter(:author, multiple: true))
424
+ expect(body).to_not have_selector("option", text: "Any")
367
425
  end
368
426
  it "should be able to be enabled" do
369
- filter(:author, multiple: true, include_blank: true).should have_tag "option", "Any"
427
+ body = Capybara.string(filter(:author, multiple: true, include_blank: true))
428
+ expect(body).to have_selector("option", text: "Any")
370
429
  end
371
430
  end
372
431
  end