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,238 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::FormBuilder do
4
+ include Arbre::HTML
5
+ let(:assigns){ {} }
6
+
7
+ # Setup an ActionView::Base object which can be used for
8
+ # generating the form for.
9
+ let(:helpers) do
10
+ view = action_view
11
+ def view.posts_path
12
+ "/posts"
13
+ end
14
+
15
+ def view.protect_against_forgery?
16
+ false
17
+ end
18
+
19
+ def view.url_for(*args)
20
+ if args.first == {:action => "index"}
21
+ posts_path
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ view
28
+ end
29
+
30
+ def build_form(options = {}, &block)
31
+ active_admin_form_for Post.new, options, &block
32
+ end
33
+
34
+ context "in general" do
35
+ let :body do
36
+ build_form do |f|
37
+ f.inputs do
38
+ f.input :title
39
+ f.input :body
40
+ end
41
+ f.buttons do
42
+ f.commit_button "Submit Me"
43
+ f.commit_button "Another Button"
44
+ end
45
+ end
46
+ end
47
+
48
+ it "should generate a text input" do
49
+ body.should have_tag("input", :attributes => { :type => "text",
50
+ :name => "post[title]" })
51
+ end
52
+ it "should generate a textarea" do
53
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
54
+ end
55
+ it "should only generate the form once" do
56
+ body.scan(/Title/).size.should == 1
57
+ end
58
+ it "should generate buttons" do
59
+ body.should have_tag("input", :attributes => { :type => "submit",
60
+ :value => "Submit Me" })
61
+ body.should have_tag("input", :attributes => { :type => "submit",
62
+ :value => "Another Button" })
63
+ end
64
+ end
65
+
66
+ describe "passing in options" do
67
+ let :body do
68
+ build_form :html => { :multipart => true } do |f|
69
+ f.inputs :title
70
+ f.buttons
71
+ end
72
+ end
73
+ it "should pass the options on to the form" do
74
+ body.should have_tag("form", :attributes => { :enctype => "multipart/form-data" })
75
+ end
76
+ end
77
+
78
+ context "with buttons" do
79
+ it "should generate the form once" do
80
+ body = build_form do |f|
81
+ f.inputs do
82
+ f.input :title
83
+ end
84
+ f.buttons
85
+ end
86
+ body.scan(/id=\"post_title\"/).size.should == 1
87
+ end
88
+ it "should generate one button and a cancel link" do
89
+ body = build_form do |f|
90
+ f.buttons
91
+ end
92
+ body.scan(/type=\"submit\"/).size.should == 1
93
+ body.scan(/class=\"cancel\"/).size.should == 1
94
+ end
95
+ it "should generate multiple buttons" do
96
+ body = build_form do |f|
97
+ f.buttons do
98
+ f.commit_button "Create & Continue"
99
+ f.commit_button "Create & Edit"
100
+ end
101
+ end
102
+ body.scan(/type=\"submit\"/).size.should == 2
103
+ body.scan(/class=\"cancel\"/).size.should == 0
104
+ end
105
+
106
+ end
107
+
108
+ context "without passing a block to inputs" do
109
+ let :body do
110
+ build_form do |f|
111
+ f.inputs :title, :body
112
+ end
113
+ end
114
+ it "should have a title input" do
115
+ body.should have_tag("input", :attributes => { :type => "text",
116
+ :name => "post[title]" })
117
+ end
118
+ it "should have a body textarea" do
119
+ body.should have_tag("textarea", :attributes => { :name => "post[body]" })
120
+ end
121
+ end
122
+
123
+ context "with semantic fields for" do
124
+ let :body do
125
+ build_form do |f|
126
+ f.inputs do
127
+ f.input :title
128
+ f.input :body
129
+ end
130
+ f.instance_eval do
131
+ @object.author = User.new
132
+ end
133
+ f.semantic_fields_for :author do |author|
134
+ author.inputs :first_name, :last_name
135
+ end
136
+ end
137
+ end
138
+ it "should generate a nested text input once" do
139
+ body.scan("post_author_attributes_first_name_input").size.should == 1
140
+ end
141
+ end
142
+
143
+ context "with collection inputs" do
144
+ before do
145
+ User.create :first_name => "John", :last_name => "Doe"
146
+ User.create :first_name => "Jane", :last_name => "Doe"
147
+ end
148
+
149
+ describe "as select" do
150
+ let :body do
151
+ build_form do |f|
152
+ f.input :author
153
+ end
154
+ end
155
+ it "should create 2 options" do
156
+ body.scan(/\<option/).size.should == 3
157
+ end
158
+ end
159
+
160
+ describe "as radio buttons" do
161
+ let :body do
162
+ build_form do |f|
163
+ f.input :author, :as => :radio
164
+ end
165
+ end
166
+ it "should create 2 radio buttons" do
167
+ body.scan(/type=\"radio\"/).size.should == 2
168
+ end
169
+ end
170
+ end
171
+
172
+ context "with inputs 'for'" do
173
+ let :body do
174
+ build_form do |f|
175
+ f.inputs do
176
+ f.input :title
177
+ f.input :body
178
+ end
179
+ f.instance_eval do
180
+ @object.author = User.new
181
+ end
182
+ f.inputs :name => 'Author', :for => :author do |author|
183
+ author.inputs :first_name, :last_name
184
+ end
185
+ end
186
+ end
187
+ it "should generate a nested text input once" do
188
+ body.scan("post_author_attributes_first_name_input").size.should == 1
189
+ end
190
+ it "should add an author first name field" do
191
+ body.should have_tag("input", :attributes => { :name => "post[author_attributes][first_name]"})
192
+ end
193
+ end
194
+
195
+ context "with wrapper html" do
196
+ it "should set a class" do
197
+ body = build_form do |f|
198
+ f.input :title, :wrapper_html => { :class => "important" }
199
+ end
200
+ body.should have_tag("li", :attributes => {:class => "string optional important"})
201
+ end
202
+ end
203
+
204
+
205
+ {
206
+ "input :title, :as => :string" => /id\=\"post_title\"/,
207
+ "input :title, :as => :text" => /id\=\"post_title\"/,
208
+ "input :created_at, :as => :time" => /id\=\"post_created_at_2i\"/,
209
+ "input :created_at, :as => :datetime" => /id\=\"post_created_at_2i\"/,
210
+ "input :created_at, :as => :date" => /id\=\"post_created_at_2i\"/,
211
+ }.each do |source, regex|
212
+ it "should properly buffer #{source}" do
213
+ body = build_form do |f|
214
+ f.inputs do
215
+ f.instance_eval(source)
216
+ f.instance_eval(source)
217
+ end
218
+ end
219
+ body.scan(regex).size.should == 2
220
+ end
221
+ end
222
+
223
+ describe "datepicker input" do
224
+ let :body do
225
+ build_form do |f|
226
+ f.inputs do
227
+ f.input :created_at, :as => :datepicker
228
+ end
229
+ end
230
+ end
231
+ it "should generate a text input with the class of datepicker" do
232
+ body.should have_tag("input", :attributes => { :type => "text",
233
+ :class => "datepicker",
234
+ :name => "post[created_at]" })
235
+ end
236
+ end
237
+
238
+ end
@@ -0,0 +1,143 @@
1
+ require 'spec_helper'
2
+
3
+ module ActiveAdmin
4
+ describe MenuItem do
5
+
6
+ it "should have a name" do
7
+ item = MenuItem.new("Dashboard", "/admin")
8
+ item.name.should == "Dashboard"
9
+ end
10
+
11
+ it "should have a url" do
12
+ item = MenuItem.new("Dashboard", "/admin")
13
+ item.url.should == "/admin"
14
+ end
15
+
16
+ it "should have a priority of 10 by default" do
17
+ item = MenuItem.new("Dashboard", "/admin")
18
+ item.priority.should == 10
19
+ end
20
+
21
+ it "should accept an optional options hash" do
22
+ item = MenuItem.new("Dashboard", "/admin", 10, :if => lambda{ logged_in? } )
23
+ end
24
+
25
+ it "should have a display if block" do
26
+ block = lambda{ logged_in? }
27
+ item = MenuItem.new("Dashboard", "/admin", 10, :if => block )
28
+ item.display_if_block.should == block
29
+ end
30
+
31
+ it "should have a default display if block always returning true" do
32
+ item = MenuItem.new("Dashboard", "/admin")
33
+ item.display_if_block.should be_instance_of(Proc)
34
+ item.display_if_block.call(self).should == true
35
+ end
36
+
37
+ describe "url generation and caching" do
38
+ it "should generate a url if it is a symbol" do
39
+ MenuItem.new("Posts", :admin_posts_path).url.should == "/admin/posts"
40
+ end
41
+
42
+ it "should generate a url if it is a string" do
43
+ MenuItem.new("Posts", "/admin/posts").url.should == "/admin/posts"
44
+ end
45
+ end
46
+
47
+ context "with no children" do
48
+ it "should be empty" do
49
+ item = MenuItem.new("Blog", "/admin/blog")
50
+ item.children.should == []
51
+ end
52
+
53
+ it "should accept new children" do
54
+ item = MenuItem.new("Blog", "/admin/blog")
55
+ item.add "Dashboard", "/admin"
56
+ item.children.first.should be_an_instance_of(MenuItem)
57
+ item.children.first.name.should == "Dashboard"
58
+ end
59
+ end
60
+
61
+ context "with many children" do
62
+ let(:item) do
63
+ i = MenuItem.new("Dashboard", "/admin")
64
+ i.add "Blog", "/"
65
+ i.add "Cars", "/"
66
+ i.add "Users", "/", 1
67
+ i.add "Settings", "/", 2
68
+ i.add "Analytics", "/", 44
69
+ i
70
+ end
71
+
72
+ it "should give access to the menu item as an array" do
73
+ item['Blog'].name.should == 'Blog'
74
+ end
75
+
76
+ it "should sort items based on priority and name" do
77
+ item.children[0].name.should == 'Users'
78
+ item.children[1].name.should == 'Settings'
79
+ item.children[2].name.should == 'Blog'
80
+ item.children[3].name.should == 'Cars'
81
+ item.children[4].name.should == 'Analytics'
82
+ end
83
+
84
+ it "children should hold a reference to their parent" do
85
+ item["Blog"].parent.should == item
86
+ end
87
+ end
88
+
89
+ describe "building children using block syntax" do
90
+ let(:item) do
91
+ MenuItem.new("Blog", "/") do |blog|
92
+ blog.add "Create New", "/blog/new"
93
+ blog.add("Comments", "/blog/comments") do |comments|
94
+ comments.add "Approved", "/blog/comments?status=approved"
95
+ end
96
+ end
97
+ end
98
+
99
+ it "should have 2 children" do
100
+ item.children.size.should == 2
101
+ end
102
+
103
+ it "should have sub-sub items" do
104
+ item["Comments"]["Approved"].name.should == 'Approved'
105
+ end
106
+ end
107
+
108
+ describe "accessing ancestory" do
109
+ let(:item){ MenuItem.new "Blog", "/blog" }
110
+
111
+ context "with no parent" do
112
+ it "should return an empty array" do
113
+ item.ancestors.should == []
114
+ end
115
+ end
116
+
117
+ context "with one parent" do
118
+ let(:sub_item) do
119
+ item.add "Create New", "/blog/new"
120
+ item["Create New"]
121
+ end
122
+ it "should return an array with the parent" do
123
+ sub_item.ancestors.should == [item]
124
+ end
125
+ end
126
+
127
+ context "with many parents" do
128
+ before(:each) do
129
+ item.add "C1", "/c1" do |c1|
130
+ c1.add "C2", "/c2" do |c2|
131
+ c2.add "C3", "/c3"
132
+ end
133
+ end
134
+ end
135
+ let(:sub_item){ item["C1"]["C2"]["C3"] }
136
+ it "should return an array with the parents in reverse order" do
137
+ sub_item.ancestors.should == [item["C1"]["C2"], item["C1"], item]
138
+ end
139
+ end
140
+ end # accessing ancestory
141
+
142
+ end
143
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Menu do
4
+
5
+ context "with no items" do
6
+ it "should be empty" do
7
+ ActiveAdmin::Menu.new.items.should == []
8
+ end
9
+
10
+ it "should accept new items" do
11
+ menu = ActiveAdmin::Menu.new
12
+ menu.add "Dashboard", "/admin"
13
+ menu.items.first.should be_an_instance_of(ActiveAdmin::MenuItem)
14
+ menu.items.first.name.should == "Dashboard"
15
+ end
16
+
17
+ it "should default new items to the priority of 10" do
18
+ menu = ActiveAdmin::Menu.new
19
+ menu.add "Dashboard", "/admin"
20
+ menu.items.first.priority.should == 10
21
+ end
22
+ end
23
+
24
+ context "with many item" do
25
+ let(:menu) do
26
+ ActiveAdmin::Menu.new do |m|
27
+ m.add "Dashboard", "/admin"
28
+ m.add "Blog", "/admin/blog"
29
+ m.add "Users", "/admin/users"
30
+ m.add "Settings", "/admin/settings" do |s|
31
+ s.add "Admin Settings", "/admin/settings/admin" do |as|
32
+ s.add "User Settings", "/admin/settings/users"
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ it "should give access to the menu item as an array" do
39
+ menu['Dashboard'].name.should == 'Dashboard'
40
+ end
41
+
42
+ it "should find the item by a url on the top level" do
43
+ menu.find_by_url("/admin").name.should == "Dashboard"
44
+ end
45
+
46
+ it "should find the item deep in the tree" do
47
+ menu.find_by_url("/admin/settings/users").name.should == "User Settings"
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
@@ -0,0 +1,203 @@
1
+ require 'spec_helper'
2
+
3
+ describe ActiveAdmin::Namespace do
4
+
5
+ let(:application){ ActiveAdmin::Application.new }
6
+
7
+ context "when new" do
8
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
9
+
10
+ it "should have an application instance" do
11
+ namespace.application.should == application
12
+ end
13
+
14
+ it "should have a name" do
15
+ namespace.name.should == :admin
16
+ end
17
+
18
+ it "should have no resources" do
19
+ namespace.resources.should == {}
20
+ end
21
+
22
+ it "should have an empty menu" do
23
+ namespace.menu.items.should be_empty
24
+ end
25
+ end
26
+
27
+ describe "registering a resource" do
28
+
29
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
30
+
31
+ context "with no configuration" do
32
+ before do
33
+ namespace.register Category
34
+ end
35
+ it "should store the namespaced registered configuration" do
36
+ namespace.resources.keys.should include('Category')
37
+ end
38
+ it "should create a new controller in the default namespace" do
39
+ defined?(Admin::CategoriesController).should be_true
40
+ end
41
+ it "should create the dashboard controller" do
42
+ defined?(Admin::DashboardController).should be_true
43
+ end
44
+ it "should create a menu item" do
45
+ namespace.load_menu!
46
+ namespace.menu["Categories"].should be_an_instance_of(ActiveAdmin::MenuItem)
47
+ namespace.menu["Categories"].url.should == "/admin/categories"
48
+ end
49
+ end
50
+
51
+ context "with a block configuration" do
52
+ it "should be evaluated in the dsl" do
53
+ lambda {
54
+ namespace.register Category do
55
+ raise "Hello World"
56
+ end
57
+ }.should raise_error
58
+ end
59
+ end
60
+
61
+ context "with a resource that's namespaced" do
62
+ before do
63
+ module ::Mock; class Resource; def self.has_many(arg1, arg2); end; end; end
64
+ namespace.register Mock::Resource
65
+ end
66
+
67
+ it "should store the namespaced registered configuration" do
68
+ namespace.resources.keys.should include('MockResource')
69
+ end
70
+ it "should create a new controller in the default namespace" do
71
+ defined?(Admin::MockResourcesController).should be_true
72
+ end
73
+ it "should create a menu item" do
74
+ namespace.load_menu!
75
+ namespace.menu["Mock Resources"].should be_an_instance_of(ActiveAdmin::MenuItem)
76
+ end
77
+ it "should use the resource as the model in the controller" do
78
+ Admin::MockResourcesController.resource_class.should == Mock::Resource
79
+ end
80
+ end
81
+
82
+ describe "finding resource instances" do
83
+ let(:namespace){ ActiveAdmin::Namespace.new(application, :admin) }
84
+ context "when registered" do
85
+ before do
86
+ @post_resource = namespace.register Post
87
+ end
88
+ it "should return the resource instance" do
89
+ namespace.resource_for(Post).should == @post_resource
90
+ end
91
+ end
92
+ context "when not registered" do
93
+ it "should be nil" do
94
+ namespace.resource_for(Post).should == nil
95
+ end
96
+ end
97
+ end
98
+
99
+ describe "adding to the menu" do
100
+
101
+ describe "adding as a top level item" do
102
+ before do
103
+ namespace.register Category
104
+ namespace.load_menu!
105
+ end
106
+ it "should add a new menu item" do
107
+ namespace.menu['Categories'].should_not be_nil
108
+ end
109
+ end
110
+
111
+ describe "adding as a child" do
112
+ before do
113
+ namespace.register Category do
114
+ menu :parent => 'Blog'
115
+ end
116
+ namespace.load_menu!
117
+ end
118
+ it "should generate the parent menu item" do
119
+ namespace.menu['Blog'].should_not be_nil
120
+ end
121
+ it "should generate its own child item" do
122
+ namespace.menu['Blog']['Categories'].should_not be_nil
123
+ end
124
+ end
125
+
126
+ describe "disabling the menu" do
127
+ before do
128
+ namespace.register Category do
129
+ menu false
130
+ end
131
+ namespace.load_menu!
132
+ end
133
+ it "should not create a menu item" do
134
+ namespace.menu["Categories"].should be_nil
135
+ end
136
+ end
137
+
138
+ describe "setting menu priority" do
139
+ before do
140
+ namespace.register Category do
141
+ menu :priority => 2
142
+ end
143
+ namespace.load_menu!
144
+ end
145
+ it "should have a custom priority of 2" do
146
+ namespace.menu["Categories"].priority.should == 2
147
+ end
148
+ end
149
+
150
+ describe "setting a condition for displaying" do
151
+ before do
152
+ namespace.register Category do
153
+ menu :if => proc { false }
154
+ end
155
+ namespace.load_menu!
156
+ end
157
+ it "should have a proc returning false" do
158
+ namespace.menu["Categories"].display_if_block.should be_instance_of(Proc)
159
+ namespace.menu["Categories"].display_if_block.call.should == false
160
+ end
161
+ end
162
+
163
+ describe "adding as a belongs to" do
164
+ context "when not optional" do
165
+ before do
166
+ namespace.register Post do
167
+ belongs_to :author
168
+ end
169
+ end
170
+ it "should not show up in the menu" do
171
+ namespace.menu["Posts"].should be_nil
172
+ end
173
+ end
174
+ context "when optional" do
175
+ before do
176
+ namespace.register Post do
177
+ belongs_to :author, :optional => true
178
+ end
179
+ end
180
+ it "should show up in the menu" do
181
+ namespace.menu["Posts"].should_not be_nil
182
+ end
183
+ end
184
+ end
185
+ end
186
+
187
+ describe "dashboard controller name" do
188
+ context "when namespaced" do
189
+ it "should be namespaced" do
190
+ namespace = ActiveAdmin::Namespace.new(application, :admin)
191
+ namespace.dashboard_controller_name.should == "Admin::DashboardController"
192
+ end
193
+ end
194
+ context "when not namespaced" do
195
+ it "should not be namespaced" do
196
+ namespace = ActiveAdmin::Namespace.new(application, :root)
197
+ namespace.dashboard_controller_name.should == "DashboardController"
198
+ end
199
+ end
200
+ end
201
+
202
+ end
203
+ end
@@ -0,0 +1,35 @@
1
+ require 'spec_helper'
2
+
3
+ describe "#pretty_format" do
4
+ include ActiveAdmin::ViewHelpers::DisplayHelper
5
+
6
+ context "when a String is passed in" do
7
+ it "should return the String passed in" do
8
+ pretty_format("hello").should == "hello"
9
+ end
10
+ end
11
+
12
+ context "when a Date or a Time is passed in" do
13
+ it "should return a localized Date or Time with long format" do
14
+ t = Time.now
15
+ self.should_receive(:localize).with(t, {:format => :long}) { "Just Now!" }
16
+ pretty_format(t).should == "Just Now!"
17
+ end
18
+ end
19
+
20
+ context "when an ActiveRecord object is passed in" do
21
+ it "should delegate to auto_link" do
22
+ post = Post.new
23
+ self.should_receive(:auto_link).with(post) { "model name" }
24
+ pretty_format(post).should == "model name"
25
+ end
26
+ end
27
+
28
+ context "when something else is passed in" do
29
+ it "should delegate to display_name" do
30
+ something = Class.new.new
31
+ self.should_receive(:display_name).with(something) { "I'm not famous" }
32
+ pretty_format(something).should == "I'm not famous"
33
+ end
34
+ end
35
+ end