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.
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
@@ -1,230 +0,0 @@
1
- require "rails_helper"
2
-
3
- describe Releaf::Core::Configuration do
4
- describe "#configure" do
5
- it "calls all initializators" do
6
- expect(subject).to receive(:initialize_defaults).ordered
7
- expect(subject).to receive(:initialize_locales).ordered
8
- expect(subject).to receive(:initialize_controllers).ordered
9
- expect(subject).to receive(:initialize_components).ordered
10
- subject.configure
11
- end
12
- end
13
-
14
- describe "#assets_resolver" do
15
- it "returns assets resolver class" do
16
- allow(subject).to receive(:assets_resolver_class_name).and_return("Book")
17
- expect(subject.assets_resolver).to eq(Book)
18
- end
19
- end
20
-
21
- describe "#access_control_module" do
22
- it "returns access control module class" do
23
- allow(subject).to receive(:access_control_module_name).and_return("Book")
24
- expect(subject.access_control_module).to eq(Book)
25
- end
26
- end
27
-
28
- describe "#initialize_defaults" do
29
- it "ovewrites only nil values with default ones" do
30
- allow(subject).to receive(:default_values).and_return(menu: "aa", components: "lk")
31
- subject.menu = "x"
32
- subject.components = nil
33
- expect{ subject.initialize_defaults }.to change{ [subject.menu, subject.components] }.to(["x", "lk"])
34
- end
35
- end
36
-
37
- describe "#initialize_locales" do
38
- before do
39
- subject.available_locales = [:a, :b]
40
- subject.available_admin_locales = [:b, :c]
41
- allow(::I18n).to receive(:available_locales=)
42
- end
43
-
44
- it "assigns available locales to `I18n.available_locales`" do
45
- expect(::I18n).to receive(:available_locales=).with([:a, :b])
46
- subject.initialize_locales
47
- end
48
-
49
- context "when no `available_admin_locales` defined" do
50
- it "overwrites it with available locales" do
51
- expect{ subject.initialize_locales }.to_not change{ subject.available_admin_locales }
52
-
53
- subject.available_admin_locales = nil
54
- expect{ subject.initialize_locales }.to change{ subject.available_admin_locales }.to eq([:a, :b])
55
- end
56
- end
57
-
58
- it "merges unique locales form admin and available locales, casts it to strings and assign to `all_locales`" do
59
- expect{ subject.initialize_locales }.to change{ subject.all_locales }.to eq(["a", "b", "c"])
60
- end
61
- end
62
-
63
- describe "#initialize_components" do
64
- before do
65
- class DummyComponentA; end
66
- class DummyComponentB
67
- def self.initialize_component; end
68
- end
69
- allow(subject).to receive(:flatten_components).with(["x", "s"])
70
- .and_return([DummyComponentA, DummyComponentB])
71
- subject.components = ["x", "s"]
72
- end
73
-
74
- it "reassign normalized components" do
75
- expect{ subject.initialize_components }.to change{ subject.components }.to([DummyComponentA, DummyComponentB])
76
- end
77
-
78
- it "calls component initializing method if available" do
79
- expect(DummyComponentB).to receive(:initialize_component)
80
- subject.initialize_components
81
- end
82
- end
83
-
84
- describe "#flatten_components" do
85
- it "returns recursively flattened component list" do
86
- class DummyComponentA; end
87
- class DummyComponentB
88
- def self.components
89
- ["o", "p"]
90
- end
91
- end
92
-
93
- allow(subject).to receive(:flatten_components).and_call_original
94
- allow(subject).to receive(:flatten_components).with(["o", "p"]).and_return(["x", "y"])
95
- expect(subject.flatten_components([DummyComponentA, DummyComponentB])).to eq([DummyComponentA, "x", "y", DummyComponentB])
96
- end
97
- end
98
-
99
- describe "#initialize_controllers" do
100
- before do
101
- subject.menu = ["a"]
102
- subject.additional_controllers = ["b"]
103
- allow(subject).to receive(:normalize_controllers).with(["a"]).and_return(["aa"])
104
- allow(subject).to receive(:normalize_controllers).with(["b"]).and_return(["bb"])
105
- allow(subject).to receive(:extract_controllers).with(["aa", "bb"]).and_return({"c" => "d"})
106
- end
107
-
108
- it "normalizes menu" do
109
- expect{ subject.initialize_controllers }.to change{ subject.menu }.from(["a"]).to(["aa"])
110
- end
111
-
112
- it "normalizes additional controllers" do
113
- expect{ subject.initialize_controllers }.to change{ subject.additional_controllers }.from(["b"]).to(["bb"])
114
- end
115
-
116
- it "extract controller items from menu and additional controllers and assign then to controllers" do
117
- expect{ subject.initialize_controllers }.to change{ subject.controllers }.from(nil).to("c" => "d")
118
- end
119
-
120
- it "extract controller names and assign to available controllers" do
121
- expect{ subject.initialize_controllers }.to change{ subject.available_controllers }.from(nil).to(["c"])
122
- end
123
- end
124
-
125
- describe "#extract_controllers" do
126
- it "returns recursively built hash with controllers from given array" do
127
- list = [{controller: "a"}, {items: [{controller: "b"}, {controller: "c"}, {xx: "x"}]}, {controller: "d"}, {asd: "xx"}]
128
- result = {"a"=>{controller: "a"}, "b"=>{controller: "b"}, "c"=>{controller: "c"}, "d" => {controller: "d"}}
129
- expect(subject.extract_controllers(list)).to eq(result)
130
- end
131
- end
132
-
133
- describe "#normalize_controllers" do
134
- it "returns list of normalized controllers" do
135
- allow(subject).to receive(:normalize_controller_item).with(:a).and_return("ab")
136
- allow(subject).to receive(:normalize_controller_item).with(:b).and_return("bc")
137
- expect(subject.normalize_controllers([:a, :b])).to eq(["ab", "bc"])
138
- end
139
- end
140
-
141
- describe "#normalize_controller_item" do
142
- describe ":controller" do
143
- context "when given value is instance of `String`" do
144
- it "use value as controller name" do
145
- expect(subject.normalize_controller_item("a")[:controller]).to eq("a")
146
- end
147
- end
148
-
149
- context "when given value is hash" do
150
- it "does not add controller value" do
151
- expect(subject.normalize_controller_item(a: "x")[:controller]).to be nil
152
- end
153
-
154
- it "does not modify controller value" do
155
- expect(subject.normalize_controller_item(controller: "x")[:controller]).to eq("x")
156
- end
157
- end
158
- end
159
-
160
- describe ":name" do
161
- context "when controller hash does not have name value" do
162
- it "assigns controller value as name" do
163
- expect(subject.normalize_controller_item(controller: "x")[:name]).to eq("x")
164
- end
165
- end
166
-
167
- context "when controller hash has name value" do
168
- it "does not change existing name value" do
169
- expect(subject.normalize_controller_item(controller: "x", name: "b")[:name]).to eq("b")
170
- end
171
- end
172
- end
173
-
174
- describe ":url_helper" do
175
- context "when controller hash does not have neither helper or controller values" do
176
- it "does not add url helper value" do
177
- expect(subject.normalize_controller_item(x: "x")[:url_helper]).to be nil
178
- end
179
- end
180
-
181
- context "when controller hash has helper value" do
182
- it "assigns symbolized helper value" do
183
- expect(subject.normalize_controller_item(controller: "x", helper: "b")[:url_helper]).to eq(:b)
184
- end
185
- end
186
-
187
- context "when controller hash has controller value" do
188
- it "assigns convert controller name to url helper" do
189
- expect(subject.normalize_controller_item(controller: "a/b")[:url_helper]).to eq(:a_b)
190
- end
191
- end
192
- end
193
-
194
- describe ":items" do
195
- before do
196
- allow(subject).to receive(:normalize_controllers).with(["a", "b"]).and_return(["c", "d"])
197
- end
198
-
199
- context "when controller hash does not have items value" do
200
- it "does not add items value" do
201
- expect(subject.normalize_controller_item(x: "x")[:items]).to be nil
202
- end
203
- end
204
-
205
- context "when controller hash has items value" do
206
- it "does normalizes items" do
207
- expect(subject.normalize_controller_item(x: "x", items: ["a", "b"])[:items]).to eq(["c", "d"])
208
- end
209
- end
210
- end
211
- end
212
-
213
- describe "#default_values" do
214
- it "returns default configuration key, value hash" do
215
- result = {
216
- menu: [],
217
- devise_for: 'releaf/permissions/user',
218
- additional_controllers: [],
219
- controllers: {},
220
- components: [],
221
- assets_resolver_class_name: 'Releaf::Core::AssetsResolver',
222
- layout_builder_class_name: 'Releaf::Builders::Page::LayoutBuilder',
223
- access_control_module_name: 'Releaf::Permissions'
224
- }
225
- expect(subject.default_values).to eq(result)
226
- end
227
- end
228
- end
229
-
230
-
@@ -1,242 +0,0 @@
1
- require 'rails_helper'
2
-
3
- describe Releaf::Core::ErrorFormatter do
4
-
5
- class DummyResourceValidatorAuthor < Author
6
- self.table_name = 'authors'
7
- has_many :books, inverse_of: :author, class_name: :DummyResourceValidatorBook, foreign_key: :author_id
8
- end
9
-
10
- class DummyResourceValidatorBook < Book
11
- self.table_name = 'books'
12
- belongs_to :author, inverse_of: :books, class_name: :DummyResourceValidatorAuthor
13
-
14
- validates_presence_of :author
15
- validate :base_validation
16
- accepts_nested_attributes_for :author
17
-
18
- attr_accessor :add_error_on_base
19
-
20
- def base_validation
21
- return unless add_error_on_base
22
- self.errors.add(:base, 'error on base')
23
- end
24
- end
25
-
26
- let(:book) {
27
- b = Book.new
28
- b.valid?
29
- b
30
- }
31
-
32
- subject do
33
- described_class.new(book, 'resource')
34
- end
35
-
36
- describe "#errors" do
37
- it "is a hash" do
38
- allow_any_instance_of(described_class).to receive(:format_errors)
39
- expect( subject.errors ).to be_an_instance_of Hash
40
- end
41
- end
42
-
43
- describe "#format_errors" do
44
- let(:book) {
45
- b = DummyResourceValidatorBook.new
46
- b.valid?
47
- b
48
- }
49
-
50
- def blank_error(attribute, class_name='DummyResourceValidatorBook', id='null')
51
- {
52
- error_code: :blank,
53
- message: "Blank",
54
- full_message: "#{class_name} with id #{id} has error \"Blank\" on attribute \"#{attribute}\""
55
- }
56
- end
57
-
58
- it "is called after initialization" do
59
- expect_any_instance_of( described_class ).to receive(:format_errors)
60
- described_class.new(Book.new, 'resource')
61
- end
62
-
63
- it "doesn't validates resource" do
64
- expect( book ).to_not receive(:valid?)
65
- expect( book ).to_not receive(:invalid?)
66
- subject
67
- end
68
-
69
- it "correctly adds errors for fields resource fields" do
70
- expect( subject.errors["resource[title]"] ).to eq [blank_error('title')]
71
- end
72
-
73
- it "correclty adds errors for missing associated object (belongs_to)" do
74
- expect( subject.errors["resource[author_id]"] ).to eq [blank_error('author')]
75
- end
76
-
77
- it "correctly adds error for missing associated object attributes (belongs_to)" do
78
- book.build_author
79
- book.valid?
80
- expect( subject.errors["resource[author_attributes][name]"] ).to eq [blank_error('name', 'DummyResourceValidatorAuthor')]
81
- end
82
-
83
- it "correctly adds error for missing associated object attributes (has_many)" do
84
- book.chapters.new(id: 12)
85
- book.chapters.new(:title => 'test')
86
- book.valid?
87
- expect( subject.errors["resource[chapters_attributes][0][title]"] ).to eq [blank_error('title', 'Chapter', '12')]
88
- expect( subject.errors["resource[chapters_attributes][1][title]"] ).to be_nil
89
-
90
- expect( subject.errors["resource[chapters_attributes][0][text]"] ).to eq [blank_error('text', 'Chapter', '12')]
91
- expect( subject.errors["resource[chapters_attributes][1][text]"] ).to eq [blank_error('text', 'Chapter')]
92
- end
93
-
94
- it "handles errors on base" do
95
- book.add_error_on_base = true
96
- book.valid?
97
- expect( subject.errors["resource"] ).to eq [{
98
- error_code: :invalid,
99
- message: "Error on base",
100
- full_message: 'DummyResourceValidatorBook with id null has error "error on base"'
101
- }]
102
- end
103
- end
104
-
105
- describe "#association" do
106
- it "returns active record reflection of association" do
107
- expect( subject.send(:association, 'author') ).to eq Book.reflect_on_association(:author)
108
- end
109
- end
110
-
111
- describe "#association_type" do
112
- it "returns active record reflection macro" do
113
- expect( subject.send(:association_type, 'author') ).to eq :belongs_to
114
- end
115
- end
116
-
117
- describe "#single_association?" do
118
- context "for :belongs_to association" do
119
- it "returns true" do
120
- expect( subject.send(:single_association?, 'author') ).to be true
121
- end
122
- end
123
-
124
- context "for :has_many association" do
125
- it "returns false" do
126
- expect( subject.send(:single_association?, 'chapters') ).to be false
127
- end
128
- end
129
-
130
- context "for :has_one association" do
131
- it "returns true" do
132
- allow(subject).to receive(:association_type).with('author').and_return(:has_one)
133
- expect( subject.send(:single_association?, 'author') ).to be true
134
- end
135
- end
136
- end
137
-
138
- describe "#models_attribute?" do
139
- context "when attribute name contains dot" do
140
- it "returns false" do
141
- expect( subject.send(:models_attribute?, 'test.attribute') ).to be false
142
- end
143
- end
144
-
145
- context "when attribute name doesn't contain dot" do
146
- it "returns true" do
147
- expect( subject.send(:models_attribute?, 'test') ).to be true
148
- end
149
- end
150
- end
151
-
152
- describe "#field_id" do
153
- context "when error is on base" do
154
- it "returns resource field_id" do
155
- expect( subject.send(:field_id, 'base') ).to eq 'resource'
156
- end
157
- end
158
-
159
- context "when attribute is association" do
160
- it "returns field_id for associations foreign key" do
161
- expect( subject.send(:field_id, 'author') ).to eq 'resource[author_id]'
162
- end
163
- end
164
-
165
- context "when attribute is not association" do
166
- it "returns field_id for field" do
167
- expect( subject.send(:field_id, 'title') ).to eq 'resource[title]'
168
- end
169
- end
170
- end
171
-
172
- describe "#add_error" do
173
- before do
174
- # prevent formatting errors when class is initialized
175
- allow_any_instance_of(described_class).to receive(:format_errors)
176
- end
177
-
178
- it "adds error to errors" do
179
- expected_result = {
180
- 'resource[title]' => [
181
- {
182
- error_code: 'test error',
183
- message: 'Error message',
184
- full_message: 'Book with id null has error "error message" on attribute "title"'
185
- },
186
- {
187
- error_code: 'test error',
188
- message: 'Jet another error message',
189
- full_message: 'Book with id null has error "jet another error message" on attribute "title"'
190
- }
191
- ],
192
- 'resource[author_id]' => [
193
- {
194
- error_code: 'invalid',
195
- message: 'Invalid author',
196
- full_message: 'Book with id null has error "invalid author" on attribute "author"',
197
- data: {foo: :bar}
198
- }
199
- ]
200
- }
201
-
202
- message = ActiveModel::ErrorMessage.new("error message")
203
- allow(message).to receive(:error_code).and_return('test error')
204
- allow(message).to receive(:data).and_return(nil)
205
-
206
- other_message = ActiveModel::ErrorMessage.new("invalid author")
207
- allow(other_message).to receive(:error_code).and_return('invalid')
208
- allow(other_message).to receive(:data).and_return({foo: :bar})
209
-
210
- jet_another_message = ActiveModel::ErrorMessage.new("jet another error message")
211
- allow(jet_another_message).to receive(:error_code).and_return('test error')
212
- allow(jet_another_message).to receive(:data).and_return(nil)
213
-
214
- expect do
215
- subject.send(:add_error, 'title', message)
216
- subject.send(:add_error, 'author', other_message)
217
- subject.send(:add_error, 'title', jet_another_message)
218
- end.to change { subject.errors }.from({}).to(expected_result)
219
- end
220
-
221
- it "localizes error messages" do
222
- message = ActiveModel::ErrorMessage.new("error message")
223
- allow(message).to receive(:error_code).and_return('test error')
224
- allow(message).to receive(:data).and_return(nil)
225
-
226
- expect( I18n ).to receive(:t).with(message, scope: "activerecord.errors.messages.book").and_call_original
227
-
228
- template = "%{class} with id %{id} has error \"error message\" on attribute \"%{attribute}\""
229
- expect( I18n ).to receive(:t).with(template, {
230
- default: template,
231
- attribute: 'title',
232
- class: 'Book',
233
- id: 'null',
234
- scope: "activerecord.errors.messages.book"
235
- }).and_call_original
236
-
237
- subject.send(:add_error, 'title', message)
238
- end
239
- end
240
-
241
-
242
- end
@@ -1,18 +0,0 @@
1
- require "rails_helper"
2
-
3
- describe Releaf::Core::ResourceTableFields do
4
- subject{ described_class.new(Book) }
5
-
6
- describe "#excluded_attributes" do
7
- it "returns attributes to exclude from table alongside parent method list" do
8
- allow(subject).to receive(:table_excluded_attributes).and_return(%w(xxx yyy))
9
- expect(subject.excluded_attributes).to include("id", "created_at", "xxx", "yyy")
10
- end
11
- end
12
-
13
- describe "#table_excluded_attributes" do
14
- it "returns array with attributes matching *_html pattern" do
15
- expect(subject.table_excluded_attributes).to eq(%w(summary_html))
16
- end
17
- end
18
- end