releaf-core 0.2.1

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 (288) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +24 -0
  3. data/app/assets/fonts/releaf/RobotoRegular_normal_400.ttf +0 -0
  4. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff +0 -0
  5. data/app/assets/fonts/releaf/RobotoRegular_normal_400.woff2 +0 -0
  6. data/app/assets/images/releaf/icons/apple-touch-icon-114x114-precomposed.png +0 -0
  7. data/app/assets/images/releaf/icons/apple-touch-icon-152x152-precomposed.png +0 -0
  8. data/app/assets/images/releaf/icons/apple-touch-icon-72x72-precomposed.png +0 -0
  9. data/app/assets/images/releaf/icons/favicon.ico +0 -0
  10. data/app/assets/images/releaf/icons/favicon.png +0 -0
  11. data/app/assets/images/releaf/icons/msapplication-tile-144x144.png +0 -0
  12. data/app/assets/images/releaf/logo-login.png +0 -0
  13. data/app/assets/images/releaf/logo.png +0 -0
  14. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/hidpi/mediaembed.png +0 -0
  15. data/app/assets/javascripts/ckeditor/plugins/mediaembed/icons/mediaembed.png +0 -0
  16. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/en.js +12 -0
  17. data/app/assets/javascripts/ckeditor/plugins/mediaembed/lang/es.js +12 -0
  18. data/app/assets/javascripts/ckeditor/plugins/mediaembed/plugin.js +63 -0
  19. data/app/assets/javascripts/releaf/3rd_party/jquery-ui-timepicker-addon.js +1882 -0
  20. data/app/assets/javascripts/releaf/3rd_party/jquery.magnific-popup.min.js +4 -0
  21. data/app/assets/javascripts/releaf/application.js +13 -0
  22. data/app/assets/javascripts/releaf/include/ajax.js +66 -0
  23. data/app/assets/javascripts/releaf/include/ajaxbox.js +179 -0
  24. data/app/assets/javascripts/releaf/include/dialogs.js +13 -0
  25. data/app/assets/javascripts/releaf/include/field.type_associated_set.js +32 -0
  26. data/app/assets/javascripts/releaf/include/field.type_date_or_datetime_or_time.js +73 -0
  27. data/app/assets/javascripts/releaf/include/field.type_richtext.js +188 -0
  28. data/app/assets/javascripts/releaf/include/loader.js +45 -0
  29. data/app/assets/javascripts/releaf/include/localization.js +213 -0
  30. data/app/assets/javascripts/releaf/include/nested_fields.js +295 -0
  31. data/app/assets/javascripts/releaf/include/notifications.js +267 -0
  32. data/app/assets/javascripts/releaf/include/pagination.js +19 -0
  33. data/app/assets/javascripts/releaf/include/profile_settings.js +28 -0
  34. data/app/assets/javascripts/releaf/include/remote_validator.js +437 -0
  35. data/app/assets/javascripts/releaf/include/search.js +140 -0
  36. data/app/assets/javascripts/releaf/include/sidebar.js +149 -0
  37. data/app/assets/javascripts/releaf/include/sortable.js +69 -0
  38. data/app/assets/javascripts/releaf/include/toolbox.js +221 -0
  39. data/app/assets/javascripts/releaf/include/url_builder.js +193 -0
  40. data/app/assets/stylesheets/releaf/application.scss +9 -0
  41. data/app/assets/stylesheets/releaf/environment/extras.scss +11 -0
  42. data/app/assets/stylesheets/releaf/environment/functions/units.scss +12 -0
  43. data/app/assets/stylesheets/releaf/environment/functions.scss +1 -0
  44. data/app/assets/stylesheets/releaf/environment/mixins/blocks.scss +133 -0
  45. data/app/assets/stylesheets/releaf/environment/mixins/elements.scss +64 -0
  46. data/app/assets/stylesheets/releaf/environment/mixins/text.scss +61 -0
  47. data/app/assets/stylesheets/releaf/environment/mixins.scss +3 -0
  48. data/app/assets/stylesheets/releaf/environment/variables/colors.scss +93 -0
  49. data/app/assets/stylesheets/releaf/environment/variables/dimensions.scss +0 -0
  50. data/app/assets/stylesheets/releaf/environment/variables/magnific-popup.scss +6 -0
  51. data/app/assets/stylesheets/releaf/environment/variables.scss +5 -0
  52. data/app/assets/stylesheets/releaf/environment.scss +4 -0
  53. data/app/assets/stylesheets/releaf/layout/base.scss +32 -0
  54. data/app/assets/stylesheets/releaf/layout/breadcrumbs.scss +47 -0
  55. data/app/assets/stylesheets/releaf/layout/buttons.scss +107 -0
  56. data/app/assets/stylesheets/releaf/layout/deprecated.scss +29 -0
  57. data/app/assets/stylesheets/releaf/layout/dialogs.scss +138 -0
  58. data/app/assets/stylesheets/releaf/layout/errors.scss +28 -0
  59. data/app/assets/stylesheets/releaf/layout/extras.scss +10 -0
  60. data/app/assets/stylesheets/releaf/layout/fields.scss +305 -0
  61. data/app/assets/stylesheets/releaf/layout/fonts.scss +16 -0
  62. data/app/assets/stylesheets/releaf/layout/footer.scss +80 -0
  63. data/app/assets/stylesheets/releaf/layout/forms.scss +23 -0
  64. data/app/assets/stylesheets/releaf/layout/header.scss +55 -0
  65. data/app/assets/stylesheets/releaf/layout/icons.scss +4 -0
  66. data/app/assets/stylesheets/releaf/layout/images.scss +4 -0
  67. data/app/assets/stylesheets/releaf/layout/links.scss +7 -0
  68. data/app/assets/stylesheets/releaf/layout/localization.scss +79 -0
  69. data/app/assets/stylesheets/releaf/layout/main.scss +43 -0
  70. data/app/assets/stylesheets/releaf/layout/notifications.scss +67 -0
  71. data/app/assets/stylesheets/releaf/layout/pagination.scss +18 -0
  72. data/app/assets/stylesheets/releaf/layout/search.scss +70 -0
  73. data/app/assets/stylesheets/releaf/layout/sections.scss +138 -0
  74. data/app/assets/stylesheets/releaf/layout/sidebar.scss +306 -0
  75. data/app/assets/stylesheets/releaf/layout/tables.scss +99 -0
  76. data/app/assets/stylesheets/releaf/layout/text.scss +31 -0
  77. data/app/assets/stylesheets/releaf/layout/toolboxes.scss +69 -0
  78. data/app/assets/stylesheets/releaf/layout.scss +35 -0
  79. data/app/assets/stylesheets/releaf/vendor/magnific-popup/main.scss +596 -0
  80. data/app/assets/stylesheets/releaf/vendor/magnific-popup/settings.scss +45 -0
  81. data/app/builders/releaf/builders/association_reflector.rb +58 -0
  82. data/app/builders/releaf/builders/base.rb +80 -0
  83. data/app/builders/releaf/builders/collection.rb +8 -0
  84. data/app/builders/releaf/builders/confirm_destroy_dialog_builder.rb +25 -0
  85. data/app/builders/releaf/builders/confirm_dialog_builder.rb +54 -0
  86. data/app/builders/releaf/builders/edit_builder.rb +66 -0
  87. data/app/builders/releaf/builders/form_builder.rb +594 -0
  88. data/app/builders/releaf/builders/index_builder.rb +118 -0
  89. data/app/builders/releaf/builders/orderer.rb +5 -0
  90. data/app/builders/releaf/builders/page/header_builder.rb +70 -0
  91. data/app/builders/releaf/builders/page/layout_builder.rb +155 -0
  92. data/app/builders/releaf/builders/page/menu_builder.rb +140 -0
  93. data/app/builders/releaf/builders/pagination_builder.rb +107 -0
  94. data/app/builders/releaf/builders/refused_destroy_dialog_builder.rb +68 -0
  95. data/app/builders/releaf/builders/resource.rb +9 -0
  96. data/app/builders/releaf/builders/resource_dialog.rb +8 -0
  97. data/app/builders/releaf/builders/resource_view.rb +54 -0
  98. data/app/builders/releaf/builders/show_builder.rb +3 -0
  99. data/app/builders/releaf/builders/table_builder.rb +280 -0
  100. data/app/builders/releaf/builders/tags/releaf_associated_set_field.rb +40 -0
  101. data/app/builders/releaf/builders/template.rb +8 -0
  102. data/app/builders/releaf/builders/toolbox.rb +23 -0
  103. data/app/builders/releaf/builders/toolbox_builder.rb +27 -0
  104. data/app/builders/releaf/builders/view.rb +132 -0
  105. data/app/builders/releaf/builders.rb +38 -0
  106. data/app/builders/releaf/core/settings/form_builder.rb +21 -0
  107. data/app/builders/releaf/core/settings/table_builder.rb +11 -0
  108. data/app/controllers/concerns/releaf/breadcrumbs.rb +42 -0
  109. data/app/controllers/concerns/releaf/richtext_attachments.rb +20 -0
  110. data/app/controllers/releaf/base_controller.rb +458 -0
  111. data/app/controllers/releaf/core/errors_controller.rb +5 -0
  112. data/app/controllers/releaf/core/settings_controller.rb +50 -0
  113. data/app/helpers/releaf/application_helper.rb +53 -0
  114. data/app/helpers/releaf/button_helper.rb +50 -0
  115. data/app/helpers/releaf/javascript_helper.rb +75 -0
  116. data/app/lib/releaf/core/assets_resolver.rb +58 -0
  117. data/app/lib/releaf/core/default_searchable_fields.rb +43 -0
  118. data/app/lib/releaf/core/error_formatter.rb +103 -0
  119. data/app/lib/releaf/core/item_orderer.rb +102 -0
  120. data/app/lib/releaf/core/resource_base.rb +66 -0
  121. data/app/lib/releaf/core/resource_fields.rb +6 -0
  122. data/app/lib/releaf/core/resource_params.rb +47 -0
  123. data/app/lib/releaf/core/resource_table_fields.rb +10 -0
  124. data/app/lib/releaf/core/resource_utilities.rb +36 -0
  125. data/app/lib/releaf/core/responders/access_denied_responder.rb +9 -0
  126. data/app/lib/releaf/core/responders/after_save_responder.rb +28 -0
  127. data/app/lib/releaf/core/responders/confirm_destroy_responder.rb +13 -0
  128. data/app/lib/releaf/core/responders/destroy_responder.rb +10 -0
  129. data/app/lib/releaf/core/responders/error_responder.rb +9 -0
  130. data/app/lib/releaf/core/responders/feature_disabled_responder.rb +9 -0
  131. data/app/lib/releaf/core/responders/page_not_found_responder.rb +9 -0
  132. data/app/lib/releaf/core/responders.rb +31 -0
  133. data/app/lib/releaf/core/search.rb +147 -0
  134. data/app/lib/releaf/core/template_field_type_mapper.rb +127 -0
  135. data/app/models/releaf/richtext_attachment.rb +6 -0
  136. data/app/models/releaf/settings.rb +27 -0
  137. data/app/views/layouts/releaf/admin.html.erb +1 -0
  138. data/app/views/releaf/base/confirm_destroy.ruby +1 -0
  139. data/app/views/releaf/base/create_releaf_richtext_attachment.haml +1 -0
  140. data/app/views/releaf/base/edit.ruby +1 -0
  141. data/app/views/releaf/base/index.ruby +1 -0
  142. data/app/views/releaf/base/new.ruby +1 -0
  143. data/app/views/releaf/base/refused_destroy.ruby +1 -0
  144. data/app/views/releaf/base/show.ruby +1 -0
  145. data/app/views/releaf/base/toolbox.ruby +1 -0
  146. data/app/views/releaf/error_pages/_error.html.haml +10 -0
  147. data/app/views/releaf/error_pages/access_denied.html.haml +1 -0
  148. data/app/views/releaf/error_pages/feature_disabled.html.haml +1 -0
  149. data/app/views/releaf/error_pages/page_not_found.html.haml +2 -0
  150. data/lib/generators/dummy/install_generator.rb +18 -0
  151. data/lib/generators/dummy/templates/builders/admin/books/form_builder.rb +13 -0
  152. data/lib/generators/dummy/templates/builders/admin/books/index_builder.rb +30 -0
  153. data/lib/generators/dummy/templates/builders/admin/books/table_builder.rb +7 -0
  154. data/lib/generators/dummy/templates/builders/admin/nodes/form_builder.rb +7 -0
  155. data/lib/generators/dummy/templates/config/routes.rb +19 -0
  156. data/lib/generators/dummy/templates/controllers/admin/authors_controller.rb +12 -0
  157. data/lib/generators/dummy/templates/controllers/admin/books_controller.rb +17 -0
  158. data/lib/generators/dummy/templates/controllers/admin/chapters_controller.rb +3 -0
  159. data/lib/generators/dummy/templates/controllers/admin/publishers_controller.rb +3 -0
  160. data/lib/generators/dummy/templates/controllers/application_controller.rb +39 -0
  161. data/lib/generators/dummy/templates/controllers/concerns/.keep +0 -0
  162. data/lib/generators/dummy/templates/controllers/concerns/node_controller.rb +37 -0
  163. data/lib/generators/dummy/templates/controllers/contacts_controller.rb +3 -0
  164. data/lib/generators/dummy/templates/controllers/home_pages_controller.rb +3 -0
  165. data/lib/generators/dummy/templates/controllers/text_pages_controller.rb +3 -0
  166. data/lib/generators/dummy/templates/initializers/releaf.rb +35 -0
  167. data/lib/generators/dummy/templates/migrations/create_authors.rb +14 -0
  168. data/lib/generators/dummy/templates/migrations/create_banners.rb +11 -0
  169. data/lib/generators/dummy/templates/migrations/create_book_sequels.rb +14 -0
  170. data/lib/generators/dummy/templates/migrations/create_books.rb +27 -0
  171. data/lib/generators/dummy/templates/migrations/create_bundles.rb +7 -0
  172. data/lib/generators/dummy/templates/migrations/create_chapters.rb +13 -0
  173. data/lib/generators/dummy/templates/migrations/create_home_pages.rb +9 -0
  174. data/lib/generators/dummy/templates/migrations/create_node_extra_fields.rb +5 -0
  175. data/lib/generators/dummy/templates/migrations/create_publishers.rb +8 -0
  176. data/lib/generators/dummy/templates/migrations/create_text_pages.rb +9 -0
  177. data/lib/generators/dummy/templates/models/author.rb +10 -0
  178. data/lib/generators/dummy/templates/models/banner.rb +5 -0
  179. data/lib/generators/dummy/templates/models/book.rb +19 -0
  180. data/lib/generators/dummy/templates/models/book_sequel.rb +4 -0
  181. data/lib/generators/dummy/templates/models/bundle.rb +17 -0
  182. data/lib/generators/dummy/templates/models/chapter.rb +7 -0
  183. data/lib/generators/dummy/templates/models/home_page.rb +5 -0
  184. data/lib/generators/dummy/templates/models/node.rb +10 -0
  185. data/lib/generators/dummy/templates/models/publisher.rb +9 -0
  186. data/lib/generators/dummy/templates/models/text_page.rb +5 -0
  187. data/lib/generators/dummy/templates/views/contacts/show.html.haml +1 -0
  188. data/lib/generators/dummy/templates/views/home_pages/show.haml +1 -0
  189. data/lib/generators/dummy/templates/views/layouts/application.html.haml +22 -0
  190. data/lib/generators/dummy/templates/views/text_pages/show.haml +1 -0
  191. data/lib/generators/releaf/install_generator.rb +93 -0
  192. data/lib/generators/releaf/templates/initializers/haml.rb +1 -0
  193. data/lib/generators/releaf/templates/initializers/releaf.rb +30 -0
  194. data/lib/generators/releaf/templates/migrations/create_releaf_nodes.rb +28 -0
  195. data/lib/generators/releaf/templates/migrations/create_releaf_permissions.rb +12 -0
  196. data/lib/generators/releaf/templates/migrations/create_releaf_richtext_attachments.rb +12 -0
  197. data/lib/generators/releaf/templates/migrations/create_releaf_roles.rb +9 -0
  198. data/lib/generators/releaf/templates/migrations/create_releaf_settings.rb +17 -0
  199. data/lib/generators/releaf/templates/migrations/create_releaf_translations.rb +21 -0
  200. data/lib/generators/releaf/templates/migrations/create_releaf_users.rb +52 -0
  201. data/lib/generators/releaf/templates/models/node.rb +3 -0
  202. data/lib/generators/releaf/templates/seeds/seeds.rb +54 -0
  203. data/lib/releaf/core/application.rb +17 -0
  204. data/lib/releaf/core/builders_autoload.rb +27 -0
  205. data/lib/releaf/core/component.rb +9 -0
  206. data/lib/releaf/core/configuration.rb +101 -0
  207. data/lib/releaf/core/engine.rb +35 -0
  208. data/lib/releaf/core/exceptions.rb +38 -0
  209. data/lib/releaf/core/route_mapper.rb +59 -0
  210. data/lib/releaf/core/settings_ui_component.rb +7 -0
  211. data/lib/releaf/core/validation_error_codes.rb +36 -0
  212. data/lib/releaf/version.rb +3 -0
  213. data/lib/releaf-core.rb +14 -0
  214. data/lib/tasks/releaf_tasks.rake +4 -0
  215. data/releaf-core.gemspec +35 -0
  216. data/spec/builders/builders/association_reflector_spec.rb +138 -0
  217. data/spec/builders/builders/base_spec.rb +276 -0
  218. data/spec/builders/builders/collection_spec.rb +18 -0
  219. data/spec/builders/builders/confirm_destroy_dialog_builder_spec.rb +71 -0
  220. data/spec/builders/builders/confirm_dialog_builder_spec.rb +105 -0
  221. data/spec/builders/builders/edit_builder_spec.rb +215 -0
  222. data/spec/builders/builders/form_builder_spec.rb +562 -0
  223. data/spec/builders/builders/index_builder_spec.rb +345 -0
  224. data/spec/builders/builders/orderer_spec.rb +22 -0
  225. data/spec/builders/builders/page/header_builder_spec.rb +143 -0
  226. data/spec/builders/builders/page/layout_builder_spec.rb +73 -0
  227. data/spec/builders/builders/page/menu_builder_spec.rb +160 -0
  228. data/spec/builders/builders/pagination_builder_spec.rb +330 -0
  229. data/spec/builders/builders/resource_dialog_spec.rb +21 -0
  230. data/spec/builders/builders/resource_view_spec.rb +158 -0
  231. data/spec/builders/builders/show_builder_spec.rb +7 -0
  232. data/spec/builders/builders/table_builder_spec.rb +638 -0
  233. data/spec/builders/builders/template_spec.rb +12 -0
  234. data/spec/builders/builders/toolbox_builder_spec.rb +67 -0
  235. data/spec/builders/builders/toolbox_spec.rb +48 -0
  236. data/spec/builders/builders/view_spec.rb +281 -0
  237. data/spec/builders/builders_spec.rb +134 -0
  238. data/spec/builders/core/settings/form_builder_spec.rb +69 -0
  239. data/spec/builders/core/settings/table_builder_spec.rb +21 -0
  240. data/spec/controllers/concerns/releaf/richtext_attachments_spec.rb +51 -0
  241. data/spec/controllers/releaf/base_controller_spec.rb +447 -0
  242. data/spec/controllers/releaf/core/settings_controller_spec.rb +31 -0
  243. data/spec/features/ajaxbox_spec.rb +111 -0
  244. data/spec/features/authorization_spec.rb +50 -0
  245. data/spec/features/dragonfly_integration_spec.rb +24 -0
  246. data/spec/features/edit_actions_spec.rb +142 -0
  247. data/spec/features/errors_spec.rb +29 -0
  248. data/spec/features/index_actions_spec.rb +85 -0
  249. data/spec/features/index_table_spec.rb +32 -0
  250. data/spec/features/menu_spec.rb +71 -0
  251. data/spec/features/richtext_attachments_spec.rb +64 -0
  252. data/spec/features/richtext_embed_spec.rb +29 -0
  253. data/spec/features/richtext_spec.rb +19 -0
  254. data/spec/features/search_spec.rb +825 -0
  255. data/spec/features/settings_spec.rb +38 -0
  256. data/spec/features/title_spec.rb +13 -0
  257. data/spec/fixtures/common_fields.yml +17 -0
  258. data/spec/fixtures/cs.png +0 -0
  259. data/spec/fixtures/time.formats.xlsx +0 -0
  260. data/spec/fixtures/unicorn.jpg +0 -0
  261. data/spec/helpers/application_helper_spec.rb +75 -0
  262. data/spec/helpers/button_helper_spec.rb +146 -0
  263. data/spec/lib/releaf/core/application_spec.rb +42 -0
  264. data/spec/lib/releaf/core/assets_resolver_spec.rb +113 -0
  265. data/spec/lib/releaf/core/configuration_spec.rb +230 -0
  266. data/spec/lib/releaf/core/default_searchable_fields_spec.rb +161 -0
  267. data/spec/lib/releaf/core/error_formatter_spec.rb +242 -0
  268. data/spec/lib/releaf/core/item_orderer_spec.rb +142 -0
  269. data/spec/lib/releaf/core/resource_base_spec.rb +174 -0
  270. data/spec/lib/releaf/core/resource_fields_spec.rb +12 -0
  271. data/spec/lib/releaf/core/resource_params_spec.rb +117 -0
  272. data/spec/lib/releaf/core/resource_table_fields_spec.rb +18 -0
  273. data/spec/lib/releaf/core/resource_utilities_spec.rb +87 -0
  274. data/spec/lib/releaf/core/responders/access_denied_responder_spec.rb +12 -0
  275. data/spec/lib/releaf/core/responders/after_save_responder_spec.rb +102 -0
  276. data/spec/lib/releaf/core/responders/confirm_destroy_responder_spec.rb +26 -0
  277. data/spec/lib/releaf/core/responders/destroy_responder_spec.rb +30 -0
  278. data/spec/lib/releaf/core/responders/error_responder_spec.rb +26 -0
  279. data/spec/lib/releaf/core/responders/feature_disabled_responder_spec.rb +12 -0
  280. data/spec/lib/releaf/core/responders/page_not_found_responder_spec.rb +12 -0
  281. data/spec/lib/releaf/core/responders_spec.rb +60 -0
  282. data/spec/lib/releaf/core/template_field_type_mapper_spec.rb +311 -0
  283. data/spec/lib/validation_error_codes_spec.rb +56 -0
  284. data/spec/misc/factories_spec.rb +43 -0
  285. data/spec/models/settings_spec.rb +58 -0
  286. data/spec/routing/route_mapper_spec.rb +185 -0
  287. data/spec/rspec_helpers/test_helpers_spec.rb +20 -0
  288. metadata +657 -0
@@ -0,0 +1,69 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::Settings::FormBuilder, type: :class do
4
+ class FormBuilderTestHelper < ActionView::Base; end
5
+ before do
6
+ Releaf::Settings.register([
7
+ { key: "myapp.rating", default: 5.65, description: "x", type: :decimal },
8
+ { key: "myapp.confirmed", default: true, type: :boolean },
9
+ { key: "myapp.intro" }
10
+ ])
11
+ end
12
+
13
+ let(:template){ FormBuilderTestHelper.new }
14
+
15
+ describe "#field_names" do
16
+ let(:subject){ described_class.new(:resource, Releaf::Settings.first, template, {}) }
17
+
18
+ it "returns :value as only editable field within array" do
19
+ expect(subject.field_names).to eq([:value])
20
+ end
21
+ end
22
+
23
+ describe "#render_value" do
24
+ let(:subject){ described_class.new(:resource, Releaf::Settings.first, template, {}) }
25
+
26
+ it "renders text field for value" do
27
+ allow(subject).to receive(:settings_field_label_text).and_return("x")
28
+ allow(subject).to receive(:settings_field_type).and_return("text")
29
+ allow(subject).to receive(:releaf_text_field).with(:value, { options: { label: { label_text: "x" }}}).and_return("y")
30
+ expect(subject.render_value).to eq("y")
31
+ end
32
+ end
33
+
34
+ describe "#settings_field_label_text" do
35
+ context "when description is available" do
36
+ let(:subject){ described_class.new(:resource, Releaf::Settings.first, template, {}) }
37
+
38
+ it "returns translated description text" do
39
+ allow(subject).to receive(:t).with("x", { scope: "settings"}).and_return("y")
40
+ expect(subject.settings_field_label_text).to eq("y")
41
+ end
42
+ end
43
+
44
+ context "when description is not available" do
45
+ let(:subject){ described_class.new(:resource, Releaf::Settings.last, template, {}) }
46
+
47
+ it "returns 'Value'" do
48
+ expect(subject.settings_field_label_text).to eq("Value")
49
+ end
50
+ end
51
+ end
52
+
53
+ describe "#settings_field_type" do
54
+ it "returns correct field type for the first setting" do
55
+ subject = described_class.new(:resource, Releaf::Settings.first, template, {})
56
+ expect(subject.settings_field_type).to eq(:decimal)
57
+ end
58
+
59
+ it "returns correct field type for the second setting" do
60
+ subject = described_class.new(:resource, Releaf::Settings.second, template, {})
61
+ expect(subject.settings_field_type).to eq(:boolean)
62
+ end
63
+
64
+ it "returns correct default field type" do
65
+ subject = described_class.new(:resource, Releaf::Settings.last, template, {})
66
+ expect(subject.settings_field_type).to eq(:text)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,21 @@
1
+ require "rails_helper"
2
+
3
+ describe Releaf::Core::Settings::TableBuilder, type: :class do
4
+ class TableBuilderTestHelper < ActionView::Base; end
5
+ let(:template){ TableBuilderTestHelper.new }
6
+ let(:resource_class){ Releaf::Settings }
7
+ let(:subject){ described_class.new([], resource_class, template, {}) }
8
+
9
+ describe "#column_names" do
10
+ it "returns var, value and updated_at as column names array" do
11
+ expect(subject.column_names).to eq([:var, :value, :updated_at])
12
+ end
13
+ end
14
+
15
+ describe "#value_content" do
16
+ it "return resource value casted to string" do
17
+ resource = Releaf::Settings.new(value: Date.parse("2012-01-01"))
18
+ expect(subject.value_content(resource)).to eq("2012-01-01")
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,51 @@
1
+ require 'rails_helper'
2
+
3
+ describe Releaf::Content::NodesController, type: :controller do
4
+ before do
5
+ sign_in create(:user)
6
+ end
7
+
8
+ describe "#create_releaf_richtext_attachment" do
9
+ let(:file) { Rack::Test::UploadedFile.new(File.expand_path('../../../fixtures/cs.png', __dir__), "image/png") }
10
+
11
+ context "when file is uploaded" do
12
+ it "renders 'create_releaf_richtext_attachment'" do
13
+ post :create_releaf_richtext_attachment, upload: file
14
+ expect( response ).to be_successful
15
+ expect( response ).to render_template('create_releaf_richtext_attachment')
16
+ end
17
+
18
+ it "creates attachment" do
19
+ expect do
20
+ post :create_releaf_richtext_attachment, upload: file
21
+ end.to change { Releaf::RichtextAttachment.count }.by(1)
22
+ end
23
+ end
24
+
25
+ context "when no file is uploaded" do
26
+ it "responds with success" do
27
+ post :create_releaf_richtext_attachment
28
+ expect( response ).to be_successful
29
+ end
30
+
31
+ it "doesn't create attachment" do
32
+ expect do
33
+ post :create_releaf_richtext_attachment
34
+ end.to_not change { Releaf::RichtextAttachment.count }
35
+ end
36
+ end
37
+ end
38
+
39
+ describe "#releaf_richtext_attachment_upload_url" do
40
+ it "returns upload url" do
41
+ allow(subject).to receive(:url_for).with(action: :create_releaf_richtext_attachment).and_return("a")
42
+ expect(subject.releaf_richtext_attachment_upload_url).to eq("a")
43
+ end
44
+
45
+ context "when no route exists for controller" do
46
+ it "returns nil" do
47
+ expect(subject.releaf_richtext_attachment_upload_url).to be nil
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,447 @@
1
+ require 'rails_helper'
2
+
3
+ describe Releaf::BaseController do
4
+ let(:new_resource){ Author.new }
5
+ let(:resource){ create(:author) }
6
+ let(:subject){ DummyController.new }
7
+ class DummyController < Releaf::BaseController
8
+ def resource_class
9
+ Author
10
+ end
11
+ end
12
+ class FooFormBuilder; end
13
+
14
+ describe "#action_views" do
15
+ it "returns action > view translation hash" do
16
+ hash = {
17
+ new: :edit,
18
+ update: :edit,
19
+ create: :edit,
20
+ }
21
+ expect(subject.action_views).to eq(hash)
22
+ end
23
+ end
24
+
25
+ describe "#action_features" do
26
+ before do
27
+ subject.setup
28
+ end
29
+
30
+ it "returns action > feature mapped hash" do
31
+ expect(subject.action_features).to eq({
32
+ index: :index,
33
+ new: :create,
34
+ create: :create,
35
+ show: :edit,
36
+ edit: :edit,
37
+ update: :edit,
38
+ confirm_destroy: :destroy,
39
+ destroy: :destroy
40
+ }.with_indifferent_access)
41
+ end
42
+
43
+ context "when `show` feature is available" do
44
+ it "returns show > show feature mapping" do
45
+ allow(subject).to receive(:feature_available?).and_call_original
46
+ allow(subject).to receive(:feature_available?).with(:show).and_return(true)
47
+ expect(subject.action_features[:show]).to eq(:show)
48
+ end
49
+ end
50
+ end
51
+
52
+ describe "#action_view" do
53
+ context "when given view does not exists within action views hash" do
54
+ it "returns given action" do
55
+ expect(subject.action_view("a")).to eq("a")
56
+ end
57
+ end
58
+
59
+ context "when given view does not exists within action views hash" do
60
+ it "returns given action" do
61
+ expect(subject.action_view(:update)).to eq(:edit)
62
+ end
63
+ end
64
+
65
+ it "lookup given action as symbol to within action views hash" do
66
+ expect(subject.action_view("new")).to eq(:edit)
67
+ end
68
+ end
69
+
70
+ describe "#active_view" do
71
+ it "returns generic view name for current action" do
72
+ allow(subject).to receive(:action_name).and_return("a")
73
+ allow(subject).to receive(:action_view).with("a").and_return("b")
74
+ expect(subject.active_view).to eq("b")
75
+ end
76
+ end
77
+
78
+ describe "#form_url" do
79
+ context "when given resource is new record" do
80
+ it "returns url for create method" do
81
+ allow(subject).to receive(:url_for).with(action: 'create', id: nil).and_return("/res/new")
82
+ expect(subject.form_url(:edit, new_resource)).to eq("/res/new")
83
+ end
84
+ end
85
+
86
+ context "when given resource is existing record" do
87
+ it "returns url for update method" do
88
+ allow(subject).to receive(:url_for).with(action: 'update', id: resource.id).and_return("/res/edit/")
89
+ expect(subject.form_url(:edit, resource)).to eq("/res/edit/")
90
+ end
91
+ end
92
+ end
93
+
94
+ describe "#form_attributes" do
95
+ it "returns basic releaf form attributes" do
96
+ attributes = {
97
+ multipart: true,
98
+ novalidate: "",
99
+ class: ["new-user"],
100
+ id: "new-user",
101
+ data: {
102
+ "remote"=>true,
103
+ "remote-validation"=>true,
104
+ "type"=>:json
105
+ }
106
+ }
107
+ expect(subject.form_attributes(:edit, new_resource, :user)).to eq(attributes)
108
+ end
109
+
110
+ it "changes class/id depending whether given object is persisted" do
111
+ expect(subject.form_attributes(:edit, new_resource, :user)[:id]).to eq("new-user")
112
+ expect(subject.form_attributes(:edit, new_resource, :user)[:class]).to eq(["new-user"])
113
+
114
+ expect(subject.form_attributes(:edit, resource, :user)[:id]).to eq("edit-user")
115
+ expect(subject.form_attributes(:edit, resource, :user)[:class]).to eq(["edit-user"])
116
+ end
117
+
118
+ it "adds has-error class if object has any errors" do
119
+ resource.name = nil
120
+ expect(resource.valid?).to be false
121
+ expect(subject.form_attributes(:edit, resource, :user)[:class]).to eq(["edit-user", "has-error"])
122
+ end
123
+
124
+ end
125
+
126
+ describe "#builder_class" do
127
+ it "returns controller class scoped builder for given builder type" do
128
+ allow(subject).to receive(:builder_scopes).and_return(["a", "b"])
129
+ allow(Releaf::Builders).to receive(:builder_class).with(["a", "b"], :form).and_return("x")
130
+ expect(subject.builder_class(:form)).to eq("x")
131
+ end
132
+ end
133
+
134
+ describe "#builder_scopes" do
135
+ it "returns array with normalized controller class name scope and project builder scope" do
136
+ allow(subject).to receive(:application_builder_scope).and_return("xxx")
137
+ expect(subject.builder_scopes).to eq(["Dummy", "xxx"])
138
+ end
139
+ end
140
+
141
+ describe "#application_builder_scope" do
142
+ it "returns node builder scope within releaf mount location scope" do
143
+ allow(subject).to receive(:application_scope).and_return("Admin")
144
+ expect(subject.application_builder_scope).to eq("Admin::Builders")
145
+
146
+ allow(subject).to receive(:application_scope).and_return("")
147
+ expect(subject.application_builder_scope).to eq("Builders")
148
+
149
+ allow(subject).to receive(:application_scope).and_return(nil)
150
+ expect(subject.application_builder_scope).to eq("Builders")
151
+ end
152
+ end
153
+
154
+ describe "#application_scope" do
155
+ it "returns node builder scope within releaf mount location scope" do
156
+ allow(Releaf::Builders).to receive(:constant_defined_at_scope?).and_call_original
157
+ allow(Releaf.application.config).to receive(:mount_location).and_return("admin")
158
+
159
+ allow(Releaf::Builders).to receive(:constant_defined_at_scope?)
160
+ .with("Admin", Object).and_return(true)
161
+ expect(subject.application_scope).to eq("Admin")
162
+
163
+ allow(Releaf::Builders).to receive(:constant_defined_at_scope?)
164
+ .with("Admin", Object).and_return(false)
165
+ expect(subject.application_scope).to eq(nil)
166
+
167
+ allow(Releaf.application.config).to receive(:mount_location).and_return("")
168
+ expect(subject.application_scope).to eq(nil)
169
+ end
170
+ end
171
+
172
+ describe "#table_options" do
173
+ it "returns table options" do
174
+ allow(subject).to receive(:builder_class).with(:table).and_return("CustomTableBuilderClassHere")
175
+ allow(subject).to receive(:feature_available?).with(:toolbox).and_return("boolean_value_here")
176
+
177
+ options = {
178
+ builder: "CustomTableBuilderClassHere",
179
+ toolbox: "boolean_value_here"
180
+ }
181
+ expect(subject.table_options).to eq(options)
182
+ end
183
+ end
184
+
185
+ describe "#form_options" do
186
+ it "returns form options" do
187
+ allow(subject).to receive(:builder_class).with(:form).and_return("CustomFormBuilderClassHere")
188
+ allow(subject).to receive(:form_url).with(:delete, resource).and_return("/some-url-here")
189
+ allow(subject).to receive(:form_attributes).with(:delete, resource, :author).and_return(some: "options_here")
190
+
191
+ options = {
192
+ builder: "CustomFormBuilderClassHere",
193
+ as: :author,
194
+ url: "/some-url-here",
195
+ html: {some: "options_here"}
196
+ }
197
+ expect(subject.form_options(:delete, resource, :author)).to eq(options)
198
+ end
199
+ end
200
+ end
201
+
202
+ # use Admin::BooksController / Admin::AuthorsController as it inherit Releaf::BaseController and
203
+ # have no extra methods or overrides
204
+ describe Admin::AuthorsController do
205
+ before do
206
+ sign_in FactoryGirl.create(:user)
207
+ end
208
+
209
+ describe "#index_url" do
210
+ context "when action is other than :index" do
211
+ context "when params have 'index_url' defined" do
212
+ it "returns params 'index_url'" do
213
+ url = "/admin/something?a=1&b=2"
214
+ get :new, index_url: url
215
+ expect(subject.index_url).to eq(url)
216
+ end
217
+ end
218
+
219
+ context "when does not have 'index_url' defined" do
220
+ it "returns index action url" do
221
+ get :new
222
+ expect(subject.index_url).to eq("http://test.host/admin/authors")
223
+ end
224
+ end
225
+ end
226
+
227
+ context "when action is :index" do
228
+ it "returns #current_url value" do
229
+ get :index
230
+ allow(subject).to receive(:current_url).and_return("random_string")
231
+ expect(subject.index_url).to eq("random_string")
232
+ end
233
+ end
234
+ end
235
+
236
+ describe "#current_url" do
237
+ it "returns current url without `ajax` param" do
238
+ get :index, ajax: 1, search: "something", page: 1
239
+ expect(subject.current_url).to eq("/admin/authors?page=1&search=something")
240
+ end
241
+
242
+ context "when no query parameters exists" do
243
+ it "returns only request path" do
244
+ get :index
245
+ expect(subject.current_url).to eq("/admin/authors")
246
+ end
247
+ end
248
+
249
+ it "caches current url value" do
250
+ get :index
251
+ expect(subject).to receive(:request).twice.and_call_original
252
+ subject.current_url
253
+ subject.current_url
254
+ subject.current_url
255
+ subject.current_url
256
+ end
257
+ end
258
+
259
+ describe "#ajax?" do
260
+ it "returns @_ajax instance variable value" do
261
+ subject.instance_variable_set("@_ajax", "ll")
262
+ expect(subject.ajax?).to eq("ll")
263
+ end
264
+
265
+ context "when @_ajax instance variable has not been set" do
266
+ it "returns false" do
267
+ expect(subject.ajax?).to be false
268
+ end
269
+ end
270
+ end
271
+
272
+ describe "#manage_ajax" do
273
+ context "when `ajax` params does not exists within params" do
274
+ it "assigns `false` to @_ajax instance variable" do
275
+ expect{ get :index }.to change{ subject.instance_variable_get("@_ajax") }.from(nil).to(false)
276
+ end
277
+ end
278
+
279
+ context "when `ajax` params exists within params" do
280
+ it "assigns `true` to @_ajax instance variable" do
281
+ expect{ get :index, ajax: 1 }.to change{ subject.instance_variable_get("@_ajax") }.from(nil).to(true)
282
+ end
283
+
284
+ it "removes ajax from `params`" do
285
+ expect{ get :index, ajax: 1 }.to_not change{ subject.params[:ajax] }.from(nil)
286
+ end
287
+
288
+ it "removes ajax from `request.query_parameters`" do
289
+ expect{ get :index, ajax: 1 }.to_not change{ subject.request.query_parameters[:ajax] }.from(nil)
290
+ end
291
+ end
292
+ end
293
+
294
+ describe "GET show" do
295
+ let(:author){ create(:author) }
296
+
297
+ context "when show feature is available" do
298
+ it "assigns all resources to @collection" do
299
+ allow(subject).to receive(:feature_available?).with(:show).and_return(true)
300
+ get :show, id: author
301
+ expect(assigns(:resource)).to eq(author)
302
+ end
303
+ end
304
+
305
+ context "when show feature is not available" do
306
+ it "does assign resource" do
307
+ allow(subject).to receive(:feature_available?).and_call_original
308
+ allow(subject).to receive(:feature_available?).with(:show).and_return(false)
309
+ get :show, id: author
310
+ expect(assigns(:resource)).to be nil
311
+ end
312
+ end
313
+ end
314
+
315
+ describe "GET index" do
316
+ before do
317
+ 21.times do |i|
318
+ FactoryGirl.create(:author)
319
+ end
320
+ end
321
+
322
+ context "when @resources_per_page is nil" do
323
+ it "assigns all resources to @collection" do
324
+ get :index, show_all: 1
325
+ expect(assigns(:collection).is_a?(ActiveRecord::Relation)).to be true
326
+ expect(assigns(:collection).size).to eq(21)
327
+ end
328
+ end
329
+
330
+ context "when @resources_per_page is not nil" do
331
+ it "assigns maximum 20 resources to @collection" do
332
+ get :index
333
+ expect(assigns(:collection).is_a?(ActiveRecord::Relation)).to be true
334
+ expect(assigns(:collection).size).to eq(20)
335
+ end
336
+ end
337
+ end
338
+
339
+ describe "DELETE #destroy" do
340
+ before do
341
+ @author = FactoryGirl.create(:author)
342
+ FactoryGirl.create(:book, title: "The book", author: @author)
343
+ FactoryGirl.create(:book, title: "Almost the book", author: @author)
344
+ end
345
+
346
+ it "creates flash error with message" do
347
+ delete :destroy, id: @author
348
+ expect(flash["error"]).to eq({"id" => "resource_status", "message" => "Cant destroy, because relations exists"})
349
+ end
350
+ end
351
+ end
352
+
353
+
354
+ describe Admin::BooksController do
355
+ before do
356
+ sign_in FactoryGirl.create(:user)
357
+ @breadcrumbs_base = [
358
+ {name: I18n.t('home', scope: 'admin.breadcrumbs'), url: releaf_root_path},
359
+ {name: I18n.t('admin/books', scope: "admin.controllers"), url: admin_books_path},
360
+ ]
361
+ end
362
+
363
+ describe "GET #index" do
364
+ before do
365
+ FactoryGirl.create(:book, title: "great one")
366
+ FactoryGirl.create(:book, title: "bad one")
367
+ FactoryGirl.create(:book, title: "average third")
368
+ end
369
+
370
+ context "when empty search string given" do
371
+ it "shows all records" do
372
+ get :index, search: ""
373
+ expect(assigns(:collection).count).to eq(3)
374
+ end
375
+ end
376
+
377
+ context "when search string with multiple words given" do
378
+ it "searches by given string" do
379
+ get :index, search: "one grea"
380
+ expect(assigns(:collection).count).to eq(1)
381
+ end
382
+ end
383
+
384
+ context "when search string given" do
385
+ it "searches by given string" do
386
+ get :index, search: "great"
387
+ expect(assigns(:collection).count).to eq(1)
388
+ end
389
+ end
390
+
391
+ context "when no search given" do
392
+ it "shows all records" do
393
+ get :index
394
+ expect(assigns(:collection).count).to eq(3)
395
+ end
396
+ end
397
+ end
398
+
399
+ describe "GET #new" do
400
+ it "assigns the requested record to @resource" do
401
+ get :new
402
+
403
+ expect(assigns(:resource).new_record?).to be true
404
+ end
405
+
406
+ context "when the requested record responds to #to_text" do
407
+ it "uses the result of #to_text for resource's breadcrumb name" do
408
+ get :new
409
+ breadcrumbs = @breadcrumbs_base + [{name: "New record", url: new_admin_book_path}]
410
+
411
+ expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
412
+ end
413
+ end
414
+ end
415
+
416
+ describe "GET #edit" do
417
+ before do
418
+ @resource = create(:book)
419
+ end
420
+
421
+ it "assigns the requested record to @resource" do
422
+ get :edit, id: @resource
423
+
424
+ expect(assigns(:resource)).to eq(@resource)
425
+ end
426
+
427
+ context "when the requested record responds to #to_text" do
428
+ it "uses the result of #to_text for resource's breadcrumb name" do
429
+ get :edit, id: @resource
430
+ breadcrumbs = @breadcrumbs_base + [{name: @resource.to_text, url: edit_admin_book_path(@resource.id)}]
431
+
432
+ expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
433
+ end
434
+ end
435
+
436
+ context "when the requested record does not respond to #to_text" do
437
+ it "uses default translation for resource's breadcrumb name" do
438
+ skip "Find out way how to stub loaded resource #respond_to?(:to_text)"
439
+ allow_any_instance_of(Book).to receive(:respond_to?).with(:to_text).and_return(false)
440
+ get :edit, id: @resource
441
+ breadcrumbs = @breadcrumbs_base + [{name: "Edit resource", url: edit_admin_book_path(@resource.id)}]
442
+
443
+ expect(assigns(:breadcrumbs)).to eq(breadcrumbs)
444
+ end
445
+ end
446
+ end
447
+ end