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
@@ -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