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.
- data/.document +5 -0
- data/.gitignore +32 -0
- data/.travis.yml +4 -0
- data/CHANGELOG.rdoc +76 -0
- data/Gemfile +26 -0
- data/LICENSE +25 -0
- data/README.rdoc +450 -0
- data/Rakefile +100 -0
- data/activeadmin.gemspec +28 -0
- data/cucumber.yml +2 -0
- data/features/comments/commenting.feature +99 -0
- data/features/comments/viewing_index.feature +19 -0
- data/features/dashboard.feature +26 -0
- data/features/edit_page.feature +77 -0
- data/features/first_boot.feature +16 -0
- data/features/global_navigation.feature +30 -0
- data/features/index/format_as_csv.feature +45 -0
- data/features/index/formats.feature +10 -0
- data/features/index/index_as_block.feature +15 -0
- data/features/index/index_as_blog.feature +50 -0
- data/features/index/index_as_grid.feature +45 -0
- data/features/index/index_as_table.feature +79 -0
- data/features/index/index_scopes.feature +52 -0
- data/features/index/pagination.feature +23 -0
- data/features/menu.feature +26 -0
- data/features/new_page.feature +75 -0
- data/features/registering_assets.feature +35 -0
- data/features/registering_resources.feature +33 -0
- data/features/show/default_content.feature +43 -0
- data/features/show/page_title.feature +33 -0
- data/features/sidebar_sections.feature +127 -0
- data/features/specifying_actions.feature +60 -0
- data/features/step_definitions/action_item_steps.rb +7 -0
- data/features/step_definitions/additional_web_steps.rb +67 -0
- data/features/step_definitions/asset_steps.rb +7 -0
- data/features/step_definitions/attribute_steps.rb +15 -0
- data/features/step_definitions/comment_steps.rb +8 -0
- data/features/step_definitions/configuration_steps.rb +31 -0
- data/features/step_definitions/dashboard_steps.rb +11 -0
- data/features/step_definitions/factory_steps.rb +28 -0
- data/features/step_definitions/flash_steps.rb +3 -0
- data/features/step_definitions/format_steps.rb +34 -0
- data/features/step_definitions/index_scope_steps.rb +20 -0
- data/features/step_definitions/menu_steps.rb +7 -0
- data/features/step_definitions/pagination_steps.rb +8 -0
- data/features/step_definitions/sidebar_steps.rb +11 -0
- data/features/step_definitions/tab_steps.rb +3 -0
- data/features/step_definitions/user_steps.rb +20 -0
- data/features/step_definitions/web_steps.rb +219 -0
- data/features/sti_resource.feature +49 -0
- data/features/support/env.rb +92 -0
- data/features/support/paths.rb +48 -0
- data/features/users/logging_in.feature +34 -0
- data/features/users/logging_out.feature +13 -0
- data/lib/active_admin/abstract_view_factory.rb +95 -0
- data/lib/active_admin/action_items.rb +37 -0
- data/lib/active_admin/application.rb +204 -0
- data/lib/active_admin/arbre/attributes.rb +20 -0
- data/lib/active_admin/arbre/class_list.rb +28 -0
- data/lib/active_admin/arbre/collection.rb +27 -0
- data/lib/active_admin/arbre/context.rb +8 -0
- data/lib/active_admin/arbre/core_extensions.rb +5 -0
- data/lib/active_admin/arbre/document.rb +42 -0
- data/lib/active_admin/arbre/element.rb +151 -0
- data/lib/active_admin/arbre/html.rb +84 -0
- data/lib/active_admin/arbre/html5_elements.rb +47 -0
- data/lib/active_admin/arbre/tag.rb +137 -0
- data/lib/active_admin/arbre/text_node.rb +35 -0
- data/lib/active_admin/arbre.rb +23 -0
- data/lib/active_admin/asset_registration.rb +34 -0
- data/lib/active_admin/callbacks.rb +87 -0
- data/lib/active_admin/comments/comment.rb +21 -0
- data/lib/active_admin/comments/configuration.rb +18 -0
- data/lib/active_admin/comments/namespace_helper.rb +14 -0
- data/lib/active_admin/comments/resource_helper.rb +17 -0
- data/lib/active_admin/comments/show_page_helper.rb +23 -0
- data/lib/active_admin/comments/views/active_admin_comment.rb +0 -0
- data/lib/active_admin/comments/views/active_admin_comments.rb +82 -0
- data/lib/active_admin/comments/views.rb +3 -0
- data/lib/active_admin/comments.rb +88 -0
- data/lib/active_admin/component.rb +22 -0
- data/lib/active_admin/controller_action.rb +12 -0
- data/lib/active_admin/csv_builder.rb +45 -0
- data/lib/active_admin/dashboards/dashboard_controller.rb +47 -0
- data/lib/active_admin/dashboards/section.rb +34 -0
- data/lib/active_admin/dashboards.rb +48 -0
- data/lib/active_admin/devise.rb +43 -0
- data/lib/active_admin/dsl.rb +215 -0
- data/lib/active_admin/event.rb +31 -0
- data/lib/active_admin/form_builder.rb +109 -0
- data/lib/active_admin/helpers/optional_display.rb +34 -0
- data/lib/active_admin/iconic/icons.rb +142 -0
- data/lib/active_admin/iconic.rb +51 -0
- data/lib/active_admin/locales/da.yml +26 -0
- data/lib/active_admin/locales/en.yml +34 -0
- data/lib/active_admin/locales/es.yml +34 -0
- data/lib/active_admin/locales/pt.yml +34 -0
- data/lib/active_admin/menu.rb +42 -0
- data/lib/active_admin/menu_item.rb +73 -0
- data/lib/active_admin/namespace.rb +198 -0
- data/lib/active_admin/page_config.rb +15 -0
- data/lib/active_admin/renderer.rb +87 -0
- data/lib/active_admin/resource/belongs_to.rb +31 -0
- data/lib/active_admin/resource.rb +229 -0
- data/lib/active_admin/resource_controller/action_builder.rb +21 -0
- data/lib/active_admin/resource_controller/actions.rb +79 -0
- data/lib/active_admin/resource_controller/callbacks.rb +47 -0
- data/lib/active_admin/resource_controller/collection.rb +144 -0
- data/lib/active_admin/resource_controller/filters.rb +58 -0
- data/lib/active_admin/resource_controller/form.rb +42 -0
- data/lib/active_admin/resource_controller/menu.rb +29 -0
- data/lib/active_admin/resource_controller/page_configurations.rb +53 -0
- data/lib/active_admin/resource_controller/scoping.rb +36 -0
- data/lib/active_admin/resource_controller/sidebars.rb +38 -0
- data/lib/active_admin/resource_controller.rb +119 -0
- data/lib/active_admin/router.rb +85 -0
- data/lib/active_admin/scope.rb +17 -0
- data/lib/active_admin/sidebar.rb +43 -0
- data/lib/active_admin/stylesheets/active_admin/_comments.scss +40 -0
- data/lib/active_admin/stylesheets/active_admin/_flash_messages.scss +13 -0
- data/lib/active_admin/stylesheets/active_admin/_forms.scss +168 -0
- data/lib/active_admin/stylesheets/active_admin/_header.scss +108 -0
- data/lib/active_admin/stylesheets/active_admin/_typography.scss +100 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_all.scss +8 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_buttons.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_gradients.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_icons.scss +20 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_reset.scss +165 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_rounded.scss +43 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_sections.scss +27 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_shadows.scss +21 -0
- data/lib/active_admin/stylesheets/active_admin/mixins/_variables.scss +12 -0
- data/lib/active_admin/stylesheets/active_admin.scss +429 -0
- data/lib/active_admin/version.rb +3 -0
- data/lib/active_admin/view_factory.rb +21 -0
- data/lib/active_admin/view_helpers/active_admin_application_helper.rb +12 -0
- data/lib/active_admin/view_helpers/assigns_with_indifferent_access_helper.rb +7 -0
- data/lib/active_admin/view_helpers/auto_link_helper.rb +42 -0
- data/lib/active_admin/view_helpers/breadcrumb_helper.rb +29 -0
- data/lib/active_admin/view_helpers/display_helper.rb +38 -0
- data/lib/active_admin/view_helpers/filter_form_helper.rb +185 -0
- data/lib/active_admin/view_helpers/form_helper.rb +12 -0
- data/lib/active_admin/view_helpers/icon_helper.rb +12 -0
- data/lib/active_admin/view_helpers/method_or_proc_helper.rb +26 -0
- data/lib/active_admin/view_helpers/renderer_helper.rb +29 -0
- data/lib/active_admin/view_helpers/sidebar_helper.rb +15 -0
- data/lib/active_admin/view_helpers/table_helper.rb +12 -0
- data/lib/active_admin/view_helpers/title_helper.rb +11 -0
- data/lib/active_admin/view_helpers/view_factory_helper.rb +11 -0
- data/lib/active_admin/view_helpers.rb +23 -0
- data/lib/active_admin/views/action_items.rb +17 -0
- data/lib/active_admin/views/components/attributes_table.rb +66 -0
- data/lib/active_admin/views/components/columns.rb +47 -0
- data/lib/active_admin/views/components/paginated_collection.rb +92 -0
- data/lib/active_admin/views/components/panel.rb +26 -0
- data/lib/active_admin/views/components/scopes.rb +70 -0
- data/lib/active_admin/views/components/sidebar_section.rb +30 -0
- data/lib/active_admin/views/components/status_tag.rb +55 -0
- data/lib/active_admin/views/components/table_for.rb +193 -0
- data/lib/active_admin/views/dashboard_section_renderer.rb +19 -0
- data/lib/active_admin/views/header_renderer.rb +37 -0
- data/lib/active_admin/views/index_as_block.rb +24 -0
- data/lib/active_admin/views/index_as_blog.rb +89 -0
- data/lib/active_admin/views/index_as_grid.rb +49 -0
- data/lib/active_admin/views/index_as_table.rb +75 -0
- data/lib/active_admin/views/pages/base.rb +144 -0
- data/lib/active_admin/views/pages/dashboard.rb +59 -0
- data/lib/active_admin/views/pages/edit.rb +27 -0
- data/lib/active_admin/views/pages/index.rb +66 -0
- data/lib/active_admin/views/pages/new.rb +27 -0
- data/lib/active_admin/views/pages/show.rb +56 -0
- data/lib/active_admin/views/tabs_renderer.rb +58 -0
- data/lib/active_admin/views/templates/active_admin/dashboard/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/lib/active_admin/views/templates/active_admin/devise/mailer/unlock_instructions.html.erb +7 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/edit.html.erb +16 -0
- data/lib/active_admin/views/templates/active_admin/devise/passwords/new.html.erb +14 -0
- data/lib/active_admin/views/templates/active_admin/devise/sessions/new.html.erb +18 -0
- data/lib/active_admin/views/templates/active_admin/devise/shared/_links.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/devise/unlocks/new.html.erb +12 -0
- data/lib/active_admin/views/templates/active_admin/resource/edit.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.csv.erb +20 -0
- data/lib/active_admin/views/templates/active_admin/resource/index.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/new.html.arb +1 -0
- data/lib/active_admin/views/templates/active_admin/resource/show.html.arb +1 -0
- data/lib/active_admin/views/templates/layouts/active_admin.html.erb +39 -0
- data/lib/active_admin/views/templates/layouts/active_admin_logged_out.html.erb +31 -0
- data/lib/active_admin/views.rb +8 -0
- data/lib/active_admin.rb +71 -0
- data/lib/activeadmin.rb +1 -0
- data/lib/generators/active_admin/devise/devise_generator.rb +49 -0
- data/lib/generators/active_admin/install/install_generator.rb +46 -0
- data/lib/generators/active_admin/install/templates/active_admin.js +51 -0
- data/lib/generators/active_admin/install/templates/active_admin.rb.erb +78 -0
- data/lib/generators/active_admin/install/templates/active_admin_vendor.js +382 -0
- data/lib/generators/active_admin/install/templates/dashboards.rb +38 -0
- data/lib/generators/active_admin/install/templates/images/admin_notes_icon.png +0 -0
- data/lib/generators/active_admin/install/templates/images/loading.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/nested_menu_arrow_dark.gif +0 -0
- data/lib/generators/active_admin/install/templates/images/orderable.png +0 -0
- data/lib/generators/active_admin/install/templates/migrations/1_create_admin_notes.rb +16 -0
- data/lib/generators/active_admin/install/templates/migrations/2_move_admin_notes_to_comments.rb +25 -0
- data/lib/generators/active_admin/resource/resource_generator.rb +16 -0
- data/lib/generators/active_admin/resource/templates/admin.rb +3 -0
- data/spec/integration/belongs_to_spec.rb +42 -0
- data/spec/spec_helper.rb +156 -0
- data/spec/support/integration_example_group.rb +33 -0
- data/spec/support/rails_template.rb +32 -0
- data/spec/support/rails_template_with_data.rb +32 -0
- data/spec/support/templates/cucumber.rb +24 -0
- data/spec/unit/abstract_view_factory_spec.rb +79 -0
- data/spec/unit/action_builder_spec.rb +88 -0
- data/spec/unit/action_items_spec.rb +27 -0
- data/spec/unit/application_spec.rb +67 -0
- data/spec/unit/arbre/html/element_finder_methods_spec.rb +54 -0
- data/spec/unit/arbre/html/element_spec.rb +224 -0
- data/spec/unit/arbre/html/tag_attributes_spec.rb +61 -0
- data/spec/unit/arbre/html/tag_spec.rb +63 -0
- data/spec/unit/arbre/html_spec.rb +210 -0
- data/spec/unit/asset_registration_spec.rb +37 -0
- data/spec/unit/auto_link_spec.rb +39 -0
- data/spec/unit/belongs_to_spec.rb +45 -0
- data/spec/unit/breadcrumbs_spec.rb +110 -0
- data/spec/unit/comments_spec.rb +57 -0
- data/spec/unit/component_spec.rb +18 -0
- data/spec/unit/components/attributes_table_spec.rb +100 -0
- data/spec/unit/components/columns_spec.rb +75 -0
- data/spec/unit/components/panel_spec.rb +31 -0
- data/spec/unit/components/sidebar_section_spec.rb +37 -0
- data/spec/unit/components/status_tag_spec.rb +81 -0
- data/spec/unit/components/table_for_spec.rb +130 -0
- data/spec/unit/controller_filters_spec.rb +27 -0
- data/spec/unit/csv_builder_spec.rb +83 -0
- data/spec/unit/dashboard_controller_spec.rb +26 -0
- data/spec/unit/dashboard_section_spec.rb +56 -0
- data/spec/unit/dashboards_spec.rb +59 -0
- data/spec/unit/display_name_spec.rb +29 -0
- data/spec/unit/event_spec.rb +41 -0
- data/spec/unit/filter_form_builder_spec.rb +179 -0
- data/spec/unit/form_builder_spec.rb +238 -0
- data/spec/unit/menu_item_spec.rb +143 -0
- data/spec/unit/menu_spec.rb +53 -0
- data/spec/unit/namespace_spec.rb +203 -0
- data/spec/unit/pretty_format_spec.rb +35 -0
- data/spec/unit/registration_spec.rb +76 -0
- data/spec/unit/renderer_spec.rb +108 -0
- data/spec/unit/resource_controller/collection_spec.rb +34 -0
- data/spec/unit/resource_controller_spec.rb +147 -0
- data/spec/unit/resource_spec.rb +290 -0
- data/spec/unit/routing_spec.rb +88 -0
- data/spec/unit/scope_spec.rb +31 -0
- data/spec/unit/tabs_renderer_spec.rb +85 -0
- data/spec/unit/view_factory_spec.rb +16 -0
- metadata +482 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'fileutils'
|
|
3
|
+
|
|
4
|
+
describe ActiveAdmin::Application do
|
|
5
|
+
|
|
6
|
+
let(:application) do
|
|
7
|
+
ActiveAdmin::Application.new.tap do |app|
|
|
8
|
+
# Manually override the load paths becuase RSpec messes these up
|
|
9
|
+
app.load_paths = [File.expand_path('app/admin', Rails.root)]
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should have a default load path of ['app/admin']" do
|
|
14
|
+
application.load_paths.should == [File.expand_path('app/admin', Rails.root)]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
it "should remove app/admin from the autoload path to remove the possibility of conflicts" do
|
|
18
|
+
ActiveSupport::Dependencies.autoload_paths.should_not include(File.join(Rails.root, "app/admin"))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
it "should remove app/admin from the eager load paths (Active Admin deals with loading)" do
|
|
22
|
+
Rails.application.config.eager_load_paths.should_not include(File.join(Rails.root, "app/admin"))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "should store the site's title" do
|
|
26
|
+
application.site_title.should == ""
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
it "should set the site title" do
|
|
30
|
+
application.site_title = "New Title"
|
|
31
|
+
application.site_title.should == "New Title"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "should have a view factory" do
|
|
35
|
+
application.view_factory.should be_an_instance_of(ActiveAdmin::ViewFactory)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should have deprecated admin notes by default" do
|
|
39
|
+
application.admin_notes.should be_nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
it "should have admin notes in admin namespace by default" do
|
|
43
|
+
application.allow_comments_in.should == [:admin]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "should have no default current_user_method" do
|
|
47
|
+
application.current_user_method.should == false
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should have no default authentication method" do
|
|
51
|
+
application.authentication_method.should == false
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
describe "files in load path" do
|
|
55
|
+
it "should load files in the first level directory" do
|
|
56
|
+
application.files_in_load_path.should include(File.expand_path("app/admin/dashboards.rb", Rails.root))
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
it "should load files from subdirectories" do
|
|
60
|
+
FileUtils.mkdir_p(File.expand_path("app/admin/public", Rails.root))
|
|
61
|
+
test_file = File.expand_path("app/admin/public/posts.rb", Rails.root)
|
|
62
|
+
FileUtils.touch(test_file)
|
|
63
|
+
application.files_in_load_path.should include(test_file)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Element, "Finder Methods" do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
6
|
+
|
|
7
|
+
describe "finding elements by tag name" do
|
|
8
|
+
|
|
9
|
+
it "should return 0 when no elements exist" do
|
|
10
|
+
div.get_elements_by_tag_name("li").size.should == 0
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
it "should return a child element" do
|
|
14
|
+
html = div do
|
|
15
|
+
ul
|
|
16
|
+
li
|
|
17
|
+
ul
|
|
18
|
+
end
|
|
19
|
+
elements = html.get_elements_by_tag_name("li")
|
|
20
|
+
elements.size.should == 1
|
|
21
|
+
elements[0].should be_instance_of(Arbre::HTML::Li)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "should return multple child elements" do
|
|
25
|
+
html = div do
|
|
26
|
+
ul
|
|
27
|
+
li
|
|
28
|
+
ul
|
|
29
|
+
li
|
|
30
|
+
end
|
|
31
|
+
elements = html.get_elements_by_tag_name("li")
|
|
32
|
+
elements.size.should == 2
|
|
33
|
+
elements[0].should be_instance_of(Arbre::HTML::Li)
|
|
34
|
+
elements[1].should be_instance_of(Arbre::HTML::Li)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
it "should return children's child elements" do
|
|
38
|
+
html = div do
|
|
39
|
+
ul
|
|
40
|
+
li do
|
|
41
|
+
li
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
elements = html.get_elements_by_tag_name("li")
|
|
45
|
+
elements.size.should == 2
|
|
46
|
+
elements[0].should be_instance_of(Arbre::HTML::Li)
|
|
47
|
+
elements[1].should be_instance_of(Arbre::HTML::Li)
|
|
48
|
+
elements[1].parent.should == elements[0]
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "finding an element by id"
|
|
53
|
+
describe "finding an element by a class name"
|
|
54
|
+
end
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
require 'active_admin/arbre/element'
|
|
3
|
+
|
|
4
|
+
describe Arbre::HTML::Element do
|
|
5
|
+
include Arbre::HTML
|
|
6
|
+
|
|
7
|
+
let(:assigns){ {} }
|
|
8
|
+
let(:element){ Arbre::HTML::Element.new }
|
|
9
|
+
|
|
10
|
+
context "when initialized" do
|
|
11
|
+
it "should have no children" do
|
|
12
|
+
element.children.should be_empty
|
|
13
|
+
end
|
|
14
|
+
it "should have no parent" do
|
|
15
|
+
element.parent.should be_nil
|
|
16
|
+
end
|
|
17
|
+
it "should have no document" do
|
|
18
|
+
element.document.should be_nil
|
|
19
|
+
end
|
|
20
|
+
it "should respond to the HTML builder methods" do
|
|
21
|
+
element.should respond_to(:span)
|
|
22
|
+
end
|
|
23
|
+
it "should have a set of local assigns" do
|
|
24
|
+
element = Arbre::HTML::Element.new :hello => "World"
|
|
25
|
+
element.assigns[:hello].should == "World"
|
|
26
|
+
end
|
|
27
|
+
it "should have an empty hash with no local assigns" do
|
|
28
|
+
element.assigns.should == {}
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "passing in a helper object" do
|
|
33
|
+
let(:element){ Arbre::HTML::Element.new(nil, action_view) }
|
|
34
|
+
it "should call methods on the helper object and return TextNode objects" do
|
|
35
|
+
element.content_tag(:div).should == "<div></div>"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
it "should raise a NoMethodError if not found" do
|
|
39
|
+
lambda {
|
|
40
|
+
element.a_method_that_doesnt_exist
|
|
41
|
+
}.should raise_error(NoMethodError)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "passing in assigns" do
|
|
46
|
+
let(:assigns){ {:post => Post.new(:title => "Hello")} }
|
|
47
|
+
it "should be accessible via a method call" do
|
|
48
|
+
post.should be_an_instance_of(Post)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
describe "adding a child" do
|
|
53
|
+
let(:child){ Arbre::HTML::Element.new }
|
|
54
|
+
before do
|
|
55
|
+
element.add_child child
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should add the child to the parent" do
|
|
59
|
+
element.children.first.should == child
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should set the parent of the child" do
|
|
63
|
+
child.parent.should == element
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
context "when the child is nil" do
|
|
67
|
+
let(:child){ nil }
|
|
68
|
+
it "should not add the child" do
|
|
69
|
+
element.children.should be_empty
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
context "when the child is a string" do
|
|
74
|
+
let(:child){ "Hello World" }
|
|
75
|
+
it "should add as a TextNode" do
|
|
76
|
+
element.children.first.should be_instance_of(Arbre::HTML::TextNode)
|
|
77
|
+
element.children.first.to_html.should == "Hello World"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe "setting the content" do
|
|
83
|
+
|
|
84
|
+
context "when a string" do
|
|
85
|
+
before do
|
|
86
|
+
element.add_child "Hello World"
|
|
87
|
+
element.content = "Goodbye"
|
|
88
|
+
end
|
|
89
|
+
it "should clear the existing children" do
|
|
90
|
+
element.children.size.should == 1
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should add the string as a child" do
|
|
94
|
+
element.children.first.to_html.should == "Goodbye"
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should html escape the string" do
|
|
98
|
+
string = "Goodbye <br />"
|
|
99
|
+
element.content = string
|
|
100
|
+
element.content.to_html.should == "Goodbye <br />"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
context "when a tag" do
|
|
105
|
+
before do
|
|
106
|
+
element.content = h2("Hello")
|
|
107
|
+
end
|
|
108
|
+
it "should set the content tag" do
|
|
109
|
+
element.children.first.should be_an_instance_of(Arbre::HTML::H2)
|
|
110
|
+
end
|
|
111
|
+
it "should set the tags parent" do
|
|
112
|
+
element.children.first.parent.should == element
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
context "when an array of tags" do
|
|
117
|
+
before do
|
|
118
|
+
element.content = [ul,div]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should set the content tag" do
|
|
122
|
+
element.children.first.should be_an_instance_of(Arbre::HTML::Ul)
|
|
123
|
+
end
|
|
124
|
+
it "should set the tags parent" do
|
|
125
|
+
element.children.first.parent.should == element
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
describe "setting the parent" do
|
|
132
|
+
let(:parent) do
|
|
133
|
+
doc = Arbre::HTML::Document.new
|
|
134
|
+
parent = Arbre::HTML::Element.new
|
|
135
|
+
doc << parent
|
|
136
|
+
parent
|
|
137
|
+
end
|
|
138
|
+
before { element.parent = parent }
|
|
139
|
+
|
|
140
|
+
it "should set the parent" do
|
|
141
|
+
element.parent.should == parent
|
|
142
|
+
end
|
|
143
|
+
it "should set the document to the parent's document" do
|
|
144
|
+
element.document.should == parent.document
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
describe "rendering to html" do
|
|
149
|
+
it "should render the children collection" do
|
|
150
|
+
element.children.should_receive(:to_html).and_return("content")
|
|
151
|
+
element.to_html.should == "content"
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
describe "adding elements together" do
|
|
156
|
+
|
|
157
|
+
context "when both elements are tags" do
|
|
158
|
+
let(:collection){ h1 + h2}
|
|
159
|
+
|
|
160
|
+
it "should return an instance of Collection" do
|
|
161
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
it "should return the elements in the collection" do
|
|
165
|
+
collection.size.should == 2
|
|
166
|
+
collection.first.should be_an_instance_of(Arbre::HTML::H1)
|
|
167
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
context "when the left is a collection and the right is a tag" do
|
|
172
|
+
let(:collection){ Arbre::HTML::Collection.new([h1, h2]) + h3}
|
|
173
|
+
|
|
174
|
+
it "should return an instance of Collection" do
|
|
175
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
it "should return the elements in the collection flattened" do
|
|
179
|
+
collection.size.should == 3
|
|
180
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
181
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
182
|
+
collection[2].should be_an_instance_of(Arbre::HTML::H3)
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
context "when the right is a collection and the left is a tag" do
|
|
187
|
+
let(:collection){ h1 + Arbre::HTML::Collection.new([h2,h3]) }
|
|
188
|
+
|
|
189
|
+
it "should return an instance of Collection" do
|
|
190
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
it "should return the elements in the collection flattened" do
|
|
194
|
+
collection.size.should == 3
|
|
195
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
196
|
+
collection[1].should be_an_instance_of(Arbre::HTML::H2)
|
|
197
|
+
collection[2].should be_an_instance_of(Arbre::HTML::H3)
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
|
|
201
|
+
context "when the left is a tag and the right is a string" do
|
|
202
|
+
let(:collection){ h1 + "Hello World"}
|
|
203
|
+
|
|
204
|
+
it "should return an instance of Collection" do
|
|
205
|
+
collection.should be_an_instance_of(Arbre::HTML::Collection)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
it "should return the elements in the collection" do
|
|
209
|
+
collection.size.should == 2
|
|
210
|
+
collection[0].should be_an_instance_of(Arbre::HTML::H1)
|
|
211
|
+
collection[1].should be_an_instance_of(Arbre::HTML::TextNode)
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
context "when the left is a string and the right is a tag" do
|
|
216
|
+
let(:collection){ "hello World" + h1}
|
|
217
|
+
|
|
218
|
+
it "should return a string" do
|
|
219
|
+
collection.strip.chomp.should == "hello World<h1></h1>"
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Tag, "Attributes" do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
6
|
+
|
|
7
|
+
let(:tag){ Arbre::HTML::Tag.new }
|
|
8
|
+
|
|
9
|
+
describe "attributes" do
|
|
10
|
+
before { tag.build :id => "my_id" }
|
|
11
|
+
|
|
12
|
+
it "should have an attributes hash" do
|
|
13
|
+
tag.attributes.should == {:id => "my_id"}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should render the attributes to html" do
|
|
17
|
+
tag.to_html.should == <<-HTML
|
|
18
|
+
<tag id="my_id"></tag>
|
|
19
|
+
HTML
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should get an attribute value" do
|
|
23
|
+
tag.attr(:id).should == "my_id"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
describe "#has_attribute?" do
|
|
27
|
+
context "when the attribute exists" do
|
|
28
|
+
it "should return true" do
|
|
29
|
+
tag.has_attribute?(:id).should == true
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "when the attribute does not exist" do
|
|
34
|
+
it "should return false" do
|
|
35
|
+
tag.has_attribute?(:class).should == false
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "should remove an attribute" do
|
|
41
|
+
tag.attributes.should == {:id => "my_id"}
|
|
42
|
+
tag.remove_attribute(:id).should == "my_id"
|
|
43
|
+
tag.attributes.should == {}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "rendering attributes" do
|
|
48
|
+
it "should html safe the attribute values" do
|
|
49
|
+
tag.set_attribute(:class, "\">bad things!")
|
|
50
|
+
tag.to_html.should == <<-HTML
|
|
51
|
+
<tag class="">bad things!"></tag>
|
|
52
|
+
HTML
|
|
53
|
+
end
|
|
54
|
+
it "should should escape the attribute names" do
|
|
55
|
+
tag.set_attribute(">bad", "things")
|
|
56
|
+
tag.to_html.should == <<-HTML
|
|
57
|
+
<tag >bad="things"></tag>
|
|
58
|
+
HTML
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML::Tag do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
let(:assigns){ {} }
|
|
6
|
+
|
|
7
|
+
let(:tag){ Arbre::HTML::Tag.new }
|
|
8
|
+
|
|
9
|
+
describe "building a new tag" do
|
|
10
|
+
before { tag.build "Hello World", :id => "my_id" }
|
|
11
|
+
|
|
12
|
+
it "should set the contents to a string" do
|
|
13
|
+
tag.content.should == "Hello World"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "should set the hash of options to the attributes" do
|
|
17
|
+
tag.attributes.should == { :id => "my_id" }
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe "creating a tag 'for' an object" do
|
|
22
|
+
let(:model_name){ mock(:singular => "resource_class")}
|
|
23
|
+
let(:resource_class){ mock(:model_name => model_name) }
|
|
24
|
+
let(:resource){ mock(:class => resource_class, :to_key => ['5'])}
|
|
25
|
+
|
|
26
|
+
before do
|
|
27
|
+
tag.build :for => resource
|
|
28
|
+
end
|
|
29
|
+
it "should set the id to the type and id" do
|
|
30
|
+
tag.id.should == "resource_class_5"
|
|
31
|
+
end
|
|
32
|
+
it "should add a class name" do
|
|
33
|
+
tag.class_list.should include("resource_class")
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
describe "css class names" do
|
|
38
|
+
it "should add a class" do
|
|
39
|
+
tag.add_class "hello_world"
|
|
40
|
+
tag.class_names.should == "hello_world"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "should remove_class" do
|
|
44
|
+
tag.add_class "hello_world"
|
|
45
|
+
tag.class_names.should == "hello_world"
|
|
46
|
+
tag.remove_class "hello_world"
|
|
47
|
+
tag.class_names.should == ""
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should not add a class if it already exists" do
|
|
51
|
+
tag.add_class "hello_world"
|
|
52
|
+
tag.add_class "hello_world"
|
|
53
|
+
tag.class_names.should == "hello_world"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "should seperate classes with space" do
|
|
57
|
+
tag.add_class "hello world"
|
|
58
|
+
tag.class_list.size.should == 2
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
end
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Arbre::HTML do
|
|
4
|
+
include Arbre::HTML
|
|
5
|
+
|
|
6
|
+
let(:assigns){ {} }
|
|
7
|
+
|
|
8
|
+
it "should render a single element" do
|
|
9
|
+
content = span("Hello World")
|
|
10
|
+
content.to_html.should == <<-HTML
|
|
11
|
+
<span>Hello World</span>
|
|
12
|
+
HTML
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "should render a child element" do
|
|
16
|
+
content = span do
|
|
17
|
+
span "Hello World"
|
|
18
|
+
end
|
|
19
|
+
content.to_html.should == <<-HTML
|
|
20
|
+
<span>
|
|
21
|
+
<span>Hello World</span>
|
|
22
|
+
</span>
|
|
23
|
+
HTML
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should render an unordered list" do
|
|
27
|
+
content = ul do
|
|
28
|
+
li "First"
|
|
29
|
+
li "Second"
|
|
30
|
+
li "Third"
|
|
31
|
+
end
|
|
32
|
+
content.to_html.should == <<-HTML
|
|
33
|
+
<ul>
|
|
34
|
+
<li>First</li>
|
|
35
|
+
<li>Second</li>
|
|
36
|
+
<li>Third</li>
|
|
37
|
+
</ul>
|
|
38
|
+
HTML
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
it "should return the correct object" do
|
|
42
|
+
list_1 = ul
|
|
43
|
+
list_2 = li
|
|
44
|
+
list_1.should be_instance_of(Arbre::HTML::Ul)
|
|
45
|
+
list_2.should be_instance_of(Arbre::HTML::Li)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "should allow local variables inside the tags" do
|
|
49
|
+
first = "First"
|
|
50
|
+
second = "Second"
|
|
51
|
+
content = ul do
|
|
52
|
+
li first
|
|
53
|
+
li second
|
|
54
|
+
end
|
|
55
|
+
content.to_html.should == <<-EOS
|
|
56
|
+
<ul>
|
|
57
|
+
<li>First</li>
|
|
58
|
+
<li>Second</li>
|
|
59
|
+
</ul>
|
|
60
|
+
EOS
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
it "should add children and nested" do
|
|
64
|
+
content = div do
|
|
65
|
+
ul
|
|
66
|
+
li do
|
|
67
|
+
li
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
content.to_html.should == <<-HTML
|
|
71
|
+
<div>
|
|
72
|
+
<ul></ul>
|
|
73
|
+
<li>
|
|
74
|
+
<li></li>
|
|
75
|
+
</li>
|
|
76
|
+
</div>
|
|
77
|
+
HTML
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should pass the element in to the block if asked for" do
|
|
81
|
+
content = div do |d|
|
|
82
|
+
d.ul do
|
|
83
|
+
li
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
content.to_html.should == <<-HTML
|
|
87
|
+
<div>
|
|
88
|
+
<ul>
|
|
89
|
+
<li></li>
|
|
90
|
+
</ul>
|
|
91
|
+
</div>
|
|
92
|
+
HTML
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it "should move content tags between parents" do
|
|
96
|
+
content = div do
|
|
97
|
+
span(ul(li))
|
|
98
|
+
end
|
|
99
|
+
content.to_html.should == <<-HTML
|
|
100
|
+
<div>
|
|
101
|
+
<span>
|
|
102
|
+
<ul>
|
|
103
|
+
<li></li>
|
|
104
|
+
</ul>
|
|
105
|
+
</span>
|
|
106
|
+
</div>
|
|
107
|
+
HTML
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "should add content to the parent if the element is passed into block" do
|
|
111
|
+
content = div do |d|
|
|
112
|
+
d.id = "my-tag"
|
|
113
|
+
ul do
|
|
114
|
+
li
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
content.to_html.should == <<-HTML
|
|
118
|
+
<div id="my-tag">
|
|
119
|
+
<ul>
|
|
120
|
+
<li></li>
|
|
121
|
+
</ul>
|
|
122
|
+
</div>
|
|
123
|
+
HTML
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
it "should have the parent set on it" do
|
|
127
|
+
item = nil
|
|
128
|
+
list = ul do
|
|
129
|
+
li "Hello"
|
|
130
|
+
item = li "World"
|
|
131
|
+
end
|
|
132
|
+
item.parent.should == list
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
it "should set a string content return value with no children" do
|
|
136
|
+
li do
|
|
137
|
+
"Hello World"
|
|
138
|
+
end.to_html.should == <<-HTML
|
|
139
|
+
<li>Hello World</li>
|
|
140
|
+
HTML
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
describe "text nodes" do
|
|
144
|
+
it "should turn strings into text nodes" do
|
|
145
|
+
li do
|
|
146
|
+
"Hello World"
|
|
147
|
+
end.children.first.should be_instance_of(Arbre::HTML::TextNode)
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
describe "self-closing nodes" do
|
|
152
|
+
it "should not self-close script tags" do
|
|
153
|
+
tag = script :type => 'text/javascript'
|
|
154
|
+
tag.to_html.should == <<-HTML
|
|
155
|
+
<script type="text/javascript"></script>
|
|
156
|
+
HTML
|
|
157
|
+
end
|
|
158
|
+
it "should self-close meta tags" do
|
|
159
|
+
tag = meta :content => "text/html; charset=utf-8"
|
|
160
|
+
tag.to_html.should == <<-HTML
|
|
161
|
+
<meta content="text/html; charset=utf-8\"/>
|
|
162
|
+
HTML
|
|
163
|
+
end
|
|
164
|
+
it "should self-close link tags" do
|
|
165
|
+
tag = link :rel => "stylesheet"
|
|
166
|
+
tag.to_html.should == <<-HTML
|
|
167
|
+
<link rel="stylesheet"/>
|
|
168
|
+
HTML
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
describe "html safe" do
|
|
173
|
+
it "should escape the contents" do
|
|
174
|
+
span("<br />").to_html.should == <<-HTML
|
|
175
|
+
<span><br /></span>
|
|
176
|
+
HTML
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
it "should return html safe strings" do
|
|
180
|
+
span("<br />").to_html.should be_html_safe
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
it "should not escape html passed in" do
|
|
184
|
+
span(span("<br />")).to_html.should == <<-HTML
|
|
185
|
+
<span>
|
|
186
|
+
<span><br /></span>
|
|
187
|
+
</span>
|
|
188
|
+
HTML
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
it "should escape string contents when passed in block" do
|
|
192
|
+
span {
|
|
193
|
+
span {
|
|
194
|
+
"<br />"
|
|
195
|
+
}
|
|
196
|
+
}.to_html.should == <<-HTML
|
|
197
|
+
<span>
|
|
198
|
+
<span><br /></span>
|
|
199
|
+
</span>
|
|
200
|
+
HTML
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
it "should escape the contents of attributes" do
|
|
204
|
+
span(:class => "<br />").to_html.should == <<-HTML
|
|
205
|
+
<span class="<br />"></span>
|
|
206
|
+
HTML
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
end
|