saulolso-activeadmin 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. data/.document +5 -0
  2. data/.gitignore +32 -0
  3. data/.travis.yml +4 -0
  4. data/CHANGELOG.rdoc +76 -0
  5. data/Gemfile +26 -0
  6. data/LICENSE +25 -0
  7. data/README.rdoc +450 -0
  8. data/Rakefile +100 -0
  9. data/activeadmin.gemspec +28 -0
  10. data/cucumber.yml +2 -0
  11. data/features/comments/commenting.feature +99 -0
  12. data/features/comments/viewing_index.feature +19 -0
  13. data/features/dashboard.feature +26 -0
  14. data/features/edit_page.feature +77 -0
  15. data/features/first_boot.feature +16 -0
  16. data/features/global_navigation.feature +30 -0
  17. data/features/index/format_as_csv.feature +45 -0
  18. data/features/index/formats.feature +10 -0
  19. data/features/index/index_as_block.feature +15 -0
  20. data/features/index/index_as_blog.feature +50 -0
  21. data/features/index/index_as_grid.feature +45 -0
  22. data/features/index/index_as_table.feature +79 -0
  23. data/features/index/index_scopes.feature +52 -0
  24. data/features/index/pagination.feature +23 -0
  25. data/features/menu.feature +26 -0
  26. data/features/new_page.feature +75 -0
  27. data/features/registering_assets.feature +35 -0
  28. data/features/registering_resources.feature +33 -0
  29. data/features/show/default_content.feature +43 -0
  30. data/features/show/page_title.feature +33 -0
  31. data/features/sidebar_sections.feature +127 -0
  32. data/features/specifying_actions.feature +60 -0
  33. data/features/step_definitions/action_item_steps.rb +7 -0
  34. data/features/step_definitions/additional_web_steps.rb +67 -0
  35. data/features/step_definitions/asset_steps.rb +7 -0
  36. data/features/step_definitions/attribute_steps.rb +15 -0
  37. data/features/step_definitions/comment_steps.rb +8 -0
  38. data/features/step_definitions/configuration_steps.rb +31 -0
  39. data/features/step_definitions/dashboard_steps.rb +11 -0
  40. data/features/step_definitions/factory_steps.rb +28 -0
  41. data/features/step_definitions/flash_steps.rb +3 -0
  42. data/features/step_definitions/format_steps.rb +34 -0
  43. data/features/step_definitions/index_scope_steps.rb +20 -0
  44. data/features/step_definitions/menu_steps.rb +7 -0
  45. data/features/step_definitions/pagination_steps.rb +8 -0
  46. data/features/step_definitions/sidebar_steps.rb +11 -0
  47. data/features/step_definitions/tab_steps.rb +3 -0
  48. data/features/step_definitions/user_steps.rb +20 -0
  49. data/features/step_definitions/web_steps.rb +219 -0
  50. data/features/sti_resource.feature +49 -0
  51. data/features/support/env.rb +92 -0
  52. data/features/support/paths.rb +48 -0
  53. data/features/users/logging_in.feature +34 -0
  54. data/features/users/logging_out.feature +13 -0
  55. data/lib/active_admin/abstract_view_factory.rb +95 -0
  56. data/lib/active_admin/action_items.rb +37 -0
  57. data/lib/active_admin/application.rb +204 -0
  58. data/lib/active_admin/arbre/attributes.rb +20 -0
  59. data/lib/active_admin/arbre/class_list.rb +28 -0
  60. data/lib/active_admin/arbre/collection.rb +27 -0
  61. data/lib/active_admin/arbre/context.rb +8 -0
  62. data/lib/active_admin/arbre/core_extensions.rb +5 -0
  63. data/lib/active_admin/arbre/document.rb +42 -0
  64. data/lib/active_admin/arbre/element.rb +151 -0
  65. data/lib/active_admin/arbre/html.rb +84 -0
  66. data/lib/active_admin/arbre/html5_elements.rb +47 -0
  67. data/lib/active_admin/arbre/tag.rb +137 -0
  68. data/lib/active_admin/arbre/text_node.rb +35 -0
  69. data/lib/active_admin/arbre.rb +23 -0
  70. data/lib/active_admin/asset_registration.rb +34 -0
  71. data/lib/active_admin/callbacks.rb +87 -0
  72. data/lib/active_admin/comments/comment.rb +21 -0
  73. data/lib/active_admin/comments/configuration.rb +18 -0
  74. data/lib/active_admin/comments/namespace_helper.rb +14 -0
  75. data/lib/active_admin/comments/resource_helper.rb +17 -0
  76. data/lib/active_admin/comments/show_page_helper.rb +23 -0
  77. data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
  78. data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
  79. data/lib/active_admin/comments/views.rb +3 -0
  80. data/lib/active_admin/comments.rb +88 -0
  81. data/lib/active_admin/component.rb +22 -0
  82. data/lib/active_admin/controller_action.rb +12 -0
  83. data/lib/active_admin/csv_builder.rb +45 -0
  84. data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
  85. data/lib/active_admin/dashboards/section.rb +34 -0
  86. data/lib/active_admin/dashboards.rb +48 -0
  87. data/lib/active_admin/devise.rb +43 -0
  88. data/lib/active_admin/dsl.rb +215 -0
  89. data/lib/active_admin/event.rb +31 -0
  90. data/lib/active_admin/form_builder.rb +109 -0
  91. data/lib/active_admin/helpers/optional_display.rb +34 -0
  92. data/lib/active_admin/iconic/icons.rb +142 -0
  93. data/lib/active_admin/iconic.rb +51 -0
  94. data/lib/active_admin/locales/da.yml +26 -0
  95. data/lib/active_admin/locales/en.yml +34 -0
  96. data/lib/active_admin/locales/es.yml +34 -0
  97. data/lib/active_admin/locales/pt.yml +34 -0
  98. data/lib/active_admin/menu.rb +42 -0
  99. data/lib/active_admin/menu_item.rb +73 -0
  100. data/lib/active_admin/namespace.rb +198 -0
  101. data/lib/active_admin/page_config.rb +15 -0
  102. data/lib/active_admin/renderer.rb +87 -0
  103. data/lib/active_admin/resource/belongs_to.rb +31 -0
  104. data/lib/active_admin/resource.rb +229 -0
  105. data/lib/active_admin/resource_controller/action_builder.rb +21 -0
  106. data/lib/active_admin/resource_controller/actions.rb +79 -0
  107. data/lib/active_admin/resource_controller/callbacks.rb +47 -0
  108. data/lib/active_admin/resource_controller/collection.rb +144 -0
  109. data/lib/active_admin/resource_controller/filters.rb +58 -0
  110. data/lib/active_admin/resource_controller/form.rb +42 -0
  111. data/lib/active_admin/resource_controller/menu.rb +29 -0
  112. data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
  113. data/lib/active_admin/resource_controller/scoping.rb +36 -0
  114. data/lib/active_admin/resource_controller/sidebars.rb +38 -0
  115. data/lib/active_admin/resource_controller.rb +119 -0
  116. data/lib/active_admin/router.rb +85 -0
  117. data/lib/active_admin/scope.rb +17 -0
  118. data/lib/active_admin/sidebar.rb +43 -0
  119. data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
  120. data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
  121. data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
  122. data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
  123. data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
  124. data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
  125. data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
  126. data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
  127. data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
  128. data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
  129. data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
  130. data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
  131. data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
  132. data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
  133. data/lib/active_admin/stylesheets/active_admin.scss +429 -0
  134. data/lib/active_admin/version.rb +3 -0
  135. data/lib/active_admin/view_factory.rb +21 -0
  136. data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
  137. data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
  138. data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
  139. data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
  140. data/lib/active_admin/view_helpers/display_helper.rb +38 -0
  141. data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
  142. data/lib/active_admin/view_helpers/form_helper.rb +12 -0
  143. data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
  144. data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
  145. data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
  146. data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
  147. data/lib/active_admin/view_helpers/table_helper.rb +12 -0
  148. data/lib/active_admin/view_helpers/title_helper.rb +11 -0
  149. data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
  150. data/lib/active_admin/view_helpers.rb +23 -0
  151. data/lib/active_admin/views/action_items.rb +17 -0
  152. data/lib/active_admin/views/components/attributes_table.rb +66 -0
  153. data/lib/active_admin/views/components/columns.rb +47 -0
  154. data/lib/active_admin/views/components/paginated_collection.rb +92 -0
  155. data/lib/active_admin/views/components/panel.rb +26 -0
  156. data/lib/active_admin/views/components/scopes.rb +70 -0
  157. data/lib/active_admin/views/components/sidebar_section.rb +30 -0
  158. data/lib/active_admin/views/components/status_tag.rb +55 -0
  159. data/lib/active_admin/views/components/table_for.rb +193 -0
  160. data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
  161. data/lib/active_admin/views/header_renderer.rb +37 -0
  162. data/lib/active_admin/views/index_as_block.rb +24 -0
  163. data/lib/active_admin/views/index_as_blog.rb +89 -0
  164. data/lib/active_admin/views/index_as_grid.rb +49 -0
  165. data/lib/active_admin/views/index_as_table.rb +75 -0
  166. data/lib/active_admin/views/pages/base.rb +144 -0
  167. data/lib/active_admin/views/pages/dashboard.rb +59 -0
  168. data/lib/active_admin/views/pages/edit.rb +27 -0
  169. data/lib/active_admin/views/pages/index.rb +66 -0
  170. data/lib/active_admin/views/pages/new.rb +27 -0
  171. data/lib/active_admin/views/pages/show.rb +56 -0
  172. data/lib/active_admin/views/tabs_renderer.rb +58 -0
  173. data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
  174. data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
  175. data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
  176. data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
  177. data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
  178. data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
  179. data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
  180. data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
  181. data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
  182. data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
  183. data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
  184. data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
  185. data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
  186. data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
  187. data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
  188. data/lib/active_admin/views.rb +8 -0
  189. data/lib/active_admin.rb +71 -0
  190. data/lib/activeadmin.rb +1 -0
  191. data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
  192. data/lib/generators/active_admin/install/install_generator.rb +46 -0
  193. data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
  194. data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
  195. data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
  196. data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
  197. data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
  198. data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
  199. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
  200. data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
  201. data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
  202. data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
  203. data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
  204. data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
  205. data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
  206. data/spec/integration/belongs_to_spec.rb +42 -0
  207. data/spec/spec_helper.rb +156 -0
  208. data/spec/support/integration_example_group.rb +33 -0
  209. data/spec/support/rails_template.rb +32 -0
  210. data/spec/support/rails_template_with_data.rb +32 -0
  211. data/spec/support/templates/cucumber.rb +24 -0
  212. data/spec/unit/abstract_view_factory_spec.rb +79 -0
  213. data/spec/unit/action_builder_spec.rb +88 -0
  214. data/spec/unit/action_items_spec.rb +27 -0
  215. data/spec/unit/application_spec.rb +67 -0
  216. data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
  217. data/spec/unit/arbre/html/element_spec.rb +224 -0
  218. data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
  219. data/spec/unit/arbre/html/tag_spec.rb +63 -0
  220. data/spec/unit/arbre/html_spec.rb +210 -0
  221. data/spec/unit/asset_registration_spec.rb +37 -0
  222. data/spec/unit/auto_link_spec.rb +39 -0
  223. data/spec/unit/belongs_to_spec.rb +45 -0
  224. data/spec/unit/breadcrumbs_spec.rb +110 -0
  225. data/spec/unit/comments_spec.rb +57 -0
  226. data/spec/unit/component_spec.rb +18 -0
  227. data/spec/unit/components/attributes_table_spec.rb +100 -0
  228. data/spec/unit/components/columns_spec.rb +75 -0
  229. data/spec/unit/components/panel_spec.rb +31 -0
  230. data/spec/unit/components/sidebar_section_spec.rb +37 -0
  231. data/spec/unit/components/status_tag_spec.rb +81 -0
  232. data/spec/unit/components/table_for_spec.rb +130 -0
  233. data/spec/unit/controller_filters_spec.rb +27 -0
  234. data/spec/unit/csv_builder_spec.rb +83 -0
  235. data/spec/unit/dashboard_controller_spec.rb +26 -0
  236. data/spec/unit/dashboard_section_spec.rb +56 -0
  237. data/spec/unit/dashboards_spec.rb +59 -0
  238. data/spec/unit/display_name_spec.rb +29 -0
  239. data/spec/unit/event_spec.rb +41 -0
  240. data/spec/unit/filter_form_builder_spec.rb +179 -0
  241. data/spec/unit/form_builder_spec.rb +238 -0
  242. data/spec/unit/menu_item_spec.rb +143 -0
  243. data/spec/unit/menu_spec.rb +53 -0
  244. data/spec/unit/namespace_spec.rb +203 -0
  245. data/spec/unit/pretty_format_spec.rb +35 -0
  246. data/spec/unit/registration_spec.rb +76 -0
  247. data/spec/unit/renderer_spec.rb +108 -0
  248. data/spec/unit/resource_controller/collection_spec.rb +34 -0
  249. data/spec/unit/resource_controller_spec.rb +147 -0
  250. data/spec/unit/resource_spec.rb +290 -0
  251. data/spec/unit/routing_spec.rb +88 -0
  252. data/spec/unit/scope_spec.rb +31 -0
  253. data/spec/unit/tabs_renderer_spec.rb +85 -0
  254. data/spec/unit/view_factory_spec.rb +16 -0
  255. metadata +482 -0
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ module MockRegistration
4
+ extend ActiveAdmin::AssetRegistration
5
+ end
6
+
7
+ describe ActiveAdmin::AssetRegistration do
8
+
9
+ before do
10
+ MockRegistration.clear_stylesheets!
11
+ MockRegistration.clear_javascripts!
12
+ end
13
+
14
+ it "should register a stylesheet file" do
15
+ MockRegistration.register_stylesheet "active_admin.css"
16
+ MockRegistration.stylesheets.should == ["active_admin.css"]
17
+ end
18
+
19
+ it "should clear all existing stylesheets" do
20
+ MockRegistration.register_stylesheet "active_admin.css"
21
+ MockRegistration.stylesheets.should == ["active_admin.css"]
22
+ MockRegistration.clear_stylesheets!
23
+ MockRegistration.stylesheets.should == []
24
+ end
25
+
26
+ it "should register a javascript file" do
27
+ MockRegistration.register_javascript "active_admin.js"
28
+ MockRegistration.javascripts.should == ["active_admin.js"]
29
+ end
30
+
31
+ it "should clear all existing javascripts" do
32
+ MockRegistration.register_javascript "active_admin.js"
33
+ MockRegistration.javascripts.should == ["active_admin.js"]
34
+ MockRegistration.clear_javascripts!
35
+ MockRegistration.javascripts.should == []
36
+ end
37
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ class AutoLinkMockResource
4
+ attr_accessor :namespace
5
+ def initialize(namespace)
6
+ @namespace = namespace
7
+ end
8
+ end
9
+
10
+ describe "auto linking resources" do
11
+ include ActiveAdmin::ViewHelpers::ActiveAdminApplicationHelper
12
+ include ActiveAdmin::ViewHelpers::AutoLinkHelper
13
+ include ActiveAdmin::ViewHelpers::DisplayHelper
14
+
15
+ let(:active_admin_config) { AutoLinkMockResource.new(namespace) }
16
+ let(:namespace){ ActiveAdmin::Namespace.new(ActiveAdmin::Application.new, :admin) }
17
+ let(:post){ Post.create! :title => "Hello World" }
18
+
19
+ def admin_post_path(post)
20
+ "/admin/posts/#{post.id}"
21
+ end
22
+
23
+ context "when the resource is not registered" do
24
+ it "should return the display name of the object" do
25
+ auto_link(post).should == "Hello World"
26
+ end
27
+ end
28
+
29
+ context "when the resource is registered" do
30
+ before do
31
+ namespace.register Post
32
+ end
33
+ it "should return a link with the display name of the object" do
34
+ self.should_receive(:link_to).with("Hello World", admin_post_path(post))
35
+ auto_link(post)
36
+ end
37
+ end
38
+
39
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ module ActiveAdmin
4
+ class Resource
5
+ describe BelongsTo do
6
+
7
+ let(:application){ ActiveAdmin::Application.new }
8
+ let(:namespace){ Namespace.new(application, :admin) }
9
+ let(:post){ namespace.register(Post) }
10
+ let(:belongs_to){ BelongsTo.new(post, :user) }
11
+
12
+ it "should have an owner" do
13
+ belongs_to.owner.should == post
14
+ end
15
+
16
+ it "should have a namespace" do
17
+ belongs_to.namespace.should == namespace
18
+ end
19
+
20
+ describe "finding the target" do
21
+ context "when the resource has been registered" do
22
+ let(:user){ namespace.register(User) }
23
+ before { user } # Ensure user is registered
24
+
25
+ it "should return the target resource" do
26
+ belongs_to.target.should == user
27
+ end
28
+ end
29
+
30
+ context "when the resource has not been registered" do
31
+ it "should raise a ActiveAdmin::BelongsTo::TargetNotFound" do
32
+ lambda {
33
+ belongs_to.target
34
+ }.should raise_error(ActiveAdmin::Resource::BelongsTo::TargetNotFound)
35
+ end
36
+ end
37
+ end
38
+
39
+ it "should be optional" do
40
+ belongs_to = BelongsTo.new post, :user, :optional => true
41
+ belongs_to.should be_optional
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,110 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Breadcrumbs" do
4
+
5
+ include ActiveAdmin::ViewHelpers
6
+
7
+ describe "generating a trail from paths" do
8
+
9
+ # Mock our params
10
+ def params; {}; end
11
+ # Mock link to and return a hash
12
+ def link_to(name, url); {:name => name, :path => url}; end
13
+
14
+ let(:trail) { breadcrumb_links(path) }
15
+
16
+ context "when request '/admin'" do
17
+ let(:path){ "/admin" }
18
+
19
+ it "should not have any items" do
20
+ trail.size.should == 0
21
+ end
22
+ end
23
+
24
+ context "when path '/admin/posts'" do
25
+ let(:path) { "/admin/posts" }
26
+
27
+ it "should have one item" do
28
+ trail.size.should == 1
29
+ end
30
+ it "should have a link to /admin" do
31
+ trail[0][:name].should == "Admin"
32
+ trail[0][:path].should == "/admin"
33
+ end
34
+ end
35
+
36
+ context "when path '/admin/posts/1'" do
37
+ let(:path) { "/admin/posts/1" }
38
+
39
+ it "should have 2 items" do
40
+ trail.size.should == 2
41
+ end
42
+ it "should have a link to /admin" do
43
+ trail[0][:name].should == "Admin"
44
+ trail[0][:path].should == "/admin"
45
+ end
46
+ it "should have a link to /admin/posts" do
47
+ trail[1][:name].should == "Posts"
48
+ trail[1][:path].should == "/admin/posts"
49
+ end
50
+ end
51
+
52
+ context "when path '/admin/posts/1/comments'" do
53
+ let(:path) { "/admin/posts/1/comments" }
54
+
55
+ it "should have 3 items" do
56
+ trail.size.should == 3
57
+ end
58
+ it "should have a link to /admin" do
59
+ trail[0][:name].should == "Admin"
60
+ trail[0][:path].should == "/admin"
61
+ end
62
+ it "should have a link to /admin/posts" do
63
+ trail[1][:name].should == "Posts"
64
+ trail[1][:path].should == "/admin/posts"
65
+ end
66
+
67
+ context "when Post.find(1) doesn't exist" do
68
+ it "should have a link to /admin/posts/1" do
69
+ trail[2][:name].should == "1"
70
+ trail[2][:path].should == "/admin/posts/1"
71
+ end
72
+ end
73
+
74
+ context "when Post.find(1) does exist" do
75
+ before do
76
+ Post.stub!(:find).and_return{ mock(:display_name => "Hello World") }
77
+ end
78
+ it "should have a link to /admin/posts/1 using display name" do
79
+ trail[2][:name].should == "Hello World"
80
+ trail[2][:path].should == "/admin/posts/1"
81
+ end
82
+ end
83
+ end
84
+
85
+ context "when path '/admin/posts/1/coments/1'" do
86
+ let(:path) { "/admin/posts/1/comments/1" }
87
+
88
+ it "should have 4 items" do
89
+ trail.size.should == 4
90
+ end
91
+ it "should have a link to /admin" do
92
+ trail[0][:name].should == "Admin"
93
+ trail[0][:path].should == "/admin"
94
+ end
95
+ it "should have a link to /admin/posts" do
96
+ trail[1][:name].should == "Posts"
97
+ trail[1][:path].should == "/admin/posts"
98
+ end
99
+ it "should have a link to /admin/posts/1" do
100
+ trail[2][:name].should == "1"
101
+ trail[2][:path].should == "/admin/posts/1"
102
+ end
103
+ it "should have a link to /admin/posts/1/comments" do
104
+ trail[3][:name].should == "Comments"
105
+ trail[3][:path].should == "/admin/posts/1/comments"
106
+ end
107
+ end
108
+
109
+ end
110
+ end
@@ -0,0 +1,57 @@
1
+ require 'spec_helper'
2
+
3
+ describe "Comments" do
4
+ let(:application){ ActiveAdmin::Application.new }
5
+
6
+ describe "Configuration" do
7
+ it "should have an array of namespaces which allow comments" do
8
+ application.allow_comments_in.should be_an_instance_of(Array)
9
+ end
10
+
11
+ it "should allow comments in the default namespace by default" do
12
+ application.allow_comments_in.should include(application.default_namespace)
13
+ end
14
+ end
15
+
16
+ describe ActiveAdmin::Comment do
17
+ describe "Associations and Validations" do
18
+ it { should belong_to :resource }
19
+ it { should belong_to :author }
20
+
21
+ it { should validate_presence_of :resource_id }
22
+ it { should validate_presence_of :resource_type }
23
+ it { should validate_presence_of :body }
24
+ it { should validate_presence_of :namespace }
25
+ end
26
+ end
27
+
28
+ describe ActiveAdmin::Comments::NamespaceHelper do
29
+ describe "#comments?" do
30
+ it "should have comments if the namespace is in the settings" do
31
+ ns = ActiveAdmin::Namespace.new(application, :admin)
32
+ ns.comments?.should be_true
33
+ end
34
+ it "should not have comments if the namespace is not in the settings" do
35
+ ns = ActiveAdmin::Namespace.new(application, :not_in_comments)
36
+ ns.comments?.should be_false
37
+ end
38
+ end
39
+ end
40
+
41
+ describe ActiveAdmin::Comments::ResourceHelper do
42
+ it "should add an attr_accessor :comments to ActiveAdmin::Resource" do
43
+ ns = ActiveAdmin::Namespace.new(application, :admin)
44
+ resource = ActiveAdmin::Resource.new(ns, Post)
45
+ resource.comments.should be_nil
46
+ resource.comments = true
47
+ resource.comments.should be_true
48
+ end
49
+
50
+ it "should not have comment if set to false by in allow_comments_in" do
51
+ ns = ActiveAdmin::Namespace.new(application, application.default_namespace)
52
+ resource = ActiveAdmin::Resource.new(ns, Post)
53
+ resource.comments = false
54
+ resource.comments?.should be_false
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ class MockComponentClass < ActiveAdmin::Component; end
4
+
5
+ describe ActiveAdmin::Component do
6
+
7
+ let(:component_class){ MockComponentClass }
8
+ let(:component){ component_class.new }
9
+
10
+ it "should be a subclass of an html div" do
11
+ ActiveAdmin::Component.ancestors.should include(Arbre::HTML::Div)
12
+ end
13
+
14
+ it "should render to a div, even as a subclass" do
15
+ component.tag_name.should == 'div'
16
+ end
17
+
18
+ end
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Views::AttributesTable do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ describe "creating with the dsl" do
8
+ let(:helpers) { action_view }
9
+
10
+ let(:post) do
11
+ post = Post.new :title => "Hello World", :body => nil
12
+ post.stub!(:id){ 1 }
13
+ post.stub!(:new_record?){ false }
14
+ post
15
+ end
16
+
17
+
18
+ # Loop through a few different ways to make the same table
19
+ # and ensure that they produce the same results
20
+ {
21
+ "when attributes are passed in to the builder methods" => proc {
22
+ attributes_table_for post, :id, :title, :body
23
+ },
24
+ "when attributes are built using the block" => proc {
25
+ attributes_table_for post do
26
+ rows :id, :title, :body
27
+ end
28
+ },
29
+ "when each attribute is passed in by itself" => proc {
30
+ attributes_table_for post do
31
+ row :id
32
+ row :title
33
+ row :body
34
+ end
35
+ },
36
+ "when you create each row with a custom block" => proc {
37
+ attributes_table_for post do
38
+ row("Id") { post.id }
39
+ row("Title"){ post.title }
40
+ row("Body") { post.body }
41
+ end
42
+ }
43
+
44
+ }.each do |context_title, table_decleration|
45
+ context context_title do
46
+ let(:table) { instance_eval &table_decleration }
47
+
48
+ it "should render a div wrapper with the class '.attributes_table'" do
49
+ table.tag_name.should == 'div'
50
+ table.attr(:class).should include('attributes_table')
51
+ end
52
+ it "should add id and type class" do
53
+ table.class_names.should include("post")
54
+ table.id.should == "attributes_table_post_1"
55
+ end
56
+
57
+ it "should render 3 rows" do
58
+ table.find_by_tag("tr").size.should == 3
59
+ end
60
+
61
+ describe "rendering the rows" do
62
+ [
63
+ ["Id" , "2"],
64
+ ["Title" , "Hello World"],
65
+ ["Body" , "<span class=\"empty\">Empty</span>"]
66
+ ].each_with_index do |set, i|
67
+ let(:title){ set[0] }
68
+ let(:content){ set[1] }
69
+ let(:current_row){ table.find_by_tag("tr")[i] }
70
+
71
+ describe "for #{set[0]}" do
72
+ it "should have the title '#{set[0]}'" do
73
+ current_row.find_by_tag("th").first.content.should == title
74
+ end
75
+ it "should have the content '#{set[1]}'" do
76
+ current_row.find_by_tag("td").first.content.chomp.strip.should == content
77
+ end
78
+ end
79
+ end
80
+ end # describe rendering rows
81
+
82
+ end
83
+ end # describe dsl styles
84
+
85
+ it "should allow html content inside the attributes table" do
86
+ table = attributes_table_for(post) do
87
+ row("ID"){ span(post.id, :class => 'id') }
88
+ end
89
+ table.find_by_tag("td").first.content.chomp.strip.should == "<span class=\"id\">1</span>"
90
+ end
91
+
92
+ it "should check if an association exists when an attribute has id in it" do
93
+ post.author = User.new(:username => "john_doe")
94
+ table = attributes_table_for post, :author_id
95
+ table.find_by_tag("td").first.content.should == "john_doe"
96
+ end
97
+
98
+ end
99
+
100
+ end
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Views::Columns do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ describe "Rendering one column" do
8
+ let(:cols) do
9
+ columns do
10
+ column { span "Hello World" }
11
+ end
12
+ end
13
+
14
+ it "should have the class .columns" do
15
+ cols.class_list.should include("columns")
16
+ end
17
+
18
+ it "should have one column" do
19
+ cols.children.size.should == 1
20
+ cols.children.first.class_list.should include("column")
21
+ end
22
+
23
+ it "should have one column with the width 100%" do
24
+ cols.children.first.attr(:style).should include("width: 100%")
25
+ end
26
+ end
27
+
28
+ describe "Rendering two columns" do
29
+ let(:cols) do
30
+ columns do
31
+ column { span "Hello World" }
32
+ column { span "Hello World" }
33
+ end
34
+ end
35
+
36
+ it "should have two columns" do
37
+ cols.children.size.should == 2
38
+ end
39
+
40
+ it "should have a first column with width 49% and margin 2%" do
41
+ cols.children.first.attr(:style).should == "width: 49%; margin-right: 2%;"
42
+ end
43
+
44
+ it "should have a second column with width 49% and no right margin" do
45
+ cols.children.last.attr(:style).should == "width: 49%;"
46
+ end
47
+ end
48
+
49
+ describe "Rendering four columns" do
50
+ let(:cols) do
51
+ columns do
52
+ column { span "Hello World" }
53
+ column { span "Hello World" }
54
+ column { span "Hello World" }
55
+ column { span "Hello World" }
56
+ end
57
+ end
58
+
59
+ it "should have four columns" do
60
+ cols.children.size.should == 4
61
+ end
62
+
63
+
64
+ (0..2).to_a.each do |index|
65
+ it "should have column #{index + 1} with width 49% and margin 2%" do
66
+ cols.children[index].attr(:style).should == "width: 23.5%; margin-right: 2%;"
67
+ end
68
+ end
69
+
70
+ it "should have column 4 with width 49% and no margin" do
71
+ cols.children[3].attr(:style).should == "width: 23.5%;"
72
+ end
73
+ end
74
+
75
+ end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Views::Panel do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ let(:helpers) { action_view }
8
+
9
+ let(:the_panel) do
10
+ panel "My Title" do
11
+ span("Hello World")
12
+ end
13
+ end
14
+
15
+ it "should have a title h3" do
16
+ the_panel.find_by_tag("h3").first.content.should == "My Title"
17
+ end
18
+
19
+ it "should have a contents div" do
20
+ the_panel.find_by_tag("div").first.class_list.should include("panel_contents")
21
+ end
22
+
23
+ it "should add children to the contents div" do
24
+ the_panel.find_by_tag("span").first.parent.should == the_panel.find_by_tag("div").first
25
+ end
26
+
27
+ it "should set the icon" do
28
+ panel("Title", :icon => :arrow_down).find_by_tag("h3").first.content.should include("span class=\"icon")
29
+ end
30
+
31
+ end
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Views::SidebarSection do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ let(:section) do
8
+ ActiveAdmin::Sidebar::Section.new(:help) do
9
+ span "Help Me"
10
+ end
11
+ end
12
+
13
+ let(:html) do
14
+ sidebar_section(section)
15
+ end
16
+
17
+ it "should have a title h3" do
18
+ html.find_by_tag("h3").first.content.should == "Help"
19
+ end
20
+
21
+ it "should have the class of 'sidebar_section'" do
22
+ html.class_list.should include("sidebar_section")
23
+ end
24
+
25
+ it "should have an id based on the title" do
26
+ html.id.should == "help_sidebar_section"
27
+ end
28
+
29
+ it "should have a contents div" do
30
+ html.find_by_tag("div").first.class_list.should include("panel_contents")
31
+ end
32
+
33
+ it "should add children to the contents div" do
34
+ html.find_by_tag("span").first.parent.should == html.find_by_tag("div").first
35
+ end
36
+
37
+ end
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Views::StatusTag do
4
+ include Arbre::HTML
5
+ let(:assigns) { {} }
6
+
7
+ let(:helpers) { action_view }
8
+
9
+ describe "#status_tag" do
10
+ subject { status_tag(nil) }
11
+
12
+ its(:tag_name) { should == 'span' }
13
+ its(:class_list) { should include('status') }
14
+
15
+ context "when status is 'completed'" do
16
+ subject { status_tag('completed') }
17
+
18
+ its(:tag_name) { should == 'span' }
19
+ its(:class_list) { should include('status') }
20
+ its(:class_list) { should include('completed') }
21
+ its(:content) { should == 'Completed' }
22
+ end
23
+
24
+ context "when status is 'in_progress'" do
25
+ subject { status_tag('in_progress') }
26
+
27
+ its(:class_list) { should include('in_progress') }
28
+ its(:content) { should == 'In Progress' }
29
+ end
30
+
31
+ context "when status is 'In progress'" do
32
+ subject { status_tag('In progress') }
33
+
34
+ its(:class_list) { should include('in_progress') }
35
+ its(:content) { should == 'In Progress' }
36
+ end
37
+
38
+ context "when status is an empty string" do
39
+ subject { status_tag('') }
40
+
41
+ its(:class_list) { should include('status') }
42
+ its(:content) { should == '' }
43
+ end
44
+
45
+ context "when status is nil" do
46
+ subject { status_tag(nil) }
47
+
48
+ its(:class_list) { should include('status') }
49
+ its(:content) { should == '' }
50
+ end
51
+
52
+ context "when status is 'Active' and type is :ok" do
53
+ subject { status_tag('Active', :ok) }
54
+
55
+ its(:class_list) { should include('status') }
56
+ its(:class_list) { should include('active') }
57
+ its(:class_list) { should include('ok') }
58
+ end
59
+
60
+ context "when status is 'Active' and class is 'ok'" do
61
+ subject { status_tag('Active', :class => 'ok') }
62
+
63
+ its(:class_list) { should include('status') }
64
+ its(:class_list) { should include('active') }
65
+ its(:class_list) { should include('ok') }
66
+ end
67
+
68
+ context "when status is 'So useless', type is :ok, class is 'woot awesome' and id is 'useless'" do
69
+ subject { status_tag('So useless', :ok, :class => 'woot awesome', :id => 'useless') }
70
+
71
+ its(:content) { should == 'So Useless' }
72
+ its(:class_list) { should include('status') }
73
+ its(:class_list) { should include('ok') }
74
+ its(:class_list) { should include('so_useless') }
75
+ its(:class_list) { should include('woot') }
76
+ its(:class_list) { should include('awesome') }
77
+ its(:id) { should == 'useless' }
78
+ end
79
+
80
+ end # describe "#status_tag"
81
+ end