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
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'active_admin/event'
3
+
4
+ describe ActiveAdmin::EventDispatcher do
5
+
6
+ let(:test_event){ 'active_admin.test_event' }
7
+ let(:dispatcher){ ActiveAdmin::EventDispatcher.new }
8
+
9
+ it "should add a subscriber for an event" do
10
+ dispatcher.subscribers(test_event).size.should == 0
11
+ dispatcher.subscribe(test_event){ true }
12
+ dispatcher.subscribers(test_event).size.should == 1
13
+ end
14
+
15
+ it "should call the dispatch block with no arguments" do
16
+ dispatcher.subscribe(test_event){ raise StandardError, "From Event Handler" }
17
+ lambda {
18
+ dispatcher.dispatch(test_event)
19
+ }.should raise_error(StandardError, "From Event Handler")
20
+ end
21
+
22
+ it "should call the dispatch block with one argument" do
23
+ arg = nil
24
+ dispatcher.subscribe(test_event){|passed_in| arg = passed_in }
25
+ dispatcher.dispatch(test_event, "My Arg")
26
+ arg.should == "My Arg"
27
+ end
28
+
29
+ it "should clear all subscribers" do
30
+ dispatcher.subscribe(test_event){ false }
31
+ dispatcher.subscribe(test_event + "_2"){ false }
32
+ dispatcher.clear_all_subscribers!
33
+ dispatcher.subscribers(test_event).size.should == 0
34
+ dispatcher.subscribers(test_event + "_2").size.should == 0
35
+ end
36
+
37
+ it "should have a dispatcher available from ActiveAdmin::Event" do
38
+ ActiveAdmin::Event.should be_an_instance_of(ActiveAdmin::EventDispatcher)
39
+ end
40
+
41
+ end
@@ -1,157 +1,179 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
 
4
- describe_with_render ActiveAdmin::FormBuilder do
4
+ describe ActiveAdmin::ViewHelpers::FilterFormHelper do
5
+ include Arbre::HTML
6
+ let(:assigns){ {} }
7
+
8
+ # Setup an ActionView::Base object which can be used for
9
+ # generating the form for.
10
+ let(:helpers) do
11
+ view = action_view
12
+ def view.collection_path
13
+ "/posts"
14
+ end
5
15
 
6
- def reset!
7
- Admin::PostsController.reset_filters!
8
- end
16
+ def view.protect_against_forgery?
17
+ false
18
+ end
9
19
 
10
- def filter(*args)
11
- Admin::PostsController.filter *args
20
+ view
12
21
  end
13
22
 
14
- before do
15
- @john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
16
- @jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
17
- reset!
18
- filter :title
19
- filter :body
20
- filter :created_at
21
- filter :id
22
- filter :author
23
- get :index
23
+ def filter(name, options = {})
24
+ search = Post.search
25
+ active_admin_filters_form_for(search, [options.merge(:attribute => name)])
24
26
  end
25
27
 
26
- after(:each) do
27
- reset!
28
- end
28
+ describe "the form in general" do
29
+ let(:body) { filter :title }
29
30
 
30
- it "should generate a form which submits via get" do
31
- response.should have_tag("form", :attributes => { :method => 'get' })
32
- end
31
+ it "should generate a form which submits via get" do
32
+ body.should have_tag("form", :attributes => { :method => 'get' })
33
+ end
33
34
 
34
- it "should generate a filter button" do
35
- response.should have_tag("input", :attributes => { :type => "submit",
35
+ it "should generate a filter button" do
36
+ body.should have_tag("input", :attributes => { :type => "submit",
36
37
  :value => "Filter" })
37
- end
38
+ end
38
39
 
39
- it "should generate a search field for a string attribute" do
40
- response.should have_tag("input", :attributes => { :name => "q[title_contains]"})
41
- end
40
+ it "should only generate the form once" do
41
+ body.scan(/q\[title_contains\]/).size.should == 1
42
+ end
42
43
 
43
- it "should label a text field with search" do
44
- response.should have_tag('label', 'Search Title')
44
+ it "should generate a clear filters link" do
45
+ body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
46
+ end
45
47
  end
46
48
 
47
- it "should generate a search field for a text attribute" do
48
- response.should have_tag("input", :attributes => { :name => "q[body_contains]"})
49
- end
49
+ describe "string attribute" do
50
+ let(:body) { filter :title }
51
+
52
+ it "should generate a search field for a string attribute" do
53
+ body.should have_tag("input", :attributes => { :name => "q[title_contains]"})
54
+ end
50
55
 
51
- it "should only generate the form once" do
52
- response.body.scan(/q\[title_contains\]/).size.should == 1
56
+ it "should label a text field with search" do
57
+ body.should have_tag('label', 'Search Title')
58
+ end
53
59
  end
54
60
 
55
- it "should generate a clear filters link" do
56
- response.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
61
+ describe "text attribute" do
62
+ let(:body) { filter :body }
63
+
64
+ it "should generate a search field for a text attribute" do
65
+ body.should have_tag("input", :attributes => { :name => "q[body_contains]"})
66
+ end
67
+
68
+ it "should label a text field with search" do
69
+ body.should have_tag('label', 'Search Body')
70
+ end
57
71
  end
58
72
 
59
- context "when date" do
73
+ describe "datetime attribute" do
74
+ let(:body) { filter :created_at }
75
+
60
76
  it "should generate a date greater than" do
61
- response.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
77
+ body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
62
78
  end
63
79
  it "should generate a date less than" do
64
- response.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
80
+ body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
65
81
  end
66
82
  end
67
83
 
68
- context "when integer" do
84
+ describe "integer attribute" do
85
+ let(:body) { filter :id }
86
+
69
87
  it "should generate a select option for equal to" do
70
- response.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
88
+ body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
71
89
  end
72
90
  it "should generate a select option for greater than" do
73
- response.should have_tag("option", "Greater Than")
91
+ body.should have_tag("option", "Greater Than")
74
92
  end
75
93
  it "should generate a select option for less than" do
76
- response.should have_tag("option", "Less Than")
94
+ body.should have_tag("option", "Less Than")
77
95
  end
78
96
  it "should generate a text field for input" do
79
- response.should have_tag("input", :attributes => {
80
- :name => "q[id_equals]" })
97
+ body.should have_tag("input", :attributes => {
98
+ :name => /q\[(id_eq|id_equals)\]/ })
81
99
  end
82
100
  it "should select the option which is currently being filtered"
83
101
  end
84
102
 
85
- context "when belong to" do
103
+ describe "belong to" do
104
+ before do
105
+ @john = User.create :first_name => "John", :last_name => "Doe", :username => "john_doe"
106
+ @jane = User.create :first_name => "Jane", :last_name => "Doe", :username => "jane_doe"
107
+ end
86
108
 
87
109
  context "when given as the _id attribute name" do
88
- before do
89
- filter :author_id
90
- get :index
91
- end
110
+ let(:body) { filter :author_id }
111
+
92
112
  it "should not render as an integer" do
93
- response.should_not have_tag("input", :attributes => {
113
+ body.should_not have_tag("input", :attributes => {
94
114
  :name => "q[author_id_eq]"})
95
115
  end
96
116
  it "should render as belongs to select" do
97
- response.should have_tag("select", :attributes => {
117
+ body.should have_tag("select", :attributes => {
98
118
  :name => "q[author_id_eq]"})
99
- response.should have_tag("option", "jane_doe", :attributes => {
119
+ body.should have_tag("option", "jane_doe", :attributes => {
100
120
  :value => @jane.id })
101
121
  end
102
122
  end
103
123
 
104
- context "as select" do
124
+ context "when given as the name of the relationship" do
125
+ let(:body) { filter :author }
126
+
105
127
  it "should generate a select" do
106
- response.should have_tag("select", :attributes => {
128
+ body.should have_tag("select", :attributes => {
107
129
  :name => "q[author_id_eq]"})
108
130
  end
109
131
  it "should set the default text to 'Any'" do
110
- response.should have_tag("option", "Any", :attributes => {
132
+ body.should have_tag("option", "Any", :attributes => {
111
133
  :value => "" })
112
134
  end
113
135
  it "should create an option for each related object" do
114
- response.should have_tag("option", "john_doe", :attributes => {
136
+ body.should have_tag("option", "john_doe", :attributes => {
115
137
  :value => @john.id })
116
- response.should have_tag("option", "jane_doe", :attributes => {
138
+ body.should have_tag("option", "jane_doe", :attributes => {
117
139
  :value => @jane.id })
118
140
  end
141
+
119
142
  context "with a proc" do
120
- before do
121
- reset!
143
+ let :body do
122
144
  filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
123
- get :index
124
145
  end
146
+
125
147
  it "should use call the proc as the collection" do
126
- response.should have_tag("option", "Title One")
127
- response.should have_tag("option", "Title Two")
148
+ body.should have_tag("option", "Title One")
149
+ body.should have_tag("option", "Title Two")
128
150
  end
129
151
  end
130
152
  end
131
153
 
132
154
  context "as check boxes" do
133
- before do
134
- filter :author, :as => :check_boxes
135
- get :index
136
- end
155
+ let(:body) { filter :author, :as => :check_boxes }
156
+
137
157
  it "should create a check box for each related object" do
138
- response.should have_tag("input", :attributes => {
158
+ body.should have_tag("input", :attributes => {
139
159
  :name => "q[author_id_in][]",
140
160
  :type => "checkbox",
141
161
  :value => @john.id })
142
- response.should have_tag("input", :attributes => {
162
+ body.should have_tag("input", :attributes => {
143
163
  :name => "q[author_id_in][]",
144
164
  :type => "checkbox",
145
165
  :value => @jane.id })
146
166
  end
147
167
  end
148
- end # belongs to
149
168
 
150
- describe "default filters" do
151
- it "should order by association, then content columns" do
152
- attributes = controller.class.default_filters_config.collect{|f| f[:attribute] }
153
- attributes.should == [ :author, :title, :body, :published_at, :created_at, :updated_at ]
169
+ context "when polymorphic relationship" do
170
+ let(:body) do
171
+ search = ActiveAdmin::Comment.search
172
+ active_admin_filters_form_for(search, [{ :attribute => :resource}])
173
+ end
174
+ it "should not generate any field" do
175
+ body.should have_tag("form", :attributes => { :method => 'get' })
176
+ end
154
177
  end
155
- end
156
-
178
+ end # belongs to
157
179
  end
@@ -1,118 +1,127 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- describe_with_render ActiveAdmin::FormBuilder do
3
+ describe ActiveAdmin::FormBuilder do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
4
6
 
5
- def build_form(&block)
6
- Admin::PostsController.form(&block)
7
- get :new
7
+ # Setup an ActionView::Base object which can be used for
8
+ # generating the form for.
9
+ let(:helpers) do
10
+ view = action_view
11
+ def view.posts_path
12
+ "/posts"
13
+ end
14
+
15
+ def view.protect_against_forgery?
16
+ false
17
+ end
18
+
19
+ def view.url_for(*args)
20
+ if args.first == {:action => "index"}
21
+ posts_path
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ view
28
+ end
29
+
30
+ def build_form(options = {}, &block)
31
+ active_admin_form_for Post.new, options, &block
8
32
  end
9
33
 
10
34
  context "in general" do
11
- before do
35
+ let :body do
12
36
  build_form do |f|
13
37
  f.inputs do
14
38
  f.input :title
15
39
  f.input :body
16
40
  end
17
- f.label :title, "My Super Title"
18
- f.text_field :title
19
41
  f.buttons do
20
- f.submit "My Submit Button"
21
42
  f.commit_button "Submit Me"
22
43
  f.commit_button "Another Button"
23
44
  end
24
45
  end
25
46
  end
47
+
26
48
  it "should generate a text input" do
27
- response.should have_tag("input", :attributes => { :type => "text",
49
+ body.should have_tag("input", :attributes => { :type => "text",
28
50
  :name => "post[title]" })
29
51
  end
30
- it "should generate a label using the default form methods" do
31
- response.should have_tag("label", "My Super Title")
32
- end
33
52
  it "should generate a textarea" do
34
- response.should have_tag("textarea", :attributes => { :name => "post[body]" })
53
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
35
54
  end
36
55
  it "should only generate the form once" do
37
- response.body.scan(/My Super Title/).size.should == 1
56
+ body.scan(/Title/).size.should == 1
38
57
  end
39
58
  it "should generate buttons" do
40
- response.should have_tag("input", :attributes => { :type => "submit",
59
+ body.should have_tag("input", :attributes => { :type => "submit",
41
60
  :value => "Submit Me" })
42
- response.should have_tag("input", :attributes => { :type => "submit",
61
+ body.should have_tag("input", :attributes => { :type => "submit",
43
62
  :value => "Another Button" })
44
63
  end
45
64
  end
46
65
 
47
66
  describe "passing in options" do
48
- before do
49
- Admin::PostsController.form :html => { :multipart => true } do |f|
67
+ let :body do
68
+ build_form :html => { :multipart => true } do |f|
50
69
  f.inputs :title
51
70
  f.buttons
52
71
  end
53
- get :new
54
72
  end
55
73
  it "should pass the options on to the form" do
56
- response.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
57
- end
58
- end
59
-
60
- context "with default settings" do
61
- before do
62
- Admin::PostsController.reset_form_config!
63
- get :new
64
- end
65
- it "should generate one post title field" do
66
- response.body.scan('id="post_title"').size.should == 1
74
+ body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
67
75
  end
68
76
  end
69
77
 
70
78
  context "with buttons" do
71
79
  it "should generate the form once" do
72
- build_form do |f|
80
+ body = build_form do |f|
73
81
  f.inputs do
74
82
  f.input :title
75
83
  end
76
84
  f.buttons
77
85
  end
78
- response.body.scan(/id=\"post_title\"/).size.should == 1
86
+ body.scan(/id=\"post_title\"/).size.should == 1
79
87
  end
80
- it "should generate one button" do
81
- build_form do |f|
88
+ it "should generate one button and a cancel link" do
89
+ body = build_form do |f|
82
90
  f.buttons
83
91
  end
84
- response.body.scan(/type=\"submit\"/).size.should == 1
92
+ body.scan(/type=\"submit\"/).size.should == 1
93
+ body.scan(/class=\"cancel\"/).size.should == 1
85
94
  end
86
95
  it "should generate multiple buttons" do
87
- build_form do |f|
96
+ body = build_form do |f|
88
97
  f.buttons do
89
- f.submit "Create"
90
98
  f.commit_button "Create & Continue"
91
99
  f.commit_button "Create & Edit"
92
100
  end
93
101
  end
94
- response.body.scan(/type=\"submit\"/).size.should == 3
102
+ body.scan(/type=\"submit\"/).size.should == 2
103
+ body.scan(/class=\"cancel\"/).size.should == 0
95
104
  end
96
105
 
97
106
  end
98
107
 
99
108
  context "without passing a block to inputs" do
100
- before do
109
+ let :body do
101
110
  build_form do |f|
102
111
  f.inputs :title, :body
103
112
  end
104
113
  end
105
114
  it "should have a title input" do
106
- response.should have_tag("input", :attributes => { :type => "text",
115
+ body.should have_tag("input", :attributes => { :type => "text",
107
116
  :name => "post[title]" })
108
117
  end
109
118
  it "should have a body textarea" do
110
- response.should have_tag("textarea", :attributes => { :name => "post[body]" })
119
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
111
120
  end
112
121
  end
113
122
 
114
123
  context "with semantic fields for" do
115
- before do
124
+ let :body do
116
125
  build_form do |f|
117
126
  f.inputs do
118
127
  f.input :title
@@ -127,7 +136,7 @@ describe_with_render ActiveAdmin::FormBuilder do
127
136
  end
128
137
  end
129
138
  it "should generate a nested text input once" do
130
- response.body.scan("post_author_attributes_first_name_input").size.should == 1
139
+ body.scan("post_author_attributes_first_name_input").size.should == 1
131
140
  end
132
141
  end
133
142
 
@@ -138,30 +147,30 @@ describe_with_render ActiveAdmin::FormBuilder do
138
147
  end
139
148
 
140
149
  describe "as select" do
141
- before do
150
+ let :body do
142
151
  build_form do |f|
143
152
  f.input :author
144
153
  end
145
154
  end
146
155
  it "should create 2 options" do
147
- response.body.scan(/\<option/).size.should == 3
156
+ body.scan(/\<option/).size.should == 3
148
157
  end
149
158
  end
150
159
 
151
160
  describe "as radio buttons" do
152
- before do
161
+ let :body do
153
162
  build_form do |f|
154
163
  f.input :author, :as => :radio
155
164
  end
156
165
  end
157
166
  it "should create 2 radio buttons" do
158
- response.body.scan(/type=\"radio\"/).size.should == 2
167
+ body.scan(/type=\"radio\"/).size.should == 2
159
168
  end
160
169
  end
161
170
  end
162
171
 
163
172
  context "with inputs 'for'" do
164
- before do
173
+ let :body do
165
174
  build_form do |f|
166
175
  f.inputs do
167
176
  f.input :title
@@ -176,52 +185,43 @@ describe_with_render ActiveAdmin::FormBuilder do
176
185
  end
177
186
  end
178
187
  it "should generate a nested text input once" do
179
- response.body.scan("post_author_attributes_first_name_input").size.should == 1
188
+ body.scan("post_author_attributes_first_name_input").size.should == 1
180
189
  end
181
190
  it "should add an author first name field" do
182
- response.body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
191
+ body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
183
192
  end
184
193
  end
185
194
 
186
195
  context "with wrapper html" do
187
196
  it "should set a class" do
188
- build_form do |f|
197
+ body = build_form do |f|
189
198
  f.input :title, :wrapper_html => { :class => "important" }
190
199
  end
191
- response.should have_tag("li", :attributes => {:class => "string optional important"})
200
+ body.should have_tag("li", :attributes => {:class => "string optional important"})
192
201
  end
193
202
  end
194
203
 
195
204
 
196
- # This checks that each input can be added via the standard
197
- # rails method as well as using the form builder's #input method.
198
205
  {
199
206
  "input :title, :as => :string" => /id\=\"post_title\"/,
200
- "text_field :title" => /id\=\"post_title\"/,
201
207
  "input :title, :as => :text" => /id\=\"post_title\"/,
202
- "text_area :title" => /id\=\"post_title\"/,
203
208
  "input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
204
- "time_select :created_at" => /id\=\"post_created_at_2i\"/,
205
209
  "input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
206
- "datetime_select :created_at" => /id\=\"post_created_at_2i\"/,
207
210
  "input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
208
- "date_select :created_at" => /id\=\"post_created_at_2i\"/,
209
- "radio_button :title, 'title'" => /id\=\"post_title_title\"/,
210
- "file_field :title" => /id\=\"post_title\"/,
211
- "hidden_field :title" => /id\=\"post_title\"/,
212
- "label :title" => /for\=\"post_title\"/,
213
211
  }.each do |source, regex|
214
212
  it "should properly buffer #{source}" do
215
- build_form do |f|
216
- f.instance_eval(source)
217
- f.instance_eval(source)
213
+ body = build_form do |f|
214
+ f.inputs do
215
+ f.instance_eval(source)
216
+ f.instance_eval(source)
217
+ end
218
218
  end
219
- response.body.scan(regex).size.should == 2
219
+ body.scan(regex).size.should == 2
220
220
  end
221
221
  end
222
222
 
223
223
  describe "datepicker input" do
224
- before do
224
+ let :body do
225
225
  build_form do |f|
226
226
  f.inputs do
227
227
  f.input :created_at, :as => :datepicker
@@ -229,7 +229,7 @@ describe_with_render ActiveAdmin::FormBuilder do
229
229
  end
230
230
  end
231
231
  it "should generate a text input with the class of datepicker" do
232
- response.should have_tag("input", :attributes => { :type => "text",
232
+ body.should have_tag("input", :attributes => { :type => "text",
233
233
  :class => "datepicker",
234
234
  :name => "post[created_at]" })
235
235
  end