activeadmin 0.1.1 → 0.2.0

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

Potentially problematic release.


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

Files changed (255) hide show
  1. data/CHANGELOG.rdoc +15 -1
  2. data/Gemfile +41 -11
  3. data/LICENSE +5 -0
  4. data/README.rdoc +202 -87
  5. data/Rakefile +51 -15
  6. data/activeadmin.gemspec +310 -131
  7. data/cucumber.yml +1 -0
  8. data/features/comments/commenting.feature +81 -0
  9. data/features/comments/viewing_index.feature +19 -0
  10. data/features/edit_page.feature +77 -0
  11. data/features/first_boot.feature +16 -0
  12. data/features/global_navigation.feature +30 -0
  13. data/features/index/formats.feature +10 -0
  14. data/features/index/index_as_block.feature +15 -0
  15. data/features/index/index_as_blog.feature +50 -0
  16. data/features/index/index_as_grid.feature +45 -0
  17. data/features/index/index_as_table.feature +79 -0
  18. data/features/index/index_scopes.feature +52 -0
  19. data/features/index/pagination.feature +23 -0
  20. data/features/new_page.feature +75 -0
  21. data/features/registering_assets.feature +35 -0
  22. data/features/registering_resources.feature +33 -0
  23. data/features/show/default_content.feature +43 -0
  24. data/features/show/page_title.feature +33 -0
  25. data/features/sidebar_sections.feature +128 -0
  26. data/features/specifying_actions.feature +16 -0
  27. data/features/step_definitions/action_item_steps.rb +7 -0
  28. data/features/step_definitions/additional_web_steps.rb +67 -0
  29. data/features/step_definitions/asset_steps.rb +7 -0
  30. data/features/step_definitions/attribute_steps.rb +15 -0
  31. data/features/step_definitions/comment_steps.rb +8 -0
  32. data/features/step_definitions/configuration_steps.rb +31 -0
  33. data/features/step_definitions/factory_steps.rb +28 -0
  34. data/features/step_definitions/flash_steps.rb +3 -0
  35. data/features/step_definitions/format_steps.rb +7 -0
  36. data/features/step_definitions/index_scope_steps.rb +20 -0
  37. data/features/step_definitions/pagination_steps.rb +8 -0
  38. data/features/step_definitions/sidebar_steps.rb +11 -0
  39. data/features/step_definitions/tab_steps.rb +3 -0
  40. data/features/step_definitions/user_steps.rb +20 -0
  41. data/features/step_definitions/web_steps.rb +219 -0
  42. data/features/support/env.rb +88 -0
  43. data/features/support/paths.rb +48 -0
  44. data/features/users/logging_in.feature +34 -0
  45. data/features/users/logging_out.feature +13 -0
  46. data/lib/active_admin.rb +155 -79
  47. data/lib/active_admin/abstract_view_factory.rb +95 -0
  48. data/lib/active_admin/action_items.rb +4 -15
  49. data/lib/active_admin/arbre.rb +23 -0
  50. data/lib/active_admin/arbre/attributes.rb +20 -0
  51. data/lib/active_admin/arbre/class_list.rb +28 -0
  52. data/lib/active_admin/arbre/collection.rb +27 -0
  53. data/lib/active_admin/arbre/context.rb +8 -0
  54. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  55. data/lib/active_admin/arbre/document.rb +42 -0
  56. data/lib/active_admin/arbre/element.rb +151 -0
  57. data/lib/active_admin/arbre/html.rb +84 -0
  58. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  59. data/lib/active_admin/arbre/tag.rb +129 -0
  60. data/lib/active_admin/arbre/text_node.rb +35 -0
  61. data/lib/active_admin/callbacks.rb +87 -0
  62. data/lib/active_admin/comments.rb +73 -0
  63. data/lib/active_admin/comments/comment.rb +15 -0
  64. data/lib/active_admin/comments/configuration.rb +16 -0
  65. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  66. data/lib/active_admin/comments/resource_helper.rb +17 -0
  67. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  68. data/lib/active_admin/comments/views.rb +3 -0
  69. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  70. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  71. data/lib/active_admin/component.rb +22 -0
  72. data/lib/active_admin/controller_action.rb +12 -0
  73. data/lib/active_admin/dashboards.rb +0 -2
  74. data/lib/active_admin/dashboards/dashboard_controller.rb +10 -5
  75. data/lib/active_admin/dashboards/section.rb +5 -14
  76. data/lib/active_admin/devise.rb +43 -0
  77. data/lib/active_admin/dsl.rb +202 -0
  78. data/lib/active_admin/event.rb +31 -0
  79. data/lib/active_admin/form_builder.rb +68 -50
  80. data/lib/active_admin/iconic.rb +51 -0
  81. data/lib/active_admin/iconic/icons.rb +142 -0
  82. data/lib/active_admin/namespace.rb +102 -16
  83. data/lib/active_admin/renderer.rb +18 -3
  84. data/lib/active_admin/resource.rb +110 -9
  85. data/lib/active_admin/resource/belongs_to.rb +31 -0
  86. data/lib/active_admin/resource_controller.rb +45 -260
  87. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  88. data/lib/active_admin/resource_controller/actions.rb +53 -0
  89. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  90. data/lib/active_admin/resource_controller/collection.rb +142 -0
  91. data/lib/active_admin/resource_controller/filters.rb +58 -0
  92. data/lib/active_admin/resource_controller/form.rb +42 -0
  93. data/lib/active_admin/resource_controller/menu.rb +29 -0
  94. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  95. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  96. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  97. data/lib/active_admin/scope.rb +17 -0
  98. data/lib/active_admin/sidebar.rb +8 -47
  99. data/lib/active_admin/stylesheets/active_admin.scss +418 -0
  100. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  101. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  102. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  103. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  104. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  105. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  106. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  107. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  108. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  109. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  110. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  111. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  112. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  113. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  114. data/lib/active_admin/version.rb +1 -1
  115. data/lib/active_admin/view_factory.rb +21 -0
  116. data/lib/active_admin/view_helpers.rb +17 -100
  117. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  118. data/lib/active_admin/view_helpers/auto_link_helper.rb +41 -0
  119. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  120. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  121. data/lib/active_admin/view_helpers/filter_form_helper.rb +174 -0
  122. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  123. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  124. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  125. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  126. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  127. data/lib/active_admin/view_helpers/status_tag_helper.rb +13 -0
  128. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  129. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  130. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  131. data/lib/active_admin/views.rb +8 -0
  132. data/lib/active_admin/views/action_items.rb +17 -0
  133. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  134. data/lib/active_admin/views/components/columns.rb +49 -0
  135. data/lib/active_admin/views/components/paginated_collection.rb +74 -0
  136. data/lib/active_admin/views/components/panel.rb +26 -0
  137. data/lib/active_admin/views/components/scopes.rb +64 -0
  138. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  139. data/lib/active_admin/views/components/table_for.rb +174 -0
  140. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  141. data/lib/active_admin/views/header_renderer.rb +37 -0
  142. data/lib/active_admin/views/index_as_block.rb +24 -0
  143. data/lib/active_admin/views/index_as_blog.rb +89 -0
  144. data/lib/active_admin/views/index_as_grid.rb +49 -0
  145. data/lib/active_admin/views/index_as_table.rb +73 -0
  146. data/lib/active_admin/views/pages/base.rb +138 -0
  147. data/lib/active_admin/views/pages/dashboard.rb +61 -0
  148. data/lib/active_admin/views/pages/edit.rb +27 -0
  149. data/lib/active_admin/views/pages/index.rb +64 -0
  150. data/lib/active_admin/views/pages/new.rb +27 -0
  151. data/lib/active_admin/views/pages/show.rb +56 -0
  152. data/lib/active_admin/views/tabs_renderer.rb +52 -0
  153. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  154. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  155. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  156. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  157. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  158. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  159. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  160. data/lib/active_admin/views/templates/active_admin_dashboard/index.html.arb +1 -0
  161. data/lib/active_admin/views/templates/active_admin_default/edit.html.arb +1 -0
  162. data/lib/active_admin/views/{active_admin_default → templates/active_admin_default}/index.csv.erb +0 -0
  163. data/lib/active_admin/views/templates/active_admin_default/index.html.arb +1 -0
  164. data/lib/active_admin/views/templates/active_admin_default/new.html.arb +1 -0
  165. data/lib/active_admin/views/templates/active_admin_default/show.html.arb +1 -0
  166. data/lib/active_admin/views/{layouts → templates/layouts}/active_admin.html.erb +3 -4
  167. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  168. data/lib/generators/active_admin/devise/devise_generator.rb +45 -0
  169. data/lib/generators/active_admin/install/install_generator.rb +18 -3
  170. data/lib/generators/active_admin/install/templates/active_admin.js +41 -0
  171. data/lib/generators/active_admin/install/templates/{active_admin.rb → active_admin.rb.erb} +33 -3
  172. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +1 -1
  173. data/lib/generators/active_admin/install/templates/dashboards.rb +3 -4
  174. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  175. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  176. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  177. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  178. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  179. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  180. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  181. data/spec/integration/belongs_to_spec.rb +42 -0
  182. data/spec/integration/index_as_table_spec.rb +0 -119
  183. data/spec/integration/layout_spec.rb +3 -37
  184. data/spec/spec_helper.rb +89 -50
  185. data/spec/support/integration_example_group.rb +37 -0
  186. data/spec/support/rails_template.rb +21 -9
  187. data/spec/support/rails_template_with_data.rb +32 -0
  188. data/spec/support/templates/cucumber.rb +28 -0
  189. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  190. data/spec/unit/action_builder_spec.rb +19 -7
  191. data/spec/unit/action_items_spec.rb +16 -30
  192. data/spec/unit/active_admin_spec.rb +10 -22
  193. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  194. data/spec/unit/arbre/html/element_spec.rb +224 -0
  195. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  196. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  197. data/spec/unit/arbre/html_spec.rb +185 -0
  198. data/spec/unit/auto_link_spec.rb +38 -0
  199. data/spec/unit/belongs_to_spec.rb +44 -0
  200. data/spec/unit/breadcrumbs_spec.rb +110 -0
  201. data/spec/unit/comments_spec.rb +53 -0
  202. data/spec/unit/component_spec.rb +18 -0
  203. data/spec/unit/components/attributes_table_spec.rb +100 -0
  204. data/spec/unit/components/columns_spec.rb +75 -0
  205. data/spec/unit/components/panel_spec.rb +31 -0
  206. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  207. data/spec/unit/components/table_for_spec.rb +130 -0
  208. data/spec/unit/dashboard_controller_spec.rb +26 -0
  209. data/spec/unit/dashboard_section_spec.rb +10 -17
  210. data/spec/unit/display_name_spec.rb +29 -0
  211. data/spec/unit/event_spec.rb +41 -0
  212. data/spec/unit/filter_form_builder_spec.rb +99 -77
  213. data/spec/unit/form_builder_spec.rb +69 -69
  214. data/spec/unit/namespace_spec.rb +61 -3
  215. data/spec/unit/pretty_format_spec.rb +35 -0
  216. data/spec/unit/registration_spec.rb +40 -1
  217. data/spec/unit/renderer_spec.rb +8 -0
  218. data/spec/unit/resource_controller_spec.rb +105 -6
  219. data/spec/unit/resource_spec.rb +78 -11
  220. data/spec/unit/routing_spec.rb +82 -6
  221. data/spec/unit/scope_spec.rb +31 -0
  222. data/spec/unit/tabs_renderer_spec.rb +24 -2
  223. data/spec/unit/view_factory_spec.rb +16 -0
  224. metadata +268 -82
  225. data/.gitignore +0 -25
  226. data/active_admin.gemspec +0 -22
  227. data/lib/active_admin/action_builder.rb +0 -60
  228. data/lib/active_admin/breadcrumbs.rb +0 -26
  229. data/lib/active_admin/dashboards/renderer.rb +0 -45
  230. data/lib/active_admin/dashboards/section_renderer.rb +0 -28
  231. data/lib/active_admin/filters.rb +0 -189
  232. data/lib/active_admin/pages.rb +0 -11
  233. data/lib/active_admin/pages/base.rb +0 -92
  234. data/lib/active_admin/pages/edit.rb +0 -21
  235. data/lib/active_admin/pages/index.rb +0 -58
  236. data/lib/active_admin/pages/index/blog.rb +0 -65
  237. data/lib/active_admin/pages/index/table.rb +0 -48
  238. data/lib/active_admin/pages/index/thumbnails.rb +0 -40
  239. data/lib/active_admin/pages/new.rb +0 -21
  240. data/lib/active_admin/pages/show.rb +0 -54
  241. data/lib/active_admin/table_builder.rb +0 -162
  242. data/lib/active_admin/tabs_renderer.rb +0 -39
  243. data/lib/active_admin/views/active_admin_dashboard/index.html.erb +0 -1
  244. data/lib/active_admin/views/active_admin_default/edit.html.erb +0 -1
  245. data/lib/active_admin/views/active_admin_default/index.html.erb +0 -1
  246. data/lib/active_admin/views/active_admin_default/new.html.erb +0 -1
  247. data/lib/active_admin/views/active_admin_default/show.html.erb +0 -1
  248. data/lib/generators/active_admin/install/templates/active_admin.css +0 -325
  249. data/lib/generators/active_admin/install/templates/images/orderable.gif +0 -0
  250. data/spec/integration/index_as_blog_spec.rb +0 -65
  251. data/spec/integration/index_as_thumbnails_spec.rb +0 -43
  252. data/spec/integration/new_view_spec.rb +0 -52
  253. data/spec/integration/show_view_spec.rb +0 -91
  254. data/spec/unit/sidebar_spec.rb +0 -96
  255. data/spec/unit/table_builder_spec.rb +0 -162
@@ -1,21 +1,34 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH << File.expand_path('../support', __FILE__)
3
+
2
4
  ENV['BUNDLE_GEMFILE'] = File.expand_path('../../Gemfile', __FILE__)
3
5
 
4
6
  require 'rubygems'
5
7
  require "bundler"
6
8
  Bundler.setup
7
9
 
10
+ require 'shoulda/active_record'
11
+ include Shoulda::ActiveRecord::Macros
12
+
8
13
  # Setup autoloading of ActiveAdmin and the load path
9
14
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
10
15
  autoload :ActiveAdmin, 'active_admin'
11
16
 
12
- module ActiveAdminIntegrationSpecHelper
13
17
 
18
+ module ActiveAdminIntegrationSpecHelper
14
19
  extend self
15
20
 
16
21
  def load_defaults!
17
- ActiveAdmin.register Post
18
- ActiveAdmin.register Category
22
+ ActiveAdmin.unload!
23
+ ActiveAdmin.load!
24
+ ActiveAdmin.register(Category)
25
+ ActiveAdmin.register(User)
26
+ ActiveAdmin.register(Post){ belongs_to :user, :optional => true }
27
+ reload_menus!
28
+ end
29
+
30
+ def reload_menus!
31
+ ActiveAdmin.namespaces.values.each{|n| n.load_menu! }
19
32
  end
20
33
 
21
34
  # Sometimes we need to reload the routes within
@@ -24,6 +37,21 @@ module ActiveAdminIntegrationSpecHelper
24
37
  Rails.application.reload_routes!
25
38
  end
26
39
 
40
+ # Helper method to load resources and ensure that Active Admin is
41
+ # setup with the new configurations.
42
+ #
43
+ # Eg:
44
+ # load_resources do
45
+ # ActiveAdmin.regiser(Post)
46
+ # end
47
+ #
48
+ def load_resources
49
+ ActiveAdmin.unload!
50
+ yield
51
+ reload_menus!
52
+ reload_routes!
53
+ end
54
+
27
55
  # Sets up a describe block where you can render controller
28
56
  # actions. Uses the Admin::PostsController as the subject
29
57
  # for the describe block
@@ -31,7 +59,17 @@ module ActiveAdminIntegrationSpecHelper
31
59
  describe *args do
32
60
  include RSpec::Rails::ControllerExampleGroup
33
61
  render_views
34
- metadata[:behaviour][:describes] = Admin::PostsController
62
+ metadata[:behaviour][:describes] = ActiveAdmin.namespaces[:admin].resources['Post'].controller
63
+ module_eval &block
64
+ end
65
+ end
66
+
67
+ # Setup a describe block which uses capybara and rails integration
68
+ # test methods.
69
+ def describe_with_capybara(*args, &block)
70
+ require 'integration_example_group'
71
+ describe *args do
72
+ include RSpec::Rails::IntegrationExampleGroup
35
73
  module_eval &block
36
74
  end
37
75
  end
@@ -41,6 +79,7 @@ module ActiveAdminIntegrationSpecHelper
41
79
  controller = ActionView::TestCase::TestController.new
42
80
  ActionView::Base.send :include, ActionView::Helpers
43
81
  ActionView::Base.send :include, ActiveAdmin::ViewHelpers
82
+ ActionView::Base.send :include, Rails.application.routes.url_helpers
44
83
  ActionView::Base.new(ActionController::Base.view_paths, assigns, controller)
45
84
  end
46
85
  alias_method :action_view, :mock_action_view
@@ -50,63 +89,63 @@ end
50
89
  ENV['RAILS'] ||= '3.0.0'
51
90
  ENV['RAILS_ENV'] = 'test'
52
91
 
53
- if ENV['RAILS'] == '3.0.0'
54
- ENV['RAILS_ROOT'] = File.expand_path('../rails/rails-3.0.0', __FILE__)
92
+ ENV['RAILS_ROOT'] = File.expand_path("../rails/rails-#{ENV["RAILS"]}", __FILE__)
55
93
 
56
- # Create the test app if it doesn't exists
57
- unless File.exists?(ENV['RAILS_ROOT'])
58
- system 'rake setup'
59
- end
94
+ # Create the test app if it doesn't exists
95
+ unless File.exists?(ENV['RAILS_ROOT'])
96
+ system 'rake setup'
97
+ end
60
98
 
61
- require ENV['RAILS_ROOT'] + '/config/environment'
62
- require 'rspec/rails'
99
+ require ENV['RAILS_ROOT'] + '/config/environment'
100
+ require 'rspec/rails'
63
101
 
64
- # Setup Some Admin stuff for us to play with
65
- include ActiveAdminIntegrationSpecHelper
66
- load_defaults!
67
- reload_routes!
102
+ # Setup Some Admin stuff for us to play with
103
+ include ActiveAdminIntegrationSpecHelper
104
+ load_defaults!
105
+ reload_routes!
68
106
 
69
- # Don't add asset cache timestamps. Makes it easy to integration
70
- # test for the presence of an asset file
71
- ENV["RAILS_ASSET_ID"] = ''
107
+ # Disabling authentication in specs so that we don't have to worry about
108
+ # it allover the place
109
+ ActiveAdmin.authentication_method = false
110
+ ActiveAdmin.current_user_method = false
72
111
 
73
- Rspec.configure do |config|
74
- config.use_transactional_fixtures = true
75
- config.use_instantiated_fixtures = false
76
- end
112
+ # Don't add asset cache timestamps. Makes it easy to integration
113
+ # test for the presence of an asset file
114
+ ENV["RAILS_ASSET_ID"] = ''
77
115
 
78
- # Ensure this is defined for Ruby 1.8
79
- module MiniTest; class Assertion < Exception; end; end
116
+ Rspec.configure do |config|
117
+ config.use_transactional_fixtures = true
118
+ config.use_instantiated_fixtures = false
119
+ end
120
+
121
+ # Ensure this is defined for Ruby 1.8
122
+ module MiniTest; class Assertion < Exception; end; end
80
123
 
81
- Rspec::Matchers.define :have_tag do |*args|
124
+ Rspec::Matchers.define :have_tag do |*args|
82
125
 
83
- match_unless_raises Test::Unit::AssertionFailedError do |response|
84
- tag = args.shift
85
- content = args.first.is_a?(Hash) ? nil : args.shift
86
-
87
- options = {
88
- :tag => tag
89
- }.merge(args[0] || {})
90
-
91
- options[:content] = content if content
126
+ match_unless_raises Test::Unit::AssertionFailedError do |response|
127
+ tag = args.shift
128
+ content = args.first.is_a?(Hash) ? nil : args.shift
129
+
130
+ options = {
131
+ :tag => tag.to_s
132
+ }.merge(args[0] || {})
133
+
134
+ options[:content] = content if content
92
135
 
136
+ begin
93
137
  begin
94
- begin
95
- assert_tag(options)
96
- rescue NoMethodError
97
- # We are not in a controller, so let's do the checking ourselves
98
- doc = HTML::Document.new(response, false, false)
99
- tag = doc.find(options)
100
- assert tag, "expected tag, but no tag found matching #{options.inspect} in:\n#{response.inspect}"
101
- end
102
- # In Ruby 1.9, MiniTest::Assertion get's raised, so we'll
103
- # handle raising a Test::Unit::AssertionFailedError
104
- rescue MiniTest::Assertion => e
105
- raise Test::Unit::AssertionFailedError, e.message
138
+ assert_tag(options)
139
+ rescue NoMethodError
140
+ # We are not in a controller, so let's do the checking ourselves
141
+ doc = HTML::Document.new(response, false, false)
142
+ tag = doc.find(options)
143
+ assert tag, "expected tag, but no tag found matching #{options.inspect} in:\n#{response.inspect}"
106
144
  end
145
+ # In Ruby 1.9, MiniTest::Assertion get's raised, so we'll
146
+ # handle raising a Test::Unit::AssertionFailedError
147
+ rescue MiniTest::Assertion => e
148
+ raise Test::Unit::AssertionFailedError, e.message
107
149
  end
108
150
  end
109
-
110
151
  end
111
-
112
-
@@ -0,0 +1,37 @@
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
+
32
+ RSpec.configure do |c|
33
+ c.include self, :example_group => { :file_path => /\bspec\/integration\// }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,19 +1,31 @@
1
1
  # Rails template to build the sample app for specs
2
- generate :model, "post title:string body:text published_at:datetime author_id:integer"
3
- inject_into_file 'app/models/post.rb', " belongs_to :author, :class_name => 'User'\n accepts_nested_attributes_for :author\n", :after => "class Post < ActiveRecord::Base\n"
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"
4
11
  generate :model, "user first_name:string last_name:string username:string"
5
12
  inject_into_file 'app/models/user.rb', " has_many :posts, :foreign_key => 'author_id'\n", :after => "class User < ActiveRecord::Base\n"
6
- generate :model, 'category name:string'
13
+ generate :model, 'category name:string description:text'
14
+ inject_into_file 'app/models/category.rb', " has_many :posts\n", :after => "class Category < ActiveRecord::Base\n"
15
+
16
+ # Add our local Active Admin to the load path
17
+ 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__)"
7
18
 
8
19
  run "rm Gemfile"
9
20
  run "rm -r test"
10
21
  run "rm -r spec"
11
22
 
12
- rake "db:migrate"
13
- rake "db:test:prepare"
14
-
15
- # Install ActiveAdmin
16
- # This should happen last so that we don't have to worry about the
17
- # rake's blowing up due to not having active admin in their load paths
18
23
  $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
19
24
  generate :'active_admin:install'
25
+
26
+ # Setup a root path for devise
27
+ route "root :to => 'admin/dashboard#index'"
28
+
29
+ rake "db:migrate"
30
+ rake "db:test:prepare"
31
+ 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,28 @@
1
+ require File.expand_path('config/environments/test', Rails.root)
2
+
3
+ Rails.application.class.configure do
4
+ config.cache_classes = false
5
+ end
6
+
7
+ # rails/railties/lib/rails/test_help.rb aborts if the environment is not 'test'. (Rails 3.0.0.beta3)
8
+ # We can't run Cucumber/RSpec/Test_Unit tests in different environments then.
9
+ #
10
+ # For now, I patch StringInquirer so that Rails.env.test? returns true when Rails.env is 'test' or 'cucumber'
11
+ #
12
+ # https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4458-rails-should-allow-test-to-run-in-cucumber-environment
13
+ module ActiveSupport
14
+ class StringInquirer < String
15
+ def method_missing(method_name, *arguments)
16
+ if method_name.to_s[-1,1] == "?"
17
+ test_string = method_name.to_s[0..-2]
18
+ if test_string == 'test'
19
+ self == 'test' or self == 'cucumber'
20
+ else
21
+ self == test_string
22
+ end
23
+ else
24
+ super
25
+ end
26
+ end
27
+ end
28
+ 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
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- describe ActiveAdmin::ActionBuilder do
3
+ describe 'defining new actions from registration blocks' do
4
4
 
5
5
  let(:controller){ Admin::PostsController }
6
6
 
@@ -16,8 +16,10 @@ describe ActiveAdmin::ActionBuilder do
16
16
 
17
17
  context "with a block" do
18
18
  let(:action!) do
19
- controller.member_action :comment do
20
- # Do nothing
19
+ ActiveAdmin.register Post do
20
+ member_action :comment do
21
+ # Do nothing
22
+ end
21
23
  end
22
24
  end
23
25
 
@@ -33,7 +35,11 @@ describe ActiveAdmin::ActionBuilder do
33
35
  end
34
36
 
35
37
  context "without a block" do
36
- let(:action!){ controller.member_action :comment }
38
+ let(:action!) do
39
+ ActiveAdmin.register Post do
40
+ member_action :comment
41
+ end
42
+ end
37
43
  it "should still generate a new empty action" do
38
44
  controller.public_instance_methods.collect(&:to_s).should include("comment")
39
45
  end
@@ -51,8 +57,10 @@ describe ActiveAdmin::ActionBuilder do
51
57
 
52
58
  context "with a block" do
53
59
  let(:action!) do
54
- controller.collection_action :comments do
55
- # Do nothing
60
+ ActiveAdmin.register Post do
61
+ collection_action :comments do
62
+ # Do nothing
63
+ end
56
64
  end
57
65
  end
58
66
  it "should create a new public instance method" do
@@ -66,7 +74,11 @@ describe ActiveAdmin::ActionBuilder do
66
74
  end
67
75
  end
68
76
  context "without a block" do
69
- let(:action!){ controller.collection_action :comments }
77
+ let(:action!) do
78
+ ActiveAdmin.register Post do
79
+ collection_action :comments
80
+ end
81
+ end
70
82
  it "should still generate a new empty action" do
71
83
  controller.public_instance_methods.collect(&:to_s).should include("comments")
72
84
  end