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