releaf-core 0.2.1 → 1.0.3
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 +4 -4
- data/LICENSE +19 -21
- data/app/assets/javascripts/releaf/application.js +1 -2
- data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +19 -21
- data/app/assets/javascripts/releaf/include/field.type_richtext.js +31 -9
- data/app/assets/javascripts/releaf/include/localization.js +3 -8
- data/app/assets/javascripts/releaf/include/nested_fields.js +1 -1
- data/app/assets/javascripts/releaf/include/remote_validator.js +7 -4
- data/app/assets/javascripts/releaf/include/sortable.js +1 -1
- data/app/assets/javascripts/releaf/include/{profile_settings.js → store_settings.js} +4 -10
- data/app/assets/javascripts/releaf/include/toolbox.js +7 -11
- data/app/assets/stylesheets/releaf/layout/fields.scss +1 -0
- data/app/assets/stylesheets/releaf/layout/header.scss +1 -0
- data/app/assets/stylesheets/releaf/layout/search.scss +15 -0
- data/app/builders/releaf/builders/base.rb +11 -9
- data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +2 -2
- data/app/builders/releaf/builders/confirm_dialog_builder.rb +3 -3
- data/app/builders/releaf/builders/edit_builder.rb +51 -6
- data/app/builders/releaf/builders/form_builder/associated_set_field.rb +37 -0
- data/app/builders/releaf/builders/form_builder/associations.rb +153 -0
- data/app/builders/releaf/builders/form_builder/boolean_fields.rb +12 -0
- data/app/builders/releaf/builders/form_builder/date_fields.rb +30 -0
- data/app/builders/releaf/builders/form_builder/fields.rb +10 -0
- data/app/builders/releaf/builders/form_builder/file_fields.rb +47 -0
- data/app/builders/releaf/builders/form_builder/i18n_fields.rb +75 -0
- data/app/builders/releaf/builders/form_builder/label.rb +34 -0
- data/app/builders/releaf/builders/form_builder/number_fields.rb +13 -0
- data/app/builders/releaf/builders/form_builder/richtext_fields.rb +28 -0
- data/app/builders/releaf/builders/form_builder/text_fields.rb +43 -0
- data/app/builders/releaf/builders/form_builder.rb +8 -489
- data/app/builders/releaf/builders/index_builder.rb +10 -3
- data/app/builders/releaf/builders/page/header_builder.rb +23 -59
- data/app/builders/releaf/builders/page/layout_builder.rb +125 -115
- data/app/builders/releaf/builders/page/menu_builder.rb +96 -106
- data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +7 -12
- data/app/builders/releaf/builders/resource_view.rb +4 -4
- data/app/builders/releaf/builders/table_builder.rb +20 -30
- data/app/builders/releaf/builders/toolbox_builder.rb +1 -1
- data/app/builders/releaf/builders/utilities/date_fields.rb +100 -0
- data/app/builders/releaf/builders/utilities/resolve_attribute_field_method_name.rb +80 -0
- data/app/builders/releaf/builders/view.rb +5 -2
- data/app/builders/releaf/settings/form_builder.rb +18 -0
- data/app/builders/releaf/settings/table_builder.rb +9 -0
- data/app/controllers/releaf/action_controller.rb +174 -0
- data/app/controllers/releaf/{core/errors_controller.rb → errors_controller.rb} +1 -1
- data/app/controllers/releaf/root_controller.rb +23 -0
- data/app/controllers/releaf/settings_controller.rb +22 -0
- data/app/helpers/releaf/application_helper.rb +1 -1
- data/app/lib/releaf/action_controller/ajax.rb +24 -0
- data/app/lib/releaf/action_controller/breadcrumbs.rb +26 -0
- data/app/lib/releaf/action_controller/builders.rb +34 -0
- data/app/lib/releaf/action_controller/features.rb +47 -0
- data/app/lib/releaf/action_controller/notifications.rb +28 -0
- data/app/lib/releaf/action_controller/resources.rb +59 -0
- data/app/{controllers/concerns/releaf → lib/releaf/action_controller}/richtext_attachments.rb +1 -1
- data/app/lib/releaf/action_controller/search.rb +22 -0
- data/app/lib/releaf/action_controller/urls.rb +49 -0
- data/app/lib/releaf/action_controller/views.rb +29 -0
- data/app/lib/releaf/assets_resolver.rb +51 -0
- data/app/lib/releaf/build_errors_hash.rb +81 -0
- data/app/lib/releaf/controller_definition.rb +22 -0
- data/app/lib/releaf/controller_group_definition.rb +12 -0
- data/app/lib/releaf/{core/default_searchable_fields.rb → default_searchable_fields.rb} +1 -1
- data/app/lib/releaf/{core/resource_base.rb → resource_base.rb} +14 -6
- data/app/lib/releaf/{core/resource_fields.rb → resource_fields.rb} +1 -1
- data/app/lib/releaf/{core/resource_params.rb → resource_params.rb} +3 -3
- data/app/lib/releaf/resource_table_fields.rb +10 -0
- data/app/lib/releaf/{core/resource_utilities.rb → resource_utilities.rb} +2 -2
- data/app/lib/releaf/{core/responders → responders}/access_denied_responder.rb +2 -2
- data/app/lib/releaf/{core/responders → responders}/after_save_responder.rb +3 -3
- data/app/lib/releaf/{core/responders → responders}/confirm_destroy_responder.rb +1 -1
- data/app/lib/releaf/{core/responders → responders}/destroy_responder.rb +1 -1
- data/app/lib/releaf/{core/responders → responders}/error_responder.rb +1 -1
- data/app/lib/releaf/{core/responders → responders}/feature_disabled_responder.rb +2 -2
- data/app/lib/releaf/{core/responders → responders}/page_not_found_responder.rb +2 -2
- data/app/lib/releaf/responders.rb +31 -0
- data/app/lib/releaf/{core/search.rb → search.rb} +1 -1
- data/app/lib/releaf/settings/normalize_value.rb +45 -0
- data/app/lib/releaf/settings/register.rb +45 -0
- data/app/models/releaf/settings.rb +25 -13
- data/app/services/array/reorder.rb +82 -0
- data/app/views/releaf/{base → action}/confirm_destroy.ruby +0 -0
- data/app/views/releaf/{base → action}/create_releaf_richtext_attachment.haml +0 -0
- data/app/views/releaf/{base → action}/edit.ruby +0 -0
- data/app/views/releaf/{base → action}/index.ruby +0 -0
- data/app/views/releaf/{base → action}/new.ruby +0 -0
- data/app/views/releaf/{base → action}/refused_destroy.ruby +0 -0
- data/app/views/releaf/{base → action}/show.ruby +0 -0
- data/app/views/releaf/{base → action}/toolbox.ruby +0 -0
- data/lib/generators/dummy/install_generator.rb +5 -0
- data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/books.js +23 -0
- data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/nodes.js +1 -0
- data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/other_site/other_nodes.js +1 -0
- data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/nodes.scss +1 -0
- data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/other_site/other_nodes.scss +1 -0
- data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +11 -1
- data/lib/generators/dummy/templates/config/routes.rb +31 -7
- data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +3 -6
- data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +1 -1
- data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +1 -1
- data/lib/generators/dummy/templates/controllers/admin/nodes_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/admin/other_site/other_nodes_controller.rb +3 -0
- data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +1 -1
- data/lib/generators/dummy/templates/controllers/application_controller.rb +27 -5
- data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +13 -3
- data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -1
- data/lib/generators/dummy/templates/initializers/releaf.rb +31 -25
- data/lib/generators/dummy/templates/migrations/create_home_pages.rb +1 -0
- data/lib/generators/dummy/templates/migrations/create_other_nodes.rb +29 -0
- data/lib/generators/dummy/templates/models/author.rb +2 -2
- data/lib/generators/dummy/templates/models/book.rb +0 -2
- data/lib/generators/dummy/templates/models/chapter.rb +0 -2
- data/lib/generators/dummy/templates/models/home_page.rb +1 -0
- data/lib/generators/dummy/templates/models/other_site/other_node.rb +7 -0
- data/lib/generators/dummy/templates/models/publisher.rb +0 -5
- data/lib/generators/dummy/templates/models/text_page.rb +0 -1
- data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -1
- data/lib/generators/dummy/templates/views/layouts/application.html.haml +9 -1
- data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -1
- data/lib/generators/releaf/templates/initializers/releaf.rb +6 -17
- data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +13 -14
- data/lib/generators/releaf/templates/seeds/seeds.rb +28 -32
- data/lib/releaf/{core/application.rb → application.rb} +5 -4
- data/lib/releaf/{core/component.rb → component.rb} +6 -2
- data/lib/releaf/configuration.rb +95 -0
- data/lib/releaf/core_ext/array/reorder.rb +5 -0
- data/lib/releaf/engine.rb +12 -0
- data/lib/releaf/exceptions.rb +5 -0
- data/lib/releaf/instance_cache.rb +72 -0
- data/lib/releaf/{core → rails_ext}/validation_error_codes.rb +1 -1
- data/lib/releaf/root/configuration.rb +6 -0
- data/lib/releaf/root/default_controller_resolver.rb +37 -0
- data/lib/releaf/root/settings_manager.rb +12 -0
- data/lib/releaf/root.rb +17 -0
- data/lib/releaf/{core/route_mapper.rb → route_mapper.rb} +6 -6
- data/lib/releaf/service.rb +11 -0
- data/lib/releaf/settings_ui.rb +7 -0
- data/lib/releaf/version.rb +1 -1
- data/lib/releaf-core.rb +38 -9
- data/spec/builders/{builders → releaf/builders}/association_reflector_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/base_spec.rb +17 -21
- data/spec/builders/{builders → releaf/builders}/collection_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/confirm_destroy_dialog_builder_spec.rb +5 -5
- data/spec/builders/{builders → releaf/builders}/confirm_dialog_builder_spec.rb +9 -7
- data/spec/builders/{builders → releaf/builders}/edit_builder_spec.rb +127 -20
- data/spec/builders/releaf/builders/form_builder/associations_spec.rb +129 -0
- data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +86 -0
- data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +48 -0
- data/spec/builders/releaf/builders/form_builder/label_spec.rb +106 -0
- data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +37 -0
- data/spec/builders/releaf/builders/form_builder_spec.rb +228 -0
- data/spec/builders/{builders → releaf/builders}/index_builder_spec.rb +29 -10
- data/spec/builders/releaf/builders/page/header_builder_spec.rb +65 -0
- data/spec/builders/releaf/builders/page/layout_builder_spec.rb +170 -0
- data/spec/builders/releaf/builders/page/menu_builder_spec.rb +345 -0
- data/spec/builders/{builders → releaf/builders}/pagination_builder_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/resource_dialog_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/resource_view_spec.rb +8 -8
- data/spec/builders/{builders → releaf/builders}/show_builder_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/table_builder_spec.rb +31 -75
- data/spec/builders/{builders → releaf/builders}/template_spec.rb +0 -0
- data/spec/builders/{builders → releaf/builders}/toolbox_builder_spec.rb +4 -4
- data/spec/builders/{builders → releaf/builders}/toolbox_spec.rb +0 -0
- data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +125 -0
- data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +318 -0
- data/spec/builders/{builders → releaf/builders}/view_spec.rb +1 -1
- data/spec/builders/{builders_spec.rb → releaf/builders_spec.rb} +0 -0
- data/spec/builders/releaf/settings/form_builder_spec.rb +48 -0
- data/spec/builders/{core → releaf}/settings/table_builder_spec.rb +6 -4
- data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +1 -1
- data/spec/controllers/releaf/{base_controller_spec.rb → action_controller_spec.rb} +132 -161
- data/spec/controllers/releaf/root_controller_spec.rb +40 -0
- data/spec/controllers/releaf/settings_controller_spec.rb +52 -0
- data/spec/error_hash_builder_spec.rb +83 -0
- data/spec/ext/array_reorder_spec.rb +12 -0
- data/spec/features/ajaxbox_spec.rb +6 -6
- data/spec/features/errors_spec.rb +2 -1
- data/spec/features/index_table_spec.rb +6 -3
- data/spec/features/richtext_attachments_spec.rb +2 -2
- data/spec/features/richtext_custom_config_spec.rb +28 -0
- data/spec/features/richtext_embed_spec.rb +1 -1
- data/spec/features/richtext_spec.rb +10 -1
- data/spec/features/search_spec.rb +1 -1
- data/spec/features/settings_spec.rb +10 -5
- data/spec/helpers/application_helper_spec.rb +4 -6
- data/spec/lib/releaf/action_controller/features_spec.rb +171 -0
- data/spec/lib/releaf/action_controller/search_spec.rb +84 -0
- data/spec/lib/releaf/{core/application_spec.rb → application_spec.rb} +7 -6
- data/spec/lib/releaf/assets_resolver_spec.rb +130 -0
- data/spec/lib/releaf/build_errors_hash_spec.rb +141 -0
- data/spec/lib/releaf/configuration_spec.rb +205 -0
- data/spec/lib/releaf/controller_definition_spec.rb +49 -0
- data/spec/lib/releaf/controller_group_definition_spec.rb +27 -0
- data/spec/lib/releaf/{core/default_searchable_fields_spec.rb → default_searchable_fields_spec.rb} +1 -1
- data/spec/lib/releaf/instance_cache_spec.rb +98 -0
- data/spec/lib/releaf/{core/resource_base_spec.rb → resource_base_spec.rb} +59 -21
- data/spec/lib/releaf/{core/resource_fields_spec.rb → resource_fields_spec.rb} +1 -1
- data/spec/lib/releaf/{core/resource_params_spec.rb → resource_params_spec.rb} +3 -5
- data/spec/lib/releaf/resource_table_fields_spec.rb +20 -0
- data/spec/lib/releaf/{core/resource_utilities_spec.rb → resource_utilities_spec.rb} +1 -1
- data/spec/lib/releaf/{core/responders → responders}/access_denied_responder_spec.rb +1 -1
- data/spec/lib/releaf/{core/responders → responders}/after_save_responder_spec.rb +9 -8
- data/spec/lib/releaf/{core/responders → responders}/confirm_destroy_responder_spec.rb +2 -2
- data/spec/lib/releaf/{core/responders → responders}/destroy_responder_spec.rb +2 -2
- data/spec/lib/releaf/{core/responders → responders}/error_responder_spec.rb +4 -4
- data/spec/lib/releaf/{core/responders → responders}/feature_disabled_responder_spec.rb +1 -1
- data/spec/lib/releaf/{core/responders → responders}/page_not_found_responder_spec.rb +1 -1
- data/spec/lib/releaf/{core/responders_spec.rb → responders_spec.rb} +14 -14
- data/spec/lib/releaf/root/configuration_spec.rb +9 -0
- data/spec/lib/releaf/root/default_controller_resolver_spec.rb +108 -0
- data/spec/lib/releaf/root_spec.rb +13 -0
- data/spec/lib/releaf/service_spec.rb +20 -0
- data/spec/lib/releaf/settings/normalize_value_spec.rb +103 -0
- data/spec/lib/releaf/settings/register_spec.rb +135 -0
- data/spec/lib/releaf/settings_manager_spec.rb +22 -0
- data/spec/lib/validation_error_codes_spec.rb +1 -1
- data/spec/misc/factories_spec.rb +0 -12
- data/spec/models/settings_spec.rb +74 -32
- data/spec/routing/route_mapper_spec.rb +5 -5
- data/spec/rspec_helpers/test_helpers_spec.rb +1 -1
- data/spec/rspec_helpers/test_spec.rb +14 -0
- data/spec/{lib/releaf/core/item_orderer_spec.rb → services/array/reorder_spec.rb} +32 -53
- metadata +299 -224
- data/app/builders/releaf/builders/orderer.rb +0 -5
- data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +0 -40
- data/app/builders/releaf/core/settings/form_builder.rb +0 -21
- data/app/builders/releaf/core/settings/table_builder.rb +0 -11
- data/app/controllers/concerns/releaf/breadcrumbs.rb +0 -42
- data/app/controllers/releaf/base_controller.rb +0 -458
- data/app/controllers/releaf/core/settings_controller.rb +0 -50
- data/app/helpers/releaf/javascript_helper.rb +0 -75
- data/app/lib/releaf/core/assets_resolver.rb +0 -58
- data/app/lib/releaf/core/error_formatter.rb +0 -103
- data/app/lib/releaf/core/item_orderer.rb +0 -102
- data/app/lib/releaf/core/resource_table_fields.rb +0 -10
- data/app/lib/releaf/core/responders.rb +0 -31
- data/app/lib/releaf/core/template_field_type_mapper.rb +0 -127
- data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
- data/lib/releaf/core/builders_autoload.rb +0 -27
- data/lib/releaf/core/configuration.rb +0 -101
- data/lib/releaf/core/engine.rb +0 -35
- data/lib/releaf/core/exceptions.rb +0 -38
- data/lib/releaf/core/settings_ui_component.rb +0 -7
- data/releaf-core.gemspec +0 -35
- data/spec/builders/builders/form_builder_spec.rb +0 -562
- data/spec/builders/builders/orderer_spec.rb +0 -22
- data/spec/builders/builders/page/header_builder_spec.rb +0 -143
- data/spec/builders/builders/page/layout_builder_spec.rb +0 -73
- data/spec/builders/builders/page/menu_builder_spec.rb +0 -160
- data/spec/builders/core/settings/form_builder_spec.rb +0 -69
- data/spec/controllers/releaf/core/settings_controller_spec.rb +0 -31
- data/spec/lib/releaf/core/assets_resolver_spec.rb +0 -113
- data/spec/lib/releaf/core/configuration_spec.rb +0 -230
- data/spec/lib/releaf/core/error_formatter_spec.rb +0 -242
- data/spec/lib/releaf/core/resource_table_fields_spec.rb +0 -18
- data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +0 -311
|
@@ -8,7 +8,7 @@ feature "Ajaxbox", js: true do
|
|
|
8
8
|
user = Releaf::Permissions::User.last
|
|
9
9
|
visit releaf_permissions_users_path
|
|
10
10
|
click_link user.name
|
|
11
|
-
expect(page).to have_header(text: user.
|
|
11
|
+
expect(page).to have_header(text: user.releaf_title)
|
|
12
12
|
|
|
13
13
|
open_toolbox_dialog "Delete"
|
|
14
14
|
within_dialog{ click_link "No" }
|
|
@@ -18,7 +18,7 @@ feature "Ajaxbox", js: true do
|
|
|
18
18
|
|
|
19
19
|
scenario "Close ajaxbox with footer 'cancel' button (wrapped within form) without reloading page" do
|
|
20
20
|
node = create(:home_page_node, name: "MyNode")
|
|
21
|
-
node_path =
|
|
21
|
+
node_path = edit_admin_node_path(node)
|
|
22
22
|
visit node_path
|
|
23
23
|
open_toolbox_dialog "Move"
|
|
24
24
|
within_dialog{ click_link "Cancel" }
|
|
@@ -28,7 +28,7 @@ feature "Ajaxbox", js: true do
|
|
|
28
28
|
|
|
29
29
|
scenario "Close ajaxbox with header 'close' button without reloading page" do
|
|
30
30
|
node = create(:home_page_node, name: "MyNode")
|
|
31
|
-
node_path =
|
|
31
|
+
node_path = edit_admin_node_path(node)
|
|
32
32
|
visit node_path
|
|
33
33
|
open_toolbox_dialog "Add child"
|
|
34
34
|
within_dialog{ find("button.close").click }
|
|
@@ -38,7 +38,7 @@ feature "Ajaxbox", js: true do
|
|
|
38
38
|
|
|
39
39
|
scenario "Drag ajaxbox within header" do
|
|
40
40
|
node = create(:home_page_node, name: "MyNode")
|
|
41
|
-
node_path =
|
|
41
|
+
node_path = edit_admin_node_path(node)
|
|
42
42
|
visit node_path
|
|
43
43
|
open_toolbox_dialog "Add child"
|
|
44
44
|
header = find(".dialog > header")
|
|
@@ -66,7 +66,7 @@ feature "Ajaxbox", js: true do
|
|
|
66
66
|
|
|
67
67
|
scenario "Ajaxbox without modality (background is clickable)" do
|
|
68
68
|
node = create(:home_page_node, name: "MyNode")
|
|
69
|
-
node_path =
|
|
69
|
+
node_path = edit_admin_node_path(node)
|
|
70
70
|
visit node_path
|
|
71
71
|
open_toolbox_dialog "Add child"
|
|
72
72
|
|
|
@@ -79,7 +79,7 @@ feature "Ajaxbox", js: true do
|
|
|
79
79
|
user = Releaf::Permissions::User.last
|
|
80
80
|
visit releaf_permissions_users_path
|
|
81
81
|
click_link user.name
|
|
82
|
-
expect(page).to have_header(text: user.
|
|
82
|
+
expect(page).to have_header(text: user.releaf_title)
|
|
83
83
|
open_toolbox_dialog "Delete"
|
|
84
84
|
|
|
85
85
|
expect(page).to have_css(".mfp-bg")
|
|
@@ -12,7 +12,8 @@ describe "Errors feature" do
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
it "returns 403 status code and generic error page for disabled feature" do
|
|
15
|
-
allow_any_instance_of(Releaf::Permissions::RolesController).to receive(:verify_feature_availability!)
|
|
15
|
+
allow_any_instance_of(Releaf::Permissions::RolesController).to receive(:verify_feature_availability!)
|
|
16
|
+
.and_raise(Releaf::FeatureDisabled, "edit")
|
|
16
17
|
visit releaf_permissions_roles_path
|
|
17
18
|
|
|
18
19
|
expect(page.status_code).to eq(403)
|
|
@@ -13,18 +13,21 @@ feature "Index tables" do
|
|
|
13
13
|
visit admin_books_path
|
|
14
14
|
|
|
15
15
|
within ".table.books thead tr" do
|
|
16
|
-
cells = [
|
|
16
|
+
cells = [
|
|
17
|
+
"Title", "Year", "Author", "Genre", "Active", "Published at",
|
|
18
|
+
"Price", "Stars", "Description", "Author publisher title"
|
|
19
|
+
]
|
|
17
20
|
expect(page).to have_cells_text(cells, type: "th")
|
|
18
21
|
end
|
|
19
22
|
|
|
20
23
|
within ".table.books tbody" do
|
|
21
24
|
within "tr[data-id='#{@book_1.id}']" do
|
|
22
|
-
cells = ["good book", "", "Aleksandrs Lielais", "", "", "No", "", "", "", "
|
|
25
|
+
cells = ["good book", "", "Aleksandrs Lielais", "", "", "No", "", "", "", "ABC books"]
|
|
23
26
|
expect(page).to have_cells_text(cells)
|
|
24
27
|
end
|
|
25
28
|
|
|
26
29
|
within "tr[data-id='#{@book_2.id}']" do
|
|
27
|
-
cells = ["steevs book", "", "Steve Lielais", "", "", "No", "", "", "", ""
|
|
30
|
+
cells = ["steevs book", "", "Steve Lielais", "", "", "No", "", "", "", ""]
|
|
28
31
|
expect(page).to have_cells_text(cells)
|
|
29
32
|
end
|
|
30
33
|
end
|
|
@@ -7,7 +7,7 @@ feature "Richtext attachments", js: true do
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
scenario "Upload image and insert it within text" do
|
|
10
|
-
visit
|
|
10
|
+
visit new_admin_node_path(content_type: 'HomePage')
|
|
11
11
|
fill_in("Name", with: "Image test")
|
|
12
12
|
select('en', from: 'Locale')
|
|
13
13
|
|
|
@@ -35,7 +35,7 @@ feature "Richtext attachments", js: true do
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
scenario "Upload file and insert url to it" do
|
|
38
|
-
visit
|
|
38
|
+
visit new_admin_node_path(content_type: 'HomePage')
|
|
39
39
|
fill_in("Name", with: "Link test")
|
|
40
40
|
select('en', from: 'Locale')
|
|
41
41
|
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
feature "Richtext custom config", js: true do
|
|
3
|
+
background do
|
|
4
|
+
# preload ActsAsNode classes
|
|
5
|
+
Rails.application.eager_load!
|
|
6
|
+
auth_as_user
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
scenario "Add embed to richtext" do
|
|
10
|
+
visit new_admin_book_path
|
|
11
|
+
wait_for_all_richtexts
|
|
12
|
+
|
|
13
|
+
within "section[data-name=\"chapters\"]" do
|
|
14
|
+
click_button "Add item"
|
|
15
|
+
expect(page).to have_css(".cke_toolbar a.cke_button__bold")
|
|
16
|
+
expect(page).to have_css(".cke_toolbar a.cke_button__italic")
|
|
17
|
+
expect(page).to_not have_css(".cke_toolbar a.cke_button__image")
|
|
18
|
+
expect(page).to_not have_css(".cke_toolbar a.cke_button__format")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
within ".field[data-name=\"summary_html\"]" do
|
|
22
|
+
expect(page).to have_css(".cke_toolbar a.cke_button__bold")
|
|
23
|
+
expect(page).to have_css(".cke_toolbar a.cke_button__italic")
|
|
24
|
+
expect(page).to have_css(".cke_toolbar a.cke_button__image")
|
|
25
|
+
expect(page).to_not have_css(".cke_toolbar a.cke_button__format")
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -7,7 +7,7 @@ feature "Richtext embed", js: true do
|
|
|
7
7
|
end
|
|
8
8
|
|
|
9
9
|
scenario "Add embed to richtext" do
|
|
10
|
-
visit
|
|
10
|
+
visit new_admin_node_path(content_type: 'HomePage')
|
|
11
11
|
fill_in("Name", with: "Embed test")
|
|
12
12
|
select('en', from: 'Locale')
|
|
13
13
|
|
|
@@ -5,7 +5,7 @@ feature "Richtext editing", js: true do
|
|
|
5
5
|
end
|
|
6
6
|
|
|
7
7
|
scenario "Image toolbar available when controller support attachments" do
|
|
8
|
-
visit
|
|
8
|
+
visit new_admin_node_path(content_type: 'TextPage')
|
|
9
9
|
fill_in_richtext 'Text', with: "some text"
|
|
10
10
|
expect(page).to have_css("a.cke_button__image")
|
|
11
11
|
end
|
|
@@ -16,4 +16,13 @@ feature "Richtext editing", js: true do
|
|
|
16
16
|
fill_in_richtext "Summary", with: "some text"
|
|
17
17
|
expect(page).to_not have_css("a.cke_button__image")
|
|
18
18
|
end
|
|
19
|
+
|
|
20
|
+
scenario "Test helper fills in correct value" do
|
|
21
|
+
visit new_admin_node_path(content_type: 'TextPage')
|
|
22
|
+
html = %Q[ <p class="xxx" id='yyy'> "HTML" 'content' </p> ]
|
|
23
|
+
fill_in_richtext 'Text', with: html
|
|
24
|
+
content = evaluate_script('CKEDITOR.instances["resource_content_attributes_text_html"].getData();')
|
|
25
|
+
expect(content).to match_html html
|
|
26
|
+
end
|
|
27
|
+
|
|
19
28
|
end
|
|
@@ -5,14 +5,18 @@ feature "Settings", js: true do
|
|
|
5
5
|
{key: "content.updated_at", default: Time.parse("2014-07-01 14:33:59"), description: "Content update time", type: :time},
|
|
6
6
|
{key: "content.updated", default: true, description: "Content is updated?", type: :boolean},
|
|
7
7
|
{key: "content.rating", default: 5.65, type: :decimal},
|
|
8
|
-
{key: "content.title", default: "some"}
|
|
8
|
+
{key: "content.title", default: "some"},
|
|
9
|
+
{key: "content.date", default: DateTime.parse("2015-05-02"), type: "date"}
|
|
9
10
|
]
|
|
10
11
|
Releaf::Settings.destroy_all
|
|
11
|
-
Releaf::Settings.register(values)
|
|
12
|
+
Releaf::Settings.register(*values)
|
|
12
13
|
auth_as_user
|
|
13
14
|
|
|
14
|
-
visit
|
|
15
|
-
expect(page).to have_number_of_resources(
|
|
15
|
+
visit releaf_settings_path
|
|
16
|
+
expect(page).to have_number_of_resources(5)
|
|
17
|
+
expect(page).to have_css(".table.releaf\\/settings tbody tr:first-child td:first-child", text: "content.date")
|
|
18
|
+
expect(page).to have_css(".table.releaf\\/settings tbody tr:first-child td:nth-child(2)", text: /^Sat, 02 May 2015 00:00:00 \+0000$/)
|
|
19
|
+
expect(page).to have_css(".table.releaf\\/settings tbody tr:last-child td:first-child", text: "content.updated_at")
|
|
16
20
|
|
|
17
21
|
search "content.updated"
|
|
18
22
|
expect(page).to have_number_of_resources(2)
|
|
@@ -21,6 +25,7 @@ feature "Settings", js: true do
|
|
|
21
25
|
update_resource do
|
|
22
26
|
fill_in "Content update time", with: '2014-04-01 12:33:59'
|
|
23
27
|
end
|
|
28
|
+
|
|
24
29
|
click_link "Back to list"
|
|
25
30
|
expect(page).to have_content("2014-04-01 12:33:59")
|
|
26
31
|
expect(Releaf::Settings["content.updated_at"]).to eq(Time.parse("2014-04-01 12:33:59"))
|
|
@@ -29,7 +34,7 @@ feature "Settings", js: true do
|
|
|
29
34
|
expect(page).to have_field("Content is updated?")
|
|
30
35
|
expect(page).to have_css(".field input[type='checkbox'][checked='checked']")
|
|
31
36
|
|
|
32
|
-
visit
|
|
37
|
+
visit releaf_settings_path
|
|
33
38
|
|
|
34
39
|
click_link "content.rating"
|
|
35
40
|
expect(page).to have_field("Value")
|
|
@@ -32,7 +32,7 @@ describe Releaf::ApplicationHelper do
|
|
|
32
32
|
describe "#i18n_options_for_select" do
|
|
33
33
|
Color = Struct.new(:id, :to_s)
|
|
34
34
|
let(:helper) do
|
|
35
|
-
helper = instance_double(Releaf::
|
|
35
|
+
helper = instance_double(Releaf::ActionController)
|
|
36
36
|
helper.extend Releaf::ApplicationHelper
|
|
37
37
|
helper.extend ActionView::Helpers
|
|
38
38
|
|
|
@@ -40,11 +40,9 @@ describe Releaf::ApplicationHelper do
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
before do
|
|
43
|
-
|
|
44
|
-
translation
|
|
45
|
-
|
|
46
|
-
I18n.backend.reload_cache
|
|
47
|
-
|
|
43
|
+
translation = Releaf::I18nDatabase::I18nEntry.create(key: "admin.xx.colors-red")
|
|
44
|
+
translation.i18n_entry_translation.create(locale: "en", text: "Color red")
|
|
45
|
+
Releaf::I18nDatabase::Backend.reset_cache
|
|
48
46
|
allow(helper).to receive(:controller_scope_name).and_return("admin.xx")
|
|
49
47
|
end
|
|
50
48
|
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
describe Releaf::ActionController::Features do
|
|
4
|
+
let(:subject){ DummyActionControllerFeaturesIncluder.new }
|
|
5
|
+
|
|
6
|
+
class DummyActionControllerFeaturesIncluder < Releaf::ActionController
|
|
7
|
+
include Releaf::ActionController::Features
|
|
8
|
+
include Releaf::Responders
|
|
9
|
+
def params
|
|
10
|
+
{action: "some_action"}
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "#verify_feature_availability!" do
|
|
15
|
+
before do
|
|
16
|
+
allow(subject).to receive(:action_feature).with("some_action").and_return(:feature_name)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it "adds itself to before filters" do
|
|
20
|
+
before_actions = subject._process_action_callbacks.select{|f| f.kind == :before}.map{|f| f.filter }
|
|
21
|
+
expect(before_actions).to include(:verify_controller_access!)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
context "when no feature defined for action" do
|
|
25
|
+
it "doesn no raise `Releaf::FeatureDisabled` exception" do
|
|
26
|
+
allow(subject).to receive(:action_feature).with("some_action").and_return(nil)
|
|
27
|
+
expect{ subject.verify_feature_availability! }.to_not raise_error
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
context "when current feature is available" do
|
|
32
|
+
it "doesn no raise `Releaf::FeatureDisabled` exception" do
|
|
33
|
+
allow(subject).to receive(:feature_available?).with(:feature_name).and_return(true)
|
|
34
|
+
expect{ subject.verify_feature_availability! }.to_not raise_error
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
context "when current feature is not available" do
|
|
39
|
+
it "raises `Releaf::FeatureDisabled` exception with stringified feature name" do
|
|
40
|
+
allow(subject).to receive(:feature_available?).with(:feature_name).and_return(false)
|
|
41
|
+
expect{ subject.verify_feature_availability! }.to raise_error(Releaf::FeatureDisabled, "feature_name")
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "#action_feature" do
|
|
47
|
+
before do
|
|
48
|
+
allow(subject).to receive(:action_features).and_return(create: "xxx", te: "kkk")
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "returns matching feature for given action from action features" do
|
|
52
|
+
expect(subject.action_feature(:create)).to eq("xxx")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "symbolize given action name" do
|
|
56
|
+
expect(subject.action_feature("te")).to eq("kkk")
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe "#features" do
|
|
61
|
+
it "returns array instance" do
|
|
62
|
+
expect(subject.features).to be_instance_of Array
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "returned array contains features as symbols" do
|
|
66
|
+
subject.features.each do|feature_name|
|
|
67
|
+
expect(feature_name).to be_instance_of Symbol
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
describe "#action_features" do
|
|
73
|
+
it "returns instance of `Hash`" do
|
|
74
|
+
expect(subject.action_features).to be_instance_of(Hash)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "returns hash with action and feature mapp as symbols" do
|
|
78
|
+
subject.action_features.each_pair do|action_name, feature_name|
|
|
79
|
+
expect(action_name).to be_instance_of(Symbol)
|
|
80
|
+
expect(feature_name).to be_instance_of(Symbol)
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
context "when `show` feature is available" do
|
|
85
|
+
it "returns show to show feature mapping" do
|
|
86
|
+
allow(subject).to receive(:feature_available?).with(:show).and_return(true)
|
|
87
|
+
expect(subject.action_features[:show]).to eq(:show)
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
context "when `show` feature is not available" do
|
|
92
|
+
it "returns show to edit feature mapping" do
|
|
93
|
+
allow(subject).to receive(:feature_available?).with(:show).and_return(false)
|
|
94
|
+
expect(subject.action_features[:show]).to eq(:edit)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe "#feature_disabled" do
|
|
100
|
+
before do
|
|
101
|
+
allow(subject).to receive(:action_responder).with(:feature_disabled).and_return("_res")
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
it "adds itself as rescue handler from `Releaf::FeatureDisabled` exception" do
|
|
105
|
+
expect(Hash[subject.rescue_handlers]["Releaf::FeatureDisabled"]).to eq(:feature_disabled)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "calls disabled feature responder" do
|
|
109
|
+
expect(subject).to receive(:respond_with).with(nil, responder: "_res")
|
|
110
|
+
subject.feature_disabled(Releaf::FeatureDisabled.new("xx"))
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "assigns @feature instance variable from exception message" do
|
|
114
|
+
allow(subject).to receive(:respond_with)
|
|
115
|
+
expect{ subject.feature_disabled(Releaf::FeatureDisabled.new("xx")) }.to change{ subject.instance_variable_get(:@feature) }
|
|
116
|
+
.to("xx")
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
describe "#feature_available?" do
|
|
121
|
+
it "adds itself as helper" do
|
|
122
|
+
expect(subject._helper_methods).to include(:feature_available?)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "returns whether feature is defined within features variable" do
|
|
126
|
+
allow(subject).to receive(:features).and_return([:edit])
|
|
127
|
+
expect(subject.feature_available?(:create)).to be false
|
|
128
|
+
|
|
129
|
+
allow(subject).to receive(:features).and_return([:edit, :create])
|
|
130
|
+
expect(subject.feature_available?(:create)).to be true
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
context "when `search` feature requested" do
|
|
134
|
+
it "also checks whether `index` feature is enabled" do
|
|
135
|
+
allow(subject).to receive(:feature_available?).with(:search).and_call_original
|
|
136
|
+
allow(subject).to receive(:feature_available?).with(:index).and_return(false)
|
|
137
|
+
|
|
138
|
+
allow(subject).to receive(:features).and_return([:edit])
|
|
139
|
+
expect(subject.feature_available?(:search)).to be false
|
|
140
|
+
|
|
141
|
+
allow(subject).to receive(:features).and_return([:edit, :search])
|
|
142
|
+
expect(subject.feature_available?(:search)).to be false
|
|
143
|
+
|
|
144
|
+
allow(subject).to receive(:feature_available?).with(:index).and_return(true)
|
|
145
|
+
expect(subject.feature_available?(:search)).to be true
|
|
146
|
+
|
|
147
|
+
allow(subject).to receive(:features).and_return([:edit])
|
|
148
|
+
expect(subject.feature_available?(:search)).to be false
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
context "when `create_another` feature requested" do
|
|
153
|
+
it "also checks whether `create` feature is enabled" do
|
|
154
|
+
allow(subject).to receive(:feature_available?).with(:create_another).and_call_original
|
|
155
|
+
allow(subject).to receive(:feature_available?).with(:create).and_return(false)
|
|
156
|
+
|
|
157
|
+
allow(subject).to receive(:features).and_return([:edit])
|
|
158
|
+
expect(subject.feature_available?(:create_another)).to be false
|
|
159
|
+
|
|
160
|
+
allow(subject).to receive(:features).and_return([:edit, :create_another])
|
|
161
|
+
expect(subject.feature_available?(:create_another)).to be false
|
|
162
|
+
|
|
163
|
+
allow(subject).to receive(:feature_available?).with(:create).and_return(true)
|
|
164
|
+
expect(subject.feature_available?(:create_another)).to be true
|
|
165
|
+
|
|
166
|
+
allow(subject).to receive(:features).and_return([:edit])
|
|
167
|
+
expect(subject.feature_available?(:create_another)).to be false
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
end
|
|
171
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
require 'rails_helper'
|
|
2
|
+
|
|
3
|
+
describe Releaf::ActionController::Search do
|
|
4
|
+
let(:subject){ DummyActionControllerSearchIncluder.new }
|
|
5
|
+
|
|
6
|
+
class DummySearcher < Releaf::Search
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
class DummyActionControllerSearchIncluder < Releaf::ActionController
|
|
10
|
+
include Releaf::ActionController::Features
|
|
11
|
+
include Releaf::ActionController::Search
|
|
12
|
+
|
|
13
|
+
def resource_class
|
|
14
|
+
Book
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "#search" do
|
|
19
|
+
before do
|
|
20
|
+
allow(subject).to receive(:searchable_fields).and_return([:name, :email])
|
|
21
|
+
allow(subject).to receive(:feature_available?).with(:search).and_return(true)
|
|
22
|
+
|
|
23
|
+
subject.instance_variable_set(:@collection, "_collection")
|
|
24
|
+
allow(subject).to receive(:searcher_class).and_return(DummySearcher)
|
|
25
|
+
allow(DummySearcher).to receive(:prepare).with(relation: "_collection", fields: [:name, :email], text: "_some")
|
|
26
|
+
.and_return("_collection_with_search")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "when feature is enabled, text and searchable fields is not blank" do
|
|
30
|
+
it "replaces collection with searchable collection" do
|
|
31
|
+
expect{ subject.search("_some") }.to change{ subject.instance_variable_get(:@collection) }
|
|
32
|
+
.from("_collection").to("_collection_with_search")
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
context "when `show` feature is not available" do
|
|
37
|
+
it "does not replace collection with searchable collection" do
|
|
38
|
+
allow(subject).to receive(:feature_available?).with(:search).and_return(false)
|
|
39
|
+
expect{ subject.search("_some") }.to_not change{ subject.instance_variable_get(:@collection) }
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "when blank search given" do
|
|
44
|
+
it "does not replace collection with searchable collection" do
|
|
45
|
+
expect{ subject.search("") }.to_not change{ subject.instance_variable_get(:@collection) }
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context "when no search fields exists" do
|
|
50
|
+
it "does not replace collection with searchable collection" do
|
|
51
|
+
allow(subject).to receive(:searchable_fields).and_return([])
|
|
52
|
+
expect{ subject.search("_some") }.to_not change{ subject.instance_variable_get(:@collection) }
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
describe "#searcher_class" do
|
|
58
|
+
it "returns `Releaf::Search` class" do
|
|
59
|
+
expect(subject.searcher_class).to eq(Releaf::Search)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
describe "#searchable_fields" do
|
|
64
|
+
let(:searchable_fields){ Releaf::DefaultSearchableFields.new(Author) }
|
|
65
|
+
|
|
66
|
+
it "adds itself as helper" do
|
|
67
|
+
expect(subject._helper_methods).to include(:searchable_fields)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "returns default searchable fields from `Releaf::DefaultSearchableFields` instance" do
|
|
71
|
+
allow(Releaf::DefaultSearchableFields).to receive(:new).with(Book).and_return(searchable_fields)
|
|
72
|
+
allow(searchable_fields).to receive(:find).and_return("x").once
|
|
73
|
+
|
|
74
|
+
expect(subject.searchable_fields).to eq("x")
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
it "caches returned searchable fields" do
|
|
78
|
+
allow(Releaf::DefaultSearchableFields).to receive(:new).and_return(searchable_fields)
|
|
79
|
+
expect(searchable_fields).to receive(:find).and_return("x").once
|
|
80
|
+
subject.searchable_fields
|
|
81
|
+
subject.searchable_fields
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
require "rails_helper"
|
|
2
2
|
|
|
3
|
-
describe Releaf::
|
|
3
|
+
describe Releaf::Application do
|
|
4
4
|
describe "#configure" do
|
|
5
|
-
it "assigns new
|
|
6
|
-
configuration = Releaf::
|
|
7
|
-
allow(Releaf::
|
|
5
|
+
it "assigns new configuration instance, evaluate block, initialize locales and components" do
|
|
6
|
+
configuration = Releaf::Configuration.new
|
|
7
|
+
allow(Releaf::Configuration).to receive(:new).and_return(configuration)
|
|
8
8
|
|
|
9
9
|
expect(subject).to receive(:config=).with(configuration).and_call_original.ordered
|
|
10
10
|
expect(configuration).to receive(:menu=).with("x").ordered
|
|
11
|
-
expect(configuration).to receive(:
|
|
11
|
+
expect(configuration).to receive(:initialize_locales).ordered
|
|
12
|
+
expect(configuration).to receive(:initialize_components).ordered
|
|
12
13
|
subject.configure{ config.menu = "x" }
|
|
13
14
|
end
|
|
14
15
|
end
|
|
@@ -24,7 +25,7 @@ describe Releaf::Core::Application do
|
|
|
24
25
|
end
|
|
25
26
|
end
|
|
26
27
|
|
|
27
|
-
subject.config = Releaf::
|
|
28
|
+
subject.config = Releaf::Configuration.new
|
|
28
29
|
allow(subject.config).to receive(:layout_builder_class_name).and_return("DummyBuilder")
|
|
29
30
|
builder = DummyBuilder.new("xx")
|
|
30
31
|
allow(DummyBuilder).to receive(:new).with("tmpl").and_return(builder)
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require "rails_helper"
|
|
2
|
+
|
|
3
|
+
describe Releaf::AssetsResolver do
|
|
4
|
+
describe ".base_assets" do
|
|
5
|
+
it "returns array with `releaf/application`" do
|
|
6
|
+
expect(described_class.base_assets).to eq(["releaf/application"])
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
describe ".controller_assets" do
|
|
11
|
+
before do
|
|
12
|
+
allow(described_class).to receive(:base_assets).and_return(["a", "b"])
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
context "when controller assets of given type (javascripts/stylesheets) exists" do
|
|
16
|
+
it "returns array with controller specific asset alognside base assets" do
|
|
17
|
+
allow(described_class).to receive(:assets).and_return(
|
|
18
|
+
"controllers/releaf/i18n_database/translations.js" => "controllers/releaf/i18n_database/translations.js",
|
|
19
|
+
"controllers/releaf/i18n_database/translations.css" => "controllers/releaf/i18n_database/translations.css",
|
|
20
|
+
)
|
|
21
|
+
expect(described_class.controller_assets("releaf/i18n_database/translations", :javascripts))
|
|
22
|
+
.to eq(["a", "b", "controllers/releaf/i18n_database/translations.js"])
|
|
23
|
+
|
|
24
|
+
expect(described_class.controller_assets("releaf/i18n_database/translations", :stylesheets))
|
|
25
|
+
.to eq(["a", "b", "controllers/releaf/i18n_database/translations.css"])
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
context "when no controller assets of given type (javascripts/stylesheets) exists" do
|
|
30
|
+
it "returns only base assets" do
|
|
31
|
+
allow(described_class).to receive(:assets).and_return(
|
|
32
|
+
"controllers/releaf/i18n_database/translations.fonts" => "controllers/releaf/i18n_database/translations.fonts",
|
|
33
|
+
"i18n_database/translations.css" => "i18n_database/translations.css",
|
|
34
|
+
)
|
|
35
|
+
expect(described_class.controller_assets("releaf/i18n_database/translations", :javascripts))
|
|
36
|
+
.to eq(["a", "b"])
|
|
37
|
+
|
|
38
|
+
expect(described_class.controller_assets("releaf/i18n_database/translations", :stylesheets))
|
|
39
|
+
.to eq(["a", "b"])
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
describe ".compiled_assets" do
|
|
45
|
+
it "returns array with uniq controller scoped stylesheets and javascripts" do
|
|
46
|
+
allow(Rails.application.assets_manifest).to receive(:files).and_return(
|
|
47
|
+
"controllers/releaf/content/nodes-72ac849dd467fe827933f15c45ea77a2b7beac55379147f3be4a21779787f484.js"=>{"logical_path"=>"controllers/releaf/content/nodes.js", "mtime"=>"2015-12-01T13:55:41+02:00", "size"=>1530, "digest"=>"72ac849dd467fe827933f15c45ea77a2b7beac55379147f3be4a21779787f484", "integrity"=>"sha256-cqyEndRn/oJ5M/FcRep3ore+rFU3kUfzvkohd5eH9IQ="},
|
|
48
|
+
"controllers/releaf/content/nodes-2ac6b38702a01d9e0918adasasdasda45e746.css"=>{"logical_path"=>"controllers/releaf/content/nodes.css", "mtime"=>"2016-02-18T13:36:15+02:00", "size"=>4301, "digest"=>"2ac6b38702a01d9e0918adasasdasda45e746", "integrity"=>"sha256-asdasdasdsa+adasdasda="},
|
|
49
|
+
# simulate old assets cache here
|
|
50
|
+
"controllers/releaf/content/nodes-adsaassdkdasd.css"=>{"logical_path"=>"controllers/releaf/content/nodes.css", "mtime"=>"2016-02-18T13:36:15+02:00", "size"=>4301, "digest"=>"adsaassdkdasd", "integrity"=>"sha256-asdasdasdsa+adasdasda="},
|
|
51
|
+
"releaontxzcent/nodes-asdassdasdsaasdasd.css"=>{"logical_path"=>"releaontxzcent/nodes-asdassdasdsaasdasd.css", "mtime"=>"2016-01-18T13:36:15+02:00", "size"=>5919, "digest"=>"asdassdasdsaasdasd", "integrity"=>"sha256-KsazhwKgHZ4JGPBY+SOznIMgzfph9Bx0lHUrZIpF50Y="},
|
|
52
|
+
"controllers/releaf/permissions/sessions-9eb2f3275ea7578a6a95ca413d318a9984ef93c0d6645f11cf77fe82a2639cf0.css"=>{"logical_path"=>"controllers/releaf/permissions/sessions.css", "mtime"=>"2016-01-18T13:36:15+02:00", "size"=>2205, "digest"=>"9eb2f3275ea7578a6a95ca413d318a9984ef93c0d6645f11cf77fe82a2639cf0", "integrity"=>"sha256-nrLzJ16nV4pqlcpBPTGKmYTvk8DWZF8Rz3f+gqJjnPA="}
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
list = [
|
|
56
|
+
"controllers/releaf/content/nodes.js",
|
|
57
|
+
"controllers/releaf/content/nodes.css",
|
|
58
|
+
"controllers/releaf/permissions/sessions.css"
|
|
59
|
+
]
|
|
60
|
+
expect(described_class.compiled_assets).to eq(list)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
describe ".noncompiled_assets" do
|
|
65
|
+
it "returns array with controller scoped stylesheets and javascripts" do
|
|
66
|
+
list = [
|
|
67
|
+
"controllers/admin/books.js",
|
|
68
|
+
"controllers/admin/nodes.js",
|
|
69
|
+
"controllers/admin/other_site/other_nodes.js",
|
|
70
|
+
"controllers/admin/nodes.css",
|
|
71
|
+
"controllers/admin/other_site/other_nodes.css",
|
|
72
|
+
"controllers/releaf/content/nodes.js",
|
|
73
|
+
"controllers/releaf/content/nodes.css",
|
|
74
|
+
"controllers/releaf/permissions/sessions.css",
|
|
75
|
+
"controllers/releaf/i18n_database/translations.js",
|
|
76
|
+
"controllers/releaf/i18n_database/translations.css"
|
|
77
|
+
]
|
|
78
|
+
expect(described_class.noncompiled_assets).to eq(list)
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
describe ".compiled_assets?" do
|
|
83
|
+
context "when `Rails.application.assets` is not nil" do
|
|
84
|
+
it "returns true" do
|
|
85
|
+
allow(Rails.application).to receive(:assets).and_return(nil)
|
|
86
|
+
expect(described_class.compiled_assets?).to be true
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
context "when `Rails.application.assets` is nil" do
|
|
91
|
+
it "returns false" do
|
|
92
|
+
allow(Rails.application).to receive(:assets).and_return("x")
|
|
93
|
+
expect(described_class.compiled_assets?).to be false
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
describe ".assets" do
|
|
99
|
+
before do
|
|
100
|
+
described_class.class_variable_set(:@@compiled_assets, nil)
|
|
101
|
+
allow(described_class).to receive(:compiled_assets).and_return("a")
|
|
102
|
+
allow(described_class).to receive(:noncompiled_assets).and_return("b")
|
|
103
|
+
allow(described_class).to receive(:assets_hash).with("a").and_return("aa")
|
|
104
|
+
allow(described_class).to receive(:assets_hash).with("b").and_return("bb")
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
context "when compiled assets is not available" do
|
|
108
|
+
it "returns grouped non compiled assets" do
|
|
109
|
+
allow(described_class).to receive(:compiled_assets?).and_return(false)
|
|
110
|
+
expect(described_class.assets).to eq("bb")
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
context "when compiled assets available" do
|
|
115
|
+
before do
|
|
116
|
+
allow(described_class).to receive(:compiled_assets?).and_return(true)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
it "caches grouped compiled assets list" do
|
|
120
|
+
expect(described_class).to receive(:assets_hash).once.and_return("aa")
|
|
121
|
+
described_class.assets
|
|
122
|
+
described_class.assets
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "returns grouped compiled assets" do
|
|
126
|
+
expect(described_class.assets).to eq("aa")
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|