saulolso-activeadmin 0.2.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +32 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +26 -0
- data/LICENSE +25 -0
- data/README.rdoc +450 -0
- data/Rakefile +100 -0
- data/activeadmin.gemspec +28 -0
- data/cucumber.yml +2 -0
- data/features/comments/commenting.feature +99 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +45 -0
- data/features/index/formats.feature +10 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -0
- data/features/menu.feature +26 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +127 -0
- data/features/specifying_actions.feature +60 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/dashboard_steps.rb +11 -0
- data/features/step_definitions/factory_steps.rb +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +34 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/menu_steps.rb +7 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/sti_resource.feature +49 -0
- data/features/support/env.rb +92 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +37 -0
- data/lib/active_admin/application.rb +204 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +8 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +137 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/comments/comment.rb +21 -0
- data/lib/active_admin/comments/configuration.rb +18 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments.rb +88 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +215 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +109 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/locales/da.yml +26 -0
- data/lib/active_admin/locales/en.yml +34 -0
- data/lib/active_admin/locales/es.yml +34 -0
- data/lib/active_admin/locales/pt.yml +34 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +198 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource.rb +229 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +79 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +144 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +38 -0
- data/lib/active_admin/resource_controller.rb +119 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +43 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/stylesheets/active_admin.scss +429 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +21 -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 +42 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/table_helper.rb +12 -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 +23 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/columns.rb +47 -0
- data/lib/active_admin/views/components/paginated_collection.rb +92 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +70 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -0
- data/lib/active_admin/views/components/status_tag.rb +55 -0
- data/lib/active_admin/views/components/table_for.rb +193 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +75 -0
- data/lib/active_admin/views/pages/base.rb +144 -0
- data/lib/active_admin/views/pages/dashboard.rb +59 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +66 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
- data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +71 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/spec_helper.rb +156 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +32 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +88 -0
- data/spec/unit/action_items_spec.rb +27 -0
- data/spec/unit/application_spec.rb +67 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +210 -0
- data/spec/unit/asset_registration_spec.rb +37 -0
- data/spec/unit/auto_link_spec.rb +39 -0
- data/spec/unit/belongs_to_spec.rb +45 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +57 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/status_tag_spec.rb +81 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/controller_filters_spec.rb +27 -0
- data/spec/unit/csv_builder_spec.rb +83 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +56 -0
- data/spec/unit/dashboards_spec.rb +59 -0
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +179 -0
- data/spec/unit/form_builder_spec.rb +238 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +203 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +147 -0
- data/spec/unit/resource_spec.rb +290 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +85 -0
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +482 -0
@@ -0,0 +1,38 @@
|
|
1
|
+
ActiveAdmin::Dashboards.build do
|
2
|
+
|
3
|
+
# Define your dashboard sections here. Each block will be
|
4
|
+
# rendered on the dashboard in the context of the view. So just
|
5
|
+
# return the content which you would like to display.
|
6
|
+
|
7
|
+
# == Simple Dashboard Section
|
8
|
+
# Here is an example of a simple dashboard section
|
9
|
+
#
|
10
|
+
# section "Recent Posts" do
|
11
|
+
# ul do
|
12
|
+
# Post.recent(5).collect do |post|
|
13
|
+
# li link_to(post.title, admin_post_path(post))
|
14
|
+
# end
|
15
|
+
# end
|
16
|
+
# end
|
17
|
+
|
18
|
+
# == Render Partial Section
|
19
|
+
# The block is rendererd within the context of the view, so you can
|
20
|
+
# easily render a partial rather than build content in ruby.
|
21
|
+
#
|
22
|
+
# section "Recent Posts" do
|
23
|
+
# div do
|
24
|
+
# render 'recent_posts' # => this will render /app/views/admin/dashboard/_recent_posts.html.erb
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
|
28
|
+
# == Section Ordering
|
29
|
+
# The dashboard sections are ordered by a given priority from top left to
|
30
|
+
# bottom right. The default priority is 10. By giving a section numerically lower
|
31
|
+
# priority it will be sorted higher. For example:
|
32
|
+
#
|
33
|
+
# section "Recent Posts", :priority => 10
|
34
|
+
# section "Recent User", :priority => 1
|
35
|
+
#
|
36
|
+
# Will render the "Recent Users" then the "Recent Posts" sections on the dashboard.
|
37
|
+
|
38
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,16 @@
|
|
1
|
+
class CreateAdminNotes < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
create_table :admin_notes do |t|
|
4
|
+
t.references :resource, :polymorphic => true, :null => false
|
5
|
+
t.references :admin_user, :polymorphic => true
|
6
|
+
t.text :body
|
7
|
+
t.timestamps
|
8
|
+
end
|
9
|
+
add_index :admin_notes, [:resource_type, :resource_id]
|
10
|
+
add_index :admin_notes, [:admin_user_type, :admin_user_id]
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.down
|
14
|
+
drop_table :admin_notes
|
15
|
+
end
|
16
|
+
end
|
data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
class MoveAdminNotesToComments < ActiveRecord::Migration
|
2
|
+
def self.up
|
3
|
+
remove_index :admin_notes, [:admin_user_type, :admin_user_id]
|
4
|
+
rename_table :admin_notes, :active_admin_comments
|
5
|
+
rename_column :active_admin_comments, :admin_user_type, :author_type
|
6
|
+
rename_column :active_admin_comments, :admin_user_id, :author_id
|
7
|
+
add_column :active_admin_comments, :namespace, :string
|
8
|
+
add_index :active_admin_comments, [:namespace]
|
9
|
+
add_index :active_admin_comments, [:author_type, :author_id]
|
10
|
+
|
11
|
+
# Update all the existing comments to the default namespace
|
12
|
+
say "Updating any existing comments to the #{ActiveAdmin.application.default_namespace} namespace."
|
13
|
+
execute "UPDATE active_admin_comments SET namespace='#{ActiveAdmin.application.default_namespace}'"
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.down
|
17
|
+
remove_index :active_admin_comments, :column => [:author_type, :author_id]
|
18
|
+
remove_index :active_admin_comments, :column => [:namespace]
|
19
|
+
remove_column :active_admin_comments, :namespace
|
20
|
+
rename_column :active_admin_comments, :author_id, :admin_user_id
|
21
|
+
rename_column :active_admin_comments, :author_type, :admin_user_type
|
22
|
+
rename_table :active_admin_comments, :admin_notes
|
23
|
+
add_index :admin_notes, [:admin_user_type, :admin_user_id]
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ActiveAdmin
|
2
|
+
module Generators
|
3
|
+
class ResourceGenerator < Rails::Generators::NamedBase
|
4
|
+
desc "Installs ActiveAdmin in a rails 3 application"
|
5
|
+
|
6
|
+
def self.source_root
|
7
|
+
@_active_admin_source_root ||= File.expand_path("../templates", __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def generate_config_file
|
11
|
+
template "admin.rb", "app/admin/#{file_path.gsub('/', '_').pluralize}.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe_with_capybara "Belongs To" do
|
4
|
+
|
5
|
+
let(:user){ User.create(:first_name => "John", :last_name => "Doe", :username => "johndoe") }
|
6
|
+
let(:post){ user.posts.create :title => "Hello World", :body => "woot!"}
|
7
|
+
|
8
|
+
before do
|
9
|
+
# Make sure both are created
|
10
|
+
user
|
11
|
+
post
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "the index page" do
|
15
|
+
before do
|
16
|
+
visit admin_user_posts_path(user)
|
17
|
+
end
|
18
|
+
|
19
|
+
describe "the main content" do
|
20
|
+
it "should display the default table" do
|
21
|
+
page.should have_content(post.title)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "the breadcrumb" do
|
26
|
+
it "should have a link to the parent's index" do
|
27
|
+
page.body.should have_tag("a", "Users", :attributes => { :href => "/admin/users" })
|
28
|
+
end
|
29
|
+
it "should have a link to the parent" do
|
30
|
+
page.body.should have_tag("a", user.id.to_s, :attributes => { :href => "/admin/users/#{user.id}" })
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "the view links" do
|
35
|
+
it "should take you to the sub resource" do
|
36
|
+
click "View"
|
37
|
+
current_path.should == "/admin/users/#{user.id}/posts/#{post.id}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH << File.expand_path('../support', __FILE__)
|
3
|
+
|
4
|
+
ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
|
5
|
+
|
6
|
+
require "bundler"
|
7
|
+
Bundler.setup
|
8
|
+
|
9
|
+
require 'shoulda/active_record'
|
10
|
+
include Shoulda::ActiveRecord::Macros
|
11
|
+
|
12
|
+
module ActiveAdminIntegrationSpecHelper
|
13
|
+
extend self
|
14
|
+
|
15
|
+
def load_defaults!
|
16
|
+
ActiveAdmin.unload!
|
17
|
+
ActiveAdmin.load!
|
18
|
+
ActiveAdmin.register(Category)
|
19
|
+
ActiveAdmin.register(User)
|
20
|
+
ActiveAdmin.register(Post){ belongs_to :user, :optional => true }
|
21
|
+
reload_menus!
|
22
|
+
end
|
23
|
+
|
24
|
+
def reload_menus!
|
25
|
+
ActiveAdmin.application.namespaces.values.each{|n| n.load_menu! }
|
26
|
+
end
|
27
|
+
|
28
|
+
# Sometimes we need to reload the routes within
|
29
|
+
# the application to test them out
|
30
|
+
def reload_routes!
|
31
|
+
Rails.application.reload_routes!
|
32
|
+
end
|
33
|
+
|
34
|
+
# Helper method to load resources and ensure that Active Admin is
|
35
|
+
# setup with the new configurations.
|
36
|
+
#
|
37
|
+
# Eg:
|
38
|
+
# load_resources do
|
39
|
+
# ActiveAdmin.regiser(Post)
|
40
|
+
# end
|
41
|
+
#
|
42
|
+
def load_resources
|
43
|
+
ActiveAdmin.unload!
|
44
|
+
yield
|
45
|
+
reload_menus!
|
46
|
+
reload_routes!
|
47
|
+
end
|
48
|
+
|
49
|
+
# Sets up a describe block where you can render controller
|
50
|
+
# actions. Uses the Admin::PostsController as the subject
|
51
|
+
# for the describe block
|
52
|
+
def describe_with_render(*args, &block)
|
53
|
+
describe *args do
|
54
|
+
include RSpec::Rails::ControllerExampleGroup
|
55
|
+
render_views
|
56
|
+
# metadata[:behaviour][:describes] = ActiveAdmin.namespaces[:admin].resources['Post'].controller
|
57
|
+
module_eval &block
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Setup a describe block which uses capybara and rails integration
|
62
|
+
# test methods.
|
63
|
+
def describe_with_capybara(*args, &block)
|
64
|
+
describe *args do
|
65
|
+
include RSpec::Rails::IntegrationExampleGroup
|
66
|
+
module_eval &block
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Returns a fake action view instance to use with our renderers
|
71
|
+
def mock_action_view(assigns = {})
|
72
|
+
controller = ActionView::TestCase::TestController.new
|
73
|
+
ActionView::Base.send :include, ActionView::Helpers
|
74
|
+
ActionView::Base.send :include, ActiveAdmin::ViewHelpers
|
75
|
+
ActionView::Base.send :include, Rails.application.routes.url_helpers
|
76
|
+
ActionView::Base.new(ActionController::Base.view_paths, assigns, controller)
|
77
|
+
end
|
78
|
+
alias_method :action_view, :mock_action_view
|
79
|
+
|
80
|
+
end
|
81
|
+
|
82
|
+
ENV['RAILS'] ||= '3.0.0'
|
83
|
+
ENV['RAILS_ENV'] = 'test'
|
84
|
+
|
85
|
+
ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{ENV["RAILS"]}", __FILE__)
|
86
|
+
|
87
|
+
# Create the test app if it doesn't exists
|
88
|
+
unless File.exists?(ENV['RAILS_ROOT'])
|
89
|
+
system 'rake setup'
|
90
|
+
end
|
91
|
+
|
92
|
+
# Ensure the Active Admin load path is happy
|
93
|
+
require 'rails'
|
94
|
+
require 'active_admin'
|
95
|
+
ActiveAdmin.application.load_paths = [ENV['RAILS_ROOT'] + "/app/admin"]
|
96
|
+
|
97
|
+
require ENV['RAILS_ROOT'] + '/config/environment'
|
98
|
+
require 'rspec/rails'
|
99
|
+
|
100
|
+
# Setup Some Admin stuff for us to play with
|
101
|
+
include ActiveAdminIntegrationSpecHelper
|
102
|
+
load_defaults!
|
103
|
+
reload_routes!
|
104
|
+
|
105
|
+
# Disabling authentication in specs so that we don't have to worry about
|
106
|
+
# it allover the place
|
107
|
+
ActiveAdmin.application.authentication_method = false
|
108
|
+
ActiveAdmin.application.current_user_method = false
|
109
|
+
|
110
|
+
# Don't add asset cache timestamps. Makes it easy to integration
|
111
|
+
# test for the presence of an asset file
|
112
|
+
ENV["RAILS_ASSET_ID"] = ''
|
113
|
+
|
114
|
+
RSpec.configure do |config|
|
115
|
+
config.use_transactional_fixtures = true
|
116
|
+
config.use_instantiated_fixtures = false
|
117
|
+
end
|
118
|
+
|
119
|
+
# All RSpec configuration needs to happen before any examples
|
120
|
+
# or else it whines.
|
121
|
+
require 'integration_example_group'
|
122
|
+
RSpec.configure do |c|
|
123
|
+
c.include RSpec::Rails::IntegrationExampleGroup, :example_group => { :file_path => /\bspec\/integration\// }
|
124
|
+
end
|
125
|
+
|
126
|
+
# Ensure this is defined for Ruby 1.8
|
127
|
+
module MiniTest; class Assertion < Exception; end; end
|
128
|
+
|
129
|
+
RSpec::Matchers.define :have_tag do |*args|
|
130
|
+
|
131
|
+
match_unless_raises Test::Unit::AssertionFailedError do |response|
|
132
|
+
tag = args.shift
|
133
|
+
content = args.first.is_a?(Hash) ? nil : args.shift
|
134
|
+
|
135
|
+
options = {
|
136
|
+
:tag => tag.to_s
|
137
|
+
}.merge(args[0] || {})
|
138
|
+
|
139
|
+
options[:content] = content if content
|
140
|
+
|
141
|
+
begin
|
142
|
+
begin
|
143
|
+
assert_tag(options)
|
144
|
+
rescue NoMethodError
|
145
|
+
# We are not in a controller, so let's do the checking ourselves
|
146
|
+
doc = HTML::Document.new(response, false, false)
|
147
|
+
tag = doc.find(options)
|
148
|
+
assert tag, "expected tag, but no tag found matching #{options.inspect} in:\n#{response.inspect}"
|
149
|
+
end
|
150
|
+
# In Ruby 1.9, MiniTest::Assertion get's raised, so we'll
|
151
|
+
# handle raising a Test::Unit::AssertionFailedError
|
152
|
+
rescue MiniTest::Assertion => e
|
153
|
+
raise Test::Unit::AssertionFailedError, e.message
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'action_dispatch'
|
2
|
+
require 'capybara/rails'
|
3
|
+
require 'capybara/dsl'
|
4
|
+
|
5
|
+
module RSpec
|
6
|
+
module Rails
|
7
|
+
module IntegrationExampleGroup
|
8
|
+
extend ActiveSupport::Concern
|
9
|
+
|
10
|
+
include ActionDispatch::Integration::Runner
|
11
|
+
include RSpec::Rails::TestUnitAssertionAdapter
|
12
|
+
include ActionDispatch::Assertions
|
13
|
+
include Capybara
|
14
|
+
include RSpec::Matchers
|
15
|
+
|
16
|
+
module InstanceMethods
|
17
|
+
def app
|
18
|
+
::Rails.application
|
19
|
+
end
|
20
|
+
|
21
|
+
def last_response
|
22
|
+
page
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
included do
|
27
|
+
before do
|
28
|
+
@router = ::Rails.application.routes
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Rails template to build the sample app for specs
|
2
|
+
|
3
|
+
# Create a cucumber database and environment
|
4
|
+
copy_file File.expand_path('../templates/cucumber.rb', __FILE__), "config/environments/cucumber.rb"
|
5
|
+
gsub_file 'config/database.yml', /^test:.*\n/, "test: &test\n"
|
6
|
+
gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *test\n database: db/cucumber.sqlite3"
|
7
|
+
|
8
|
+
# Generate some test models
|
9
|
+
generate :model, "post title:string body:text published_at:datetime author_id:integer category_id:integer"
|
10
|
+
inject_into_file 'app/models/post.rb', " belongs_to :author, :class_name => 'User'\n belongs_to :category\n accepts_nested_attributes_for :author\n", :after => "class Post < ActiveRecord::Base\n"
|
11
|
+
generate :model, "user type:string first_name:string last_name:string username:string"
|
12
|
+
inject_into_file 'app/models/user.rb', " has_many :posts, :foreign_key => 'author_id'\n", :after => "class User < ActiveRecord::Base\n"
|
13
|
+
generate :model, "publisher --migration=false --parent=User"
|
14
|
+
generate :model, 'category name:string description:text'
|
15
|
+
inject_into_file 'app/models/category.rb', " has_many :posts\n", :after => "class Category < ActiveRecord::Base\n"
|
16
|
+
|
17
|
+
# Add our local Active Admin to the load path
|
18
|
+
inject_into_file "config/environment.rb", "\n$LOAD_PATH.unshift('#{File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))}')\nrequire \"active_admin\"\n", :after => "require File.expand_path('../application', __FILE__)"
|
19
|
+
|
20
|
+
run "rm Gemfile"
|
21
|
+
run "rm -r test"
|
22
|
+
run "rm -r spec"
|
23
|
+
|
24
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
25
|
+
generate :'active_admin:install'
|
26
|
+
|
27
|
+
# Setup a root path for devise
|
28
|
+
route "root :to => 'admin/dashboard#index'"
|
29
|
+
|
30
|
+
rake "db:migrate"
|
31
|
+
rake "db:test:prepare"
|
32
|
+
run "/usr/bin/env RAILS_ENV=cucumber rake db:migrate"
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# Use the default
|
2
|
+
apply File.expand_path("../rails_template.rb", __FILE__)
|
3
|
+
|
4
|
+
# Register Active Admin controllers
|
5
|
+
%w{ Post User Category }.each do |type|
|
6
|
+
generate :'active_admin:resource', type
|
7
|
+
end
|
8
|
+
|
9
|
+
# Setup some default data
|
10
|
+
append_file "db/seeds.rb", <<-EOF
|
11
|
+
users = ["Jimi Hendrix", "Jimmy Page", "Yngwie Malmsteen", "Eric Clapton", "Kirk Hammett"].collect do |name|
|
12
|
+
first, last = name.split(" ")
|
13
|
+
User.create! :first_name => first,
|
14
|
+
:last_name => last,
|
15
|
+
:username => [first,last].join('-').downcase
|
16
|
+
end
|
17
|
+
|
18
|
+
categories = ["Rock", "Pop Rock", "Alt-Country", "Blues", "Dub-Step"].collect do |name|
|
19
|
+
Category.create! :name => name
|
20
|
+
end
|
21
|
+
|
22
|
+
1_000.times do |i|
|
23
|
+
user = users[i % users.size]
|
24
|
+
cat = categories[i % categories.size]
|
25
|
+
Post.create :title => "Blog Post \#{i}",
|
26
|
+
:body => "Blog post \#{i} is written by \#{user.username} about \#{cat.name}",
|
27
|
+
:category => cat,
|
28
|
+
:author => user
|
29
|
+
end
|
30
|
+
EOF
|
31
|
+
|
32
|
+
rake 'db:seed'
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('config/environments/test', Rails.root)
|
2
|
+
|
3
|
+
# rails/railties/lib/rails/test_help.rb aborts if the environment is not 'test'. (Rails 3.0.0.beta3)
|
4
|
+
# We can't run Cucumber/RSpec/Test_Unit tests in different environments then.
|
5
|
+
#
|
6
|
+
# For now, I patch StringInquirer so that Rails.env.test? returns true when Rails.env is 'test' or 'cucumber'
|
7
|
+
#
|
8
|
+
# https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4458-rails-should-allow-test-to-run-in-cucumber-environment
|
9
|
+
module ActiveSupport
|
10
|
+
class StringInquirer < String
|
11
|
+
def method_missing(method_name, *arguments)
|
12
|
+
if method_name.to_s[-1,1] == "?"
|
13
|
+
test_string = method_name.to_s[0..-2]
|
14
|
+
if test_string == 'test'
|
15
|
+
self == 'test' or self == 'cucumber'
|
16
|
+
else
|
17
|
+
self == test_string
|
18
|
+
end
|
19
|
+
else
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'active_admin/abstract_view_factory'
|
4
|
+
|
5
|
+
describe ActiveAdmin::AbstractViewFactory do
|
6
|
+
|
7
|
+
let(:view_factory){ ActiveAdmin::AbstractViewFactory.new }
|
8
|
+
let(:mock_view){ Class.new }
|
9
|
+
|
10
|
+
describe "registering a new view key" do
|
11
|
+
before do
|
12
|
+
view_factory.register :my_new_view_class => mock_view
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should respond to :my_new_view_class" do
|
16
|
+
view_factory.respond_to?(:my_new_view_class)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should respond to :my_new_view_class=" do
|
20
|
+
view_factory.respond_to?(:my_new_view_class=)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should generate a getter method" do
|
24
|
+
view_factory.my_new_view_class.should == mock_view
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should be settable view a setter method" do
|
28
|
+
view_factory.my_new_view_class = "Some Obj"
|
29
|
+
view_factory.my_new_view_class.should == "Some Obj"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "array syntax access" do
|
34
|
+
before do
|
35
|
+
view_factory.register :my_new_view_class => mock_view
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should be available through array syntax" do
|
39
|
+
view_factory[:my_new_view_class].should == mock_view
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should be settable through array syntax" do
|
43
|
+
view_factory[:my_new_view_class] = "My New View Class"
|
44
|
+
view_factory[:my_new_view_class].should == "My New View Class"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "registering default views" do
|
49
|
+
before do
|
50
|
+
ActiveAdmin::AbstractViewFactory.register :my_default_view_class => mock_view
|
51
|
+
end
|
52
|
+
it "should generate a getter method" do
|
53
|
+
view_factory.my_default_view_class.should == mock_view
|
54
|
+
end
|
55
|
+
it "should be settable view a setter method and not change default" do
|
56
|
+
view_factory.my_default_view_class = "Some Obj"
|
57
|
+
view_factory.my_default_view_class.should == "Some Obj"
|
58
|
+
view_factory.default_for(:my_default_view_class).should == mock_view
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "subclassing the ViewFactory" do
|
63
|
+
let(:subclass) do
|
64
|
+
ActiveAdmin::AbstractViewFactory.register :my_subclassed_view => "From Parent"
|
65
|
+
Class.new(ActiveAdmin::AbstractViewFactory) do
|
66
|
+
def my_subclassed_view
|
67
|
+
"From Subclass"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should use the subclass implementation" do
|
73
|
+
factory = subclass.new
|
74
|
+
factory.my_subclassed_view.should == "From Subclass"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'defining new actions from registration blocks' do
|
4
|
+
|
5
|
+
let(:controller){ Admin::PostsController }
|
6
|
+
|
7
|
+
describe "generating a new member action" do
|
8
|
+
before do
|
9
|
+
action!
|
10
|
+
reload_routes!
|
11
|
+
end
|
12
|
+
|
13
|
+
after(:each) do
|
14
|
+
controller.clear_member_actions!
|
15
|
+
end
|
16
|
+
|
17
|
+
context "with a block" do
|
18
|
+
let(:action!) do
|
19
|
+
ActiveAdmin.register Post do
|
20
|
+
member_action :comment do
|
21
|
+
# Do nothing
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should create a new public instance method" do
|
27
|
+
controller.public_instance_methods.collect(&:to_s).should include("comment")
|
28
|
+
end
|
29
|
+
it "should add itself to the member actions config" do
|
30
|
+
controller.active_admin_config.member_actions.size.should == 1
|
31
|
+
end
|
32
|
+
it "should create a new named route" do
|
33
|
+
Rails.application.routes.url_helpers.methods.collect(&:to_s).should include("comment_admin_post_path")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "without a block" do
|
38
|
+
let(:action!) do
|
39
|
+
ActiveAdmin.register Post do
|
40
|
+
member_action :comment
|
41
|
+
end
|
42
|
+
end
|
43
|
+
it "should still generate a new empty action" do
|
44
|
+
controller.public_instance_methods.collect(&:to_s).should include("comment")
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "generate a new collection action" do
|
50
|
+
before do
|
51
|
+
action!
|
52
|
+
reload_routes!
|
53
|
+
end
|
54
|
+
after(:each) do
|
55
|
+
controller.clear_collection_actions!
|
56
|
+
end
|
57
|
+
|
58
|
+
context "with a block" do
|
59
|
+
let(:action!) do
|
60
|
+
ActiveAdmin.register Post do
|
61
|
+
collection_action :comments do
|
62
|
+
# Do nothing
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
it "should create a new public instance method" do
|
67
|
+
controller.public_instance_methods.collect(&:to_s).should include("comments")
|
68
|
+
end
|
69
|
+
it "should add itself to the member actions config" do
|
70
|
+
controller.active_admin_config.collection_actions.size.should == 1
|
71
|
+
end
|
72
|
+
it "should create a new named route" do
|
73
|
+
Rails.application.routes.url_helpers.methods.collect(&:to_s).should include("comments_admin_posts_path")
|
74
|
+
end
|
75
|
+
end
|
76
|
+
context "without a block" do
|
77
|
+
let(:action!) do
|
78
|
+
ActiveAdmin.register Post do
|
79
|
+
collection_action :comments
|
80
|
+
end
|
81
|
+
end
|
82
|
+
it "should still generate a new empty action" do
|
83
|
+
controller.public_instance_methods.collect(&:to_s).should include("comments")
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe ActiveAdmin::ActionItems do
|
4
|
+
|
5
|
+
describe "rendering" do
|
6
|
+
include Arbre::HTML
|
7
|
+
let(:assigns){ {} }
|
8
|
+
let(:action_item) do
|
9
|
+
ActiveAdmin::ActionItems::ActionItem.new do
|
10
|
+
h2 "Hello World"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
let(:rendered){ insert_tag ActiveAdmin::Views::ActionItems, [action_item]}
|
15
|
+
|
16
|
+
it "should have a parent .action_items div" do
|
17
|
+
rendered.tag_name.should == 'div'
|
18
|
+
rendered.class_list.should include('action_items')
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should render the contents of each action item" do
|
22
|
+
rendered.children.size.should == 1
|
23
|
+
rendered.content.strip.should == "<span class=\"action_item\">\n <h2>Hello World</h2>\n </span>"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|