activeadmin-orac 1.0.0.pre4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +15 -0
- data/.gitignore +49 -0
- data/.hound.yml +14 -0
- data/.travis.yml +40 -0
- data/.yardopts +8 -0
- data/CHANGELOG.md +120 -0
- data/CODE_OF_CONDUCT.md +22 -0
- data/CONTRIBUTING.md +144 -0
- data/Gemfile +78 -0
- data/Guardfile +8 -0
- data/LICENSE +20 -0
- data/README.md +102 -0
- data/Rakefile +33 -0
- data/activeadmin.gemspec +31 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow.gif +0 -0
- data/app/assets/images/active_admin/nested_menu_arrow_dark.gif +0 -0
- data/app/assets/images/active_admin/orderable.png +0 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +9 -0
- data/app/assets/javascripts/active_admin/ext/jquery-ui.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/ext/jquery.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/initializers/batch_actions.js.coffee +7 -0
- data/app/assets/javascripts/active_admin/initializers/datepicker.js.coffee +10 -0
- data/app/assets/javascripts/active_admin/initializers/filters.js.coffee +22 -0
- data/app/assets/javascripts/active_admin/initializers/tabs.js.coffee +3 -0
- data/app/assets/javascripts/active_admin/jquery_ui.js.erb +11 -0
- data/app/assets/javascripts/active_admin/lib/batch_actions.js.coffee +39 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +44 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +101 -0
- data/app/assets/javascripts/active_admin/lib/flash.js.coffee +19 -0
- data/app/assets/javascripts/active_admin/lib/has_many.js.coffee +79 -0
- data/app/assets/javascripts/active_admin/lib/modal_dialog.js.coffee +45 -0
- data/app/assets/javascripts/active_admin/lib/per_page.js.coffee +42 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +24 -0
- data/app/assets/stylesheets/active_admin/_base.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.scss +333 -0
- data/app/assets/stylesheets/active_admin/_header.scss +156 -0
- data/app/assets/stylesheets/active_admin/_mixins.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +30 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.scss +149 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +152 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.scss +37 -0
- data/app/assets/stylesheets/active_admin/components/_grid.scss +9 -0
- data/app/assets/stylesheets/active_admin/components/_index_list.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_links.scss +5 -0
- data/app/assets/stylesheets/active_admin/components/_modal_dialog.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_pagination.scss +44 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +16 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.scss +67 -0
- data/app/assets/stylesheets/active_admin/components/_tables.scss +110 -0
- data/app/assets/stylesheets/active_admin/components/_tabs.scss +65 -0
- data/app/assets/stylesheets/active_admin/components/_unsupported_browser.scss +16 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.scss +10 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.scss +65 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.scss +28 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.scss +41 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.scss +15 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +17 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.scss +34 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.scss +288 -0
- data/app/assets/stylesheets/active_admin/structure/_footer.scss +14 -0
- data/app/assets/stylesheets/active_admin/structure/_main_structure.scss +29 -0
- data/app/assets/stylesheets/active_admin/structure/_title_bar.scss +41 -0
- data/app/views/active_admin/devise/confirmations/new.html.erb +15 -0
- data/app/views/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/active_admin/devise/passwords/edit.html.erb +18 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +15 -0
- data/app/views/active_admin/devise/registrations/new.html.erb +22 -0
- data/app/views/active_admin/devise/sessions/new.html.erb +20 -0
- data/app/views/active_admin/devise/shared/_links.erb +27 -0
- data/app/views/active_admin/devise/unlocks/new.html.erb +15 -0
- data/app/views/active_admin/page/index.html.arb +1 -0
- data/app/views/active_admin/resource/edit.html.arb +1 -0
- data/app/views/active_admin/resource/index.html.arb +1 -0
- data/app/views/active_admin/resource/new.html.arb +1 -0
- data/app/views/active_admin/resource/show.html.arb +1 -0
- data/app/views/layouts/active_admin.html.arb +1 -0
- data/app/views/layouts/active_admin_logged_out.html.erb +39 -0
- data/config/locales/ar.yml +136 -0
- data/config/locales/bg.yml +121 -0
- data/config/locales/bs.yml +122 -0
- data/config/locales/ca.yml +107 -0
- data/config/locales/cs.yml +110 -0
- data/config/locales/da.yml +106 -0
- data/config/locales/de-CH.yml +102 -0
- data/config/locales/de.yml +135 -0
- data/config/locales/el.yml +127 -0
- data/config/locales/en-GB.yml +98 -0
- data/config/locales/en.yml +136 -0
- data/config/locales/es-MX.yml +94 -0
- data/config/locales/es.yml +136 -0
- data/config/locales/fa.yml +120 -0
- data/config/locales/fi.yml +113 -0
- data/config/locales/fr.yml +119 -0
- data/config/locales/he.yml +95 -0
- data/config/locales/hr.yml +124 -0
- data/config/locales/hu.yml +99 -0
- data/config/locales/id.yml +136 -0
- data/config/locales/it.yml +136 -0
- data/config/locales/ja.yml +136 -0
- data/config/locales/ko.yml +121 -0
- data/config/locales/lt.yml +121 -0
- data/config/locales/lv.yml +93 -0
- data/config/locales/nb.yml +121 -0
- data/config/locales/nl.yml +134 -0
- data/config/locales/pl.yml +98 -0
- data/config/locales/pt-BR.yml +136 -0
- data/config/locales/pt-PT.yml +93 -0
- data/config/locales/ro.yml +97 -0
- data/config/locales/ru.yml +140 -0
- data/config/locales/sv-SE.yml +134 -0
- data/config/locales/tr.yml +136 -0
- data/config/locales/uk.yml +137 -0
- data/config/locales/vi.yml +94 -0
- data/config/locales/zh-CN.yml +112 -0
- data/config/locales/zh-TW.yml +136 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +112 -0
- data/docs/1-general-configuration.md +171 -0
- data/docs/10-custom-pages.md +106 -0
- data/docs/11-decorators.md +55 -0
- data/docs/12-arbre-components.md +150 -0
- data/docs/13-authorization-adapter.md +248 -0
- data/docs/14-gotchas.md +116 -0
- data/docs/2-resource-customization.md +422 -0
- data/docs/3-index-pages.md +272 -0
- data/docs/3-index-pages/custom-index.md +31 -0
- data/docs/3-index-pages/index-as-block.md +21 -0
- data/docs/3-index-pages/index-as-blog.md +71 -0
- data/docs/3-index-pages/index-as-grid.md +29 -0
- data/docs/3-index-pages/index-as-table.md +213 -0
- data/docs/4-csv-format.md +58 -0
- data/docs/5-forms.md +172 -0
- data/docs/6-show-pages.md +105 -0
- data/docs/7-sidebars.md +71 -0
- data/docs/8-custom-actions.md +160 -0
- data/docs/9-batch-actions.md +233 -0
- data/docs/README.md +24 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/authorization_pundit.feature +37 -0
- data/features/belongs_to.feature +66 -0
- data/features/breadcrumb.feature +75 -0
- data/features/comments/commenting.feature +171 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +43 -0
- data/features/development_reloading.feature +30 -0
- data/features/edit_page.feature +117 -0
- data/features/favicon.feature +20 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +29 -0
- data/features/i18n.feature +43 -0
- data/features/index/batch_actions.feature +196 -0
- data/features/index/filters.feature +161 -0
- data/features/index/format_as_csv.feature +203 -0
- data/features/index/formats.feature +66 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +69 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +291 -0
- data/features/index/index_blank_slate.feature +83 -0
- data/features/index/index_parameters.feature +75 -0
- data/features/index/index_scope_to.feature +56 -0
- data/features/index/index_scopes.feature +251 -0
- data/features/index/page_title.feature +42 -0
- data/features/index/pagination.feature +63 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/meta_tags.feature +21 -0
- data/features/new_page.feature +109 -0
- data/features/registering_assets.feature +34 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/renamed_resource.feature +32 -0
- data/features/root_to.feature +17 -0
- data/features/show/columns.feature +40 -0
- data/features/show/default_content.feature +44 -0
- data/features/show/page_title.feature +59 -0
- data/features/show/tabs.feature +27 -0
- data/features/sidebar_sections.feature +210 -0
- data/features/site_title.feature +47 -0
- data/features/specifying_actions.feature +93 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/action_link_steps.rb +20 -0
- data/features/step_definitions/additional_web_steps.rb +81 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +18 -0
- data/features/step_definitions/batch_action_steps.rb +81 -0
- data/features/step_definitions/blog_steps.rb +3 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -0
- data/features/step_definitions/column_steps.rb +8 -0
- data/features/step_definitions/comment_steps.rb +12 -0
- data/features/step_definitions/configuration_steps.rb +100 -0
- data/features/step_definitions/dashboard_steps.rb +15 -0
- data/features/step_definitions/factory_steps.rb +35 -0
- data/features/step_definitions/filter_steps.rb +39 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +52 -0
- data/features/step_definitions/i18n_steps.rb +3 -0
- data/features/step_definitions/index_scope_steps.rb +21 -0
- data/features/step_definitions/index_views_steps.rb +3 -0
- data/features/step_definitions/layout_steps.rb +3 -0
- data/features/step_definitions/member_link_steps.rb +7 -0
- data/features/step_definitions/menu_steps.rb +11 -0
- data/features/step_definitions/meta_tag_steps.rb +3 -0
- data/features/step_definitions/pagination_steps.rb +15 -0
- data/features/step_definitions/sidebar_steps.rb +13 -0
- data/features/step_definitions/site_title_steps.rb +17 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +8 -0
- data/features/step_definitions/table_steps.rb +116 -0
- data/features/step_definitions/user_steps.rb +52 -0
- data/features/step_definitions/web_steps.rb +85 -0
- data/features/sti_resource.feature +65 -0
- data/features/strong_parameters.feature +73 -0
- data/features/support/env.rb +162 -0
- data/features/support/paths.rb +71 -0
- data/features/support/selectors.rb +45 -0
- data/features/symbol_leak.feature +35 -0
- data/features/users/logging_in.feature +36 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin.rb +130 -0
- data/lib/active_admin/abstract_view_factory.rb +85 -0
- data/lib/active_admin/application.rb +324 -0
- data/lib/active_admin/asset_registration.rb +29 -0
- data/lib/active_admin/authorization_adapter.rb +132 -0
- data/lib/active_admin/base_controller.rb +87 -0
- data/lib/active_admin/base_controller/authorization.rb +130 -0
- data/lib/active_admin/base_controller/menu.rb +38 -0
- data/lib/active_admin/batch_actions.rb +16 -0
- data/lib/active_admin/batch_actions/controller.rb +40 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +159 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +38 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +58 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/callbacks.rb +88 -0
- data/lib/active_admin/cancan_adapter.rb +36 -0
- data/lib/active_admin/component.rb +5 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +129 -0
- data/lib/active_admin/dependency.rb +168 -0
- data/lib/active_admin/deprecation.rb +35 -0
- data/lib/active_admin/devise.rb +80 -0
- data/lib/active_admin/dsl.rb +173 -0
- data/lib/active_admin/engine.rb +16 -0
- data/lib/active_admin/error.rb +62 -0
- data/lib/active_admin/event.rb +24 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/filters/active.rb +30 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +83 -0
- data/lib/active_admin/filters/formtastic_addons.rb +79 -0
- data/lib/active_admin/filters/humanized.rb +68 -0
- data/lib/active_admin/filters/resource_extension.rb +194 -0
- data/lib/active_admin/form_builder.rb +145 -0
- data/lib/active_admin/generators/boilerplate.rb +45 -0
- data/lib/active_admin/helpers/collection.rb +17 -0
- data/lib/active_admin/helpers/i18n.rb +7 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/routes/url_helpers.rb +15 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +115 -0
- data/lib/active_admin/inputs.rb +20 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filters/base.rb +44 -0
- data/lib/active_admin/inputs/filters/base/search_method_select.rb +75 -0
- data/lib/active_admin/inputs/filters/boolean_input.rb +24 -0
- data/lib/active_admin/inputs/filters/check_boxes_input.rb +50 -0
- data/lib/active_admin/inputs/filters/date_picker_input.rb +13 -0
- data/lib/active_admin/inputs/filters/date_range_input.rb +36 -0
- data/lib/active_admin/inputs/filters/numeric_input.rb +12 -0
- data/lib/active_admin/inputs/filters/select_input.rb +55 -0
- data/lib/active_admin/inputs/filters/string_input.rb +26 -0
- data/lib/active_admin/menu.rb +108 -0
- data/lib/active_admin/menu_collection.rb +93 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +247 -0
- data/lib/active_admin/order_clause.rb +26 -0
- data/lib/active_admin/orm/active_record.rb +5 -0
- data/lib/active_admin/orm/active_record/comments.rb +95 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +45 -0
- data/lib/active_admin/orm/active_record/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/orm/active_record/comments/resource_helper.rb +17 -0
- data/lib/active_admin/orm/active_record/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments/views/active_admin_comments.rb +88 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/page.rb +92 -0
- data/lib/active_admin/page_controller.rb +33 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/pundit_adapter.rb +68 -0
- data/lib/active_admin/reloader.rb +25 -0
- data/lib/active_admin/resource.rb +168 -0
- data/lib/active_admin/resource/action_items.rb +108 -0
- data/lib/active_admin/resource/belongs_to.rb +44 -0
- data/lib/active_admin/resource/controllers.rb +19 -0
- data/lib/active_admin/resource/includes.rb +12 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +62 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +23 -0
- data/lib/active_admin/resource/routes.rb +115 -0
- data/lib/active_admin/resource/scope_to.rb +74 -0
- data/lib/active_admin/resource/scopes.rb +50 -0
- data/lib/active_admin/resource/sidebars.rb +28 -0
- data/lib/active_admin/resource_collection.rb +72 -0
- data/lib/active_admin/resource_controller.rb +51 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +317 -0
- data/lib/active_admin/resource_controller/decorators.rb +102 -0
- data/lib/active_admin/resource_controller/resource_class_methods.rb +24 -0
- data/lib/active_admin/resource_controller/scoping.rb +31 -0
- data/lib/active_admin/resource_controller/sidebars.rb +18 -0
- data/lib/active_admin/resource_controller/streaming.rb +43 -0
- data/lib/active_admin/resource_dsl.rb +190 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +56 -0
- data/lib/active_admin/sidebar_section.rb +37 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +27 -0
- data/lib/active_admin/view_helpers.rb +19 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +45 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +33 -0
- data/lib/active_admin/view_helpers/display_helper.rb +97 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +46 -0
- data/lib/active_admin/view_helpers/fields_for.rb +51 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +14 -0
- data/lib/active_admin/view_helpers/form_helper.rb +20 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +97 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/active_admin_form.rb +124 -0
- data/lib/active_admin/views/components/attributes_table.rb +94 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +161 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +71 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +163 -0
- data/lib/active_admin/views/components/panel.rb +38 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +34 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +80 -0
- data/lib/active_admin/views/components/table_for.rb +218 -0
- data/lib/active_admin/views/components/tabs.rb +28 -0
- data/lib/active_admin/views/components/unsupported_browser.rb +11 -0
- data/lib/active_admin/views/footer.rb +20 -0
- data/lib/active_admin/views/header.rb +32 -0
- data/lib/active_admin/views/index_as_block.rb +36 -0
- data/lib/active_admin/views/index_as_blog.rb +156 -0
- data/lib/active_admin/views/index_as_grid.rb +80 -0
- data/lib/active_admin/views/index_as_table.rb +373 -0
- data/lib/active_admin/views/pages/base.rb +147 -0
- data/lib/active_admin/views/pages/form.rb +65 -0
- data/lib/active_admin/views/pages/index.rb +163 -0
- data/lib/active_admin/views/pages/layout.rb +26 -0
- data/lib/active_admin/views/pages/page.rb +30 -0
- data/lib/active_admin/views/pages/show.rb +59 -0
- data/lib/active_admin/views/tabbed_navigation.rb +66 -0
- data/lib/active_admin/views/title_bar.rb +55 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +14 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/assets/templates/active_admin.scss +17 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +65 -0
- data/lib/generators/active_admin/install/install_generator.rb +45 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +272 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +30 -0
- data/lib/generators/active_admin/install/templates/dashboard.rb +33 -0
- data/lib/generators/active_admin/install/templates/migrations/create_active_admin_comments.rb +19 -0
- data/lib/generators/active_admin/page/USAGE +8 -0
- data/lib/generators/active_admin/page/page_generator.rb +12 -0
- data/lib/generators/active_admin/page/templates/page.rb +5 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +20 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +45 -0
- data/lib/ransack_ext.rb +20 -0
- data/script/local +53 -0
- data/script/travis_cache +107 -0
- data/script/use_rails +53 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.flash.js.coffee +25 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/flashes.html +2 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -0
- data/spec/javascripts/support/jasmine.yml +74 -0
- data/spec/javascripts/support/jasmine_config.rb +23 -0
- data/spec/javascripts/support/jasmine_runner.rb +32 -0
- data/spec/rails_helper.rb +161 -0
- data/spec/requests/default_namespace_spec.rb +61 -0
- data/spec/requests/javascript_spec.rb +22 -0
- data/spec/requests/memory_spec.rb +21 -0
- data/spec/requests/stylesheets_spec.rb +18 -0
- data/spec/spec_helper.rb +17 -0
- data/spec/support/active_admin_request_helpers.rb +27 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +34 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +162 -0
- data/spec/support/rails_template_with_data.rb +74 -0
- data/spec/support/templates/admin/stores.rb +9 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/manifest.js +3 -0
- data/spec/support/templates/policies/active_admin/comment_policy.rb +9 -0
- data/spec/support/templates/policies/active_admin/page_policy.rb +18 -0
- data/spec/support/templates/policies/admin_user_policy.rb +11 -0
- data/spec/support/templates/policies/application_policy.rb +45 -0
- data/spec/support/templates/policies/category_policy.rb +7 -0
- data/spec/support/templates/policies/post_policy.rb +15 -0
- data/spec/support/templates/policies/store_policy.rb +11 -0
- data/spec/support/templates/policies/user_policy.rb +11 -0
- data/spec/support/templates/post_decorator.rb +11 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +134 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +165 -0
- data/spec/unit/asset_registration_spec.rb +52 -0
- data/spec/unit/authorization/authorization_adapter_spec.rb +61 -0
- data/spec/unit/authorization/controller_authorization_spec.rb +39 -0
- data/spec/unit/authorization/index_overriding_spec.rb +23 -0
- data/spec/unit/auto_link_spec.rb +69 -0
- data/spec/unit/batch_actions/resource_spec.rb +97 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +65 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +188 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/config_shared_examples.rb +59 -0
- data/spec/unit/controller_filters_spec.rb +41 -0
- data/spec/unit/csv_builder_spec.rb +303 -0
- data/spec/unit/dependency_spec.rb +135 -0
- data/spec/unit/devise_spec.rb +96 -0
- data/spec/unit/dsl_spec.rb +122 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +434 -0
- data/spec/unit/filters/humanized_spec.rb +64 -0
- data/spec/unit/filters/resource_spec.rb +128 -0
- data/spec/unit/form_builder_spec.rb +932 -0
- data/spec/unit/generators/install_spec.rb +24 -0
- data/spec/unit/helpers/collection_spec.rb +65 -0
- data/spec/unit/helpers/scope_chain_spec.rb +36 -0
- data/spec/unit/helpers/settings_spec.rb +30 -0
- data/spec/unit/i18n_spec.rb +12 -0
- data/spec/unit/menu_collection_spec.rb +62 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +71 -0
- data/spec/unit/namespace/authorization_spec.rb +27 -0
- data/spec/unit/namespace/register_page_spec.rb +73 -0
- data/spec/unit/namespace/register_resource_spec.rb +160 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/order_clause_spec.rb +81 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +78 -0
- data/spec/unit/pretty_format_spec.rb +77 -0
- data/spec/unit/pundit_adapter_spec.rb +98 -0
- data/spec/unit/resource/action_items_spec.rb +65 -0
- data/spec/unit/resource/includes_spec.rb +21 -0
- data/spec/unit/resource/menu_spec.rb +18 -0
- data/spec/unit/resource/naming_spec.rb +122 -0
- data/spec/unit/resource/page_presenters_spec.rb +44 -0
- data/spec/unit/resource/pagination_spec.rb +38 -0
- data/spec/unit/resource/routes_spec.rb +77 -0
- data/spec/unit/resource/scopes_spec.rb +50 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +175 -0
- data/spec/unit/resource_controller/data_access_spec.rb +140 -0
- data/spec/unit/resource_controller/decorators_spec.rb +94 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +38 -0
- data/spec/unit/resource_controller_spec.rb +269 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +337 -0
- data/spec/unit/routing_spec.rb +185 -0
- data/spec/unit/scope_spec.rb +185 -0
- data/spec/unit/settings_spec.rb +118 -0
- data/spec/unit/view_factory_spec.rb +19 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +217 -0
- data/spec/unit/view_helpers/display_helper_spec.rb +165 -0
- data/spec/unit/view_helpers/download_format_links_helper_spec.rb +39 -0
- data/spec/unit/view_helpers/fields_for_spec.rb +50 -0
- data/spec/unit/view_helpers/flash_helper_spec.rb +25 -0
- data/spec/unit/view_helpers/form_helper_spec.rb +43 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +139 -0
- data/spec/unit/views/components/attributes_table_spec.rb +272 -0
- data/spec/unit/views/components/batch_action_selector_spec.rb +43 -0
- data/spec/unit/views/components/blank_slate_spec.rb +27 -0
- data/spec/unit/views/components/columns_spec.rb +189 -0
- data/spec/unit/views/components/index_list_spec.rb +35 -0
- data/spec/unit/views/components/index_table_for_spec.rb +127 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +249 -0
- data/spec/unit/views/components/panel_spec.rb +58 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +68 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +249 -0
- data/spec/unit/views/components/table_for_spec.rb +434 -0
- data/spec/unit/views/components/tabs_spec.rb +39 -0
- data/spec/unit/views/components/unsupported_browser_spec.rb +41 -0
- data/spec/unit/views/index_as_blog_spec.rb +76 -0
- data/spec/unit/views/pages/form_spec.rb +51 -0
- data/spec/unit/views/pages/index_spec.rb +60 -0
- data/spec/unit/views/pages/layout_spec.rb +59 -0
- data/spec/unit/views/pages/show_spec.rb +33 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +158 -0
- data/tasks/docs.rake +37 -0
- data/tasks/parallel_tests.rake +66 -0
- data/tasks/test.rake +91 -0
- data/tasks/yard.rake +9 -0
- metadata +974 -0
|
@@ -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
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
describe ActiveAdmin::Devise::Controller do
|
|
4
|
+
|
|
5
|
+
let(:controller_class) do
|
|
6
|
+
klass = Class.new do
|
|
7
|
+
def self.layout(*); end
|
|
8
|
+
def self.helper(*); end
|
|
9
|
+
end
|
|
10
|
+
klass.send(:include, ActiveAdmin::Devise::Controller)
|
|
11
|
+
klass
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
let(:controller) { controller_class.new }
|
|
15
|
+
|
|
16
|
+
context 'with a RAILS_RELATIVE_URL_ROOT set' do
|
|
17
|
+
|
|
18
|
+
before { Rails.configuration.action_controller[:relative_url_root] = '/foo' }
|
|
19
|
+
|
|
20
|
+
it "should set the root path to the default namespace" do
|
|
21
|
+
expect(controller.root_path).to eq "/foo/admin"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should set the root path to '/' when no default namespace" do
|
|
25
|
+
allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
|
|
26
|
+
expect(controller.root_path).to eq "/foo/"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context 'without a RAILS_RELATIVE_URL_ROOT set' do
|
|
32
|
+
|
|
33
|
+
before { Rails.configuration.action_controller[:relative_url_root] = nil }
|
|
34
|
+
|
|
35
|
+
it "should set the root path to the default namespace" do
|
|
36
|
+
expect(controller.root_path).to eq "/admin"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "should set the root path to '/' when no default namespace" do
|
|
40
|
+
allow(ActiveAdmin.application).to receive(:default_namespace).and_return(false)
|
|
41
|
+
expect(controller.root_path).to eq "/"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
context "within a scoped route" do
|
|
47
|
+
|
|
48
|
+
SCOPE = '/aa_scoped'
|
|
49
|
+
|
|
50
|
+
before do
|
|
51
|
+
# Remove existing routes
|
|
52
|
+
routes = Rails.application.routes
|
|
53
|
+
routes.clear!
|
|
54
|
+
|
|
55
|
+
# Add scoped routes
|
|
56
|
+
routes.draw do
|
|
57
|
+
scope path: SCOPE do
|
|
58
|
+
ActiveAdmin.routes(self)
|
|
59
|
+
devise_for :admin_users, ActiveAdmin::Devise.config
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
after do
|
|
65
|
+
# Resume default routes
|
|
66
|
+
reload_routes!
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "should include scope path in root_path" do
|
|
70
|
+
expect(controller.root_path).to eq "#{SCOPE}/admin"
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe "#config" do
|
|
76
|
+
let(:config) { ActiveAdmin::Devise.config }
|
|
77
|
+
|
|
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)
|
|
82
|
+
|
|
83
|
+
expect(config[:sign_out_via]).to include(:get)
|
|
84
|
+
end
|
|
85
|
+
|
|
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)
|
|
89
|
+
|
|
90
|
+
expect(config[:sign_out_via]).to eq [:delete, :post, :get]
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end # describe ":sign_out_via option"
|
|
94
|
+
end # describe "#config"
|
|
95
|
+
|
|
96
|
+
end
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
module MockModuleToInclude
|
|
5
|
+
def self.included(dsl)
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe ActiveAdmin::DSL do
|
|
10
|
+
|
|
11
|
+
let(:application) { ActiveAdmin::Application.new }
|
|
12
|
+
let(:namespace) { ActiveAdmin::Namespace.new application, :admin }
|
|
13
|
+
let(:resource_config) { ActiveAdmin::Resource.new namespace, Post }
|
|
14
|
+
let(:dsl){ ActiveAdmin::DSL.new(resource_config) }
|
|
15
|
+
|
|
16
|
+
describe "#include" do
|
|
17
|
+
|
|
18
|
+
it "should call the included class method on the module that is included" do
|
|
19
|
+
expect(MockModuleToInclude).to receive(:included).with(dsl)
|
|
20
|
+
dsl.run_registration_block do
|
|
21
|
+
include MockModuleToInclude
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
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
|
+
|
|
60
|
+
describe "#menu" do
|
|
61
|
+
|
|
62
|
+
it "should set the menu_item_options on the configuration" do
|
|
63
|
+
expect(resource_config).to receive(:menu_item_options=).with({parent: "Admin"})
|
|
64
|
+
dsl.run_registration_block do
|
|
65
|
+
menu parent: "Admin"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
describe "#navigation_menu" do
|
|
72
|
+
|
|
73
|
+
it "should set the navigation_menu_name on the configuration" do
|
|
74
|
+
expect(resource_config).to receive(:navigation_menu_name=).with(:admin)
|
|
75
|
+
dsl.run_registration_block do
|
|
76
|
+
navigation_menu :admin
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should accept a block" do
|
|
81
|
+
dsl = ActiveAdmin::DSL.new(resource_config)
|
|
82
|
+
dsl.run_registration_block do
|
|
83
|
+
navigation_menu { :dynamic_menu }
|
|
84
|
+
end
|
|
85
|
+
expect(resource_config.navigation_menu_name).to eq :dynamic_menu
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
describe "#sidebar" do
|
|
91
|
+
|
|
92
|
+
before do
|
|
93
|
+
dsl.config.sidebar_sections << ActiveAdmin::SidebarSection.new(:email)
|
|
94
|
+
end
|
|
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', 'Search status:', 'email', 'help']
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
end
|
|
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
|
|
122
|
+
end
|
|
@@ -0,0 +1,434 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
class Post
|
|
4
|
+
ransacker :custom_searcher do
|
|
5
|
+
# nothing to see here
|
|
6
|
+
end
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
describe ActiveAdmin::Filters::ViewHelper do
|
|
10
|
+
|
|
11
|
+
# Setup an ActionView::Base object which can be used for
|
|
12
|
+
# generating the form for.
|
|
13
|
+
let(:helpers) do
|
|
14
|
+
view = action_view
|
|
15
|
+
def view.collection_path
|
|
16
|
+
"/posts"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def view.protect_against_forgery?
|
|
20
|
+
false
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def view.a_helper_method
|
|
24
|
+
"A Helper Method"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
view
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def render_filter(search, filters)
|
|
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
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def filter(name, options = {})
|
|
37
|
+
render_filter scope, name => options
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
let(:scope) { Post.search }
|
|
41
|
+
|
|
42
|
+
describe "the form in general" do
|
|
43
|
+
let(:body) { Capybara.string(filter :title) }
|
|
44
|
+
|
|
45
|
+
it "should generate a form which submits via get" do
|
|
46
|
+
expect(body).to have_selector("form.filter_form[method=get]")
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
it "should generate a filter button" do
|
|
50
|
+
expect(body).to have_selector("input[type=submit][value=Filter]")
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "should only generate the form once" do
|
|
54
|
+
expect(body).to have_selector("form", count: 1)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
it "should generate a clear filters link" do
|
|
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
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
describe "string attribute" do
|
|
71
|
+
let(:body) { Capybara.string(filter :title) }
|
|
72
|
+
|
|
73
|
+
it "should generate a select option for starts with" do
|
|
74
|
+
expect(body).to have_selector("option[value=title_starts_with]", text: "Starts with")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "should generate a select option for ends with" do
|
|
78
|
+
expect(body).to have_selector("option[value=title_ends_with]", text: "Ends with")
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
it "should generate a select option for contains" do
|
|
82
|
+
expect(body).to have_selector("option[value=title_contains]", text: "Contains")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
it "should generate a text field for input" do
|
|
86
|
+
expect(body).to have_selector("input[name='q[title_contains]']")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it "should have a proper label" do
|
|
90
|
+
expect(body).to have_selector("label", text: "Title")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should translate the label for text field" do
|
|
94
|
+
with_translation activerecord: {attributes: {post: {title: 'Name'}}} do
|
|
95
|
+
expect(body).to have_selector("label", text: "Name")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
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")
|
|
103
|
+
end
|
|
104
|
+
|
|
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}") }
|
|
109
|
+
|
|
110
|
+
it "shouldn't include a select field" do
|
|
111
|
+
expect(body).not_to have_selector("select")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
it "should build correctly" do
|
|
115
|
+
expect(body).to have_selector("input[name='q[title_#{predicate}]']")
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
describe "text attribute" do
|
|
123
|
+
let(:body) { Capybara.string(filter :body) }
|
|
124
|
+
|
|
125
|
+
it "should generate a search field for a text attribute" do
|
|
126
|
+
expect(body).to have_selector("input[name='q[body_contains]']")
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should have a proper label" do
|
|
130
|
+
expect(body).to have_selector("label", text: "Body")
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
describe "string attribute, as a select" do
|
|
135
|
+
let(:body) { filter :title, as: :select }
|
|
136
|
+
let(:builder) { ActiveAdmin::Inputs::Filters::SelectInput }
|
|
137
|
+
|
|
138
|
+
context "when loading collection from DB" do
|
|
139
|
+
it "should use pluck for efficiency" do
|
|
140
|
+
expect_any_instance_of(builder).to receive(:pluck_column) { [] }
|
|
141
|
+
body
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
it "should remove original ordering to prevent PostgreSQL error" do
|
|
145
|
+
expect(scope.object.klass).to receive(:reorder).with('title asc') {
|
|
146
|
+
distinct = ActiveAdmin::Dependency.rails >= 4 ? :distinct : :uniq
|
|
147
|
+
m = double distinct => double(pluck: ['A Title'])
|
|
148
|
+
expect(m.send(distinct)).to receive(:pluck).with :title
|
|
149
|
+
m
|
|
150
|
+
}
|
|
151
|
+
body
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
describe "datetime attribute" do
|
|
157
|
+
let(:body) { Capybara.string(filter :created_at) }
|
|
158
|
+
|
|
159
|
+
it "should generate a date greater than" do
|
|
160
|
+
expect(body).to have_selector("input.datepicker[name='q[created_at_gteq_date]']")
|
|
161
|
+
end
|
|
162
|
+
it "should generate a seperator" do
|
|
163
|
+
expect(body).to have_selector("span.seperator")
|
|
164
|
+
end
|
|
165
|
+
it "should generate a date less than" do
|
|
166
|
+
expect(body).to have_selector("input.datepicker[name='q[created_at_lteq_date]']")
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
describe "integer attribute" do
|
|
171
|
+
let(:body) { Capybara.string(filter :id) }
|
|
172
|
+
|
|
173
|
+
it "should generate a select option for equal to" do
|
|
174
|
+
expect(body).to have_selector("option[value=id_equals]", text: "Equals")
|
|
175
|
+
end
|
|
176
|
+
it "should generate a select option for greater than" do
|
|
177
|
+
expect(body).to have_selector("option", text: "Greater than")
|
|
178
|
+
end
|
|
179
|
+
it "should generate a select option for less than" do
|
|
180
|
+
expect(body).to have_selector("option", text: "Less than")
|
|
181
|
+
end
|
|
182
|
+
it "should generate a text field for input" do
|
|
183
|
+
expect(body).to have_selector("input[name='q[id_equals]']")
|
|
184
|
+
end
|
|
185
|
+
it "should select the option which is currently being filtered" do
|
|
186
|
+
scope = Post.search id_greater_than: 1
|
|
187
|
+
body = Capybara.string(render_filter scope, id: {})
|
|
188
|
+
expect(body).to have_selector("option[value=id_greater_than][selected=selected]", text: "Greater than")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
describe "boolean attribute" do
|
|
193
|
+
context "boolean datatypes" do
|
|
194
|
+
let(:body) { Capybara.string(filter :starred) }
|
|
195
|
+
|
|
196
|
+
it "should generate a select" do
|
|
197
|
+
expect(body).to have_selector("select[name='q[starred_eq]']")
|
|
198
|
+
end
|
|
199
|
+
it "should set the default text to 'Any'" do
|
|
200
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
|
201
|
+
end
|
|
202
|
+
it "should create an option for true and false" do
|
|
203
|
+
expect(body).to have_selector("option[value=true]", text: "Yes")
|
|
204
|
+
expect(body).to have_selector("option[value=false]", text: "No")
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
it "should translate the label for boolean field" do
|
|
208
|
+
with_translation activerecord: {attributes: {post: {starred: 'Faved'}}} do
|
|
209
|
+
expect(body).to have_selector("label", text: "Faved")
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
context "non-boolean data types" do
|
|
215
|
+
let(:body) { Capybara.string(filter :title_present, as: :boolean) }
|
|
216
|
+
|
|
217
|
+
it "should generate a select" do
|
|
218
|
+
expect(body).to have_selector("select[name='q[title_present]']")
|
|
219
|
+
end
|
|
220
|
+
it "should set the default text to 'Any'" do
|
|
221
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
|
222
|
+
end
|
|
223
|
+
it "should create an option for true and false" do
|
|
224
|
+
expect(body).to have_selector("option[value=true]", text: "Yes")
|
|
225
|
+
expect(body).to have_selector("option[value=false]", text: "No")
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
describe "belongs_to" do
|
|
231
|
+
before do
|
|
232
|
+
@john = User.create first_name: "John", last_name: "Doe", username: "john_doe"
|
|
233
|
+
@jane = User.create first_name: "Jane", last_name: "Doe", username: "jane_doe"
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
context "when given as the _id attribute name" do
|
|
237
|
+
let(:body) { Capybara.string(filter :author_id) }
|
|
238
|
+
|
|
239
|
+
it "should generate a numeric filter" do
|
|
240
|
+
expect(body).to have_selector("label", text: "Author") # really this should be Author ID :/)
|
|
241
|
+
expect(body).to have_selector("option[value=author_id_less_than]")
|
|
242
|
+
expect(body).to have_selector("input#q_author_id[name='q[author_id_equals]']")
|
|
243
|
+
end
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
context "when given as the name of the relationship" do
|
|
247
|
+
let(:body) { Capybara.string(filter :author) }
|
|
248
|
+
|
|
249
|
+
it "should generate a select" do
|
|
250
|
+
expect(body).to have_selector("select[name='q[author_id_eq]']")
|
|
251
|
+
end
|
|
252
|
+
it "should set the default text to 'Any'" do
|
|
253
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
|
254
|
+
end
|
|
255
|
+
it "should create an option for each related object" do
|
|
256
|
+
expect(body).to have_selector("option[value='#{@john.id}']", text: "John Doe")
|
|
257
|
+
expect(body).to have_selector("option[value='#{@jane.id}']", text: "Jane Doe")
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
context "with a proc" do
|
|
261
|
+
let :body do
|
|
262
|
+
Capybara.string(filter :title, as: :select, collection: proc{ ['Title One', 'Title Two'] })
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
it "should use call the proc as the collection" do
|
|
266
|
+
expect(body).to have_selector("option", text: "Title One")
|
|
267
|
+
expect(body).to have_selector("option", text: "Title Two")
|
|
268
|
+
end
|
|
269
|
+
|
|
270
|
+
it "should render the collection in the context of the view" do
|
|
271
|
+
body = Capybara.string(filter(:title, as: :select, collection: proc{[a_helper_method]}))
|
|
272
|
+
expect(body).to have_selector("option", text: "A Helper Method")
|
|
273
|
+
end
|
|
274
|
+
end
|
|
275
|
+
end
|
|
276
|
+
|
|
277
|
+
context "as check boxes" do
|
|
278
|
+
let(:body) { Capybara.string(filter :author, as: :check_boxes) }
|
|
279
|
+
|
|
280
|
+
it "should create a check box for each related object" do
|
|
281
|
+
expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
|
|
282
|
+
expect(body).to have_selector("input[type=checkbox][name='q[author_id_in][]'][value='#{@jane.id}']")
|
|
283
|
+
end
|
|
284
|
+
end
|
|
285
|
+
|
|
286
|
+
context "when polymorphic relationship" do
|
|
287
|
+
let(:scope) { ActiveAdmin::Comment.search }
|
|
288
|
+
it "should raise an error if a collection isn't provided" do
|
|
289
|
+
expect { filter :resource }.to raise_error \
|
|
290
|
+
Formtastic::PolymorphicInputWithoutCollectionError
|
|
291
|
+
end
|
|
292
|
+
end
|
|
293
|
+
|
|
294
|
+
context "when using a custom foreign key" do
|
|
295
|
+
let(:scope) { Post.search }
|
|
296
|
+
let(:body) { Capybara.string(filter :category) }
|
|
297
|
+
it "should ignore that foreign key and let Ransack handle it" do
|
|
298
|
+
expect(Post.reflect_on_association(:category).foreign_key).to eq :custom_category_id
|
|
299
|
+
expect(body).to have_selector("select[name='q[category_id_eq]']")
|
|
300
|
+
end
|
|
301
|
+
end
|
|
302
|
+
end # belongs to
|
|
303
|
+
|
|
304
|
+
describe "has_and_belongs_to_many" do
|
|
305
|
+
skip "add HABTM models so this can be tested"
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
describe "has_many :through" do
|
|
309
|
+
# Setup an ActionView::Base object which can be used for
|
|
310
|
+
# generating the form for.
|
|
311
|
+
let(:helpers) do
|
|
312
|
+
view = action_view
|
|
313
|
+
def view.collection_path
|
|
314
|
+
"/categories"
|
|
315
|
+
end
|
|
316
|
+
|
|
317
|
+
def view.protect_against_forgery?
|
|
318
|
+
false
|
|
319
|
+
end
|
|
320
|
+
|
|
321
|
+
def view.a_helper_method
|
|
322
|
+
"A Helper Method"
|
|
323
|
+
end
|
|
324
|
+
|
|
325
|
+
view
|
|
326
|
+
end
|
|
327
|
+
let(:scope) { Category.search }
|
|
328
|
+
|
|
329
|
+
let!(:john) { User.create first_name: "John", last_name: "Doe", username: "john_doe" }
|
|
330
|
+
let!(:jane) { User.create first_name: "Jane", last_name: "Doe", username: "jane_doe" }
|
|
331
|
+
|
|
332
|
+
context "when given as the name of the relationship" do
|
|
333
|
+
let(:body) { Capybara.string(filter :authors) }
|
|
334
|
+
|
|
335
|
+
it "should generate a select" do
|
|
336
|
+
expect(body).to have_selector("select[name='q[posts_author_id_eq]']")
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
it "should set the default text to 'Any'" do
|
|
340
|
+
expect(body).to have_selector("option[value='']", text: "Any")
|
|
341
|
+
end
|
|
342
|
+
|
|
343
|
+
it "should create an option for each related object" do
|
|
344
|
+
expect(body).to have_selector("option[value='#{john.id}']", text: "John Doe")
|
|
345
|
+
expect(body).to have_selector("option[value='#{jane.id}']", text: "Jane Doe")
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
context "as check boxes" do
|
|
350
|
+
let(:body) { Capybara.string(filter :authors, as: :check_boxes) }
|
|
351
|
+
|
|
352
|
+
it "should create a check box for each related object" do
|
|
353
|
+
expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{john.id}']")
|
|
354
|
+
expect(body).to have_selector("input[name='q[posts_author_id_in][]'][type=checkbox][value='#{jane.id}']")
|
|
355
|
+
end
|
|
356
|
+
end
|
|
357
|
+
end
|
|
358
|
+
|
|
359
|
+
describe "conditional display" do
|
|
360
|
+
[:if, :unless].each do |verb|
|
|
361
|
+
should = verb == :if ? "should" : "shouldn't"
|
|
362
|
+
if_true = verb == :if ? :to : :to_not
|
|
363
|
+
if_false = verb == :if ? :to_not : :to
|
|
364
|
+
context "with #{verb.inspect} proc" do
|
|
365
|
+
it "#{should} be displayed if true" do
|
|
366
|
+
body = Capybara.string(filter :body, verb => proc{ true })
|
|
367
|
+
expect(body).send if_true, have_selector("input[name='q[body_contains]']")
|
|
368
|
+
end
|
|
369
|
+
it "#{should} be displayed if false" do
|
|
370
|
+
body = Capybara.string(filter :body, verb => proc{ false })
|
|
371
|
+
expect(body).send if_false, have_selector("input[name='q[body_contains]']")
|
|
372
|
+
end
|
|
373
|
+
it "should still be hidden on the second render" do
|
|
374
|
+
filters = {body: { verb => proc{ verb == :unless }}}
|
|
375
|
+
2.times do
|
|
376
|
+
body = Capybara.string(render_filter scope, filters)
|
|
377
|
+
expect(body).not_to have_selector("input[name='q[body_contains]']")
|
|
378
|
+
end
|
|
379
|
+
end
|
|
380
|
+
it "should successfully keep rendering other filters after one is hidden" do
|
|
381
|
+
filters = {body: { verb => proc{ verb == :unless }}, author: {}}
|
|
382
|
+
body = Capybara.string(render_filter scope, filters)
|
|
383
|
+
expect(body).not_to have_selector("input[name='q[body_contains]']")
|
|
384
|
+
expect(body).to have_selector("select[name='q[author_id_eq]']")
|
|
385
|
+
end
|
|
386
|
+
end
|
|
387
|
+
end
|
|
388
|
+
end
|
|
389
|
+
|
|
390
|
+
describe "custom search methods" do
|
|
391
|
+
|
|
392
|
+
it "should work as select" do
|
|
393
|
+
body = Capybara.string(filter :custom_searcher, as: :select, collection: ['foo'])
|
|
394
|
+
expect(body).to have_selector("select[name='q[custom_searcher]']")
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
it "should work as string" do
|
|
398
|
+
body = Capybara.string(filter :custom_searcher, as: :string)
|
|
399
|
+
expect(body).to have_selector("input[name='q[custom_searcher]']")
|
|
400
|
+
end
|
|
401
|
+
end
|
|
402
|
+
|
|
403
|
+
describe "does not support some filter inputs" do
|
|
404
|
+
it "should fallback to use formtastic inputs" do
|
|
405
|
+
body = Capybara.string(filter :custom_searcher, as: :text)
|
|
406
|
+
expect(body).to have_selector("textarea[name='q[custom_searcher]']")
|
|
407
|
+
end
|
|
408
|
+
end
|
|
409
|
+
|
|
410
|
+
describe "blank option" do
|
|
411
|
+
context "for a select filter" do
|
|
412
|
+
it "should be there by default" do
|
|
413
|
+
body = Capybara.string(filter(:author))
|
|
414
|
+
expect(body).to have_selector("option", text: "Any")
|
|
415
|
+
end
|
|
416
|
+
it "should be able to be disabled" do
|
|
417
|
+
body = Capybara.string(filter(:author, include_blank: false))
|
|
418
|
+
expect(body).to_not have_selector("option", text: "Any")
|
|
419
|
+
end
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
context "for a multi-select filter" do
|
|
423
|
+
it "should not be there by default" do
|
|
424
|
+
body = Capybara.string(filter(:author, multiple: true))
|
|
425
|
+
expect(body).to_not have_selector("option", text: "Any")
|
|
426
|
+
end
|
|
427
|
+
it "should be able to be enabled" do
|
|
428
|
+
body = Capybara.string(filter(:author, multiple: true, include_blank: true))
|
|
429
|
+
expect(body).to have_selector("option", text: "Any")
|
|
430
|
+
end
|
|
431
|
+
end
|
|
432
|
+
end
|
|
433
|
+
|
|
434
|
+
end
|