releaf-core 0.2.1 → 1.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (256) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +19 -21
  3. data/app/assets/javascripts/releaf/application.js +1 -2
  4. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +19 -21
  5. data/app/assets/javascripts/releaf/include/field.type_richtext.js +31 -9
  6. data/app/assets/javascripts/releaf/include/localization.js +3 -8
  7. data/app/assets/javascripts/releaf/include/nested_fields.js +1 -1
  8. data/app/assets/javascripts/releaf/include/remote_validator.js +7 -4
  9. data/app/assets/javascripts/releaf/include/sortable.js +1 -1
  10. data/app/assets/javascripts/releaf/include/{profile_settings.js → store_settings.js} +4 -10
  11. data/app/assets/javascripts/releaf/include/toolbox.js +7 -11
  12. data/app/assets/stylesheets/releaf/layout/fields.scss +1 -0
  13. data/app/assets/stylesheets/releaf/layout/header.scss +1 -0
  14. data/app/assets/stylesheets/releaf/layout/search.scss +15 -0
  15. data/app/builders/releaf/builders/base.rb +11 -9
  16. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +2 -2
  17. data/app/builders/releaf/builders/confirm_dialog_builder.rb +3 -3
  18. data/app/builders/releaf/builders/edit_builder.rb +51 -6
  19. data/app/builders/releaf/builders/form_builder/associated_set_field.rb +37 -0
  20. data/app/builders/releaf/builders/form_builder/associations.rb +153 -0
  21. data/app/builders/releaf/builders/form_builder/boolean_fields.rb +12 -0
  22. data/app/builders/releaf/builders/form_builder/date_fields.rb +30 -0
  23. data/app/builders/releaf/builders/form_builder/fields.rb +10 -0
  24. data/app/builders/releaf/builders/form_builder/file_fields.rb +47 -0
  25. data/app/builders/releaf/builders/form_builder/i18n_fields.rb +75 -0
  26. data/app/builders/releaf/builders/form_builder/label.rb +34 -0
  27. data/app/builders/releaf/builders/form_builder/number_fields.rb +13 -0
  28. data/app/builders/releaf/builders/form_builder/richtext_fields.rb +28 -0
  29. data/app/builders/releaf/builders/form_builder/text_fields.rb +43 -0
  30. data/app/builders/releaf/builders/form_builder.rb +8 -489
  31. data/app/builders/releaf/builders/index_builder.rb +10 -3
  32. data/app/builders/releaf/builders/page/header_builder.rb +23 -59
  33. data/app/builders/releaf/builders/page/layout_builder.rb +125 -115
  34. data/app/builders/releaf/builders/page/menu_builder.rb +96 -106
  35. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +7 -12
  36. data/app/builders/releaf/builders/resource_view.rb +4 -4
  37. data/app/builders/releaf/builders/table_builder.rb +20 -30
  38. data/app/builders/releaf/builders/toolbox_builder.rb +1 -1
  39. data/app/builders/releaf/builders/utilities/date_fields.rb +100 -0
  40. data/app/builders/releaf/builders/utilities/resolve_attribute_field_method_name.rb +80 -0
  41. data/app/builders/releaf/builders/view.rb +5 -2
  42. data/app/builders/releaf/settings/form_builder.rb +18 -0
  43. data/app/builders/releaf/settings/table_builder.rb +9 -0
  44. data/app/controllers/releaf/action_controller.rb +174 -0
  45. data/app/controllers/releaf/{core/errors_controller.rb → errors_controller.rb} +1 -1
  46. data/app/controllers/releaf/root_controller.rb +23 -0
  47. data/app/controllers/releaf/settings_controller.rb +22 -0
  48. data/app/helpers/releaf/application_helper.rb +1 -1
  49. data/app/lib/releaf/action_controller/ajax.rb +24 -0
  50. data/app/lib/releaf/action_controller/breadcrumbs.rb +26 -0
  51. data/app/lib/releaf/action_controller/builders.rb +34 -0
  52. data/app/lib/releaf/action_controller/features.rb +47 -0
  53. data/app/lib/releaf/action_controller/notifications.rb +28 -0
  54. data/app/lib/releaf/action_controller/resources.rb +59 -0
  55. data/app/{controllers/concerns/releaf → lib/releaf/action_controller}/richtext_attachments.rb +1 -1
  56. data/app/lib/releaf/action_controller/search.rb +22 -0
  57. data/app/lib/releaf/action_controller/urls.rb +49 -0
  58. data/app/lib/releaf/action_controller/views.rb +29 -0
  59. data/app/lib/releaf/assets_resolver.rb +51 -0
  60. data/app/lib/releaf/build_errors_hash.rb +81 -0
  61. data/app/lib/releaf/controller_definition.rb +22 -0
  62. data/app/lib/releaf/controller_group_definition.rb +12 -0
  63. data/app/lib/releaf/{core/default_searchable_fields.rb → default_searchable_fields.rb} +1 -1
  64. data/app/lib/releaf/{core/resource_base.rb → resource_base.rb} +14 -6
  65. data/app/lib/releaf/{core/resource_fields.rb → resource_fields.rb} +1 -1
  66. data/app/lib/releaf/{core/resource_params.rb → resource_params.rb} +3 -3
  67. data/app/lib/releaf/resource_table_fields.rb +10 -0
  68. data/app/lib/releaf/{core/resource_utilities.rb → resource_utilities.rb} +2 -2
  69. data/app/lib/releaf/{core/responders → responders}/access_denied_responder.rb +2 -2
  70. data/app/lib/releaf/{core/responders → responders}/after_save_responder.rb +3 -3
  71. data/app/lib/releaf/{core/responders → responders}/confirm_destroy_responder.rb +1 -1
  72. data/app/lib/releaf/{core/responders → responders}/destroy_responder.rb +1 -1
  73. data/app/lib/releaf/{core/responders → responders}/error_responder.rb +1 -1
  74. data/app/lib/releaf/{core/responders → responders}/feature_disabled_responder.rb +2 -2
  75. data/app/lib/releaf/{core/responders → responders}/page_not_found_responder.rb +2 -2
  76. data/app/lib/releaf/responders.rb +31 -0
  77. data/app/lib/releaf/{core/search.rb → search.rb} +1 -1
  78. data/app/lib/releaf/settings/normalize_value.rb +45 -0
  79. data/app/lib/releaf/settings/register.rb +45 -0
  80. data/app/models/releaf/settings.rb +25 -13
  81. data/app/services/array/reorder.rb +82 -0
  82. data/app/views/releaf/{base → action}/confirm_destroy.ruby +0 -0
  83. data/app/views/releaf/{base → action}/create_releaf_richtext_attachment.haml +0 -0
  84. data/app/views/releaf/{base → action}/edit.ruby +0 -0
  85. data/app/views/releaf/{base → action}/index.ruby +0 -0
  86. data/app/views/releaf/{base → action}/new.ruby +0 -0
  87. data/app/views/releaf/{base → action}/refused_destroy.ruby +0 -0
  88. data/app/views/releaf/{base → action}/show.ruby +0 -0
  89. data/app/views/releaf/{base → action}/toolbox.ruby +0 -0
  90. data/lib/generators/dummy/install_generator.rb +5 -0
  91. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/books.js +23 -0
  92. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/nodes.js +1 -0
  93. data/lib/generators/dummy/templates/assets/javascripts/controllers/admin/other_site/other_nodes.js +1 -0
  94. data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/nodes.scss +1 -0
  95. data/lib/generators/dummy/templates/assets/stylesheets/controllers/admin/other_site/other_nodes.scss +1 -0
  96. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +11 -1
  97. data/lib/generators/dummy/templates/config/routes.rb +31 -7
  98. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +3 -6
  99. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +1 -1
  100. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +1 -1
  101. data/lib/generators/dummy/templates/controllers/admin/nodes_controller.rb +3 -0
  102. data/lib/generators/dummy/templates/controllers/admin/other_site/other_nodes_controller.rb +3 -0
  103. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +1 -1
  104. data/lib/generators/dummy/templates/controllers/application_controller.rb +27 -5
  105. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +13 -3
  106. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -1
  107. data/lib/generators/dummy/templates/initializers/releaf.rb +31 -25
  108. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +1 -0
  109. data/lib/generators/dummy/templates/migrations/create_other_nodes.rb +29 -0
  110. data/lib/generators/dummy/templates/models/author.rb +2 -2
  111. data/lib/generators/dummy/templates/models/book.rb +0 -2
  112. data/lib/generators/dummy/templates/models/chapter.rb +0 -2
  113. data/lib/generators/dummy/templates/models/home_page.rb +1 -0
  114. data/lib/generators/dummy/templates/models/other_site/other_node.rb +7 -0
  115. data/lib/generators/dummy/templates/models/publisher.rb +0 -5
  116. data/lib/generators/dummy/templates/models/text_page.rb +0 -1
  117. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -1
  118. data/lib/generators/dummy/templates/views/layouts/application.html.haml +9 -1
  119. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -1
  120. data/lib/generators/releaf/templates/initializers/releaf.rb +6 -17
  121. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +13 -14
  122. data/lib/generators/releaf/templates/seeds/seeds.rb +28 -32
  123. data/lib/releaf/{core/application.rb → application.rb} +5 -4
  124. data/lib/releaf/{core/component.rb → component.rb} +6 -2
  125. data/lib/releaf/configuration.rb +95 -0
  126. data/lib/releaf/core_ext/array/reorder.rb +5 -0
  127. data/lib/releaf/engine.rb +12 -0
  128. data/lib/releaf/exceptions.rb +5 -0
  129. data/lib/releaf/instance_cache.rb +72 -0
  130. data/lib/releaf/{core → rails_ext}/validation_error_codes.rb +1 -1
  131. data/lib/releaf/root/configuration.rb +6 -0
  132. data/lib/releaf/root/default_controller_resolver.rb +37 -0
  133. data/lib/releaf/root/settings_manager.rb +12 -0
  134. data/lib/releaf/root.rb +17 -0
  135. data/lib/releaf/{core/route_mapper.rb → route_mapper.rb} +6 -6
  136. data/lib/releaf/service.rb +11 -0
  137. data/lib/releaf/settings_ui.rb +7 -0
  138. data/lib/releaf/version.rb +1 -1
  139. data/lib/releaf-core.rb +38 -9
  140. data/spec/builders/{builders → releaf/builders}/association_reflector_spec.rb +0 -0
  141. data/spec/builders/{builders → releaf/builders}/base_spec.rb +17 -21
  142. data/spec/builders/{builders → releaf/builders}/collection_spec.rb +0 -0
  143. data/spec/builders/{builders → releaf/builders}/confirm_destroy_dialog_builder_spec.rb +5 -5
  144. data/spec/builders/{builders → releaf/builders}/confirm_dialog_builder_spec.rb +9 -7
  145. data/spec/builders/{builders → releaf/builders}/edit_builder_spec.rb +127 -20
  146. data/spec/builders/releaf/builders/form_builder/associations_spec.rb +129 -0
  147. data/spec/builders/releaf/builders/form_builder/date_fields_spec.rb +86 -0
  148. data/spec/builders/releaf/builders/form_builder/i18n_fields_spec.rb +48 -0
  149. data/spec/builders/releaf/builders/form_builder/label_spec.rb +106 -0
  150. data/spec/builders/releaf/builders/form_builder/number_fields_spec.rb +37 -0
  151. data/spec/builders/releaf/builders/form_builder_spec.rb +228 -0
  152. data/spec/builders/{builders → releaf/builders}/index_builder_spec.rb +29 -10
  153. data/spec/builders/releaf/builders/page/header_builder_spec.rb +65 -0
  154. data/spec/builders/releaf/builders/page/layout_builder_spec.rb +170 -0
  155. data/spec/builders/releaf/builders/page/menu_builder_spec.rb +345 -0
  156. data/spec/builders/{builders → releaf/builders}/pagination_builder_spec.rb +0 -0
  157. data/spec/builders/{builders → releaf/builders}/resource_dialog_spec.rb +0 -0
  158. data/spec/builders/{builders → releaf/builders}/resource_view_spec.rb +8 -8
  159. data/spec/builders/{builders → releaf/builders}/show_builder_spec.rb +0 -0
  160. data/spec/builders/{builders → releaf/builders}/table_builder_spec.rb +31 -75
  161. data/spec/builders/{builders → releaf/builders}/template_spec.rb +0 -0
  162. data/spec/builders/{builders → releaf/builders}/toolbox_builder_spec.rb +4 -4
  163. data/spec/builders/{builders → releaf/builders}/toolbox_spec.rb +0 -0
  164. data/spec/builders/releaf/builders/utilities/date_fields_spec.rb +125 -0
  165. data/spec/builders/releaf/builders/utilities/resolve_attribute_field_method_name_spec.rb +318 -0
  166. data/spec/builders/{builders → releaf/builders}/view_spec.rb +1 -1
  167. data/spec/builders/{builders_spec.rb → releaf/builders_spec.rb} +0 -0
  168. data/spec/builders/releaf/settings/form_builder_spec.rb +48 -0
  169. data/spec/builders/{core → releaf}/settings/table_builder_spec.rb +6 -4
  170. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +1 -1
  171. data/spec/controllers/releaf/{base_controller_spec.rb → action_controller_spec.rb} +132 -161
  172. data/spec/controllers/releaf/root_controller_spec.rb +40 -0
  173. data/spec/controllers/releaf/settings_controller_spec.rb +52 -0
  174. data/spec/error_hash_builder_spec.rb +83 -0
  175. data/spec/ext/array_reorder_spec.rb +12 -0
  176. data/spec/features/ajaxbox_spec.rb +6 -6
  177. data/spec/features/errors_spec.rb +2 -1
  178. data/spec/features/index_table_spec.rb +6 -3
  179. data/spec/features/richtext_attachments_spec.rb +2 -2
  180. data/spec/features/richtext_custom_config_spec.rb +28 -0
  181. data/spec/features/richtext_embed_spec.rb +1 -1
  182. data/spec/features/richtext_spec.rb +10 -1
  183. data/spec/features/search_spec.rb +1 -1
  184. data/spec/features/settings_spec.rb +10 -5
  185. data/spec/helpers/application_helper_spec.rb +4 -6
  186. data/spec/lib/releaf/action_controller/features_spec.rb +171 -0
  187. data/spec/lib/releaf/action_controller/search_spec.rb +84 -0
  188. data/spec/lib/releaf/{core/application_spec.rb → application_spec.rb} +7 -6
  189. data/spec/lib/releaf/assets_resolver_spec.rb +130 -0
  190. data/spec/lib/releaf/build_errors_hash_spec.rb +141 -0
  191. data/spec/lib/releaf/configuration_spec.rb +205 -0
  192. data/spec/lib/releaf/controller_definition_spec.rb +49 -0
  193. data/spec/lib/releaf/controller_group_definition_spec.rb +27 -0
  194. data/spec/lib/releaf/{core/default_searchable_fields_spec.rb → default_searchable_fields_spec.rb} +1 -1
  195. data/spec/lib/releaf/instance_cache_spec.rb +98 -0
  196. data/spec/lib/releaf/{core/resource_base_spec.rb → resource_base_spec.rb} +59 -21
  197. data/spec/lib/releaf/{core/resource_fields_spec.rb → resource_fields_spec.rb} +1 -1
  198. data/spec/lib/releaf/{core/resource_params_spec.rb → resource_params_spec.rb} +3 -5
  199. data/spec/lib/releaf/resource_table_fields_spec.rb +20 -0
  200. data/spec/lib/releaf/{core/resource_utilities_spec.rb → resource_utilities_spec.rb} +1 -1
  201. data/spec/lib/releaf/{core/responders → responders}/access_denied_responder_spec.rb +1 -1
  202. data/spec/lib/releaf/{core/responders → responders}/after_save_responder_spec.rb +9 -8
  203. data/spec/lib/releaf/{core/responders → responders}/confirm_destroy_responder_spec.rb +2 -2
  204. data/spec/lib/releaf/{core/responders → responders}/destroy_responder_spec.rb +2 -2
  205. data/spec/lib/releaf/{core/responders → responders}/error_responder_spec.rb +4 -4
  206. data/spec/lib/releaf/{core/responders → responders}/feature_disabled_responder_spec.rb +1 -1
  207. data/spec/lib/releaf/{core/responders → responders}/page_not_found_responder_spec.rb +1 -1
  208. data/spec/lib/releaf/{core/responders_spec.rb → responders_spec.rb} +14 -14
  209. data/spec/lib/releaf/root/configuration_spec.rb +9 -0
  210. data/spec/lib/releaf/root/default_controller_resolver_spec.rb +108 -0
  211. data/spec/lib/releaf/root_spec.rb +13 -0
  212. data/spec/lib/releaf/service_spec.rb +20 -0
  213. data/spec/lib/releaf/settings/normalize_value_spec.rb +103 -0
  214. data/spec/lib/releaf/settings/register_spec.rb +135 -0
  215. data/spec/lib/releaf/settings_manager_spec.rb +22 -0
  216. data/spec/lib/validation_error_codes_spec.rb +1 -1
  217. data/spec/misc/factories_spec.rb +0 -12
  218. data/spec/models/settings_spec.rb +74 -32
  219. data/spec/routing/route_mapper_spec.rb +5 -5
  220. data/spec/rspec_helpers/test_helpers_spec.rb +1 -1
  221. data/spec/rspec_helpers/test_spec.rb +14 -0
  222. data/spec/{lib/releaf/core/item_orderer_spec.rb → services/array/reorder_spec.rb} +32 -53
  223. metadata +299 -224
  224. data/app/builders/releaf/builders/orderer.rb +0 -5
  225. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +0 -40
  226. data/app/builders/releaf/core/settings/form_builder.rb +0 -21
  227. data/app/builders/releaf/core/settings/table_builder.rb +0 -11
  228. data/app/controllers/concerns/releaf/breadcrumbs.rb +0 -42
  229. data/app/controllers/releaf/base_controller.rb +0 -458
  230. data/app/controllers/releaf/core/settings_controller.rb +0 -50
  231. data/app/helpers/releaf/javascript_helper.rb +0 -75
  232. data/app/lib/releaf/core/assets_resolver.rb +0 -58
  233. data/app/lib/releaf/core/error_formatter.rb +0 -103
  234. data/app/lib/releaf/core/item_orderer.rb +0 -102
  235. data/app/lib/releaf/core/resource_table_fields.rb +0 -10
  236. data/app/lib/releaf/core/responders.rb +0 -31
  237. data/app/lib/releaf/core/template_field_type_mapper.rb +0 -127
  238. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  239. data/lib/releaf/core/builders_autoload.rb +0 -27
  240. data/lib/releaf/core/configuration.rb +0 -101
  241. data/lib/releaf/core/engine.rb +0 -35
  242. data/lib/releaf/core/exceptions.rb +0 -38
  243. data/lib/releaf/core/settings_ui_component.rb +0 -7
  244. data/releaf-core.gemspec +0 -35
  245. data/spec/builders/builders/form_builder_spec.rb +0 -562
  246. data/spec/builders/builders/orderer_spec.rb +0 -22
  247. data/spec/builders/builders/page/header_builder_spec.rb +0 -143
  248. data/spec/builders/builders/page/layout_builder_spec.rb +0 -73
  249. data/spec/builders/builders/page/menu_builder_spec.rb +0 -160
  250. data/spec/builders/core/settings/form_builder_spec.rb +0 -69
  251. data/spec/controllers/releaf/core/settings_controller_spec.rb +0 -31
  252. data/spec/lib/releaf/core/assets_resolver_spec.rb +0 -113
  253. data/spec/lib/releaf/core/configuration_spec.rb +0 -230
  254. data/spec/lib/releaf/core/error_formatter_spec.rb +0 -242
  255. data/spec/lib/releaf/core/resource_table_fields_spec.rb +0 -18
  256. 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.to_text)
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 = edit_releaf_content_node_path(node)
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 = edit_releaf_content_node_path(node)
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 = edit_releaf_content_node_path(node)
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 = edit_releaf_content_node_path(node)
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.to_text)
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!).and_raise(Releaf::FeatureDisabled, "edit")
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 = ["Title", "Year", "Author", "Genre", "Active", "Published at", "Price", "Stars", "Cover image uid", "Description", "Author publisher title"]
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", "", "", "", "", "ABC books"]
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 new_releaf_content_node_path(content_type: 'HomePage')
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 new_releaf_content_node_path(content_type: 'HomePage')
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 new_releaf_content_node_path(content_type: 'HomePage')
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 new_releaf_content_node_path(content_type: 'TextPage')
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'> &quot;HTML&quot; '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
@@ -1,6 +1,6 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Search do
3
+ describe Releaf::Search do
4
4
 
5
5
  describe "searching in models attributes" do
6
6
  with_model :Tester, scope: :all do
@@ -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 releaf_core_settings_path
15
- expect(page).to have_number_of_resources(4)
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 releaf_core_settings_path
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::BaseController)
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 = FactoryGirl.create(:translation, :key => "admin.xx.colors-red")
45
- FactoryGirl.create(:translation_data, :lang => "en", :localization => "Color red", :translation => translation)
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::Core::Application do
3
+ describe Releaf::Application do
4
4
  describe "#configure" do
5
- it "assigns new `Releaf::Core::Configuration` instance, evaluate block and call instance configuration" do
6
- configuration = Releaf::Core::Configuration.new
7
- allow(Releaf::Core::Configuration).to receive(:new).and_return(configuration)
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(:configure)
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::Core::Configuration.new
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