saulolso-activeadmin 0.2.2

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.
Files changed (255) hide show
  1. data/.document +5 -0
  2. data/.gitignore +32 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +76 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +25 -0
  7. data/README.rdoc +450 -0
  8. data/Rakefile +100 -0
  9. data/activeadmin.gemspec +28 -0
  10. data/cucumber.yml +2 -0
  11. data/features/comments/commenting.feature +99 -0
  12. data/features/comments/viewing_index.feature +19 -0
  13. data/features/dashboard.feature +26 -0
  14. data/features/edit_page.feature +77 -0
  15. data/features/first_boot.feature +16 -0
  16. data/features/global_navigation.feature +30 -0
  17. data/features/index/format_as_csv.feature +45 -0
  18. data/features/index/formats.feature +10 -0
  19. data/features/index/index_as_block.feature +15 -0
  20. data/features/index/index_as_blog.feature +50 -0
  21. data/features/index/index_as_grid.feature +45 -0
  22. data/features/index/index_as_table.feature +79 -0
  23. data/features/index/index_scopes.feature +52 -0
  24. data/features/index/pagination.feature +23 -0
  25. data/features/menu.feature +26 -0
  26. data/features/new_page.feature +75 -0
  27. data/features/registering_assets.feature +35 -0
  28. data/features/registering_resources.feature +33 -0
  29. data/features/show/default_content.feature +43 -0
  30. data/features/show/page_title.feature +33 -0
  31. data/features/sidebar_sections.feature +127 -0
  32. data/features/specifying_actions.feature +60 -0
  33. data/features/step_definitions/action_item_steps.rb +7 -0
  34. data/features/step_definitions/additional_web_steps.rb +67 -0
  35. data/features/step_definitions/asset_steps.rb +7 -0
  36. data/features/step_definitions/attribute_steps.rb +15 -0
  37. data/features/step_definitions/comment_steps.rb +8 -0
  38. data/features/step_definitions/configuration_steps.rb +31 -0
  39. data/features/step_definitions/dashboard_steps.rb +11 -0
  40. data/features/step_definitions/factory_steps.rb +28 -0
  41. data/features/step_definitions/flash_steps.rb +3 -0
  42. data/features/step_definitions/format_steps.rb +34 -0
  43. data/features/step_definitions/index_scope_steps.rb +20 -0
  44. data/features/step_definitions/menu_steps.rb +7 -0
  45. data/features/step_definitions/pagination_steps.rb +8 -0
  46. data/features/step_definitions/sidebar_steps.rb +11 -0
  47. data/features/step_definitions/tab_steps.rb +3 -0
  48. data/features/step_definitions/user_steps.rb +20 -0
  49. data/features/step_definitions/web_steps.rb +219 -0
  50. data/features/sti_resource.feature +49 -0
  51. data/features/support/env.rb +92 -0
  52. data/features/support/paths.rb +48 -0
  53. data/features/users/logging_in.feature +34 -0
  54. data/features/users/logging_out.feature +13 -0
  55. data/lib/active_admin/abstract_view_factory.rb +95 -0
  56. data/lib/active_admin/action_items.rb +37 -0
  57. data/lib/active_admin/application.rb +204 -0
  58. data/lib/active_admin/arbre/attributes.rb +20 -0
  59. data/lib/active_admin/arbre/class_list.rb +28 -0
  60. data/lib/active_admin/arbre/collection.rb +27 -0
  61. data/lib/active_admin/arbre/context.rb +8 -0
  62. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  63. data/lib/active_admin/arbre/document.rb +42 -0
  64. data/lib/active_admin/arbre/element.rb +151 -0
  65. data/lib/active_admin/arbre/html.rb +84 -0
  66. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  67. data/lib/active_admin/arbre/tag.rb +137 -0
  68. data/lib/active_admin/arbre/text_node.rb +35 -0
  69. data/lib/active_admin/arbre.rb +23 -0
  70. data/lib/active_admin/asset_registration.rb +34 -0
  71. data/lib/active_admin/callbacks.rb +87 -0
  72. data/lib/active_admin/comments/comment.rb +21 -0
  73. data/lib/active_admin/comments/configuration.rb +18 -0
  74. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  75. data/lib/active_admin/comments/resource_helper.rb +17 -0
  76. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  77. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  78. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  79. data/lib/active_admin/comments/views.rb +3 -0
  80. data/lib/active_admin/comments.rb +88 -0
  81. data/lib/active_admin/component.rb +22 -0
  82. data/lib/active_admin/controller_action.rb +12 -0
  83. data/lib/active_admin/csv_builder.rb +45 -0
  84. data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
  85. data/lib/active_admin/dashboards/section.rb +34 -0
  86. data/lib/active_admin/dashboards.rb +48 -0
  87. data/lib/active_admin/devise.rb +43 -0
  88. data/lib/active_admin/dsl.rb +215 -0
  89. data/lib/active_admin/event.rb +31 -0
  90. data/lib/active_admin/form_builder.rb +109 -0
  91. data/lib/active_admin/helpers/optional_display.rb +34 -0
  92. data/lib/active_admin/iconic/icons.rb +142 -0
  93. data/lib/active_admin/iconic.rb +51 -0
  94. data/lib/active_admin/locales/da.yml +26 -0
  95. data/lib/active_admin/locales/en.yml +34 -0
  96. data/lib/active_admin/locales/es.yml +34 -0
  97. data/lib/active_admin/locales/pt.yml +34 -0
  98. data/lib/active_admin/menu.rb +42 -0
  99. data/lib/active_admin/menu_item.rb +73 -0
  100. data/lib/active_admin/namespace.rb +198 -0
  101. data/lib/active_admin/page_config.rb +15 -0
  102. data/lib/active_admin/renderer.rb +87 -0
  103. data/lib/active_admin/resource/belongs_to.rb +31 -0
  104. data/lib/active_admin/resource.rb +229 -0
  105. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  106. data/lib/active_admin/resource_controller/actions.rb +79 -0
  107. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  108. data/lib/active_admin/resource_controller/collection.rb +144 -0
  109. data/lib/active_admin/resource_controller/filters.rb +58 -0
  110. data/lib/active_admin/resource_controller/form.rb +42 -0
  111. data/lib/active_admin/resource_controller/menu.rb +29 -0
  112. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  113. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  114. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  115. data/lib/active_admin/resource_controller.rb +119 -0
  116. data/lib/active_admin/router.rb +85 -0
  117. data/lib/active_admin/scope.rb +17 -0
  118. data/lib/active_admin/sidebar.rb +43 -0
  119. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  120. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  121. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  122. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  123. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  124. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  125. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  126. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  127. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  128. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  129. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  130. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  131. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  132. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  133. data/lib/active_admin/stylesheets/active_admin.scss +429 -0
  134. data/lib/active_admin/version.rb +3 -0
  135. data/lib/active_admin/view_factory.rb +21 -0
  136. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  137. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  138. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  139. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  140. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  141. data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
  142. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  143. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  144. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  145. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  146. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  147. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  148. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  149. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  150. data/lib/active_admin/view_helpers.rb +23 -0
  151. data/lib/active_admin/views/action_items.rb +17 -0
  152. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  153. data/lib/active_admin/views/components/columns.rb +47 -0
  154. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  155. data/lib/active_admin/views/components/panel.rb +26 -0
  156. data/lib/active_admin/views/components/scopes.rb +70 -0
  157. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  158. data/lib/active_admin/views/components/status_tag.rb +55 -0
  159. data/lib/active_admin/views/components/table_for.rb +193 -0
  160. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  161. data/lib/active_admin/views/header_renderer.rb +37 -0
  162. data/lib/active_admin/views/index_as_block.rb +24 -0
  163. data/lib/active_admin/views/index_as_blog.rb +89 -0
  164. data/lib/active_admin/views/index_as_grid.rb +49 -0
  165. data/lib/active_admin/views/index_as_table.rb +75 -0
  166. data/lib/active_admin/views/pages/base.rb +144 -0
  167. data/lib/active_admin/views/pages/dashboard.rb +59 -0
  168. data/lib/active_admin/views/pages/edit.rb +27 -0
  169. data/lib/active_admin/views/pages/index.rb +66 -0
  170. data/lib/active_admin/views/pages/new.rb +27 -0
  171. data/lib/active_admin/views/pages/show.rb +56 -0
  172. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  173. data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
  174. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  175. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  176. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  177. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  178. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  179. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  180. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  181. data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
  182. data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
  183. data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
  184. data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
  185. data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
  186. data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
  187. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  188. data/lib/active_admin/views.rb +8 -0
  189. data/lib/active_admin.rb +71 -0
  190. data/lib/activeadmin.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  193. data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
  194. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
  195. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
  196. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  197. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  198. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  199. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  200. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  201. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  202. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  203. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  204. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  205. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  206. data/spec/integration/belongs_to_spec.rb +42 -0
  207. data/spec/spec_helper.rb +156 -0
  208. data/spec/support/integration_example_group.rb +33 -0
  209. data/spec/support/rails_template.rb +32 -0
  210. data/spec/support/rails_template_with_data.rb +32 -0
  211. data/spec/support/templates/cucumber.rb +24 -0
  212. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  213. data/spec/unit/action_builder_spec.rb +88 -0
  214. data/spec/unit/action_items_spec.rb +27 -0
  215. data/spec/unit/application_spec.rb +67 -0
  216. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  217. data/spec/unit/arbre/html/element_spec.rb +224 -0
  218. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  219. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  220. data/spec/unit/arbre/html_spec.rb +210 -0
  221. data/spec/unit/asset_registration_spec.rb +37 -0
  222. data/spec/unit/auto_link_spec.rb +39 -0
  223. data/spec/unit/belongs_to_spec.rb +45 -0
  224. data/spec/unit/breadcrumbs_spec.rb +110 -0
  225. data/spec/unit/comments_spec.rb +57 -0
  226. data/spec/unit/component_spec.rb +18 -0
  227. data/spec/unit/components/attributes_table_spec.rb +100 -0
  228. data/spec/unit/components/columns_spec.rb +75 -0
  229. data/spec/unit/components/panel_spec.rb +31 -0
  230. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  231. data/spec/unit/components/status_tag_spec.rb +81 -0
  232. data/spec/unit/components/table_for_spec.rb +130 -0
  233. data/spec/unit/controller_filters_spec.rb +27 -0
  234. data/spec/unit/csv_builder_spec.rb +83 -0
  235. data/spec/unit/dashboard_controller_spec.rb +26 -0
  236. data/spec/unit/dashboard_section_spec.rb +56 -0
  237. data/spec/unit/dashboards_spec.rb +59 -0
  238. data/spec/unit/display_name_spec.rb +29 -0
  239. data/spec/unit/event_spec.rb +41 -0
  240. data/spec/unit/filter_form_builder_spec.rb +179 -0
  241. data/spec/unit/form_builder_spec.rb +238 -0
  242. data/spec/unit/menu_item_spec.rb +143 -0
  243. data/spec/unit/menu_spec.rb +53 -0
  244. data/spec/unit/namespace_spec.rb +203 -0
  245. data/spec/unit/pretty_format_spec.rb +35 -0
  246. data/spec/unit/registration_spec.rb +76 -0
  247. data/spec/unit/renderer_spec.rb +108 -0
  248. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  249. data/spec/unit/resource_controller_spec.rb +147 -0
  250. data/spec/unit/resource_spec.rb +290 -0
  251. data/spec/unit/routing_spec.rb +88 -0
  252. data/spec/unit/scope_spec.rb +31 -0
  253. data/spec/unit/tabs_renderer_spec.rb +85 -0
  254. data/spec/unit/view_factory_spec.rb +16 -0
  255. 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
@@ -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
@@ -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,3 @@
1
+ ActiveAdmin.register <%= class_name.singularize %> do
2
+
3
+ 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
@@ -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