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,6 +1,6 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::ResourceParams do
3
+ describe Releaf::ResourceParams do
4
4
  subject{ described_class.new(Book) }
5
5
 
6
6
  describe "#file_attributes" do
@@ -43,6 +43,7 @@ describe Releaf::Core::ResourceParams do
43
43
  expect(subject.localized_attributes).to eq(["t1", "t2", "s1", "s2"])
44
44
 
45
45
  allow(subject.resource_class).to receive(:translated_attribute_names).and_return([])
46
+ subject.instance_variable_set("@localized_attributes", nil) # reset cached values
46
47
  expect(subject.localized_attributes).to eq([])
47
48
  end
48
49
  end
@@ -57,7 +58,7 @@ describe Releaf::Core::ResourceParams do
57
58
  end
58
59
 
59
60
  describe "#base_attributes" do
60
- it "returns array with non-excluded and file attributes" do
61
+ it "returns array with base and file attributes" do
61
62
  allow(subject.resource_class).to receive(:column_names).and_return(["a", "b", "c"])
62
63
  allow(subject).to receive(:file_attribute?).and_return(false)
63
64
  expect(subject.base_attributes).to eq(["a", "b", "c"])
@@ -65,9 +66,6 @@ describe Releaf::Core::ResourceParams do
65
66
  allow(subject).to receive(:file_attribute?).with("b").and_return(true)
66
67
  allow(subject).to receive(:file_attribute_params).with("b").and_return(["b1", "b2"])
67
68
  expect(subject.base_attributes).to eq(["a", "b1", "b2", "c"])
68
-
69
- allow(subject).to receive(:excluded_attributes).and_return(["a"])
70
- expect(subject.base_attributes).to eq(["b1", "b2", "c"])
71
69
  end
72
70
  end
73
71
 
@@ -0,0 +1,20 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::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 all base and localized attributes matching *_html and *_uid pattern" do
15
+ allow(subject).to receive(:localized_attributes).and_return(["color", "body_html", "some_uid"])
16
+ allow(subject).to receive(:base_attributes).and_return(["image_uid", "title", "price", "description_html"])
17
+ expect(subject.table_excluded_attributes).to eq(%w(image_uid description_html body_html some_uid))
18
+ end
19
+ end
20
+ end
@@ -1,6 +1,6 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::ResourceUtilities do
3
+ describe Releaf::ResourceUtilities do
4
4
  let(:resource){ Releaf::Permissions::Role.new }
5
5
  let(:users_association){ resource.class.reflect_on_association(:users) }
6
6
  let(:permissions_association){ resource.class.reflect_on_association(:permissions) }
@@ -1,6 +1,6 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::AccessDeniedResponder, type: :controller do
3
+ describe Releaf::Responders::AccessDeniedResponder, type: :controller do
4
4
  controller{}
5
5
  subject{ described_class.new(controller, []) }
6
6
 
@@ -1,13 +1,14 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::AfterSaveResponder, type: :controller do
4
- let(:controller){ Releaf::BaseController.new }
3
+ describe Releaf::Responders::AfterSaveResponder, type: :controller do
4
+ let(:controller){ Releaf::ActionController.new }
5
5
  let(:resource){ Book.new}
6
6
  subject{ described_class.new(controller, [resource]) }
7
7
 
8
8
  describe "#json_resource_errors" do
9
- it "returns resource errors formatted with `Releaf::Releaf::ErrorFormatter`" do
10
- allow(Releaf::Core::ErrorFormatter).to receive(:format_errors).with(resource).and_return(a: "b")
9
+ it "returns resource errors hash built with `Releaf::BuildErrorsHash`" do
10
+ allow(Releaf::BuildErrorsHash).to receive(:call).with(resource: resource, field_name_prefix: :resource)
11
+ .and_return(a: "b")
11
12
  expect(subject.json_resource_errors).to eq(errors: {a: "b"})
12
13
  end
13
14
  end
@@ -82,17 +83,17 @@ describe Releaf::Core::Responders::AfterSaveResponder, type: :controller do
82
83
  end
83
84
 
84
85
  context "when options has :redirect key" do
85
- it "calls `display_errors`" do
86
+ it "returns json with resource location url and status code `303`" do
86
87
  allow(subject).to receive(:options).and_return(redirect: true)
87
88
  expect(subject).to receive(:render).with(json: {url: "some_url"}, status: 303)
88
89
  subject.to_json
89
90
  end
90
91
  end
91
92
 
92
- context "when options has key :destroyable with `false` value" do
93
- it "renders `refused_destroy` template" do
93
+ context "when options has no :redirect key" do
94
+ it "redirects to resource location with status code `303`" do
94
95
  allow(subject).to receive(:options).and_return({})
95
- expect(subject).to receive(:redirect_to).with("some_url", status: 303)
96
+ expect(subject).to receive(:redirect_to).with("some_url", status: 303, turbolinks: false)
96
97
  subject.to_json
97
98
  end
98
99
  end
@@ -1,7 +1,7 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::ConfirmDestroyResponder, type: :controller do
4
- let(:controller){ Releaf::BaseController.new }
3
+ describe Releaf::Responders::ConfirmDestroyResponder, type: :controller do
4
+ let(:controller){ Releaf::ActionController.new }
5
5
  let(:resource){ Book.new}
6
6
  subject{ described_class.new(controller, [resource]) }
7
7
 
@@ -1,7 +1,7 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::DestroyResponder, type: :controller do
4
- let(:controller){ Releaf::BaseController.new }
3
+ describe Releaf::Responders::DestroyResponder, type: :controller do
4
+ let(:controller){ Releaf::ActionController.new }
5
5
  let(:resource){ Book.new}
6
6
  subject{ described_class.new(controller, [resource]) }
7
7
 
@@ -1,15 +1,15 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::ErrorResponder, type: :controller do
4
- class Releaf::Core::Responders::DummyErrorResponder < ActionController::Responder
5
- include Releaf::Core::Responders::ErrorResponder
3
+ describe Releaf::Responders::ErrorResponder, type: :controller do
4
+ class Releaf::Responders::DummyErrorResponder < ActionController::Responder
5
+ include Releaf::Responders::ErrorResponder
6
6
  def status_code
7
7
  401
8
8
  end
9
9
  end
10
10
 
11
11
  controller{}
12
- subject{ Releaf::Core::Responders::DummyErrorResponder.new(controller, []) }
12
+ subject{ Releaf::Responders::DummyErrorResponder.new(controller, []) }
13
13
 
14
14
  describe "#template" do
15
15
  it "returns template based on class name" do
@@ -1,6 +1,6 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::FeatureDisabledResponder, type: :controller do
3
+ describe Releaf::Responders::FeatureDisabledResponder, type: :controller do
4
4
  controller{}
5
5
  subject{ described_class.new(controller, []) }
6
6
 
@@ -1,6 +1,6 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders::PageNotFoundResponder, type: :controller do
3
+ describe Releaf::Responders::PageNotFoundResponder, type: :controller do
4
4
  controller{}
5
5
  subject{ described_class.new(controller, []) }
6
6
 
@@ -1,27 +1,27 @@
1
1
  require "rails_helper"
2
2
 
3
- describe Releaf::Core::Responders, type: :controller do
4
- subject{ Releaf::BaseController.new }
3
+ describe Releaf::Responders, type: :controller do
4
+ subject{ Releaf::ActionController.new }
5
5
 
6
6
  describe "#respond_with" do
7
7
  before do
8
- allow(subject).to receive(:active_responder).and_return(Releaf::Core::Responders::AfterSaveResponder)
8
+ allow(subject).to receive(:active_responder).and_return(Releaf::Responders::AfterSaveResponder)
9
9
  allow(subject).to receive(:request).and_return(request)
10
10
  allow(subject).to receive(:content_type).and_return(:html)
11
11
  end
12
12
 
13
13
  context "when no responder defined within options" do
14
14
  it "adds active responder to `responder` options" do
15
- expect(Releaf::Core::Responders::AfterSaveResponder).to receive(:call)
15
+ expect(Releaf::Responders::AfterSaveResponder).to receive(:call)
16
16
  subject.respond_with(nil)
17
17
  end
18
18
  end
19
19
 
20
20
  context "when responder is defined within options" do
21
21
  it "adds active responder to `responder` options" do
22
- expect(Releaf::Core::Responders::AfterSaveResponder).to_not receive(:call)
23
- expect(Releaf::Core::Responders::PageNotFoundResponder).to receive(:call)
24
- subject.respond_with(nil, responder: Releaf::Core::Responders::PageNotFoundResponder)
22
+ expect(Releaf::Responders::AfterSaveResponder).to_not receive(:call)
23
+ expect(Releaf::Responders::PageNotFoundResponder).to receive(:call)
24
+ subject.respond_with(nil, responder: Releaf::Responders::PageNotFoundResponder)
25
25
  end
26
26
  end
27
27
  end
@@ -29,13 +29,13 @@ describe Releaf::Core::Responders, type: :controller do
29
29
  describe "#action_responders" do
30
30
  it "returns hash with action to responders matching" do
31
31
  hash = {
32
- create: Releaf::Core::Responders::AfterSaveResponder,
33
- update: Releaf::Core::Responders::AfterSaveResponder,
34
- confirm_destroy: Releaf::Core::Responders::ConfirmDestroyResponder,
35
- destroy: Releaf::Core::Responders::DestroyResponder,
36
- access_denied: Releaf::Core::Responders::AccessDeniedResponder,
37
- feature_disabled: Releaf::Core::Responders::FeatureDisabledResponder,
38
- page_not_found: Releaf::Core::Responders::PageNotFoundResponder,
32
+ create: Releaf::Responders::AfterSaveResponder,
33
+ update: Releaf::Responders::AfterSaveResponder,
34
+ confirm_destroy: Releaf::Responders::ConfirmDestroyResponder,
35
+ destroy: Releaf::Responders::DestroyResponder,
36
+ access_denied: Releaf::Responders::AccessDeniedResponder,
37
+ feature_disabled: Releaf::Responders::FeatureDisabledResponder,
38
+ page_not_found: Releaf::Responders::PageNotFoundResponder,
39
39
  }
40
40
  expect(subject.action_responders).to eq(hash)
41
41
  end
@@ -0,0 +1,9 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Root::Configuration do
4
+ subject{ described_class.new(default_controller_resolver: "asd") }
5
+
6
+ it do
7
+ is_expected.to have_attributes(default_controller_resolver: "asd")
8
+ end
9
+ end
@@ -0,0 +1,108 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Root::DefaultControllerResolver do
4
+ let(:controller) { Releaf::RootController.new }
5
+ let(:request) { instance_double(ActionDispatch::Request, subdomain: nil) }
6
+ subject { described_class.new(current_controller: controller) }
7
+
8
+ before do
9
+ allow( controller ).to receive(:request).and_return(request)
10
+ end
11
+
12
+ it_behaves_like "an Releaf::Service includer"
13
+
14
+ describe "#call" do
15
+ it "returns first available controller index path" do
16
+ allow(subject).to receive(:controllers).and_return(["a", "b", "c"])
17
+ allow(subject).to receive(:controller_index_path).with("a").and_return(nil)
18
+ allow(subject).to receive(:controller_index_path).with("b").and_return("bb")
19
+ allow(subject).to receive(:controller_index_path).with("c").and_return("cc")
20
+
21
+ expect(subject.call).to eq("bb")
22
+ end
23
+
24
+ context "when no controller path is available" do
25
+ it "returns nil" do
26
+ allow(subject).to receive(:controllers).and_return(["a", "b"])
27
+ allow(subject).to receive(:controller_index_path).with("a").and_return(nil)
28
+ allow(subject).to receive(:controller_index_path).with("b").and_return(nil)
29
+
30
+ expect(subject.call).to be nil
31
+ end
32
+ end
33
+ end
34
+
35
+ describe "#controller_index_path" do
36
+ before do
37
+ allow(subject).to receive(:route_path).with(controller: "x", action: "index")
38
+ .and_return("_index_path_")
39
+ allow(subject).to receive(:route_path).with(controller: "x", action: "index", subdomain: "shop")
40
+ .and_return("_shop_index_path_")
41
+ end
42
+
43
+ context "when subdomain is not present" do
44
+ it "returns index path for given controller" do
45
+ allow(subject).to receive(:subdomain).and_return("")
46
+ expect(subject.controller_index_path("x")).to eq("_index_path_")
47
+ end
48
+ end
49
+
50
+ context "when subdomain is present" do
51
+ before do
52
+ allow(subject).to receive(:subdomain).and_return("shop")
53
+ end
54
+
55
+ context "when subdomain index exists" do
56
+ it "returns subdomain index path for given controller" do
57
+ expect(subject.controller_index_path("x")).to eq("_shop_index_path_")
58
+ end
59
+ end
60
+
61
+ context "when subdomain index does not exist" do
62
+ it "returns index path for given controller" do
63
+ allow(subject).to receive(:route_path).with(controller: "x", action: "index", subdomain: "shop")
64
+ .and_return(nil)
65
+ expect(subject.controller_index_path("x")).to eq("_index_path_")
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "#route_path" do
72
+ context "when route exists" do
73
+ it "returns route path" do
74
+ allow(subject).to receive(:route_exists?).with(controller: "admin/books", action: "index").and_return(true)
75
+ expect(subject.route_path(controller: "admin/books", action: "index")).to eq("/admin/books")
76
+ end
77
+ end
78
+
79
+ context "when given route does not exist" do
80
+ it "returns nil" do
81
+ allow(subject).to receive(:route_exists?).with(controller: "admin/books", action: "index").and_return(false)
82
+ expect(subject.route_path(controller: "admin/books", action: "index")).to be nil
83
+ end
84
+ end
85
+ end
86
+
87
+ describe "#route_exists?" do
88
+ context "when given route exists" do
89
+ it "returns true" do
90
+ expect(subject.route_exists?(controller: "admin/books", action: "index")).to be true
91
+ end
92
+ end
93
+
94
+ context "when given route does not exist" do
95
+ it "returns false" do
96
+ expect(subject.route_exists?(controller: "releaf/permissions/profile", action: "index")).to be false
97
+ expect(subject.route_exists?(controller: "admin/asdasd", action: "index")).to be false
98
+ end
99
+ end
100
+ end
101
+
102
+ describe "#controllers" do
103
+ it "returns available controllers from Releaf config" do
104
+ allow(Releaf.application.config).to receive(:available_controllers).and_return("x")
105
+ expect(subject.controllers).to eq("x")
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,13 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Root do
4
+ describe ".configure_component" do
5
+ it "adds new `Releaf::Root::Configuration` configuration with default controller resolver and assigns settings manager" do
6
+ allow(Releaf::Root::Configuration).to receive(:new)
7
+ .with(default_controller_resolver: Releaf::Root::DefaultControllerResolver).and_return("_new")
8
+ expect(Releaf.application.config).to receive(:add_configuration).with("_new")
9
+ expect(Releaf.application.config).to receive(:settings_manager=).with(Releaf::Root::SettingsManager)
10
+ described_class.configure_component
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,20 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Service do
4
+ class DummyServiceIncluder
5
+ include Releaf::Service
6
+ attribute :some, String
7
+ attribute :thing, String
8
+
9
+ def call; end
10
+ end
11
+
12
+ describe ".call" do
13
+ it "initialize new service instance and return `#call` method value" do
14
+ subject = DummyServiceIncluder.new(some: "asd", thing: "asdasd")
15
+ allow(DummyServiceIncluder).to receive(:new).with(some: "x", thing: "y").and_return(subject)
16
+ allow(subject).to receive(:call).and_return("_x_")
17
+ expect(DummyServiceIncluder.call(some: "x", thing: "y")).to eq("_x_")
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,103 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Settings::NormalizeValue do
4
+ let(:subject){ described_class.new(value: "x", input_type: :date) }
5
+
6
+ describe "#call" do
7
+ before do
8
+ allow(subject).to receive(:normalization_method).and_return("normalize_time")
9
+ allow(described_class).to receive(:normalize_time).and_return("a")
10
+ end
11
+
12
+ context "when normalization method exists for given input type" do
13
+ it "returns value normalize with normalization method" do
14
+ expect(subject.call).to eq("a")
15
+ end
16
+ end
17
+
18
+ context "when normalization method does not exist for given input type" do
19
+ it "returns non-normalized value" do
20
+ allow(described_class).to receive(:respond_to?).with("normalize_time").and_return(false)
21
+ expect(subject.call).to eq("x")
22
+ end
23
+ end
24
+ end
25
+
26
+ describe "#normalization_method" do
27
+ it "returns normalization method name built from given input type" do
28
+ expect(subject.normalization_method).to eq("normalize_date")
29
+ end
30
+ end
31
+
32
+ describe ".normalize_decimal" do
33
+ it "returns normalized decimal value" do
34
+ expect(described_class.normalize_decimal("1,12")).to eq(1.12.to_d)
35
+ expect(described_class.normalize_decimal("1.298")).to eq(1.298.to_d)
36
+ end
37
+ end
38
+
39
+ describe ".normalize_float" do
40
+ it "returns normalized float value" do
41
+ expect(described_class.normalize_float("1,12")).to eq(1.12.to_f)
42
+ expect(described_class.normalize_float("1.298")).to eq(1.298.to_f)
43
+ end
44
+ end
45
+
46
+ describe ".normalize_integer" do
47
+ it "returns normalized integer value" do
48
+ expect(described_class.normalize_integer("1,12")).to eq(1)
49
+ expect(described_class.normalize_integer("4,298")).to eq(4)
50
+ end
51
+ end
52
+
53
+ describe ".normalize_time" do
54
+ it "returns value normalized with `Time.parse`" do
55
+ allow(Time).to receive(:parse).with("a").and_return("b")
56
+ expect(described_class.normalize_time("a")).to eq("b")
57
+ end
58
+
59
+ context "when empty value given" do
60
+ it "returns nil" do
61
+ expect(described_class.normalize_time(" ")).to be nil
62
+ expect(described_class.normalize_time("")).to be nil
63
+ end
64
+ end
65
+ end
66
+
67
+ describe ".normalize_date" do
68
+ it "returns value normalized with `Date.parse`" do
69
+ allow(Date).to receive(:parse).with("a").and_return("b")
70
+ expect(described_class.normalize_date("a")).to eq("b")
71
+ end
72
+
73
+ context "when empty value given" do
74
+ it "returns nil" do
75
+ expect(described_class.normalize_date(" ")).to be nil
76
+ expect(described_class.normalize_date("")).to be nil
77
+ end
78
+ end
79
+ end
80
+
81
+ describe ".normalize_datetime" do
82
+ it "returns value normalized with `DateTime.parse`" do
83
+ allow(DateTime).to receive(:parse).with("a").and_return("b")
84
+ expect(described_class.normalize_datetime("a")).to eq("b")
85
+ end
86
+
87
+ context "when empty value given" do
88
+ it "returns nil" do
89
+ expect(described_class.normalize_datetime(" ")).to be nil
90
+ expect(described_class.normalize_datetime("")).to be nil
91
+ end
92
+ end
93
+ end
94
+
95
+ describe ".normalize_boolean" do
96
+ it "returns value compared against string value of `1`" do
97
+ expect(described_class.normalize_boolean("1")).to be true
98
+ expect(described_class.normalize_boolean("0")).to be false
99
+ expect(described_class.normalize_boolean("ewwqe")).to be false
100
+ expect(described_class.normalize_boolean("")).to be false
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,135 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Settings::Register do
4
+ let(:subject){ described_class.new(settings: [{key: "a", type: "boolean"}, {key: "c", type: "text"}]) }
5
+
6
+ describe "#call" do
7
+ it "registers normalized settings items" do
8
+ allow(subject).to receive(:normalize).with(key: "a", type: "boolean").and_return("yy")
9
+ allow(subject).to receive(:normalize).with(key: "c", type: "text").and_return("zz")
10
+ expect(subject).to receive(:register).with("yy")
11
+ expect(subject).to receive(:register).with("zz")
12
+ subject.call
13
+ end
14
+ end
15
+
16
+ describe "#normalize" do
17
+ before do
18
+ allow(subject.settings_class).to receive(:supported_types).and_return([:boolean, :text])
19
+ end
20
+
21
+ it "normalizes type valey to symbol" do
22
+ expect(subject.normalize(key: "x", type: "boolean")).to eq(key: "x", type: :boolean)
23
+ end
24
+
25
+ context "when no type given" do
26
+ it "sets `:text` as default type" do
27
+ expect(subject.normalize(key: "x")).to eq(key: "x", type: :text)
28
+ end
29
+ end
30
+
31
+ context "when unsupported type given" do
32
+ it "raises `Releaf::Error`" do
33
+ allow(subject.settings_class).to receive(:supported_types).and_return([:mp3, :mp4])
34
+ expect{ subject.normalize(key: "x") }.to raise_error(Releaf::Error, "Unsupported settings type: text")
35
+ end
36
+ end
37
+
38
+ context "when dissallowed settings keys given" do
39
+ it "raises `Releaf::Error`" do
40
+ expect{ subject.normalize(key: "x", color: "red") }.to raise_error(Releaf::Error, "Dissallowed settings keys: [:color]")
41
+ end
42
+ end
43
+ end
44
+
45
+ describe "#register" do
46
+ before do
47
+ allow(subject.settings_class).to receive(:[]=)
48
+ allow(subject.settings_class.registry).to receive(:update)
49
+ allow(subject).to receive(:write_default?).with(key: "x", default: "_xx").and_return(true)
50
+ end
51
+
52
+ it "assigns item to settings registry" do
53
+ expect(subject.settings_class.registry).to receive(:update).with("x" => {key: "x", default: "_xx"})
54
+ subject.register(key: "x", default: "_xx")
55
+ end
56
+
57
+ it "stores value to cache and db" do
58
+ expect(subject.settings_class).to receive(:[]=).with("x", "_xx")
59
+ subject.register(key: "x", default: "_xx")
60
+ end
61
+
62
+ context "when default write is not permitted" do
63
+ it "does not store default value to db" do
64
+ allow(subject).to receive(:write_default?).with(key: "x").and_return(false)
65
+ expect(subject).to_not receive(:[]=)
66
+ subject.register(key: "x", default: "_xx")
67
+ end
68
+ end
69
+ end
70
+
71
+ describe "#allowed_keys" do
72
+ it "returns array with `key`, `default`, `type` and `description`" do
73
+ expect(subject.allowed_keys).to eq([:key, :default, :type, :description])
74
+ end
75
+ end
76
+
77
+ describe "#write_default?" do
78
+ before do
79
+ allow(subject).to receive(:table_exists?).and_return(true)
80
+ allow(subject.settings_class).to receive(:find_by).with(var: "xx").and_return(nil)
81
+ end
82
+
83
+ context "when database table exists and key does not exist in database" do
84
+ it "returns true" do
85
+ expect(subject.write_default?(key: "xx")).to be true
86
+ end
87
+ end
88
+
89
+ context "when database table exists and key does exist in database" do
90
+ it "returns false" do
91
+ allow(subject.settings_class).to receive(:find_by).with(var: "xx").and_return(Author.new)
92
+ expect(subject.write_default?(key: "xx")).to be false
93
+ end
94
+ end
95
+
96
+ context "when database table does not exists and key does not exist in database" do
97
+ it "returns false" do
98
+ allow(subject).to receive(:table_exists?).and_return(false)
99
+ expect(subject.write_default?(key: "xx")).to be false
100
+ end
101
+ end
102
+ end
103
+
104
+ describe "#table_exists?" do
105
+ before do
106
+ allow(subject.settings_class).to receive(:table_exists?).and_return(true)
107
+ end
108
+
109
+ context "when `ActiveRecord::NoDatabaseError` database does not exist" do
110
+ it "returns false" do
111
+ allow(subject.settings_class).to receive(:table_exists?).and_raise(ActiveRecord::NoDatabaseError, "x")
112
+ expect(subject.table_exists?).to be false
113
+ end
114
+ end
115
+
116
+ context "when table does not exist" do
117
+ it "returns false" do
118
+ allow(subject.settings_class).to receive(:table_exists?).and_return(false)
119
+ expect(subject.table_exists?).to be false
120
+ end
121
+ end
122
+
123
+ context "when table exists" do
124
+ it "returns true" do
125
+ expect(subject.table_exists?).to be true
126
+ end
127
+ end
128
+ end
129
+
130
+ describe "#settings_class" do
131
+ it "returns `Releaf::Settings` class" do
132
+ expect(subject.settings_class).to eq(Releaf::Settings)
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,22 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Root::SettingsManager do
4
+ let(:controller){ Releaf::RootController.new }
5
+ let(:cookies){ {"asd.a" => "lalal"} }
6
+
7
+ before do
8
+ allow(controller).to receive(:send).with(:cookies).and_return(cookies)
9
+ end
10
+
11
+ describe ".read" do
12
+ it "returns cookies settings for given key" do
13
+ expect(described_class.read(controller: controller, key: "asd.a")).to eq("lalal")
14
+ end
15
+ end
16
+
17
+ describe ".write" do
18
+ it "writes user settings for given key and value" do
19
+ expect{ described_class.write(controller: controller, key: "asd.a", value: "op") }.to change{ cookies["asd.a"] }.to("op")
20
+ end
21
+ end
22
+ end
@@ -19,7 +19,7 @@ describe "Extend ActiveModel validation error with error_code attribute" do
19
19
  end
20
20
 
21
21
  it "does not owerwrite default error message behaviour" do
22
- expect(item.errors.get(:name).first).to eq("Blank")
22
+ expect(item.errors.get(:name).first).to eq("can't be blank")
23
23
  end
24
24
 
25
25
  context "when validation have :error_code option" do