releaf-core 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
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