yousty-activeadmin 1.0.0.pre
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 +7 -0
- data/.gitignore +43 -0
- data/.travis.yml +8 -0
- data/.yardopts +9 -0
- data/CHANGELOG.md +1056 -0
- data/CONTRIBUTING.md +110 -0
- data/Gemfile +41 -0
- data/Guardfile +7 -0
- data/LICENSE +25 -0
- data/README.md +67 -0
- data/Rakefile +25 -0
- data/activeadmin.gemspec +33 -0
- data/app/assets/images/active_admin/admin_notes_icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-header-bg.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-input-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-next-link-icon.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-nipple.png +0 -0
- data/app/assets/images/active_admin/datepicker/datepicker-prev-link-icon.png +0 -0
- data/app/assets/images/active_admin/index_list_icons/block_icon.svg +10 -0
- data/app/assets/images/active_admin/index_list_icons/blog_icon.svg +4 -0
- data/app/assets/images/active_admin/index_list_icons/grid_icon.svg +13 -0
- data/app/assets/images/active_admin/index_list_icons/table_icon.svg +3 -0
- data/app/assets/images/active_admin/loading.gif +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/application.js.coffee +6 -0
- data/app/assets/javascripts/active_admin/base.js.coffee +5 -0
- data/app/assets/javascripts/active_admin/components/application.js.coffee +23 -0
- data/app/assets/javascripts/active_admin/components/batch_actions.js.coffee +26 -0
- data/app/assets/javascripts/active_admin/components/has_many.js.coffee +41 -0
- data/app/assets/javascripts/active_admin/lib/checkbox-toggler.js.coffee +37 -0
- data/app/assets/javascripts/active_admin/lib/dropdown-menu.js.coffee +105 -0
- data/app/assets/javascripts/active_admin/lib/popover.js.coffee +97 -0
- data/app/assets/javascripts/active_admin/lib/table-checkbox-toggler.js.coffee +25 -0
- data/app/assets/stylesheets/active_admin/_base.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/_forms.css.scss +293 -0
- data/app/assets/stylesheets/active_admin/_header.css.scss +152 -0
- data/app/assets/stylesheets/active_admin/_mixins.css.scss +1 -0
- data/app/assets/stylesheets/active_admin/_typography.css.scss +100 -0
- data/app/assets/stylesheets/active_admin/components/_batch_actions.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_blank_slates.scss +31 -0
- data/app/assets/stylesheets/active_admin/components/_breadcrumbs.scss +20 -0
- data/app/assets/stylesheets/active_admin/components/_buttons.scss +11 -0
- data/app/assets/stylesheets/active_admin/components/_columns.scss +3 -0
- data/app/assets/stylesheets/active_admin/components/_comments.css.scss +41 -0
- data/app/assets/stylesheets/active_admin/components/_date_picker.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_dropdown_menu.scss +151 -0
- data/app/assets/stylesheets/active_admin/components/_flash_messages.css.scss +39 -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/_pagination.scss +34 -0
- data/app/assets/stylesheets/active_admin/components/_panels.scss +6 -0
- data/app/assets/stylesheets/active_admin/components/_popovers.css.scss +123 -0
- data/app/assets/stylesheets/active_admin/components/_scopes.scss +10 -0
- data/app/assets/stylesheets/active_admin/components/_status_tags.scss +12 -0
- data/app/assets/stylesheets/active_admin/components/_table_tools.css.scss +95 -0
- data/app/assets/stylesheets/active_admin/components/_tables.css.scss +110 -0
- data/app/assets/stylesheets/active_admin/mixins/_all.css.scss +11 -0
- data/app/assets/stylesheets/active_admin/mixins/_buttons.css.scss +66 -0
- data/app/assets/stylesheets/active_admin/mixins/_gradients.css.scss +38 -0
- data/app/assets/stylesheets/active_admin/mixins/_icons.css.scss +21 -0
- data/app/assets/stylesheets/active_admin/mixins/_reset.css.scss +165 -0
- data/app/assets/stylesheets/active_admin/mixins/_rounded.css.scss +43 -0
- data/app/assets/stylesheets/active_admin/mixins/_sections.css.scss +36 -0
- data/app/assets/stylesheets/active_admin/mixins/_shadows.css.scss +22 -0
- data/app/assets/stylesheets/active_admin/mixins/_typography.scss +3 -0
- data/app/assets/stylesheets/active_admin/mixins/_utilities.scss +26 -0
- data/app/assets/stylesheets/active_admin/mixins/_variables.css.scss +32 -0
- data/app/assets/stylesheets/active_admin/pages/_logged_out.scss +44 -0
- data/app/assets/stylesheets/active_admin/print.css.scss +284 -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 +43 -0
- data/app/views/active_admin/dashboard/index.html.arb +1 -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 +19 -0
- data/app/views/active_admin/devise/passwords/new.html.erb +14 -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 +14 -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.csv.erb +17 -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 +37 -0
- data/config/locales/bg.yml +101 -0
- data/config/locales/ca.yml +98 -0
- data/config/locales/cs.yml +105 -0
- data/config/locales/da.yml +102 -0
- data/config/locales/de-CH.yml +117 -0
- data/config/locales/de.yml +119 -0
- data/config/locales/en-GB.yml +91 -0
- data/config/locales/en.yml +110 -0
- data/config/locales/es.yml +106 -0
- data/config/locales/es_MX.yml +104 -0
- data/config/locales/fi.yml +109 -0
- data/config/locales/fr.yml +97 -0
- data/config/locales/he.yml +91 -0
- data/config/locales/hr.yml +93 -0
- data/config/locales/hu.yml +92 -0
- data/config/locales/it.yml +89 -0
- data/config/locales/ja.yml +104 -0
- data/config/locales/ko.yml +84 -0
- data/config/locales/lt.yml +90 -0
- data/config/locales/lv.yml +89 -0
- data/config/locales/nl.yml +90 -0
- data/config/locales/no-NB.yml +85 -0
- data/config/locales/pl.yml +93 -0
- data/config/locales/pt-BR.yml +90 -0
- data/config/locales/pt-PT.yml +89 -0
- data/config/locales/ro.yml +93 -0
- data/config/locales/ru.yml +103 -0
- data/config/locales/sv-SE.yml +89 -0
- data/config/locales/tr.yml +90 -0
- data/config/locales/uk.yml +100 -0
- data/config/locales/vi.yml +90 -0
- data/config/locales/zh-CN.yml +90 -0
- data/config/locales/zh-TW.yml +90 -0
- data/cucumber.yml +3 -0
- data/docs/0-installation.md +84 -0
- data/docs/1-general-configuration.md +137 -0
- data/docs/10-custom-pages.md +98 -0
- data/docs/11-decorators.md +66 -0
- data/docs/12-arbre-components.md +144 -0
- data/docs/13-authorization-adapter.md +227 -0
- data/docs/2-resource-customization.md +340 -0
- data/docs/3-index-pages/create-an-index.md +29 -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 +154 -0
- data/docs/3-index-pages.md +206 -0
- data/docs/4-csv-format.md +39 -0
- data/docs/5-forms.md +110 -0
- data/docs/6-show-pages.md +77 -0
- data/docs/7-sidebars.md +42 -0
- data/docs/8-custom-actions.md +139 -0
- data/docs/9-batch-actions.md +155 -0
- data/features/action_item.feature +73 -0
- data/features/authorization.feature +64 -0
- data/features/authorization_cancan.feature +52 -0
- data/features/belongs_to.feature +63 -0
- data/features/breadcrumb.feature +27 -0
- data/features/comments/commenting.feature +140 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +16 -0
- data/features/decorators.feature +41 -0
- data/features/development_reloading.feature +31 -0
- data/features/edit_page.feature +127 -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 +38 -0
- data/features/index/batch_actions.feature +123 -0
- data/features/index/filters.feature +138 -0
- data/features/index/format_as_csv.feature +117 -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 +195 -0
- data/features/index/index_blank_slate.feature +61 -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 +30 -0
- data/features/index/pagination.feature +59 -0
- data/features/index/switch_index_view.feature +73 -0
- data/features/menu.feature +53 -0
- data/features/new_page.feature +119 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_pages.feature +148 -0
- data/features/registering_resources.feature +33 -0
- data/features/root_to.feature +17 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +47 -0
- data/features/sidebar_sections.feature +198 -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 +7 -0
- data/features/step_definitions/additional_web_steps.rb +82 -0
- data/features/step_definitions/asset_steps.rb +15 -0
- data/features/step_definitions/attribute_steps.rb +13 -0
- data/features/step_definitions/batch_action_steps.rb +55 -0
- data/features/step_definitions/breadcrumb_steps.rb +3 -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 +34 -0
- data/features/step_definitions/filter_steps.rb +17 -0
- data/features/step_definitions/flash_steps.rb +11 -0
- data/features/step_definitions/format_steps.rb +45 -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/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +8 -0
- data/features/step_definitions/site_title_steps.rb +15 -0
- data/features/step_definitions/symbol_leak_steps.rb +3 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/table_steps.rb +119 -0
- data/features/step_definitions/user_steps.rb +39 -0
- data/features/step_definitions/web_steps.rb +86 -0
- data/features/sti_resource.feature +73 -0
- data/features/support/env.rb +112 -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 +34 -0
- data/features/users/logging_out.feature +13 -0
- data/features/users/resetting_password.feature +34 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/application.rb +242 -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/authorization.rb +151 -0
- data/lib/active_admin/base_controller/menu.rb +34 -0
- data/lib/active_admin/base_controller.rb +78 -0
- data/lib/active_admin/batch_actions/controller.rb +24 -0
- data/lib/active_admin/batch_actions/resource_extension.rb +127 -0
- data/lib/active_admin/batch_actions/views/batch_action_form.rb +35 -0
- data/lib/active_admin/batch_actions/views/batch_action_popover.rb +28 -0
- data/lib/active_admin/batch_actions/views/batch_action_selector.rb +66 -0
- data/lib/active_admin/batch_actions/views/selection_cells.rb +37 -0
- data/lib/active_admin/batch_actions.rb +17 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/cancan_adapter.rb +40 -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 +49 -0
- data/lib/active_admin/deprecation.rb +36 -0
- data/lib/active_admin/devise.rb +70 -0
- data/lib/active_admin/dsl.rb +166 -0
- data/lib/active_admin/engine.rb +7 -0
- data/lib/active_admin/event.rb +33 -0
- data/lib/active_admin/filters/dsl.rb +21 -0
- data/lib/active_admin/filters/forms.rb +89 -0
- data/lib/active_admin/filters/formtastic_addons.rb +70 -0
- data/lib/active_admin/filters/resource_extension.rb +136 -0
- data/lib/active_admin/filters.rb +9 -0
- data/lib/active_admin/form_builder.rb +152 -0
- data/lib/active_admin/helpers/collection.rb +23 -0
- data/lib/active_admin/helpers/optional_display.rb +38 -0
- data/lib/active_admin/helpers/scope_chain.rb +23 -0
- data/lib/active_admin/helpers/settings.rb +108 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/inputs/datepicker_input.rb +20 -0
- data/lib/active_admin/inputs/filter_base/search_method_select.rb +73 -0
- data/lib/active_admin/inputs/filter_base.rb +33 -0
- data/lib/active_admin/inputs/filter_boolean_input.rb +32 -0
- data/lib/active_admin/inputs/filter_check_boxes_input.rb +51 -0
- data/lib/active_admin/inputs/filter_date_range_input.rb +34 -0
- data/lib/active_admin/inputs/filter_numeric_input.rb +10 -0
- data/lib/active_admin/inputs/filter_select_input.rb +61 -0
- data/lib/active_admin/inputs/filter_string_input.rb +24 -0
- data/lib/active_admin/inputs.rb +15 -0
- data/lib/active_admin/menu.rb +107 -0
- data/lib/active_admin/menu_collection.rb +96 -0
- data/lib/active_admin/menu_item.rb +97 -0
- data/lib/active_admin/namespace.rb +224 -0
- data/lib/active_admin/orm/active_record/comments/comment.rb +39 -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/active_admin_comments.rb +75 -0
- data/lib/active_admin/orm/active_record/comments/views.rb +2 -0
- data/lib/active_admin/orm/active_record/comments.rb +84 -0
- data/lib/active_admin/orm/active_record.rb +3 -0
- data/lib/active_admin/orm/mongoid/.gitkeep +0 -0
- data/lib/active_admin/orm/mongoid.rb +1 -0
- data/lib/active_admin/page.rb +88 -0
- data/lib/active_admin/page_controller.rb +29 -0
- data/lib/active_admin/page_dsl.rb +28 -0
- data/lib/active_admin/page_presenter.rb +32 -0
- data/lib/active_admin/resource/action_items.rb +91 -0
- data/lib/active_admin/resource/belongs_to.rb +36 -0
- data/lib/active_admin/resource/controllers.rb +18 -0
- data/lib/active_admin/resource/menu.rb +64 -0
- data/lib/active_admin/resource/naming.rb +84 -0
- data/lib/active_admin/resource/page_presenters.rb +82 -0
- data/lib/active_admin/resource/pagination.rb +19 -0
- data/lib/active_admin/resource/routes.rb +99 -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 +27 -0
- data/lib/active_admin/resource.rb +153 -0
- data/lib/active_admin/resource_collection.rb +42 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/data_access.rb +298 -0
- data/lib/active_admin/resource_controller/decorators.rb +20 -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.rb +50 -0
- data/lib/active_admin/resource_dsl.rb +134 -0
- data/lib/active_admin/router.rb +106 -0
- data/lib/active_admin/scope.rb +57 -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/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +34 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +26 -0
- data/lib/active_admin/view_helpers/display_helper.rb +49 -0
- data/lib/active_admin/view_helpers/download_format_links_helper.rb +49 -0
- data/lib/active_admin/view_helpers/fields_for.rb +50 -0
- data/lib/active_admin/view_helpers/flash_helper.rb +13 -0
- data/lib/active_admin/view_helpers/form_helper.rb +24 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +93 -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/view_helpers.rb +21 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/action_list_popover.rb +29 -0
- data/lib/active_admin/views/components/attributes_table.rb +103 -0
- data/lib/active_admin/views/components/blank_slate.rb +17 -0
- data/lib/active_admin/views/components/columns.rb +150 -0
- data/lib/active_admin/views/components/dropdown_menu.rb +73 -0
- data/lib/active_admin/views/components/index_list.rb +68 -0
- data/lib/active_admin/views/components/paginated_collection.rb +125 -0
- data/lib/active_admin/views/components/panel.rb +34 -0
- data/lib/active_admin/views/components/popover.rb +27 -0
- data/lib/active_admin/views/components/scopes.rb +66 -0
- data/lib/active_admin/views/components/sidebar_section.rb +28 -0
- data/lib/active_admin/views/components/site_title.rb +55 -0
- data/lib/active_admin/views/components/status_tag.rb +56 -0
- data/lib/active_admin/views/components/table_for.rb +191 -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 +264 -0
- data/lib/active_admin/views/pages/base.rb +139 -0
- data/lib/active_admin/views/pages/form.rb +51 -0
- data/lib/active_admin/views/pages/index.rb +147 -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 +62 -0
- data/lib/active_admin/views/title_bar.rb +53 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +125 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/assets/assets_generator.rb +16 -0
- data/lib/generators/active_admin/assets/templates/active_admin.css.scss +17 -0
- data/lib/generators/active_admin/assets/templates/active_admin.js.coffee +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +86 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +235 -0
- data/lib/generators/active_admin/install/templates/admin_user.rb.erb +27 -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/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/lib/ransack_ext.rb +12 -0
- data/script/local +44 -0
- data/script/use_rails +53 -0
- data/spec/integration/default_namespace_spec.rb +61 -0
- data/spec/integration/javascript_spec.rb +20 -0
- data/spec/integration/memory_spec.rb +29 -0
- data/spec/integration/stylesheets_spec.rb +41 -0
- data/spec/javascripts/coffeescripts/jquery.aa.checkbox-toggler-spec.js.coffee +50 -0
- data/spec/javascripts/coffeescripts/jquery.aa.popover-spec.js.coffee +82 -0
- data/spec/javascripts/coffeescripts/jquery.aa.table-checkbox-toggler-spec.js.coffee +34 -0
- data/spec/javascripts/compiled/jquery.aa.checkbox-toggler-spec.js +60 -0
- data/spec/javascripts/compiled/jquery.aa.popover-spec.js +106 -0
- data/spec/javascripts/compiled/jquery.aa.table-checkbox-toggler-spec.js +37 -0
- data/spec/javascripts/fixtures/checkboxes.html +9 -0
- data/spec/javascripts/fixtures/table_checkboxes.html +17 -0
- data/spec/javascripts/helpers/SpecHelper.js +3 -0
- data/spec/javascripts/helpers/vendor/jasmine-fixture-0.0.5.js +108 -0
- data/spec/javascripts/helpers/vendor/jasmine-jquery.js +288 -0
- data/spec/javascripts/helpers/vendor/sinon-1.2.0.js +2915 -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/javascripts/support/jquery-ui-1.8.16.custom.min.js +34 -0
- data/spec/javascripts/support/jquery.min.js +4 -0
- data/spec/spec_helper.rb +175 -0
- data/spec/spec_helper_without_rails.rb +16 -0
- data/spec/support/deferred_garbage_collection.rb +19 -0
- data/spec/support/detect_rails_version.rb +42 -0
- data/spec/support/integration_example_group.rb +31 -0
- data/spec/support/jslint.yml +80 -0
- data/spec/support/rails_template.rb +111 -0
- data/spec/support/rails_template_with_data.rb +59 -0
- data/spec/support/templates/admin/stores.rb +11 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/support/templates/cucumber_with_reloading.rb +5 -0
- data/spec/support/templates/en.yml +8 -0
- data/spec/support/templates/post_decorator.rb +53 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +126 -0
- data/spec/unit/active_admin_spec.rb +11 -0
- data/spec/unit/application_spec.rb +141 -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/auto_link_spec.rb +32 -0
- data/spec/unit/batch_actions/resource_spec.rb +91 -0
- data/spec/unit/batch_actions/settings_spec.rb +61 -0
- data/spec/unit/belongs_to_spec.rb +42 -0
- data/spec/unit/cancan_adapter_spec.rb +43 -0
- data/spec/unit/comments_spec.rb +106 -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 +32 -0
- data/spec/unit/csv_builder_spec.rb +103 -0
- data/spec/unit/devise_spec.rb +116 -0
- data/spec/unit/dsl_spec.rb +61 -0
- data/spec/unit/event_spec.rb +47 -0
- data/spec/unit/filters/filter_form_builder_spec.rb +423 -0
- data/spec/unit/filters/resource_spec.rb +119 -0
- data/spec/unit/form_builder_spec.rb +514 -0
- data/spec/unit/generators/install_spec.rb +23 -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/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 +74 -0
- data/spec/unit/namespace/register_resource_spec.rb +163 -0
- data/spec/unit/namespace_spec.rb +103 -0
- data/spec/unit/page_controller_spec.rb +5 -0
- data/spec/unit/page_spec.rb +72 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/resource/action_items_spec.rb +62 -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 +73 -0
- data/spec/unit/resource/scopes_spec.rb +43 -0
- data/spec/unit/resource/sidebars_spec.rb +43 -0
- data/spec/unit/resource_collection_spec.rb +160 -0
- data/spec/unit/resource_controller/data_access_spec.rb +73 -0
- data/spec/unit/resource_controller/sidebars_spec.rb +46 -0
- data/spec/unit/resource_controller_spec.rb +265 -0
- data/spec/unit/resource_registration_spec.rb +56 -0
- data/spec/unit/resource_spec.rb +243 -0
- data/spec/unit/routing_spec.rb +172 -0
- data/spec/unit/scope_spec.rb +108 -0
- data/spec/unit/settings_spec.rb +88 -0
- data/spec/unit/view_factory_spec.rb +21 -0
- data/spec/unit/view_helpers/breadcrumbs_spec.rb +149 -0
- data/spec/unit/view_helpers/display_name_spec.rb +41 -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/form_helper_spec.rb +56 -0
- data/spec/unit/view_helpers/method_or_proc_helper_spec.rb +101 -0
- data/spec/unit/views/components/action_list_popover_spec.rb +30 -0
- data/spec/unit/views/components/attributes_table_spec.rb +230 -0
- data/spec/unit/views/components/batch_action_popover_spec.rb +33 -0
- data/spec/unit/views/components/blank_slate_spec.rb +17 -0
- data/spec/unit/views/components/columns_spec.rb +142 -0
- data/spec/unit/views/components/index_list_spec.rb +32 -0
- data/spec/unit/views/components/paginated_collection_spec.rb +227 -0
- data/spec/unit/views/components/panel_spec.rb +51 -0
- data/spec/unit/views/components/popover_spec.rb +33 -0
- data/spec/unit/views/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/views/components/site_title_spec.rb +78 -0
- data/spec/unit/views/components/status_tag_spec.rb +95 -0
- data/spec/unit/views/components/table_for_spec.rb +201 -0
- data/spec/unit/views/pages/form_spec.rb +35 -0
- data/spec/unit/views/pages/layout_spec.rb +63 -0
- data/spec/unit/views/pages/show_spec.rb +20 -0
- data/spec/unit/views/tabbed_navigation_spec.rb +149 -0
- data/tasks/docs.rake +37 -0
- data/tasks/js.rake +32 -0
- data/tasks/parallel_tests.rake +60 -0
- data/tasks/test.rake +79 -0
- data/tasks/yard.rake +7 -0
- metadata +896 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
Then /^I should see (\d+) ([\w]*) in the table$/ do |count, resource_type|
|
|
2
|
+
all("table.index_table tr > td:first").count.should eq count.to_i
|
|
3
|
+
end
|
|
4
|
+
|
|
5
|
+
# TODO: simplify this, if possible?
|
|
6
|
+
class HtmlTableToTextHelper
|
|
7
|
+
def initialize(html, table_css_selector = "table")
|
|
8
|
+
@html = html
|
|
9
|
+
@selector = table_css_selector
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def to_array
|
|
13
|
+
rows = Nokogiri::HTML(@html).css("#{@selector} tr")
|
|
14
|
+
rows.map do |row|
|
|
15
|
+
row.css('th, td').map do |td|
|
|
16
|
+
cell_to_string(td)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def cell_to_string(td)
|
|
24
|
+
str = ""
|
|
25
|
+
input = td.css('input').last
|
|
26
|
+
|
|
27
|
+
if input
|
|
28
|
+
str << input_to_string(input)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
str << td.content.strip.gsub("\n", ' ')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def input_to_string(input)
|
|
35
|
+
case input.attribute("type").value
|
|
36
|
+
when "checkbox"
|
|
37
|
+
if input.attribute("disabled")
|
|
38
|
+
"_"
|
|
39
|
+
else
|
|
40
|
+
if input.attribute("checked")
|
|
41
|
+
"[X]"
|
|
42
|
+
else
|
|
43
|
+
"[ ]"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
when "text"
|
|
47
|
+
if input.attribute("value").present?
|
|
48
|
+
"[#{input.attribute("value")}]"
|
|
49
|
+
else
|
|
50
|
+
"[ ]"
|
|
51
|
+
end
|
|
52
|
+
when "submit"
|
|
53
|
+
input.attribute("value")
|
|
54
|
+
else
|
|
55
|
+
raise "I don't know what to do with #{input}"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
module TableMatchHelper
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
# @param table [Array[Array]]
|
|
64
|
+
# @param expected_table [Array[Array[String]]]
|
|
65
|
+
# The expected_table values are String. They are converted to
|
|
66
|
+
# Regexp when they start and end with a '/'
|
|
67
|
+
# Example:
|
|
68
|
+
#
|
|
69
|
+
# assert_table_match(
|
|
70
|
+
# [["Name", "Date"], ["Philippe", "Feb 08"]],
|
|
71
|
+
# [["Name", "Date"], ["Philippe", "/\w{3} \d{2}/"]]
|
|
72
|
+
# )
|
|
73
|
+
def assert_tables_match(table, expected_table)
|
|
74
|
+
expected_table.each_index do |row_index|
|
|
75
|
+
expected_table[row_index].each_index do |column_index|
|
|
76
|
+
expected_cell = expected_table[row_index][column_index]
|
|
77
|
+
cell = table.try(:[], row_index).try(:[], column_index)
|
|
78
|
+
begin
|
|
79
|
+
assert_cells_match(cell, expected_cell)
|
|
80
|
+
rescue
|
|
81
|
+
puts "Cell at line #{row_index} and column #{column_index}: #{cell.inspect} does not match #{expected_cell.inspect}"
|
|
82
|
+
puts "Expecting:"
|
|
83
|
+
table.each { |row| puts row.inspect }
|
|
84
|
+
puts "to match:"
|
|
85
|
+
expected_table.each { |row| puts row.inspect }
|
|
86
|
+
raise $!
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def assert_cells_match(cell, expected_cell)
|
|
93
|
+
if expected_cell =~ /^\/.*\/$/
|
|
94
|
+
cell.should match(Regexp.new(expected_cell[1..-2]))
|
|
95
|
+
else
|
|
96
|
+
(cell || "").strip.should == expected_cell
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end # module TableMatchHelper
|
|
101
|
+
|
|
102
|
+
World(TableMatchHelper)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
# Usage:
|
|
106
|
+
#
|
|
107
|
+
# I should see the "invoices" table:
|
|
108
|
+
# | Invoice # | Date | Total Amount |
|
|
109
|
+
# | /\d+/ | 27/01/12 | $30.00 |
|
|
110
|
+
# | /\d+/ | 12/02/12 | $25.00 |
|
|
111
|
+
#
|
|
112
|
+
Then /^I should see the "([^"]*)" table:$/ do |table_id, expected_table|
|
|
113
|
+
page.should have_css("table##{table_id}")
|
|
114
|
+
|
|
115
|
+
assert_tables_match(
|
|
116
|
+
HtmlTableToTextHelper.new(page.body, "table##{table_id}").to_array,
|
|
117
|
+
expected_table.raw
|
|
118
|
+
)
|
|
119
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
def ensure_user_created(email)
|
|
2
|
+
user = AdminUser.where(:email => email).first_or_create(:password => 'password', :password_confirmation => 'password')
|
|
3
|
+
|
|
4
|
+
unless user.persisted?
|
|
5
|
+
raise "Could not create user #{email}: #{user.errors.full_messages}"
|
|
6
|
+
end
|
|
7
|
+
user
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
Given /^(?:I am logged|log) out$/ do
|
|
11
|
+
click_link 'Logout' if page.all(:css, "a", :text => 'Logout').any?
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
Given /^I am logged in$/ do
|
|
15
|
+
step 'log out'
|
|
16
|
+
login_as ensure_user_created 'admin@example.com'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# only for @requires-reloading scenario
|
|
20
|
+
Given /^I am logged in with capybara$/ do
|
|
21
|
+
ensure_user_created 'admin@example.com'
|
|
22
|
+
step 'log out'
|
|
23
|
+
|
|
24
|
+
visit new_admin_user_session_path
|
|
25
|
+
fill_in 'Email', :with => 'admin@example.com'
|
|
26
|
+
fill_in 'Password', :with => 'password'
|
|
27
|
+
click_button 'Login'
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
Given /^an admin user "([^"]*)" exists$/ do |email|
|
|
31
|
+
ensure_user_created(email)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
Given /^an admin user "([^"]*)" exists with( expired)? reset password token "(.*?)"$/ do |email, expired, token|
|
|
35
|
+
user = ensure_user_created(email)
|
|
36
|
+
user.reset_password_token = token
|
|
37
|
+
user.reset_password_sent_at = 1.minute.ago unless expired
|
|
38
|
+
user.save
|
|
39
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
require 'uri'
|
|
2
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "paths"))
|
|
3
|
+
require File.expand_path(File.join(File.dirname(__FILE__), "..", "support", "selectors"))
|
|
4
|
+
|
|
5
|
+
module WithinHelpers
|
|
6
|
+
def with_scope(locator)
|
|
7
|
+
locator ? within(*selector_for(locator)) { yield } : yield
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
World(WithinHelpers)
|
|
11
|
+
|
|
12
|
+
# Single-line step scoper
|
|
13
|
+
When /^(.*) within (.*[^:])$/ do |step_name, parent|
|
|
14
|
+
with_scope(parent) { step step_name }
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Multi-line step scoper
|
|
18
|
+
When /^(.*) within (.*[^:]):$/ do |step_name, parent, table_or_string|
|
|
19
|
+
with_scope(parent) { step "#{step_name}:", table_or_string }
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
Given /^(?:I )am on (.+)$/ do |page_name|
|
|
23
|
+
visit path_to(page_name)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
When /^(?:I )go to (.+)$/ do |page_name|
|
|
27
|
+
visit path_to(page_name)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
When /^(?:I )POST to "(.*?)" with params "(.*?)"$/ do |url, params|
|
|
31
|
+
post "#{url}#{params}"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
When /^(?:I )press "([^"]*)"$/ do |button|
|
|
35
|
+
click_button(button)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
When /^(?:I )follow "([^"]*)"$/ do |link|
|
|
39
|
+
click_link(link)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
When /^(?:I )fill in "([^"]*)" with "([^"]*)"$/ do |field, value|
|
|
43
|
+
fill_in(field, :with => value)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
When /^(?:I )select "([^"]*)" from "([^"]*)"$/ do |value, field|
|
|
47
|
+
select(value, :from => field)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
When /^(?:I )(check|uncheck|choose) "([^"]*)"$/ do |action, field|
|
|
51
|
+
send action, field
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
When /^(?:I )attach the file "([^"]*)" to "([^"]*)"$/ do |path, field|
|
|
55
|
+
attach_file(field, File.expand_path(path))
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
Then /^(?:I )should( not)? see( the element)? "([^"]*)"$/ do |negate, is_css, text|
|
|
59
|
+
should = negate ? :should_not : :should
|
|
60
|
+
have = is_css ? have_css(text) : have_content(text)
|
|
61
|
+
page.send should, have
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
Then /^the "([^"]*)" field(?: within (.*))? should( not)? contain "([^"]*)"$/ do |field, parent, negate, value|
|
|
65
|
+
with_scope(parent) do
|
|
66
|
+
field = find_field(field)
|
|
67
|
+
field_value = (field.tag_name == 'textarea') ? field.text : field.value
|
|
68
|
+
negate ? field_value.should_not =~ /#{value}/ : field_value.should =~ /#{value}/
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
Then /^the "([^"]*)" checkbox(?: within (.*))? should( not)? be checked$/ do |label, parent, negate|
|
|
73
|
+
with_scope(parent) do
|
|
74
|
+
field_checked = find_field(label)['checked']
|
|
75
|
+
field_checked.should negate ? be_false : be_true
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
Then /^(?:|I )should be on (.+)$/ do |page_name|
|
|
80
|
+
current_path = URI.parse(current_url).path
|
|
81
|
+
current_path.should == path_to(page_name)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
Then /^show me the page$/ do
|
|
85
|
+
save_and_open_page
|
|
86
|
+
end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
Feature: STI Resource
|
|
2
|
+
|
|
3
|
+
Ensure that standard CRUD works with STI models
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given I am logged in
|
|
7
|
+
And a configuration of:
|
|
8
|
+
"""
|
|
9
|
+
ActiveAdmin.register Publisher do
|
|
10
|
+
controller do
|
|
11
|
+
def permitted_params
|
|
12
|
+
params.permit publisher: [:first_name, :last_name, :username, :age]
|
|
13
|
+
end if Rails::VERSION::MAJOR == 4
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
ActiveAdmin.register User do
|
|
17
|
+
controller do
|
|
18
|
+
def permitted_params
|
|
19
|
+
params.permit user: [:first_name, :last_name, :username, :age]
|
|
20
|
+
end if Rails::VERSION::MAJOR == 4
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
Scenario: Create, update and delete a child STI resource
|
|
26
|
+
Given I am on the index page for publishers
|
|
27
|
+
When I follow "New Publisher"
|
|
28
|
+
And I fill in "First name" with "Terry"
|
|
29
|
+
And I fill in "Last name" with "Fox"
|
|
30
|
+
And I fill in "Username" with "terry_fox"
|
|
31
|
+
And I press "Create Publisher"
|
|
32
|
+
Then I should see "Publisher was successfully created"
|
|
33
|
+
And I should see "Terry"
|
|
34
|
+
|
|
35
|
+
When I follow "Edit Publisher"
|
|
36
|
+
And I fill in "First name" with "Joe"
|
|
37
|
+
And I press "Update Publisher"
|
|
38
|
+
Then I should see "Publisher was successfully updated"
|
|
39
|
+
And I should see "Joe"
|
|
40
|
+
|
|
41
|
+
When I follow "Delete Publisher"
|
|
42
|
+
Then I should see "Publisher was successfully destroyed"
|
|
43
|
+
|
|
44
|
+
Scenario: Create, update and delete a parent STI resource
|
|
45
|
+
Given I am on the index page for users
|
|
46
|
+
When I follow "New User"
|
|
47
|
+
And I fill in "First name" with "Terry"
|
|
48
|
+
And I fill in "Last name" with "Fox"
|
|
49
|
+
And I fill in "Username" with "terry_fox"
|
|
50
|
+
And I press "Create User"
|
|
51
|
+
Then I should see "User was successfully created"
|
|
52
|
+
And I should see "Terry"
|
|
53
|
+
|
|
54
|
+
When I follow "Edit User"
|
|
55
|
+
And I fill in "First name" with "Joe"
|
|
56
|
+
And I press "Update User"
|
|
57
|
+
Then I should see "User was successfully updated"
|
|
58
|
+
And I should see "Joe"
|
|
59
|
+
|
|
60
|
+
When I follow "Delete User"
|
|
61
|
+
Then I should see "User was successfully destroyed"
|
|
62
|
+
|
|
63
|
+
Scenario: Update and delete a child STI when the parent is registered
|
|
64
|
+
Given a publisher named "Terry Fox" exists
|
|
65
|
+
And I am on the index page for users
|
|
66
|
+
When I follow "Edit"
|
|
67
|
+
And I fill in "First name" with "Joe"
|
|
68
|
+
And I press "Update Publisher"
|
|
69
|
+
Then I should see "Publisher was successfully updated"
|
|
70
|
+
And I should see "Joe"
|
|
71
|
+
|
|
72
|
+
When I follow "Delete User"
|
|
73
|
+
Then I should see "Publisher was successfully destroyed"
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
|
|
2
|
+
# It is recommended to regenerate this file in the future when you upgrade to a
|
|
3
|
+
# newer version of cucumber-rails. Consider adding your own code to a new file
|
|
4
|
+
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
|
|
5
|
+
# files.
|
|
6
|
+
|
|
7
|
+
ENV["RAILS_ENV"] ||= "cucumber"
|
|
8
|
+
|
|
9
|
+
require File.expand_path('../../../spec/spec_helper_without_rails', __FILE__)
|
|
10
|
+
|
|
11
|
+
ENV['RAILS_ROOT'] = File.expand_path("../../../spec/rails/rails-#{ENV["RAILS"]}", __FILE__)
|
|
12
|
+
|
|
13
|
+
# Create the test app if it doesn't exists
|
|
14
|
+
unless File.exists?(ENV['RAILS_ROOT'])
|
|
15
|
+
system 'rake setup'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Ensure the Active Admin load path is happy
|
|
19
|
+
require 'rails'
|
|
20
|
+
require 'active_admin'
|
|
21
|
+
ActiveAdmin.application.load_paths = [ENV['RAILS_ROOT'] + "/app/admin"]
|
|
22
|
+
|
|
23
|
+
require ENV['RAILS_ROOT'] + '/config/environment'
|
|
24
|
+
|
|
25
|
+
# Setup autoloading of ActiveAdmin and the load path
|
|
26
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
27
|
+
autoload :ActiveAdmin, 'active_admin'
|
|
28
|
+
|
|
29
|
+
require 'cucumber/rails'
|
|
30
|
+
|
|
31
|
+
require 'capybara/rails'
|
|
32
|
+
require 'capybara/cucumber'
|
|
33
|
+
require 'capybara/session'
|
|
34
|
+
# Capybara defaults to XPath selectors rather than Webrat's default of CSS3. In
|
|
35
|
+
# order to ease the transition to Capybara we set the default here. If you'd
|
|
36
|
+
# prefer to use XPath just remove this line and adjust any selectors in your
|
|
37
|
+
# steps to use the XPath syntax.
|
|
38
|
+
Capybara.default_selector = :css
|
|
39
|
+
|
|
40
|
+
# If you set this to false, any error raised from within your app will bubble
|
|
41
|
+
# up to your step definition and out to cucumber unless you catch it somewhere
|
|
42
|
+
# on the way. You can make Rails rescue errors and render error pages on a
|
|
43
|
+
# per-scenario basis by tagging a scenario or feature with the @allow-rescue tag.
|
|
44
|
+
#
|
|
45
|
+
# If you set this to true, Rails will rescue all errors and render error
|
|
46
|
+
# pages, more or less in the same way your application would behave in the
|
|
47
|
+
# default production environment. It's not recommended to do this for all
|
|
48
|
+
# of your scenarios, as this makes it hard to discover errors in your application.
|
|
49
|
+
ActionController::Base.allow_rescue = false
|
|
50
|
+
|
|
51
|
+
# If you set this to true, each scenario will run in a database transaction.
|
|
52
|
+
# You can still turn off transactions on a per-scenario basis, simply tagging
|
|
53
|
+
# a feature or scenario with the @no-txn tag. If you are using Capybara,
|
|
54
|
+
# tagging with @culerity or @javascript will also turn transactions off.
|
|
55
|
+
#
|
|
56
|
+
# If you set this to false, transactions will be off for all scenarios,
|
|
57
|
+
# regardless of whether you use @no-txn or not.
|
|
58
|
+
#
|
|
59
|
+
# Beware that turning transactions off will leave data in your database
|
|
60
|
+
# after each scenario, which can lead to hard-to-debug failures in
|
|
61
|
+
# subsequent scenarios. If you do this, we recommend you create a Before
|
|
62
|
+
# block that will explicitly put your database in a known state.
|
|
63
|
+
Cucumber::Rails::World.use_transactional_fixtures = false
|
|
64
|
+
# How to clean your database when transactions are turned off. See
|
|
65
|
+
# http://github.com/bmabey/database_cleaner for more info.
|
|
66
|
+
if defined?(ActiveRecord::Base)
|
|
67
|
+
begin
|
|
68
|
+
require 'database_cleaner'
|
|
69
|
+
require 'database_cleaner/cucumber'
|
|
70
|
+
DatabaseCleaner.strategy = :truncation
|
|
71
|
+
rescue LoadError => ignore_if_database_cleaner_not_present
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Warden helpers to speed up login
|
|
76
|
+
# See https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara
|
|
77
|
+
include Warden::Test::Helpers
|
|
78
|
+
|
|
79
|
+
After do
|
|
80
|
+
Warden.test_reset!
|
|
81
|
+
|
|
82
|
+
# Reset back to the default auth adapter
|
|
83
|
+
ActiveAdmin.application.namespace(:admin).
|
|
84
|
+
authorization_adapter = ActiveAdmin::AuthorizationAdapter
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
Before do
|
|
88
|
+
|
|
89
|
+
begin
|
|
90
|
+
# We are caching classes, but need to manually clear references to
|
|
91
|
+
# the controllers. If they aren't clear, the router stores references
|
|
92
|
+
ActiveSupport::Dependencies.clear
|
|
93
|
+
|
|
94
|
+
# Reload Active Admin
|
|
95
|
+
ActiveAdmin.unload!
|
|
96
|
+
ActiveAdmin.load!
|
|
97
|
+
rescue
|
|
98
|
+
p $!
|
|
99
|
+
raise $!
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# improve the performance of the specs suite by not logging anything
|
|
104
|
+
# see http://blog.plataformatec.com.br/2011/12/three-tips-to-improve-the-performance-of-your-test-suite/
|
|
105
|
+
Rails.logger.level = 4
|
|
106
|
+
|
|
107
|
+
# Improves performance by forcing the garbage collector to run less often.
|
|
108
|
+
unless ENV['DEFER_GC'] == '0' || ENV['DEFER_GC'] == 'false'
|
|
109
|
+
require File.expand_path('../../../spec/support/deferred_garbage_collection', __FILE__)
|
|
110
|
+
Before { DeferredGarbageCollection.start }
|
|
111
|
+
After { DeferredGarbageCollection.reconsider }
|
|
112
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module NavigationHelpers
|
|
2
|
+
# Maps a name to a path. Used by the
|
|
3
|
+
#
|
|
4
|
+
# When /^I go to (.+)$/ do |page_name|
|
|
5
|
+
#
|
|
6
|
+
# step definition in web_steps.rb
|
|
7
|
+
#
|
|
8
|
+
def path_to(page_name)
|
|
9
|
+
params = page_name.scan(/with params "(.*?)"/).flatten[0] || ''
|
|
10
|
+
page_name.sub! /\ with params.*/, ''
|
|
11
|
+
|
|
12
|
+
url = case page_name
|
|
13
|
+
|
|
14
|
+
when /the home\s?page/
|
|
15
|
+
'/'
|
|
16
|
+
when /the dashboard/
|
|
17
|
+
"/admin"
|
|
18
|
+
when /the new post page/
|
|
19
|
+
"/admin/posts/new"
|
|
20
|
+
when /the login page/
|
|
21
|
+
"/admin/login"
|
|
22
|
+
when /the first post show page/
|
|
23
|
+
"/admin/posts/1"
|
|
24
|
+
when /the first post edit page/
|
|
25
|
+
"/admin/posts/1/edit"
|
|
26
|
+
when /the admin password reset form with reset password token "([^"]*)"/
|
|
27
|
+
"/admin/password/edit?reset_password_token=#{$1}"
|
|
28
|
+
|
|
29
|
+
# the index page for posts in the root namespace
|
|
30
|
+
# the index page for posts in the user_admin namespace
|
|
31
|
+
when /^the index page for (.*) in the (.*) namespace$/
|
|
32
|
+
if $2 != 'root'
|
|
33
|
+
send "#{$2}_#{$1}_path"
|
|
34
|
+
else
|
|
35
|
+
send "#{$1}_path"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# same as above, except defaults to admin namespace
|
|
39
|
+
when /^the index page for (.*)$/
|
|
40
|
+
send "admin_#{$1}_path"
|
|
41
|
+
|
|
42
|
+
when /^the last author's posts$/
|
|
43
|
+
admin_user_posts_path(User.last)
|
|
44
|
+
|
|
45
|
+
when /^the last author's last post page$/
|
|
46
|
+
admin_user_post_path(User.last, Post.where(:author_id => User.last.id).last)
|
|
47
|
+
|
|
48
|
+
when /^the last post's edit page$/
|
|
49
|
+
edit_admin_post_path(Post.last)
|
|
50
|
+
|
|
51
|
+
# Add more mappings here.
|
|
52
|
+
# Here is an example that pulls values out of the Regexp:
|
|
53
|
+
#
|
|
54
|
+
# when /^(.*)'s profile page$/i
|
|
55
|
+
# user_profile_path(User.find_by_login($1))
|
|
56
|
+
|
|
57
|
+
else
|
|
58
|
+
begin
|
|
59
|
+
page_name =~ /the (.*) page/
|
|
60
|
+
path_components = $1.split(/\s+/)
|
|
61
|
+
self.send path_components.push('path').join('_')
|
|
62
|
+
rescue Object => e
|
|
63
|
+
raise "Can't find mapping from \"#{page_name}\" to a path.\n" +
|
|
64
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
url + params
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
World(NavigationHelpers)
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module HtmlSelectorsHelpers
|
|
2
|
+
# Maps a name to a selector. Used primarily by the
|
|
3
|
+
#
|
|
4
|
+
# When /^(.+) within (.+)$/ do |step, scope|
|
|
5
|
+
#
|
|
6
|
+
# step definitions in web_steps.rb
|
|
7
|
+
#
|
|
8
|
+
def selector_for(locator)
|
|
9
|
+
case locator
|
|
10
|
+
|
|
11
|
+
when "the page"
|
|
12
|
+
"html > body"
|
|
13
|
+
|
|
14
|
+
# Add more mappings here.
|
|
15
|
+
# Here is an example that pulls values out of the Regexp:
|
|
16
|
+
#
|
|
17
|
+
# when /^the (notice|error|info) flash$/
|
|
18
|
+
# ".flash.#{$1}"
|
|
19
|
+
|
|
20
|
+
# You can also return an array to use a different selector
|
|
21
|
+
# type, like:
|
|
22
|
+
#
|
|
23
|
+
# when /the header/
|
|
24
|
+
# [:xpath, "//header"]
|
|
25
|
+
|
|
26
|
+
when "index grid"
|
|
27
|
+
[:css, "table.index_grid"]
|
|
28
|
+
|
|
29
|
+
when /^the "([^"]*)" sidebar$/
|
|
30
|
+
[:css, "##{$1.gsub(" ", '').underscore}_sidebar_section"]
|
|
31
|
+
|
|
32
|
+
# This allows you to provide a quoted selector as the scope
|
|
33
|
+
# for "within" steps as was previously the default for the
|
|
34
|
+
# web steps:
|
|
35
|
+
when /^"(.+)"$/
|
|
36
|
+
$1
|
|
37
|
+
|
|
38
|
+
else
|
|
39
|
+
raise "Can't find mapping from \"#{locator}\" to a selector.\n" +
|
|
40
|
+
"Now, go and add a mapping in #{__FILE__}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
World(HtmlSelectorsHelpers)
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
Feature: User input shouldn't be symbolized
|
|
2
|
+
|
|
3
|
+
Background:
|
|
4
|
+
Given a configuration of:
|
|
5
|
+
"""
|
|
6
|
+
ActiveAdmin.register Post
|
|
7
|
+
"""
|
|
8
|
+
Given I am logged in
|
|
9
|
+
And 1 post exists
|
|
10
|
+
|
|
11
|
+
Scenario: The dashboard doesn't leak
|
|
12
|
+
Given I am on the dashboard with params "?really_long_malicious_key0"
|
|
13
|
+
Then "really_long_malicious_key0" shouldn't be a symbol
|
|
14
|
+
|
|
15
|
+
Scenario: The index page doesn't leak
|
|
16
|
+
Given I am on the index page for posts with params "?really_long_malicious_key1"
|
|
17
|
+
Then "really_long_malicious_key1" shouldn't be a symbol
|
|
18
|
+
|
|
19
|
+
@allow-rescue
|
|
20
|
+
Scenario: The filter query hash doesn't leak
|
|
21
|
+
Given I am on the index page for posts with params "?q[really_long_malicious_key2]"
|
|
22
|
+
Then "really_long_malicious_key2" shouldn't be a symbol
|
|
23
|
+
|
|
24
|
+
Scenario: The show page doesn't leak
|
|
25
|
+
Given I go to the first post show page with params "?really_long_malicious_key3"
|
|
26
|
+
Then "really_long_malicious_key3" shouldn't be a symbol
|
|
27
|
+
|
|
28
|
+
Scenario: The edit page doesn't leak
|
|
29
|
+
Given I go to the first post edit page with params "?really_long_malicious_key4"
|
|
30
|
+
Then "really_long_malicious_key4" shouldn't be a symbol
|
|
31
|
+
|
|
32
|
+
@allow-rescue
|
|
33
|
+
Scenario: Batch Actions don't leak
|
|
34
|
+
Given I POST to "admin/posts/batch_action" with params "?batch_action=really_long_malicious_key5"
|
|
35
|
+
Then "really_long_malicious_key5" shouldn't be a symbol
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Feature: User Logging In
|
|
2
|
+
|
|
3
|
+
Logging in to the system as an admin user
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a configuration of:
|
|
7
|
+
"""
|
|
8
|
+
ActiveAdmin.register Post
|
|
9
|
+
"""
|
|
10
|
+
And I am logged out
|
|
11
|
+
And an admin user "admin@example.com" exists
|
|
12
|
+
When I go to the dashboard
|
|
13
|
+
|
|
14
|
+
Scenario: Logging in Successfully
|
|
15
|
+
When I fill in "Email" with "admin@example.com"
|
|
16
|
+
And I fill in "Password" with "password"
|
|
17
|
+
And I press "Login"
|
|
18
|
+
Then I should be on the the dashboard
|
|
19
|
+
And I should see the element "a[href='/admin/logout' ]:contains('Logout')"
|
|
20
|
+
And I should see the element "a[href='/admin/admin_users/1']:contains('admin@example.com')"
|
|
21
|
+
|
|
22
|
+
Scenario: Attempting to log in with an incorrect email address
|
|
23
|
+
When I fill in "Email" with "not-an-admin@example.com"
|
|
24
|
+
And I fill in "Password" with "not-my-password"
|
|
25
|
+
And I press "Login"
|
|
26
|
+
Then I should see "Login"
|
|
27
|
+
And I should see "Invalid email or password."
|
|
28
|
+
|
|
29
|
+
Scenario: Attempting to log in with an incorrect password
|
|
30
|
+
When I fill in "Email" with "admin@example.com"
|
|
31
|
+
And I fill in "Password" with "not-my-password"
|
|
32
|
+
And I press "Login"
|
|
33
|
+
Then I should see "Login"
|
|
34
|
+
And I should see "Invalid email or password."
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Feature: User Logging out
|
|
2
|
+
|
|
3
|
+
Logging out of the system as an admin user
|
|
4
|
+
|
|
5
|
+
Scenario: Logging out successfully
|
|
6
|
+
Given a configuration of:
|
|
7
|
+
"""
|
|
8
|
+
ActiveAdmin.register Post
|
|
9
|
+
"""
|
|
10
|
+
And I am logged in
|
|
11
|
+
When I go to the dashboard
|
|
12
|
+
And I follow "Logout"
|
|
13
|
+
Then I should see "Login"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
Feature: User Resetting Password
|
|
2
|
+
|
|
3
|
+
Resetting my password as an admin user
|
|
4
|
+
|
|
5
|
+
Background:
|
|
6
|
+
Given a configuration of:
|
|
7
|
+
"""
|
|
8
|
+
ActiveAdmin.register Post
|
|
9
|
+
"""
|
|
10
|
+
And I am logged out
|
|
11
|
+
And an admin user "admin@example.com" exists
|
|
12
|
+
|
|
13
|
+
Scenario: Resetting password successfully
|
|
14
|
+
When I go to the dashboard
|
|
15
|
+
And I follow "Forgot your password?"
|
|
16
|
+
When I fill in "Email" with "admin@example.com"
|
|
17
|
+
And I press "Reset My Password"
|
|
18
|
+
Then I should see "You will receive an email with instructions about how to reset your password in a few minutes."
|
|
19
|
+
|
|
20
|
+
Scenario: Changing password after resetting
|
|
21
|
+
Given an admin user "admin@example.com" exists with reset password token "123reset"
|
|
22
|
+
When I go to the admin password reset form with reset password token "123reset"
|
|
23
|
+
And I fill in "Password" with "password"
|
|
24
|
+
And I fill in "Password confirmation" with "password"
|
|
25
|
+
And I press "Change my password"
|
|
26
|
+
Then I should see "success"
|
|
27
|
+
|
|
28
|
+
Scenario: Changing password after resetting with errors
|
|
29
|
+
Given an admin user "admin@example.com" exists with expired reset password token "123reset"
|
|
30
|
+
When I go to the admin password reset form with reset password token "123reset"
|
|
31
|
+
And I fill in "Password" with "password"
|
|
32
|
+
And I fill in "Password confirmation" with "wrong"
|
|
33
|
+
And I press "Change my password"
|
|
34
|
+
Then I should see "expired"
|