releaf-core 0.2.1
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.
- checksums.yaml +7 -0
- data/LICENSE +24 -0
- data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
- data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
- data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
- data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
- data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
- data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
- data/app/assets/images/releaf/icons/favicon.ico +0 -0
- data/app/assets/images/releaf/icons/favicon.png +0 -0
- data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
- data/app/assets/images/releaf/logo-login.png +0 -0
- data/app/assets/images/releaf/logo.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
- data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
- data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
- data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
- data/app/assets/javascripts/releaf/application.js +13 -0
- data/app/assets/javascripts/releaf/include/ajax.js +66 -0
- data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
- data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
- data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
- data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
- data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
- data/app/assets/javascripts/releaf/include/loader.js +45 -0
- data/app/assets/javascripts/releaf/include/localization.js +213 -0
- data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
- data/app/assets/javascripts/releaf/include/notifications.js +267 -0
- data/app/assets/javascripts/releaf/include/pagination.js +19 -0
- data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
- data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
- data/app/assets/javascripts/releaf/include/search.js +140 -0
- data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
- data/app/assets/javascripts/releaf/include/sortable.js +69 -0
- data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
- data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
- data/app/assets/stylesheets/releaf/application.scss +9 -0
- data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
- data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
- data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
- data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
- data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
- data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
- data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
- data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
- data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
- data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
- data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
- data/app/assets/stylesheets/releaf/environment.scss +4 -0
- data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
- data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
- data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
- data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
- data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
- data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
- data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
- data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
- data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
- data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
- data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
- data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
- data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
- data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
- data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
- data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
- data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
- data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
- data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
- data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
- data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
- data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
- data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
- data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
- data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
- data/app/assets/stylesheets/releaf/layout.scss +35 -0
- data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
- data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
- data/app/builders/releaf/builders/association_reflector.rb +58 -0
- data/app/builders/releaf/builders/base.rb +80 -0
- data/app/builders/releaf/builders/collection.rb +8 -0
- data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
- data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
- data/app/builders/releaf/builders/edit_builder.rb +66 -0
- data/app/builders/releaf/builders/form_builder.rb +594 -0
- data/app/builders/releaf/builders/index_builder.rb +118 -0
- data/app/builders/releaf/builders/orderer.rb +5 -0
- data/app/builders/releaf/builders/page/header_builder.rb +70 -0
- data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
- data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
- data/app/builders/releaf/builders/pagination_builder.rb +107 -0
- data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
- data/app/builders/releaf/builders/resource.rb +9 -0
- data/app/builders/releaf/builders/resource_dialog.rb +8 -0
- data/app/builders/releaf/builders/resource_view.rb +54 -0
- data/app/builders/releaf/builders/show_builder.rb +3 -0
- data/app/builders/releaf/builders/table_builder.rb +280 -0
- data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
- data/app/builders/releaf/builders/template.rb +8 -0
- data/app/builders/releaf/builders/toolbox.rb +23 -0
- data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
- data/app/builders/releaf/builders/view.rb +132 -0
- data/app/builders/releaf/builders.rb +38 -0
- data/app/builders/releaf/core/settings/form_builder.rb +21 -0
- data/app/builders/releaf/core/settings/table_builder.rb +11 -0
- data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
- data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
- data/app/controllers/releaf/base_controller.rb +458 -0
- data/app/controllers/releaf/core/errors_controller.rb +5 -0
- data/app/controllers/releaf/core/settings_controller.rb +50 -0
- data/app/helpers/releaf/application_helper.rb +53 -0
- data/app/helpers/releaf/button_helper.rb +50 -0
- data/app/helpers/releaf/javascript_helper.rb +75 -0
- data/app/lib/releaf/core/assets_resolver.rb +58 -0
- data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
- data/app/lib/releaf/core/error_formatter.rb +103 -0
- data/app/lib/releaf/core/item_orderer.rb +102 -0
- data/app/lib/releaf/core/resource_base.rb +66 -0
- data/app/lib/releaf/core/resource_fields.rb +6 -0
- data/app/lib/releaf/core/resource_params.rb +47 -0
- data/app/lib/releaf/core/resource_table_fields.rb +10 -0
- data/app/lib/releaf/core/resource_utilities.rb +36 -0
- data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
- data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
- data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
- data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
- data/app/lib/releaf/core/responders/error_responder.rb +9 -0
- data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
- data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
- data/app/lib/releaf/core/responders.rb +31 -0
- data/app/lib/releaf/core/search.rb +147 -0
- data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
- data/app/models/releaf/richtext_attachment.rb +6 -0
- data/app/models/releaf/settings.rb +27 -0
- data/app/views/layouts/releaf/admin.html.erb +1 -0
- data/app/views/releaf/base/confirm_destroy.ruby +1 -0
- data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
- data/app/views/releaf/base/edit.ruby +1 -0
- data/app/views/releaf/base/index.ruby +1 -0
- data/app/views/releaf/base/new.ruby +1 -0
- data/app/views/releaf/base/refused_destroy.ruby +1 -0
- data/app/views/releaf/base/show.ruby +1 -0
- data/app/views/releaf/base/toolbox.ruby +1 -0
- data/app/views/releaf/error_pages/_error.html.haml +10 -0
- data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
- data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
- data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
- data/lib/generators/dummy/install_generator.rb +18 -0
- data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
- data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
- data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
- data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
- data/lib/generators/dummy/templates/config/routes.rb +19 -0
- data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
- data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
- data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
- data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
- data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
- data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
- data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
- data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
- data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
- data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
- data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
- data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
- data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
- data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
- data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
- data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
- data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
- data/lib/generators/dummy/templates/models/author.rb +10 -0
- data/lib/generators/dummy/templates/models/banner.rb +5 -0
- data/lib/generators/dummy/templates/models/book.rb +19 -0
- data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
- data/lib/generators/dummy/templates/models/bundle.rb +17 -0
- data/lib/generators/dummy/templates/models/chapter.rb +7 -0
- data/lib/generators/dummy/templates/models/home_page.rb +5 -0
- data/lib/generators/dummy/templates/models/node.rb +10 -0
- data/lib/generators/dummy/templates/models/publisher.rb +9 -0
- data/lib/generators/dummy/templates/models/text_page.rb +5 -0
- data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
- data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
- data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
- data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
- data/lib/generators/releaf/install_generator.rb +93 -0
- data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
- data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
- data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
- data/lib/generators/releaf/templates/models/node.rb +3 -0
- data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
- data/lib/releaf/core/application.rb +17 -0
- data/lib/releaf/core/builders_autoload.rb +27 -0
- data/lib/releaf/core/component.rb +9 -0
- data/lib/releaf/core/configuration.rb +101 -0
- data/lib/releaf/core/engine.rb +35 -0
- data/lib/releaf/core/exceptions.rb +38 -0
- data/lib/releaf/core/route_mapper.rb +59 -0
- data/lib/releaf/core/settings_ui_component.rb +7 -0
- data/lib/releaf/core/validation_error_codes.rb +36 -0
- data/lib/releaf/version.rb +3 -0
- data/lib/releaf-core.rb +14 -0
- data/lib/tasks/releaf_tasks.rake +4 -0
- data/releaf-core.gemspec +35 -0
- data/spec/builders/builders/association_reflector_spec.rb +138 -0
- data/spec/builders/builders/base_spec.rb +276 -0
- data/spec/builders/builders/collection_spec.rb +18 -0
- data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
- data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
- data/spec/builders/builders/edit_builder_spec.rb +215 -0
- data/spec/builders/builders/form_builder_spec.rb +562 -0
- data/spec/builders/builders/index_builder_spec.rb +345 -0
- data/spec/builders/builders/orderer_spec.rb +22 -0
- data/spec/builders/builders/page/header_builder_spec.rb +143 -0
- data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
- data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
- data/spec/builders/builders/pagination_builder_spec.rb +330 -0
- data/spec/builders/builders/resource_dialog_spec.rb +21 -0
- data/spec/builders/builders/resource_view_spec.rb +158 -0
- data/spec/builders/builders/show_builder_spec.rb +7 -0
- data/spec/builders/builders/table_builder_spec.rb +638 -0
- data/spec/builders/builders/template_spec.rb +12 -0
- data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
- data/spec/builders/builders/toolbox_spec.rb +48 -0
- data/spec/builders/builders/view_spec.rb +281 -0
- data/spec/builders/builders_spec.rb +134 -0
- data/spec/builders/core/settings/form_builder_spec.rb +69 -0
- data/spec/builders/core/settings/table_builder_spec.rb +21 -0
- data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
- data/spec/controllers/releaf/base_controller_spec.rb +447 -0
- data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
- data/spec/features/ajaxbox_spec.rb +111 -0
- data/spec/features/authorization_spec.rb +50 -0
- data/spec/features/dragonfly_integration_spec.rb +24 -0
- data/spec/features/edit_actions_spec.rb +142 -0
- data/spec/features/errors_spec.rb +29 -0
- data/spec/features/index_actions_spec.rb +85 -0
- data/spec/features/index_table_spec.rb +32 -0
- data/spec/features/menu_spec.rb +71 -0
- data/spec/features/richtext_attachments_spec.rb +64 -0
- data/spec/features/richtext_embed_spec.rb +29 -0
- data/spec/features/richtext_spec.rb +19 -0
- data/spec/features/search_spec.rb +825 -0
- data/spec/features/settings_spec.rb +38 -0
- data/spec/features/title_spec.rb +13 -0
- data/spec/fixtures/common_fields.yml +17 -0
- data/spec/fixtures/cs.png +0 -0
- data/spec/fixtures/time.formats.xlsx +0 -0
- data/spec/fixtures/unicorn.jpg +0 -0
- data/spec/helpers/application_helper_spec.rb +75 -0
- data/spec/helpers/button_helper_spec.rb +146 -0
- data/spec/lib/releaf/core/application_spec.rb +42 -0
- data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
- data/spec/lib/releaf/core/configuration_spec.rb +230 -0
- data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
- data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
- data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
- data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
- data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
- data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
- data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
- data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
- data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
- data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
- data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
- data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
- data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
- data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
- data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
- data/spec/lib/releaf/core/responders_spec.rb +60 -0
- data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
- data/spec/lib/validation_error_codes_spec.rb +56 -0
- data/spec/misc/factories_spec.rb +43 -0
- data/spec/models/settings_spec.rb +58 -0
- data/spec/routing/route_mapper_spec.rb +185 -0
- data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
- metadata +657 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::ResourceTableFields do
|
|
4
|
+
subject{ described_class.new(Book) }
|
|
5
|
+
|
|
6
|
+
describe "#excluded_attributes" do
|
|
7
|
+
it "returns attributes to exclude from table alongside parent method list" do
|
|
8
|
+
allow(subject).to receive(:table_excluded_attributes).and_return(%w(xxx yyy))
|
|
9
|
+
expect(subject.excluded_attributes).to include("id", "created_at", "xxx", "yyy")
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
describe "#table_excluded_attributes" do
|
|
14
|
+
it "returns array with attributes matching *_html pattern" do
|
|
15
|
+
expect(subject.table_excluded_attributes).to eq(%w(summary_html))
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::ResourceUtilities do
|
|
4
|
+
let(:resource){ Releaf::Permissions::Role.new }
|
|
5
|
+
let(:users_association){ resource.class.reflect_on_association(:users) }
|
|
6
|
+
let(:permissions_association){ resource.class.reflect_on_association(:permissions) }
|
|
7
|
+
|
|
8
|
+
describe ".restricted_associations" do
|
|
9
|
+
it "returns hash with restricted association objects and controller" do
|
|
10
|
+
allow(described_class).to receive(:restricted_associations).with(resource).and_return([permissions_association, users_association])
|
|
11
|
+
allow(described_class).to receive(:association_controller).with(users_association).and_return("aa")
|
|
12
|
+
allow(described_class).to receive(:association_controller).with(permissions_association).and_return("bb")
|
|
13
|
+
resource.users.build
|
|
14
|
+
resource.permissions.build
|
|
15
|
+
|
|
16
|
+
expect(described_class.restricted_relations(resource)).to eq(
|
|
17
|
+
users: {objects: resource.users, controller: "aa"},
|
|
18
|
+
permissions: {objects: resource.permissions, controller: "bb"},
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe ".association_controller" do
|
|
24
|
+
it "returns guessed controller from given association name" do
|
|
25
|
+
expect(described_class.association_controller(users_association)).to eq("users")
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "when no controller guessed" do
|
|
29
|
+
it "returns nil" do
|
|
30
|
+
expect(described_class.association_controller(permissions_association)).to be nil
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe ".restricted_associations" do
|
|
36
|
+
it "returns array with restricted associations" do
|
|
37
|
+
allow(described_class).to receive(:restricted_association?).with(resource, users_association).and_return(false)
|
|
38
|
+
allow(described_class).to receive(:restricted_association?).with(resource, permissions_association).and_return(true)
|
|
39
|
+
expect(described_class.restricted_associations(resource)).to eq([permissions_association])
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe ".restricted_association?" do
|
|
44
|
+
context "when associations with dependent option `restrict_with_exception` given" do
|
|
45
|
+
let(:association){ resource.class.reflect_on_association(:users) }
|
|
46
|
+
|
|
47
|
+
context "when association object(-s) exists" do
|
|
48
|
+
it "returns true" do
|
|
49
|
+
resource.users.build
|
|
50
|
+
users = resource.users
|
|
51
|
+
allow(resource).to receive(:users).and_return(users)
|
|
52
|
+
allow(users).to receive(:exists?).and_return(true)
|
|
53
|
+
expect(described_class.restricted_association?(resource, association)).to be true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
context "when association object(-s) does not exist" do
|
|
58
|
+
it "returns false" do
|
|
59
|
+
expect(described_class.restricted_association?(resource, association)).to be false
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context "when associations with dependent option other than `restrict_with_exception` given" do
|
|
65
|
+
it "returns false" do
|
|
66
|
+
association = resource.class.reflect_on_association(:permissions)
|
|
67
|
+
expect(described_class.restricted_association?(resource, association)).to be false
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
describe ".destroyable?" do
|
|
73
|
+
context "when no restricted association" do
|
|
74
|
+
it "returns true" do
|
|
75
|
+
allow(described_class).to receive(:restricted_associations).with(resource).and_return([])
|
|
76
|
+
expect(described_class.destroyable?(resource)).to be true
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context "when restricted association exist" do
|
|
81
|
+
it "returns false" do
|
|
82
|
+
allow(described_class).to receive(:restricted_associations).with(resource).and_return([:a])
|
|
83
|
+
expect(described_class.destroyable?(resource)).to be false
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::AccessDeniedResponder, type: :controller do
|
|
4
|
+
controller{}
|
|
5
|
+
subject{ described_class.new(controller, []) }
|
|
6
|
+
|
|
7
|
+
describe "#status_code" do
|
|
8
|
+
it "returns 404" do
|
|
9
|
+
expect(subject.status_code).to eq(403)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::AfterSaveResponder, type: :controller do
|
|
4
|
+
let(:controller){ Releaf::BaseController.new }
|
|
5
|
+
let(:resource){ Book.new}
|
|
6
|
+
subject{ described_class.new(controller, [resource]) }
|
|
7
|
+
|
|
8
|
+
describe "#json_resource_errors" do
|
|
9
|
+
it "returns resource errors formatted with `Releaf::Releaf::ErrorFormatter`" do
|
|
10
|
+
allow(Releaf::Core::ErrorFormatter).to receive(:format_errors).with(resource).and_return(a: "b")
|
|
11
|
+
expect(subject.json_resource_errors).to eq(errors: {a: "b"})
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
describe "#render_notification?" do
|
|
16
|
+
before do
|
|
17
|
+
allow(subject).to receive(:has_errors?).and_return(true)
|
|
18
|
+
allow(subject).to receive(:format).and_return(:json)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
context "when request format is other json" do
|
|
22
|
+
it "returns true" do
|
|
23
|
+
allow(subject).to receive(:format).and_return(:html)
|
|
24
|
+
expect(subject.render_notification?).to be true
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
context "when object has no errors" do
|
|
29
|
+
it "returns true" do
|
|
30
|
+
allow(subject).to receive(:has_errors?).and_return(false)
|
|
31
|
+
expect(subject.render_notification?).to be true
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
context "when request format is json and object has errors" do
|
|
36
|
+
it "returns false" do
|
|
37
|
+
expect(subject.render_notification?).to be false
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
describe "#respond" do
|
|
43
|
+
before do
|
|
44
|
+
allow(subject).to receive(:to_html)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
context "when render notifications return `true`" do
|
|
48
|
+
it "renders notification with success value true/false whether resource has errors" do
|
|
49
|
+
allow(subject).to receive(:render_notification?).and_return(true)
|
|
50
|
+
allow(subject).to receive(:has_errors?).and_return(true)
|
|
51
|
+
expect(subject.controller).to receive(:render_notification).with(false)
|
|
52
|
+
subject.respond
|
|
53
|
+
|
|
54
|
+
allow(subject).to receive(:has_errors?).and_return(false)
|
|
55
|
+
expect(subject.controller).to receive(:render_notification).with(true)
|
|
56
|
+
subject.respond
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
context "when render notifications return `false`" do
|
|
61
|
+
it "does not render notification" do
|
|
62
|
+
allow(subject).to receive(:render_notification?).and_return(false)
|
|
63
|
+
expect(subject.controller).to_not receive(:render_notification)
|
|
64
|
+
subject.respond
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe "#to_json" do
|
|
70
|
+
context "when resource has errors" do
|
|
71
|
+
it "calls `display_errors`" do
|
|
72
|
+
allow(subject).to receive(:has_errors?).and_return(true)
|
|
73
|
+
expect(subject).to receive(:display_errors)
|
|
74
|
+
subject.to_json
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
context "when resource has no errors" do
|
|
79
|
+
before do
|
|
80
|
+
allow(subject).to receive(:resource_location).and_return("some_url")
|
|
81
|
+
allow(subject).to receive(:has_errors?).and_return(false)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context "when options has :redirect key" do
|
|
85
|
+
it "calls `display_errors`" do
|
|
86
|
+
allow(subject).to receive(:options).and_return(redirect: true)
|
|
87
|
+
expect(subject).to receive(:render).with(json: {url: "some_url"}, status: 303)
|
|
88
|
+
subject.to_json
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
context "when options has key :destroyable with `false` value" do
|
|
93
|
+
it "renders `refused_destroy` template" do
|
|
94
|
+
allow(subject).to receive(:options).and_return({})
|
|
95
|
+
expect(subject).to receive(:redirect_to).with("some_url", status: 303)
|
|
96
|
+
subject.to_json
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::ConfirmDestroyResponder, type: :controller do
|
|
4
|
+
let(:controller){ Releaf::BaseController.new }
|
|
5
|
+
let(:resource){ Book.new}
|
|
6
|
+
subject{ described_class.new(controller, [resource]) }
|
|
7
|
+
|
|
8
|
+
describe "#to_html" do
|
|
9
|
+
context "when options has key :destroyable with `true` value" do
|
|
10
|
+
it "renders default view" do
|
|
11
|
+
allow(subject).to receive(:options).and_return(destroyable: true)
|
|
12
|
+
expect(subject).to receive(:default_render)
|
|
13
|
+
subject.to_html
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
context "when options has key :destroyable with `false` value" do
|
|
18
|
+
it "renders `refused_destroy` template" do
|
|
19
|
+
allow(subject).to receive(:options).and_return(destroyable: false)
|
|
20
|
+
expect(subject).to receive(:render).with("refused_destroy")
|
|
21
|
+
subject.to_html
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::DestroyResponder, type: :controller do
|
|
4
|
+
let(:controller){ Releaf::BaseController.new }
|
|
5
|
+
let(:resource){ Book.new}
|
|
6
|
+
subject{ described_class.new(controller, [resource]) }
|
|
7
|
+
|
|
8
|
+
describe "#to_html" do
|
|
9
|
+
before do
|
|
10
|
+
allow(controller).to receive(:request).and_return(request)
|
|
11
|
+
allow(controller).to receive(:formats).and_return([:html])
|
|
12
|
+
allow(subject).to receive(:default_render)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "when resource has been successfully destroyed" do
|
|
16
|
+
it "renders success notification" do
|
|
17
|
+
resource.destroy
|
|
18
|
+
expect(subject.controller).to receive(:render_notification).with(true, failure_message_key: "cant destroy, because relations exists")
|
|
19
|
+
subject.to_html
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
context "when resource has not been destroyed" do
|
|
24
|
+
it "renders failure notification" do
|
|
25
|
+
expect(subject.controller).to receive(:render_notification).with(false, failure_message_key: "cant destroy, because relations exists")
|
|
26
|
+
subject.to_html
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::ErrorResponder, type: :controller do
|
|
4
|
+
class Releaf::Core::Responders::DummyErrorResponder < ActionController::Responder
|
|
5
|
+
include Releaf::Core::Responders::ErrorResponder
|
|
6
|
+
def status_code
|
|
7
|
+
401
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
controller{}
|
|
12
|
+
subject{ Releaf::Core::Responders::DummyErrorResponder.new(controller, []) }
|
|
13
|
+
|
|
14
|
+
describe "#template" do
|
|
15
|
+
it "returns template based on class name" do
|
|
16
|
+
expect(subject.template).to eq("dummy_error")
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe "#to_html" do
|
|
21
|
+
it "renders error template with class status code" do
|
|
22
|
+
expect(subject).to receive(:render).with("releaf/error_pages/dummy_error", status: 401)
|
|
23
|
+
subject.to_html
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::FeatureDisabledResponder, type: :controller do
|
|
4
|
+
controller{}
|
|
5
|
+
subject{ described_class.new(controller, []) }
|
|
6
|
+
|
|
7
|
+
describe "#status_code" do
|
|
8
|
+
it "returns 404" do
|
|
9
|
+
expect(subject.status_code).to eq(403)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders::PageNotFoundResponder, type: :controller do
|
|
4
|
+
controller{}
|
|
5
|
+
subject{ described_class.new(controller, []) }
|
|
6
|
+
|
|
7
|
+
describe "#status_code" do
|
|
8
|
+
it "returns 404" do
|
|
9
|
+
expect(subject.status_code).to eq(404)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::Responders, type: :controller do
|
|
4
|
+
subject{ Releaf::BaseController.new }
|
|
5
|
+
|
|
6
|
+
describe "#respond_with" do
|
|
7
|
+
before do
|
|
8
|
+
allow(subject).to receive(:active_responder).and_return(Releaf::Core::Responders::AfterSaveResponder)
|
|
9
|
+
allow(subject).to receive(:request).and_return(request)
|
|
10
|
+
allow(subject).to receive(:content_type).and_return(:html)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
context "when no responder defined within options" do
|
|
14
|
+
it "adds active responder to `responder` options" do
|
|
15
|
+
expect(Releaf::Core::Responders::AfterSaveResponder).to receive(:call)
|
|
16
|
+
subject.respond_with(nil)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when responder is defined within options" do
|
|
21
|
+
it "adds active responder to `responder` options" do
|
|
22
|
+
expect(Releaf::Core::Responders::AfterSaveResponder).to_not receive(:call)
|
|
23
|
+
expect(Releaf::Core::Responders::PageNotFoundResponder).to receive(:call)
|
|
24
|
+
subject.respond_with(nil, responder: Releaf::Core::Responders::PageNotFoundResponder)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
describe "#action_responders" do
|
|
30
|
+
it "returns hash with action to responders matching" do
|
|
31
|
+
hash = {
|
|
32
|
+
create: Releaf::Core::Responders::AfterSaveResponder,
|
|
33
|
+
update: Releaf::Core::Responders::AfterSaveResponder,
|
|
34
|
+
confirm_destroy: Releaf::Core::Responders::ConfirmDestroyResponder,
|
|
35
|
+
destroy: Releaf::Core::Responders::DestroyResponder,
|
|
36
|
+
access_denied: Releaf::Core::Responders::AccessDeniedResponder,
|
|
37
|
+
feature_disabled: Releaf::Core::Responders::FeatureDisabledResponder,
|
|
38
|
+
page_not_found: Releaf::Core::Responders::PageNotFoundResponder,
|
|
39
|
+
}
|
|
40
|
+
expect(subject.action_responders).to eq(hash)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe "#action_responder" do
|
|
45
|
+
it "returns matching responder for given action" do
|
|
46
|
+
allow(subject).to receive(:action_responders).and_return(a: "x")
|
|
47
|
+
expect(subject.action_responder(:a)).to eq("x")
|
|
48
|
+
allow(subject).to receive(:action_responders).and_return(b: "x")
|
|
49
|
+
expect(subject.action_responder(:a)).to be nil
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "#active_responder" do
|
|
54
|
+
it "returns currect action matching responder" do
|
|
55
|
+
allow(subject).to receive(:action_name).and_return(:save)
|
|
56
|
+
allow(subject).to receive(:action_responder).with(:save).and_return("x")
|
|
57
|
+
expect(subject.active_responder).to eq("x")
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::Core::TemplateFieldTypeMapper do
|
|
4
|
+
let(:object){ double("generic object") }
|
|
5
|
+
|
|
6
|
+
def file_field_error_message field_name, obj
|
|
7
|
+
"object doesn't respond to `%s` method. Did you forgot to add `file_accessor :%s` to `%s` model?" % [field_name, field_name, obj.class.name]
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def image_field_error_message field_name, obj
|
|
11
|
+
"object doesn't respond to `%s` method. Did you forgot to add `image_accessor :%s` to `%s` model?" % [field_name, field_name, obj.class.name]
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe ".field_type_name", pending: true do
|
|
15
|
+
it "needs tests"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe ".use_i18n?" do
|
|
19
|
+
context "when object translates" do
|
|
20
|
+
context "when given attribute translatable" do
|
|
21
|
+
it "returns true" do
|
|
22
|
+
expect(described_class.use_i18n?(Book.new, :description)).to be true
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context "when attribute does not translatable" do
|
|
27
|
+
it "returns false" do
|
|
28
|
+
expect(described_class.use_i18n?(Book.new, :title)).to be false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
context "when object does not translates" do
|
|
34
|
+
it "returns false" do
|
|
35
|
+
expect(described_class.use_i18n?(Releaf::Permissions::User.new, :password)).to be false
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
describe ".image_or_error" do
|
|
41
|
+
context "given field_name that doesn't end with _uid" do
|
|
42
|
+
it "raises ArgumentError" do
|
|
43
|
+
allow(object).to receive(:image)
|
|
44
|
+
expect { subject.send(:image_or_error, 'image', object) }.to raise_error ArgumentError
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
context 'given field_name is `image_uid`' do
|
|
49
|
+
context 'when object responds to `image` method' do
|
|
50
|
+
it "returns 'image'" do
|
|
51
|
+
allow(object).to receive(:image)
|
|
52
|
+
expect( subject.send(:image_or_error, 'image_uid', object) ).to eq 'image'
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
context 'when object does not respond to `image` method' do
|
|
57
|
+
it 'raises RuntimeError' do
|
|
58
|
+
expect { subject.send(:image_or_error, 'image_uid', object) }.to raise_error(RuntimeError, image_field_error_message('image', object))
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe ".file_or_error" do
|
|
65
|
+
context "given field_name that doesn't end with _uid" do
|
|
66
|
+
it "raises ArgumentError" do
|
|
67
|
+
allow(object).to receive(:file)
|
|
68
|
+
expect { subject.send(:file_or_error, 'file', object) }.to raise_error ArgumentError
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
context 'given field_name is `file_uid`' do
|
|
73
|
+
context 'when object responds to `file` method' do
|
|
74
|
+
it "returns 'file'" do
|
|
75
|
+
allow(object).to receive(:file)
|
|
76
|
+
expect( subject.send(:file_or_error, 'file_uid', object) ).to eq 'file'
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
context 'when object does not respond to `file` method' do
|
|
81
|
+
it 'raises RuntimeError' do
|
|
82
|
+
expect { subject.send(:file_or_error, 'file_uid', object) }.to raise_error(RuntimeError, file_field_error_message('file', object))
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe ".field_type_name_for_string" do
|
|
89
|
+
%w[thumbnail_uid image_uid photo_uid photography_uid picture_uid avatar_uid logo_uid banner_uid icon_uid].each do |field_name|
|
|
90
|
+
context "when attribute name is '#{field_name}'" do
|
|
91
|
+
context "when object responds to '#{field_name.sub(/_uid$/, '')}'" do
|
|
92
|
+
it "returns 'image'" do
|
|
93
|
+
allow(object).to receive(field_name.sub(/_uid$/, '').to_sym)
|
|
94
|
+
expect( subject.send(:field_type_name_for_string, field_name, object) ).to eq 'image'
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
context "when object doesn't respond to '#{field_name.sub(/_uid$/, '')}'" do
|
|
99
|
+
it "raises RuntimeError" do
|
|
100
|
+
test_field_name = field_name.sub(/_uid$/, '')
|
|
101
|
+
expect { subject.send(:field_type_name_for_string, field_name, object) }.to raise_error(RuntimeError, image_field_error_message(test_field_name, object))
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
%w[image_uid2 uid].each do |field_name|
|
|
108
|
+
context "when attribute_name is '#{field_name}'" do
|
|
109
|
+
it "doesn't return 'image'" do
|
|
110
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to_not eq 'image'
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "doesn't return 'file'" do
|
|
114
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to_not eq 'file'
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
%w[some_uid other_uid cook_file_uid file_uid].each do |field_name|
|
|
120
|
+
context "when attribute name is '#{field_name}'" do
|
|
121
|
+
context "when object responds to '#{field_name.sub(/_uid$/, '')}'" do
|
|
122
|
+
it "returns 'file'" do
|
|
123
|
+
allow(object).to receive(field_name.sub(/_uid$/, '').to_sym)
|
|
124
|
+
expect( subject.send(:field_type_name_for_string, field_name, object) ).to eq 'file'
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
context "when object doesn't respond to '#{field_name.sub(/_uid$/, '')}'" do
|
|
129
|
+
it "raises RuntimeError" do
|
|
130
|
+
test_field_name = field_name.sub(/_uid$/, '')
|
|
131
|
+
expect { subject.send(:field_type_name_for_string, field_name, object) }.to raise_error(RuntimeError, file_field_error_message(test_field_name, object))
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
%w[pin password password_confirmation encrypted_password some_password some_password_for_secretary].each do |field_name|
|
|
138
|
+
context "when attribute name is '#{field_name}'" do
|
|
139
|
+
it "returns 'password'" do
|
|
140
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to eq 'password'
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
%w[this_pin pin_that some_pin_for_admin].each do |field_name|
|
|
146
|
+
context "when attribute name is '#{field_name}'" do
|
|
147
|
+
it "doesn't return 'password'" do
|
|
148
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to_not eq 'password'
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
%w[email admin_email].each do |field_name|
|
|
154
|
+
context "when attribute name is '#{field_name}'" do
|
|
155
|
+
it "returns 'email'" do
|
|
156
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to eq 'email'
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
context "when attribute name is 'email_for_admin'" do
|
|
162
|
+
it "doesn't return 'email'" do
|
|
163
|
+
expect( subject.send(:field_type_name_for_string, 'email_for_admin', nil) ).to_not eq 'email'
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
%w[link awesome_link].each do |field_name|
|
|
168
|
+
context "when attribute name is '#{field_name}'" do
|
|
169
|
+
it "returns 'link'" do
|
|
170
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to eq 'link'
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
context "when attribute name is 'link_to_awesome_site'" do
|
|
176
|
+
it "doesn't return 'link'" do
|
|
177
|
+
expect( subject.send(:field_type_name_for_string, 'link_to_awesome_site', nil) ).to_not eq 'link'
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
%w[www homepage admin_homepage www_page homepage_www url homepage_url site_url url_for_this_site].each do |field_name|
|
|
182
|
+
context "when attribute name is '#{field_name}'" do
|
|
183
|
+
it "doesn't return 'link'" do
|
|
184
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to_not eq 'link'
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
%w[www homepage url some_pin uid everything_else html].each do |field_name|
|
|
190
|
+
context "when attribute name is '#{field_name}'" do
|
|
191
|
+
it "returns 'text'" do
|
|
192
|
+
expect( subject.send(:field_type_name_for_string, field_name, nil) ).to eq 'text'
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end # describe ".field_type_name_for_string"
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
describe '.field_type_name_for_text' do
|
|
200
|
+
%w[url homepage random_url random_homepage random_link cool_link].each do |field_name|
|
|
201
|
+
context "when attribute name is '#{field_name}'" do
|
|
202
|
+
it "returns 'link'" do
|
|
203
|
+
expect( subject.send(:field_type_name_for_text, field_name, nil) ).to eq 'link'
|
|
204
|
+
end
|
|
205
|
+
end
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
%w[url_for_site link_to_site link home_page homepage_for_site].each do |field_name|
|
|
209
|
+
context "when attribute name is '#{field_name}'" do
|
|
210
|
+
it "doesn't return 'link'" do
|
|
211
|
+
expect( subject.send(:field_type_name_for_text, field_name, nil) ).to_not eq 'link'
|
|
212
|
+
end
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
%w[html random_html].each do |field_name|
|
|
217
|
+
context "when attribute name is '#{field_name}'" do
|
|
218
|
+
it "returns 'richtext'" do
|
|
219
|
+
expect( subject.send(:field_type_name_for_text, field_name, nil) ).to eq 'richtext'
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
context "when attribute name is 'html_for_description'" do
|
|
225
|
+
it "doesn't return 'richtext'" do
|
|
226
|
+
expect( subject.send(:field_type_name_for_text, 'html_for_description', nil) ).to_not eq 'richtext'
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
%w[text description random html_text].each do |field_name|
|
|
231
|
+
context "when attribute name is '#{field_name}'" do
|
|
232
|
+
it "returns 'textarea'" do
|
|
233
|
+
expect( subject.send(:field_type_name_for_text, field_name, nil) ).to eq 'textarea'
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end # describe '.field_type_name_for_text'
|
|
238
|
+
|
|
239
|
+
describe ".field_type_name_for_datetime" do
|
|
240
|
+
%w[no matter what].each do |field_name|
|
|
241
|
+
context "when attribute name is '#{field_name}'" do
|
|
242
|
+
it "returns 'datetime'" do
|
|
243
|
+
expect( subject.send(:field_type_name_for_datetime, field_name, nil) ).to eq 'datetime'
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
end
|
|
247
|
+
end # describe ".field_type_name_for_datetime" do
|
|
248
|
+
describe ".field_type_name_for_date" do
|
|
249
|
+
%w[no matter what].each do |field_name|
|
|
250
|
+
context "when attribute name is '#{field_name}'" do
|
|
251
|
+
it "returns 'date'" do
|
|
252
|
+
expect( subject.send(:field_type_name_for_date, field_name, nil) ).to eq 'date'
|
|
253
|
+
end
|
|
254
|
+
end
|
|
255
|
+
end
|
|
256
|
+
end # describe ".field_type_name_for_date" do
|
|
257
|
+
describe ".field_type_name_for_time" do
|
|
258
|
+
%w[no matter what].each do |field_name|
|
|
259
|
+
context "when attribute name is '#{field_name}'" do
|
|
260
|
+
it "returns 'time'" do
|
|
261
|
+
expect( subject.send(:field_type_name_for_time, field_name, nil) ).to eq 'time'
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
end
|
|
265
|
+
end # describe ".field_type_name_for_time" do
|
|
266
|
+
describe ".field_type_name_for_boolean" do
|
|
267
|
+
%w[no matter what].each do |field_name|
|
|
268
|
+
context "when attribute name is '#{field_name}'" do
|
|
269
|
+
it "returns 'boolean'" do
|
|
270
|
+
expect( subject.send(:field_type_name_for_boolean, field_name, nil) ).to eq 'boolean'
|
|
271
|
+
end
|
|
272
|
+
end
|
|
273
|
+
end
|
|
274
|
+
end # describe ".field_type_name_for_boolean" do
|
|
275
|
+
describe ".field_type_name_for_float" do
|
|
276
|
+
%w[no matter what].each do |field_name|
|
|
277
|
+
context "when attribute name is '#{field_name}'" do
|
|
278
|
+
it "returns 'float'" do
|
|
279
|
+
expect( subject.send(:field_type_name_for_float, field_name, nil) ).to eq 'float'
|
|
280
|
+
end
|
|
281
|
+
end
|
|
282
|
+
end
|
|
283
|
+
end # describe ".field_type_name_for_float" do
|
|
284
|
+
|
|
285
|
+
describe ".field_type_name_for_integer" do
|
|
286
|
+
before do
|
|
287
|
+
author = FactoryGirl.create(:author)
|
|
288
|
+
@book = FactoryGirl.create(:book, :author => author)
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
context "when attributes ends with '_id'" do
|
|
292
|
+
context "when there's an ActiveRecord association" do
|
|
293
|
+
it "returns 'item'" do
|
|
294
|
+
expect( subject.send(:field_type_name_for_integer, 'author_id', @book) ).to eq 'item'
|
|
295
|
+
end
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
context "when there's no ActiveRecord association" do
|
|
299
|
+
it "returns 'text'" do
|
|
300
|
+
expect( subject.send(:field_type_name_for_integer, 'random_field_id', @book) ).to eq 'integer'
|
|
301
|
+
end
|
|
302
|
+
end
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
context "when attribute doesn't end with '_id'" do
|
|
306
|
+
it "returns 'text'" do
|
|
307
|
+
expect( subject.send(:field_type_name_for_integer, 'random_field', nil) ).to eq 'integer'
|
|
308
|
+
end
|
|
309
|
+
end
|
|
310
|
+
end # describe ".field_type_name_for_integer"
|
|
311
|
+
end
|