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,41 +1,27 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
- describe_with_render ActiveAdmin::ActionItems do
3
+ describe ActiveAdmin::ActionItems do
4
4
 
5
- # Store the config and set it back after each spec so that we
6
- # dont mess with other specs
7
- before do
8
- @config_before = Admin::PostsController.action_items
9
- Admin::PostsController.clear_action_items!
10
- end
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
11
13
 
12
- after(:each) do
13
- Admin::PostsController.action_items = @config_before
14
- end
14
+ let(:rendered){ insert_tag ActiveAdmin::Views::ActionItems, [action_item]}
15
15
 
16
- # Helpers method to define an action item
17
- def action_item(*args, &block)
18
- Admin::PostsController.class_eval do
19
- action_item *args, &block
16
+ it "should have a parent .action_items div" do
17
+ rendered.tag_name.should == 'div'
18
+ rendered.class_list.should include('action_items')
20
19
  end
21
- end
22
20
 
23
- context "when setting with a block" do
24
- before do
25
- action_item do
26
- link_to "All Posts", collection_path
27
- end
28
- get :index
29
- end
30
- it "should add a new action item" do
31
- Admin::PostsController.action_items.size.should == 1
32
- end
33
- it "should render the content in the context of the view" do
34
- response.should have_tag('a', 'All Posts')
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>"
35
24
  end
36
25
  end
37
26
 
38
- # action_item 'New', new_post_path
39
- context "when setting with as a link with text and a path"
40
-
41
27
  end
@@ -14,24 +14,8 @@ describe ActiveAdmin do
14
14
  Rails.application.config.eager_load_paths.should_not include(File.join(Rails.root, "app/admin"))
15
15
  end
16
16
 
17
- # TODO: Find a good way to test loading and unloading constants
18
- # without blowing up all the other specs
19
- #
20
- #describe "loading" do
21
- # it "should unload all registered controllers" do
22
- # TestClass = Class.new(ActiveRecord::Base)
23
- # ActiveAdmin.register(TestClass)
24
- # Admin::TestClassesController
25
- # ActiveAdmin.unload!
26
- # lambda {
27
- # Admin::TestClassesController
28
- # }.should raise_error
29
- # ActiveAdminIntegrationSpecHelper.load!
30
- # end
31
- #end
32
-
33
17
  it "should default the application name" do
34
- ActiveAdmin.site_title.should == "Rails300"
18
+ ActiveAdmin.site_title.should == Rails.application.class.to_s.split('::').first
35
19
  end
36
20
 
37
21
  it "should set the site title" do
@@ -41,12 +25,16 @@ describe ActiveAdmin do
41
25
  ActiveAdmin.site_title = old_title
42
26
  end
43
27
 
44
- it "should have a set of menus" do
45
- ActiveAdmin.menus.should be_an_instance_of(Hash)
28
+ it "should have a view factory" do
29
+ ActiveAdmin.view_factory.should be_an_instance_of(ActiveAdmin::ViewFactory)
46
30
  end
47
-
48
- it "should have a default tab renderer" do
49
- ActiveAdmin.tabs_renderer.should == ActiveAdmin::TabsRenderer
31
+
32
+ it "should have admin notes by default" do
33
+ ActiveAdmin.admin_notes.should be_true
34
+ end
35
+
36
+ it "should have a default current_user_method" do
37
+ ActiveAdmin.current_user_method.should == false
50
38
  end
51
39
 
52
40
  end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arbre::HTML::Element, "Finder Methods" do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ describe "finding elements by tag name" do
8
+
9
+ it "should return 0 when no elements exist" do
10
+ div.get_elements_by_tag_name("li").size.should == 0
11
+ end
12
+
13
+ it "should return a child element" do
14
+ html = div do
15
+ ul
16
+ li
17
+ ul
18
+ end
19
+ elements = html.get_elements_by_tag_name("li")
20
+ elements.size.should == 1
21
+ elements[0].should be_instance_of(Arbre::HTML::Li)
22
+ end
23
+
24
+ it "should return multple child elements" do
25
+ html = div do
26
+ ul
27
+ li
28
+ ul
29
+ li
30
+ end
31
+ elements = html.get_elements_by_tag_name("li")
32
+ elements.size.should == 2
33
+ elements[0].should be_instance_of(Arbre::HTML::Li)
34
+ elements[1].should be_instance_of(Arbre::HTML::Li)
35
+ end
36
+
37
+ it "should return children's child elements" do
38
+ html = div do
39
+ ul
40
+ li do
41
+ li
42
+ end
43
+ end
44
+ elements = html.get_elements_by_tag_name("li")
45
+ elements.size.should == 2
46
+ elements[0].should be_instance_of(Arbre::HTML::Li)
47
+ elements[1].should be_instance_of(Arbre::HTML::Li)
48
+ elements[1].parent.should == elements[0]
49
+ end
50
+ end
51
+
52
+ describe "finding an element by id"
53
+ describe "finding an element by a class name"
54
+ end
@@ -0,0 +1,224 @@
1
+ require 'spec_helper'
2
+ require 'active_admin/arbre/element'
3
+
4
+ describe Arbre::HTML::Element do
5
+ include Arbre::HTML
6
+
7
+ let(:assigns){ {} }
8
+ let(:element){ Arbre::HTML::Element.new }
9
+
10
+ context "when initialized" do
11
+ it "should have no children" do
12
+ element.children.should be_empty
13
+ end
14
+ it "should have no parent" do
15
+ element.parent.should be_nil
16
+ end
17
+ it "should have no document" do
18
+ element.document.should be_nil
19
+ end
20
+ it "should respond to the HTML builder methods" do
21
+ element.should respond_to(:span)
22
+ end
23
+ it "should have a set of local assigns" do
24
+ element = Arbre::HTML::Element.new :hello => "World"
25
+ element.assigns[:hello].should == "World"
26
+ end
27
+ it "should have an empty hash with no local assigns" do
28
+ element.assigns.should == {}
29
+ end
30
+ end
31
+
32
+ describe "passing in a helper object" do
33
+ let(:element){ Arbre::HTML::Element.new(nil, action_view) }
34
+ it "should call methods on the helper object and return TextNode objects" do
35
+ element.content_tag(:div).should == "<div></div>"
36
+ end
37
+
38
+ it "should raise a NoMethodError if not found" do
39
+ lambda {
40
+ element.a_method_that_doesnt_exist
41
+ }.should raise_error(NoMethodError)
42
+ end
43
+ end
44
+
45
+ describe "passing in assigns" do
46
+ let(:assigns){ {:post => Post.new(:title => "Hello")} }
47
+ it "should be accessible via a method call" do
48
+ post.should be_an_instance_of(Post)
49
+ end
50
+ end
51
+
52
+ describe "adding a child" do
53
+ let(:child){ Arbre::HTML::Element.new }
54
+ before do
55
+ element.add_child child
56
+ end
57
+
58
+ it "should add the child to the parent" do
59
+ element.children.first.should == child
60
+ end
61
+
62
+ it "should set the parent of the child" do
63
+ child.parent.should == element
64
+ end
65
+
66
+ context "when the child is nil" do
67
+ let(:child){ nil }
68
+ it "should not add the child" do
69
+ element.children.should be_empty
70
+ end
71
+ end
72
+
73
+ context "when the child is a string" do
74
+ let(:child){ "Hello World" }
75
+ it "should add as a TextNode" do
76
+ element.children.first.should be_instance_of(Arbre::HTML::TextNode)
77
+ element.children.first.to_html.should == "Hello World"
78
+ end
79
+ end
80
+ end
81
+
82
+ describe "setting the content" do
83
+
84
+ context "when a string" do
85
+ before do
86
+ element.add_child "Hello World"
87
+ element.content = "Goodbye"
88
+ end
89
+ it "should clear the existing children" do
90
+ element.children.size.should == 1
91
+ end
92
+
93
+ it "should add the string as a child" do
94
+ element.children.first.to_html.should == "Goodbye"
95
+ end
96
+
97
+ it "should html escape the string" do
98
+ string = "Goodbye <br />"
99
+ element.content = string
100
+ element.content.to_html.should == "Goodbye &lt;br /&gt;"
101
+ end
102
+ end
103
+
104
+ context "when a tag" do
105
+ before do
106
+ element.content = h2("Hello")
107
+ end
108
+ it "should set the content tag" do
109
+ element.children.first.should be_an_instance_of(Arbre::HTML::H2)
110
+ end
111
+ it "should set the tags parent" do
112
+ element.children.first.parent.should == element
113
+ end
114
+ end
115
+
116
+ context "when an array of tags" do
117
+ before do
118
+ element.content = [ul,div]
119
+ end
120
+
121
+ it "should set the content tag" do
122
+ element.children.first.should be_an_instance_of(Arbre::HTML::Ul)
123
+ end
124
+ it "should set the tags parent" do
125
+ element.children.first.parent.should == element
126
+ end
127
+ end
128
+
129
+ end
130
+
131
+ describe "setting the parent" do
132
+ let(:parent) do
133
+ doc = Arbre::HTML::Document.new
134
+ parent = Arbre::HTML::Element.new
135
+ doc << parent
136
+ parent
137
+ end
138
+ before { element.parent = parent }
139
+
140
+ it "should set the parent" do
141
+ element.parent.should == parent
142
+ end
143
+ it "should set the document to the parent's document" do
144
+ element.document.should == parent.document
145
+ end
146
+ end
147
+
148
+ describe "rendering to html" do
149
+ it "should render the children collection" do
150
+ element.children.should_receive(:to_html).and_return("content")
151
+ element.to_html.should == "content"
152
+ end
153
+ end
154
+
155
+ describe "adding elements together" do
156
+
157
+ context "when both elements are tags" do
158
+ let(:collection){ h1 + h2}
159
+
160
+ it "should return an instance of Collection" do
161
+ collection.should be_an_instance_of(Arbre::HTML::Collection)
162
+ end
163
+
164
+ it "should return the elements in the collection" do
165
+ collection.size.should == 2
166
+ collection.first.should be_an_instance_of(Arbre::HTML::H1)
167
+ collection[1].should be_an_instance_of(Arbre::HTML::H2)
168
+ end
169
+ end
170
+
171
+ context "when the left is a collection and the right is a tag" do
172
+ let(:collection){ Arbre::HTML::Collection.new([h1, h2]) + h3}
173
+
174
+ it "should return an instance of Collection" do
175
+ collection.should be_an_instance_of(Arbre::HTML::Collection)
176
+ end
177
+
178
+ it "should return the elements in the collection flattened" do
179
+ collection.size.should == 3
180
+ collection[0].should be_an_instance_of(Arbre::HTML::H1)
181
+ collection[1].should be_an_instance_of(Arbre::HTML::H2)
182
+ collection[2].should be_an_instance_of(Arbre::HTML::H3)
183
+ end
184
+ end
185
+
186
+ context "when the right is a collection and the left is a tag" do
187
+ let(:collection){ h1 + Arbre::HTML::Collection.new([h2,h3]) }
188
+
189
+ it "should return an instance of Collection" do
190
+ collection.should be_an_instance_of(Arbre::HTML::Collection)
191
+ end
192
+
193
+ it "should return the elements in the collection flattened" do
194
+ collection.size.should == 3
195
+ collection[0].should be_an_instance_of(Arbre::HTML::H1)
196
+ collection[1].should be_an_instance_of(Arbre::HTML::H2)
197
+ collection[2].should be_an_instance_of(Arbre::HTML::H3)
198
+ end
199
+ end
200
+
201
+ context "when the left is a tag and the right is a string" do
202
+ let(:collection){ h1 + "Hello World"}
203
+
204
+ it "should return an instance of Collection" do
205
+ collection.should be_an_instance_of(Arbre::HTML::Collection)
206
+ end
207
+
208
+ it "should return the elements in the collection" do
209
+ collection.size.should == 2
210
+ collection[0].should be_an_instance_of(Arbre::HTML::H1)
211
+ collection[1].should be_an_instance_of(Arbre::HTML::TextNode)
212
+ end
213
+ end
214
+
215
+ context "when the left is a string and the right is a tag" do
216
+ let(:collection){ "hello World" + h1}
217
+
218
+ it "should return a string" do
219
+ collection.strip.chomp.should == "hello World<h1></h1>"
220
+ end
221
+ end
222
+ end
223
+
224
+ end
@@ -0,0 +1,61 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arbre::HTML::Tag, "Attributes" do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ let(:tag){ Arbre::HTML::Tag.new }
8
+
9
+ describe "attributes" do
10
+ before { tag.build :id => "my_id" }
11
+
12
+ it "should have an attributes hash" do
13
+ tag.attributes.should == {:id => "my_id"}
14
+ end
15
+
16
+ it "should render the attributes to html" do
17
+ tag.to_html.should == <<-HTML
18
+ <tag id="my_id"></tag>
19
+ HTML
20
+ end
21
+
22
+ it "should get an attribute value" do
23
+ tag.attr(:id).should == "my_id"
24
+ end
25
+
26
+ describe "#has_attribute?" do
27
+ context "when the attribute exists" do
28
+ it "should return true" do
29
+ tag.has_attribute?(:id).should == true
30
+ end
31
+ end
32
+
33
+ context "when the attribute does not exist" do
34
+ it "should return false" do
35
+ tag.has_attribute?(:class).should == false
36
+ end
37
+ end
38
+ end
39
+
40
+ it "should remove an attribute" do
41
+ tag.attributes.should == {:id => "my_id"}
42
+ tag.remove_attribute(:id).should == "my_id"
43
+ tag.attributes.should == {}
44
+ end
45
+ end
46
+
47
+ describe "rendering attributes" do
48
+ it "should html safe the attribute values" do
49
+ tag.set_attribute(:class, "\">bad things!")
50
+ tag.to_html.should == <<-HTML
51
+ <tag class="&quot;&gt;bad things!"></tag>
52
+ HTML
53
+ end
54
+ it "should should escape the attribute names" do
55
+ tag.set_attribute(">bad", "things")
56
+ tag.to_html.should == <<-HTML
57
+ <tag &gt;bad="things"></tag>
58
+ HTML
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+
3
+ describe Arbre::HTML::Tag do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ let(:tag){ Arbre::HTML::Tag.new }
8
+
9
+ describe "building a new tag" do
10
+ before { tag.build "Hello World", :id => "my_id" }
11
+
12
+ it "should set the contents to a string" do
13
+ tag.content.should == "Hello World"
14
+ end
15
+
16
+ it "should set the hash of options to the attributes" do
17
+ tag.attributes.should == { :id => "my_id" }
18
+ end
19
+ end
20
+
21
+ describe "creating a tag 'for' an object" do
22
+ let(:model_name){ mock(:singular => "resource_class")}
23
+ let(:resource_class){ mock(:model_name => model_name) }
24
+ let(:resource){ mock(:class => resource_class, :to_key => ['5'])}
25
+
26
+ before do
27
+ tag.build :for => resource
28
+ end
29
+ it "should set the id to the type and id" do
30
+ tag.id.should == "resource_class_5"
31
+ end
32
+ it "should add a class name" do
33
+ tag.class_list.should include("resource_class")
34
+ end
35
+ end
36
+
37
+ describe "css class names" do
38
+ it "should add a class" do
39
+ tag.add_class "hello_world"
40
+ tag.class_names.should == "hello_world"
41
+ end
42
+
43
+ it "should remove_class" do
44
+ tag.add_class "hello_world"
45
+ tag.class_names.should == "hello_world"
46
+ tag.remove_class "hello_world"
47
+ tag.class_names.should == ""
48
+ end
49
+
50
+ it "should not add a class if it already exists" do
51
+ tag.add_class "hello_world"
52
+ tag.add_class "hello_world"
53
+ tag.class_names.should == "hello_world"
54
+ end
55
+
56
+ it "should seperate classes with space" do
57
+ tag.add_class "hello world"
58
+ tag.class_list.size.should == 2
59
+ end
60
+ end
61
+
62
+
63
+ end