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,130 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Views::TableFor do
4
+ describe "creating with the dsl" do
5
+ include Arbre::HTML
6
+
7
+ let(:assigns){ {} }
8
+ let(:helpers){ mock_action_view }
9
+
10
+ let(:collection) do
11
+ [Post.new(:title => "First Post"), Post.new(:title => "Second Post"), Post.new(:title => "Third Post")]
12
+ end
13
+
14
+ context "when creating a column with a symbol" do
15
+ let(:table) do
16
+ table_for(collection) do
17
+ column :title
18
+ end
19
+ end
20
+
21
+ it "should create a table header based on the symbol" do
22
+ table.find_by_tag("th").first.content.should == "Title"
23
+ end
24
+
25
+ it "should create a table row for each element in the collection" do
26
+ table.find_by_tag("tr").size.should == 4 # 1 for head, 3 for rows
27
+ end
28
+
29
+ ["First Post", "Second Post", "Third Post"].each_with_index do |content, index|
30
+ it "should create a cell with #{content}" do
31
+ table.find_by_tag("td")[index].content.should == content
32
+ end
33
+ end
34
+ end
35
+
36
+ context "when creating many columns with symbols" do
37
+ let(:table) do
38
+ table_for(collection) do
39
+ column :title
40
+ column :created_at
41
+ end
42
+ end
43
+
44
+ it "should create a table header based on the symbol" do
45
+ table.find_by_tag("th").first.content.should == "Title"
46
+ table.find_by_tag("th").last.content.should == "Created At"
47
+ end
48
+
49
+ it "should create a table row for each element in the collection" do
50
+ table.find_by_tag("tr").size.should == 4 # 1 for head, 3 for rows
51
+ end
52
+
53
+ it "should create a cell for each column" do
54
+ table.find_by_tag("td").size.should == 6
55
+ end
56
+ end
57
+
58
+ context "when creating a column with block content" do
59
+ let(:table) do
60
+ table_for(collection) do
61
+ column :title do |post|
62
+ span(post.title)
63
+ end
64
+ end
65
+ end
66
+
67
+ [ "<span>First Post</span>",
68
+ "<span>Second Post</span>",
69
+ "<span>Third Post</span>" ].each_with_index do |content, index|
70
+ it "should create a cell with #{content}" do
71
+ table.find_by_tag("td")[index].content.strip.should == content
72
+ end
73
+ end
74
+ end
75
+
76
+ context "when creating a column with multiple block content" do
77
+ let(:table) do
78
+ table_for(collection) do
79
+ column :title do |post|
80
+ span(post.title)
81
+ span(post.title)
82
+ end
83
+ end
84
+ end
85
+
86
+ 3.times do |index|
87
+ it "should create a cell with multiple elements in row #{index}" do
88
+ table.find_by_tag("td")[index].find_by_tag("span").size.should == 2
89
+ end
90
+ end
91
+ end
92
+ end
93
+
94
+ describe "column sorting" do
95
+
96
+ def build_column(*args, &block)
97
+ ActiveAdmin::Views::TableFor::Column.new(*args, &block)
98
+ end
99
+
100
+ subject { table_column }
101
+
102
+ context "when default" do
103
+ let(:table_column){ build_column(:username) }
104
+ it { should be_sortable }
105
+ its(:sort_key){ should == "username" }
106
+ end
107
+
108
+ context "when a block given with no sort key" do
109
+ let(:table_column){ build_column("Username"){ } }
110
+ it { should_not be_sortable }
111
+ end
112
+
113
+ context "when a block given with a sort key" do
114
+ let(:table_column){ build_column("Username", :sortable => :username){ } }
115
+ it { should be_sortable }
116
+ its(:sort_key){ should == "username" }
117
+ end
118
+
119
+ context "when :sortable => false with a symbol" do
120
+ let(:table_column){ build_column(:username, :sortable => false) }
121
+ it { should_not be_sortable }
122
+ end
123
+
124
+ context "when :sortable => false with a symbol and string" do
125
+ let(:table_column){ build_column("Username", :username, :sortable => false) }
126
+ it { should_not be_sortable }
127
+ end
128
+
129
+ end
130
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin, "filters" do
4
+ let(:application){ ActiveAdmin::Application.new }
5
+
6
+ describe "before filters" do
7
+ it "should add a new before filter to ActiveAdmin::ResourceController" do
8
+ ActiveAdmin::ResourceController.should_receive(:before_filter).and_return(true)
9
+ application.before_filter :my_filter, :only => :show
10
+ end
11
+ end
12
+
13
+ describe "after filters" do
14
+ it "should add a new after filter to ActiveAdmin::ResourceController" do
15
+ ActiveAdmin::ResourceController.should_receive(:after_filter).and_return(true)
16
+ application.after_filter :my_filter, :only => :show
17
+ end
18
+ end
19
+
20
+ describe "around filters" do
21
+ it "should add a new around filter to ActiveAdmin::ResourceController" do
22
+ ActiveAdmin::ResourceController.should_receive(:around_filter).and_return(true)
23
+ application.around_filter :my_filter, :only => :show
24
+ end
25
+ end
26
+
27
+ end
@@ -0,0 +1,83 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::CSVBuilder do
4
+
5
+ describe '.default_for_resource using Post' do
6
+ let(:csv_builder) { ActiveAdmin::CSVBuilder.default_for_resource(Post) }
7
+
8
+ it "should return a default csv_builder for Post" do
9
+ csv_builder.should be_a(ActiveAdmin::CSVBuilder)
10
+ end
11
+
12
+ specify "the first column should be Id" do
13
+ csv_builder.columns.first.name.should == 'Id'
14
+ csv_builder.columns.first.data.should == :id
15
+ end
16
+
17
+ specify "the following columns should be content_column" do
18
+ csv_builder.columns[1..-1].each_with_index do |column, index|
19
+ column.name.should == Post.content_columns[index].name.titleize
20
+ column.data.should == Post.content_columns[index].name.to_sym
21
+ end
22
+ end
23
+ end
24
+
25
+ context 'when empty' do
26
+ let(:builder){ ActiveAdmin::CSVBuilder.new }
27
+
28
+ it "should have no columns" do
29
+ builder.columns.should == []
30
+ end
31
+ end
32
+
33
+ context "with a symbol column (:title)" do
34
+ let(:builder) do
35
+ ActiveAdmin::CSVBuilder.new do
36
+ column :title
37
+ end
38
+ end
39
+
40
+ it "should have one colum" do
41
+ builder.columns.size.should == 1
42
+ end
43
+
44
+ describe "the column" do
45
+ let(:column){ builder.columns.first }
46
+
47
+ it "should have a name of 'Title'" do
48
+ column.name.should == "Title"
49
+ end
50
+
51
+ it "should have the data :title" do
52
+ column.data.should == :title
53
+ end
54
+ end
55
+ end
56
+
57
+ context "with a block and title" do
58
+ let(:builder) do
59
+ ActiveAdmin::CSVBuilder.new do
60
+ column "My title" do
61
+ # nothing
62
+ end
63
+ end
64
+ end
65
+
66
+ it "should have one colum" do
67
+ builder.columns.size.should == 1
68
+ end
69
+
70
+ describe "the column" do
71
+ let(:column){ builder.columns.first }
72
+
73
+ it "should have a name of 'My title'" do
74
+ column.name.should == "My title"
75
+ end
76
+
77
+ it "should have the data :title" do
78
+ column.data.should be_an_instance_of(Proc)
79
+ end
80
+ end
81
+ end
82
+
83
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+
4
+ module Admin
5
+ class DashboardController < ActiveAdmin::Dashboards::DashboardController
6
+ end
7
+ end
8
+ class DashboardController < ActiveAdmin::Dashboards::DashboardController; end
9
+
10
+ describe ActiveAdmin::Dashboards::DashboardController do
11
+
12
+ describe "getting the namespace name" do
13
+ subject{ controller.send :namespace }
14
+
15
+ context "when admin namespace" do
16
+ let(:controller){ Admin::DashboardController.new }
17
+ it { should == :admin }
18
+ end
19
+
20
+ context "when root namespace" do
21
+ let(:controller){ DashboardController.new }
22
+ it { should == :root }
23
+ end
24
+ end
25
+
26
+ end
@@ -0,0 +1,56 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Dashboards::Section do
4
+
5
+ def section(options = {})
6
+ name = options.delete(:name) || "Recent Posts"
7
+ ActiveAdmin::Dashboards::Section.new(:admin, name, options){ }
8
+ end
9
+
10
+ describe "accessors" do
11
+ it "should have a namespace" do
12
+ section.namespace.should == :admin
13
+ end
14
+
15
+ it "should have a block" do
16
+ section.block.class.should == Proc
17
+ end
18
+
19
+ it "should have a name" do
20
+ section.name.should == 'Recent Posts'
21
+ end
22
+ end
23
+
24
+ describe "priority" do
25
+ context "when not set" do
26
+ subject{ section.priority }
27
+ it { should == ActiveAdmin::Dashboards::Section::DEFAULT_PRIORITY }
28
+ end
29
+
30
+ context "when set" do
31
+ subject{ section(:priority => 1).priority }
32
+ it { should == 1 }
33
+ end
34
+ end
35
+
36
+ describe "icon" do
37
+ it "should set the icon" do
38
+ s = section(:icon => :my_icon)
39
+ s.icon.should == :my_icon
40
+ end
41
+ it "should be nil by default" do
42
+ section.icon.should be_nil
43
+ end
44
+ end
45
+
46
+ describe "sorting sections" do
47
+ it "should sort by priority then alpha" do
48
+ s1 = section :name => "Woot"
49
+ s2 = section :name => :Alpha
50
+ s3 = section :name => "Zulu", :priority => 1
51
+ s4 = section :name => "Beta", :priority => 100
52
+ [s1,s2,s3,s4].sort.should == [s3, s2, s1, s4]
53
+ end
54
+ end
55
+
56
+ end
@@ -0,0 +1,59 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Dashboards do
4
+
5
+ after(:each) do
6
+ ActiveAdmin::Dashboards.clear_all_sections!
7
+ end
8
+
9
+ describe "adding sections" do
10
+ before do
11
+ ActiveAdmin::Dashboards.clear_all_sections!
12
+ ActiveAdmin::Dashboards.add_section('Recent Posts')
13
+ end
14
+ it "should add a new section namespaced" do
15
+ ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
16
+ end
17
+ end
18
+
19
+ describe "adding sections using the build syntax" do
20
+ before do
21
+ ActiveAdmin::Dashboards.clear_all_sections!
22
+ ActiveAdmin::Dashboards.build do
23
+ section "Recent Posts" do
24
+ end
25
+ end
26
+ end
27
+
28
+ it "should add a new section" do
29
+ ActiveAdmin::Dashboards.sections[:admin].first.should be_an_instance_of(ActiveAdmin::Dashboards::Section)
30
+ end
31
+ end
32
+
33
+ describe "clearing all sections" do
34
+ before do
35
+ ActiveAdmin::Dashboards.add_section('Recent Posts')
36
+ end
37
+ it "should clear all sections" do
38
+ ActiveAdmin::Dashboards.clear_all_sections!
39
+ ActiveAdmin::Dashboards.sections.keys.should be_empty
40
+ end
41
+ end
42
+
43
+ describe "finding namespaced sections" do
44
+ context "when the namespace exists" do
45
+ before do
46
+ ActiveAdmin::Dashboards.add_section('Recent Posts')
47
+ end
48
+ it "should return an array of sections" do
49
+ ActiveAdmin::Dashboards.sections_for_namespace(:admin).should_not be_empty
50
+ end
51
+ end
52
+
53
+ context "when the namespace does not exists" do
54
+ it "should return an empty array" do
55
+ ActiveAdmin::Dashboards.sections_for_namespace(:not_a_namespace).should be_empty
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,29 @@
1
+ require 'spec_helper'
2
+
3
+ describe "display names" do
4
+
5
+ include ActiveAdmin::ViewHelpers
6
+
7
+ [:display_name, :full_name, :name, :username, :login, :title, :email, :to_s].each do |m|
8
+ it "should return #{m} if defined" do
9
+ r = Class.new do
10
+ define_method m do
11
+ m.to_s
12
+ end
13
+ end.new
14
+ display_name(r).should == m.to_s
15
+ end
16
+ end
17
+
18
+ it "should memeoize the result for the class" do
19
+ c = Class.new do
20
+ def name
21
+ "My Name"
22
+ end
23
+ end
24
+ display_name(c.new).should == "My Name"
25
+ ActiveAdmin.application.should_not_receive(:display_name_methods)
26
+ display_name(c.new).should == "My Name"
27
+ end
28
+
29
+ end
@@ -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
@@ -0,0 +1,179 @@
1
+ require 'spec_helper'
2
+
3
+
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
15
+
16
+ def view.protect_against_forgery?
17
+ false
18
+ end
19
+
20
+ view
21
+ end
22
+
23
+ def filter(name, options = {})
24
+ search = Post.search
25
+ active_admin_filters_form_for(search, [options.merge(:attribute => name)])
26
+ end
27
+
28
+ describe "the form in general" do
29
+ let(:body) { filter :title }
30
+
31
+ it "should generate a form which submits via get" do
32
+ body.should have_tag("form", :attributes => { :method => 'get' })
33
+ end
34
+
35
+ it "should generate a filter button" do
36
+ body.should have_tag("input", :attributes => { :type => "submit",
37
+ :value => "Filter" })
38
+ end
39
+
40
+ it "should only generate the form once" do
41
+ body.scan(/q\[title_contains\]/).size.should == 1
42
+ end
43
+
44
+ it "should generate a clear filters link" do
45
+ body.should have_tag("a", "Clear Filters", :attributes => { :class => "clear_filters_btn" })
46
+ end
47
+ end
48
+
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
55
+
56
+ it "should label a text field with search" do
57
+ body.should have_tag('label', 'Search Title')
58
+ end
59
+ end
60
+
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
71
+ end
72
+
73
+ describe "datetime attribute" do
74
+ let(:body) { filter :created_at }
75
+
76
+ it "should generate a date greater than" do
77
+ body.should have_tag("input", :attributes => { :name => "q[created_at_gte]", :class => "datepicker"})
78
+ end
79
+ it "should generate a date less than" do
80
+ body.should have_tag("input", :attributes => { :name => "q[created_at_lte]", :class => "datepicker"})
81
+ end
82
+ end
83
+
84
+ describe "integer attribute" do
85
+ let(:body) { filter :id }
86
+
87
+ it "should generate a select option for equal to" do
88
+ body.should have_tag("option", "Equal To", :attributes => { :value => 'id_eq' })
89
+ end
90
+ it "should generate a select option for greater than" do
91
+ body.should have_tag("option", "Greater Than")
92
+ end
93
+ it "should generate a select option for less than" do
94
+ body.should have_tag("option", "Less Than")
95
+ end
96
+ it "should generate a text field for input" do
97
+ body.should have_tag("input", :attributes => {
98
+ :name => /q\[(id_eq|id_equals)\]/ })
99
+ end
100
+ it "should select the option which is currently being filtered"
101
+ end
102
+
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
108
+
109
+ context "when given as the _id attribute name" do
110
+ let(:body) { filter :author_id }
111
+
112
+ it "should not render as an integer" do
113
+ body.should_not have_tag("input", :attributes => {
114
+ :name => "q[author_id_eq]"})
115
+ end
116
+ it "should render as belongs to select" do
117
+ body.should have_tag("select", :attributes => {
118
+ :name => "q[author_id_eq]"})
119
+ body.should have_tag("option", "jane_doe", :attributes => {
120
+ :value => @jane.id })
121
+ end
122
+ end
123
+
124
+ context "when given as the name of the relationship" do
125
+ let(:body) { filter :author }
126
+
127
+ it "should generate a select" do
128
+ body.should have_tag("select", :attributes => {
129
+ :name => "q[author_id_eq]"})
130
+ end
131
+ it "should set the default text to 'Any'" do
132
+ body.should have_tag("option", "Any", :attributes => {
133
+ :value => "" })
134
+ end
135
+ it "should create an option for each related object" do
136
+ body.should have_tag("option", "john_doe", :attributes => {
137
+ :value => @john.id })
138
+ body.should have_tag("option", "jane_doe", :attributes => {
139
+ :value => @jane.id })
140
+ end
141
+
142
+ context "with a proc" do
143
+ let :body do
144
+ filter :title, :as => :select, :collection => proc{ ['Title One', 'Title Two'] }
145
+ end
146
+
147
+ it "should use call the proc as the collection" do
148
+ body.should have_tag("option", "Title One")
149
+ body.should have_tag("option", "Title Two")
150
+ end
151
+ end
152
+ end
153
+
154
+ context "as check boxes" do
155
+ let(:body) { filter :author, :as => :check_boxes }
156
+
157
+ it "should create a check box for each related object" do
158
+ body.should have_tag("input", :attributes => {
159
+ :name => "q[author_id_in][]",
160
+ :type => "checkbox",
161
+ :value => @john.id })
162
+ body.should have_tag("input", :attributes => {
163
+ :name => "q[author_id_in][]",
164
+ :type => "checkbox",
165
+ :value => @jane.id })
166
+ end
167
+ end
168
+
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
177
+ end
178
+ end # belongs to
179
+ end