newsletter 3.0.2 → 3.2.0

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 (259) hide show
  1. checksums.yaml +5 -13
  2. data/.gitignore +6 -0
  3. data/.ruby-version +1 -1
  4. data/Gemfile +17 -5
  5. data/README.md +40 -0
  6. data/app/assets/images/newsletter/BottomRight.gif +0 -0
  7. data/app/assets/images/newsletter/MidRight.gif +0 -0
  8. data/app/assets/images/newsletter/TopCenter.gif +0 -0
  9. data/app/assets/images/newsletter/TopRight.gif +0 -0
  10. data/app/assets/images/newsletter/calendar_date_select/calendar.gif +0 -0
  11. data/app/assets/images/newsletter/iReach_logo.gif +0 -0
  12. data/app/assets/images/newsletter/spacer.gif +0 -0
  13. data/app/assets/images/newsletter/topMid.gif +0 -0
  14. data/app/assets/javascripts/newsletter/application.js +6 -0
  15. data/app/assets/stylesheets/newsletter/admin.css +261 -0
  16. data/app/assets/stylesheets/newsletter/application.css +3 -1
  17. data/app/assets/stylesheets/newsletter/nav.css +68 -0
  18. data/app/assets/stylesheets/newsletter/timepicker.css +54 -0
  19. data/app/controllers/newsletter/application_controller.rb +5 -26
  20. data/app/controllers/newsletter/areas_controller.rb +0 -38
  21. data/app/controllers/newsletter/designs_controller.rb +5 -2
  22. data/app/controllers/newsletter/elements_controller.rb +7 -7
  23. data/app/controllers/newsletter/fields_controller.rb +1 -46
  24. data/app/controllers/newsletter/newsletters_controller.rb +6 -24
  25. data/app/controllers/newsletter/pieces_controller.rb +8 -21
  26. data/app/helpers/newsletter/designs_helper.rb +1 -8
  27. data/app/helpers/newsletter/layout_helper.rb +43 -0
  28. data/app/helpers/newsletter/newsletters_helper.rb +9 -5
  29. data/app/models/newsletter/area.rb +1 -4
  30. data/app/models/newsletter/asset.rb +7 -1
  31. data/app/models/newsletter/design.rb +48 -34
  32. data/app/models/newsletter/element.rb +0 -42
  33. data/app/models/newsletter/field.rb +7 -10
  34. data/app/models/newsletter/field/inline_asset.rb +15 -2
  35. data/app/models/newsletter/newsletter.rb +18 -11
  36. data/app/models/newsletter/piece.rb +20 -24
  37. data/app/views/layouts/newsletter/application.html.erb +20 -116
  38. data/app/views/layouts/newsletter/layout.html.erb +15 -0
  39. data/app/views/newsletter/areas/_area.html.erb +1 -1
  40. data/app/views/newsletter/designs/_area_fields.html.erb +1 -1
  41. data/app/views/newsletter/designs/_form.html.erb +11 -29
  42. data/app/views/newsletter/designs/_newsletter_area.html.erb +2 -2
  43. data/app/views/newsletter/designs/edit.html.erb +3 -6
  44. data/app/views/newsletter/designs/index.html.erb +7 -6
  45. data/app/views/newsletter/designs/new.html.erb +2 -2
  46. data/app/views/newsletter/designs/show.html.erb +5 -5
  47. data/app/views/newsletter/elements/_field_fields.html.erb +12 -25
  48. data/app/views/newsletter/elements/_form.html.erb +38 -34
  49. data/app/views/newsletter/elements/edit.html.erb +2 -5
  50. data/app/views/newsletter/elements/index.html.erb +7 -7
  51. data/app/views/newsletter/elements/new.html.erb +2 -2
  52. data/app/views/newsletter/elements/show.html.erb +5 -5
  53. data/app/views/newsletter/fields/_inline_asset.html.erb +12 -32
  54. data/app/views/newsletter/fields/_text.html.erb +2 -4
  55. data/app/views/newsletter/fields/_text_area.html.erb +2 -7
  56. data/app/views/newsletter/newsletters/_form.html.erb +6 -16
  57. data/app/views/newsletter/newsletters/_head.html.erb +2 -3
  58. data/app/views/newsletter/newsletters/_newsletter.html.erb +11 -6
  59. data/app/views/newsletter/newsletters/archive.html.erb +1 -1
  60. data/app/views/newsletter/newsletters/edit.html.erb +8 -16
  61. data/app/views/newsletter/newsletters/index.html.erb +7 -7
  62. data/app/views/newsletter/newsletters/new.html.erb +2 -2
  63. data/app/views/newsletter/newsletters/show.html.erb +11 -6
  64. data/app/views/newsletter/pieces/_form.html.erb +1 -8
  65. data/app/views/newsletter/pieces/edit.html.erb +2 -4
  66. data/app/views/newsletter/pieces/new.html.erb +3 -5
  67. data/config/locales/newsletters.en.yml +27 -0
  68. data/config/routes.rb +4 -4
  69. data/designs/exports/Example.yml +202 -0
  70. data/designs/exports/example-export.yaml +481 -87
  71. data/lib/deleteable.rb +12 -14
  72. data/lib/newsletter/engine.rb +112 -6
  73. data/lib/newsletter/version.rb +1 -1
  74. data/lib/tasks/newsletter.rake +54 -41
  75. data/newsletter.gemspec +3 -1
  76. data/spec/test_app/.rspec +2 -0
  77. data/spec/test_app/app/controllers/application_controller.rb +5 -0
  78. data/spec/test_app/app/models/ability.rb +8 -0
  79. data/spec/test_app/app/models/user.rb +10 -0
  80. data/spec/test_app/app/views/layouts/application.html.erb +3 -1
  81. data/spec/test_app/config/database.postgres.yml +21 -0
  82. data/spec/test_app/config/initializers/carrierwave.rb +23 -0
  83. data/spec/test_app/config/newsletter.yml +6 -3
  84. data/spec/test_app/config/routes.rb +1 -2
  85. data/spec/test_app/db/migrate/20131222171230_create_users.rb +13 -0
  86. data/spec/test_app/db/schema.rb +13 -2
  87. data/spec/test_app/features/newsletter_management.feature +39 -0
  88. data/spec/test_app/features/piece_management.feature +20 -0
  89. data/spec/test_app/features/step_definitions/debugging_steps.rb +3 -0
  90. data/spec/test_app/features/step_definitions/design_steps.rb +3 -0
  91. data/spec/test_app/features/step_definitions/login_steps.rb +4 -0
  92. data/spec/test_app/features/step_definitions/newsletter_steps.rb +24 -0
  93. data/spec/test_app/features/step_definitions/piece_steps.rb +26 -0
  94. data/{features → spec/test_app/features}/step_definitions/webrat_steps.rb +10 -6
  95. data/spec/test_app/features/support/env.rb +36 -0
  96. data/spec/test_app/features/support/functions.rb +3 -0
  97. data/{features → spec/test_app/features}/support/paths.rb +10 -1
  98. data/spec/test_app/lib/debugging.rb +61 -0
  99. data/spec/test_app/script/full_suite +44 -0
  100. data/spec/test_app/script/rspec_multi_db +26 -0
  101. data/spec/test_app/spec/controllers/newsletter/pieces_controller_spec.rb +175 -0
  102. data/spec/test_app/spec/factories/_functions.rb +19 -0
  103. data/spec/test_app/spec/factories/assets.rb +8 -0
  104. data/spec/test_app/spec/factories/designs.rb +1 -1
  105. data/spec/test_app/spec/factories/newsletters.rb +68 -6
  106. data/spec/test_app/spec/factories/pieces.rb +8 -0
  107. data/spec/test_app/spec/factories/users.rb +13 -0
  108. data/spec/test_app/spec/features/newsletter/design_spec.rb +175 -0
  109. data/spec/test_app/spec/features/newsletter/element_spec.rb +53 -0
  110. data/spec/test_app/spec/features/newsletter/newsletter_spec.rb +99 -3
  111. data/spec/test_app/spec/helpers/newsletter/newsletters_helper_spec.rb +65 -0
  112. data/spec/test_app/spec/models/newsletter/asset_spec.rb +23 -0
  113. data/spec/test_app/spec/models/newsletter/design_spec.rb +23 -2
  114. data/spec/test_app/spec/models/newsletter/element_spec.rb +4 -0
  115. data/spec/test_app/spec/models/newsletter/inline_asset_spec.rb +43 -0
  116. data/spec/test_app/spec/models/newsletter/newsletter_spec.rb +102 -2
  117. data/spec/test_app/spec/models/newsletter/piece_spec.rb +33 -0
  118. data/spec/test_app/spec/rails_helper.rb +82 -0
  119. data/spec/test_app/spec/routing/newsletter/pieces_routing_spec.rb +28 -0
  120. data/spec/test_app/spec/spec_helper.rb +73 -64
  121. data/spec/test_app/spec/support/carrierwave.rb +7 -0
  122. data/spec/test_app/spec/support/continuances.rb +18 -0
  123. data/spec/test_app/spec/support/files/iReach_logo.gif +0 -0
  124. data/spec/test_app/spec/support/files/test.pdf +0 -0
  125. data/spec/test_app/spec/support/functions.rb +3 -0
  126. metadata +145 -726
  127. data/README +0 -243
  128. data/README.rdoc +0 -3
  129. data/app/views/newsletter/elements/_newsletter_field.html.erb +0 -37
  130. data/features/support/env.rb +0 -17
  131. data/lib/tasks/newsletter_tasks.rake +0 -4
  132. data/lib/tasks/rspec.rake +0 -158
  133. data/spec/spec_helper.rb +0 -55
  134. data/spec/test_app/db/structure.sql +0 -12
  135. data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_article.html.erb +0 -10
  136. data/spec/test_app/newsletters/designs/My_Design/elements/_left_column_image.html.erb +0 -2
  137. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_article.html.erb +0 -5
  138. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_headline.html.erb +0 -1
  139. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_image.html.erb +0 -1
  140. data/spec/test_app/newsletters/designs/My_Design/elements/_right_column_paragraph.html.erb +0 -3
  141. data/spec/test_app/newsletters/designs/My_Design/layout.html.erb +0 -66
  142. data/spec/test_app/newsletters/designs/Testo_Changeo/elements/_left_column_article.html.erb +0 -10
  143. data/spec/test_app/newsletters/designs/Testo_Changeo/layout.html.erb +0 -66
  144. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_article.html.erb +0 -10
  145. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_left_column_image.html.erb +0 -2
  146. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_article.html.erb +0 -5
  147. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_headline.html.erb +0 -1
  148. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_image.html.erb +0 -1
  149. data/spec/test_app/newsletters/designs/empower_innovative_e-business/elements/_right_column_paragraph.html.erb +0 -3
  150. data/spec/test_app/newsletters/designs/empower_innovative_e-business/layout.html.erb +0 -66
  151. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_article.html.erb +0 -10
  152. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_left_column_image.html.erb +0 -2
  153. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_article.html.erb +0 -5
  154. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_headline.html.erb +0 -1
  155. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_image.html.erb +0 -1
  156. data/spec/test_app/newsletters/designs/enable_extensible_systems/elements/_right_column_paragraph.html.erb +0 -3
  157. data/spec/test_app/newsletters/designs/enable_extensible_systems/layout.html.erb +0 -66
  158. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_article.html.erb +0 -10
  159. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_left_column_image.html.erb +0 -2
  160. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_article.html.erb +0 -5
  161. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_headline.html.erb +0 -1
  162. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_image.html.erb +0 -1
  163. data/spec/test_app/newsletters/designs/engage_innovative_schemas/elements/_right_column_paragraph.html.erb +0 -3
  164. data/spec/test_app/newsletters/designs/engage_innovative_schemas/layout.html.erb +0 -67
  165. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_article.html.erb +0 -10
  166. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_left_column_image.html.erb +0 -2
  167. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_article.html.erb +0 -5
  168. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_headline.html.erb +0 -1
  169. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_image.html.erb +0 -1
  170. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/elements/_right_column_paragraph.html.erb +0 -3
  171. data/spec/test_app/newsletters/designs/envisioneer_seamless_ROI/layout.html.erb +0 -66
  172. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_article.html.erb +0 -10
  173. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_left_column_image.html.erb +0 -2
  174. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_article.html.erb +0 -5
  175. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_headline.html.erb +0 -1
  176. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_image.html.erb +0 -1
  177. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/elements/_right_column_paragraph.html.erb +0 -3
  178. data/spec/test_app/newsletters/designs/harness_integrated_partnerships/layout.html.erb +0 -66
  179. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_article.html.erb +0 -10
  180. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_left_column_image.html.erb +0 -2
  181. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_article.html.erb +0 -5
  182. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_headline.html.erb +0 -1
  183. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_image.html.erb +0 -1
  184. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/elements/_right_column_paragraph.html.erb +0 -3
  185. data/spec/test_app/newsletters/designs/innovate_24_365_functionalities/layout.html.erb +0 -66
  186. data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/elements/_left_column_article.html.erb +0 -10
  187. data/spec/test_app/newsletters/designs/integrate_mission-critical_systems/layout.html.erb +0 -66
  188. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_article.html.erb +0 -10
  189. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_left_column_image.html.erb +0 -2
  190. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_article.html.erb +0 -5
  191. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_headline.html.erb +0 -1
  192. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_image.html.erb +0 -1
  193. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/elements/_right_column_paragraph.html.erb +0 -3
  194. data/spec/test_app/newsletters/designs/iterate_real-time_web-readiness/layout.html.erb +0 -67
  195. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_article.html.erb +0 -10
  196. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_left_column_image.html.erb +0 -2
  197. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_article.html.erb +0 -5
  198. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_headline.html.erb +0 -1
  199. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_image.html.erb +0 -1
  200. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/elements/_right_column_paragraph.html.erb +0 -3
  201. data/spec/test_app/newsletters/designs/iterate_strategic_architectures/layout.html.erb +0 -67
  202. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_article.html.erb +0 -10
  203. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_left_column_image.html.erb +0 -2
  204. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_article.html.erb +0 -5
  205. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_headline.html.erb +0 -1
  206. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_image.html.erb +0 -1
  207. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/elements/_right_column_paragraph.html.erb +0 -3
  208. data/spec/test_app/newsletters/designs/orchestrate_sticky_communities/layout.html.erb +0 -67
  209. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_article.html.erb +0 -10
  210. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_left_column_image.html.erb +0 -2
  211. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_article.html.erb +0 -5
  212. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_headline.html.erb +0 -1
  213. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_image.html.erb +0 -1
  214. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/elements/_right_column_paragraph.html.erb +0 -3
  215. data/spec/test_app/newsletters/designs/repurpose_impactful_partnerships/layout.html.erb +0 -67
  216. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_article.html.erb +0 -10
  217. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_left_column_image.html.erb +0 -2
  218. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_article.html.erb +0 -5
  219. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_headline.html.erb +0 -1
  220. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_image.html.erb +0 -1
  221. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/elements/_right_column_paragraph.html.erb +0 -3
  222. data/spec/test_app/newsletters/designs/revolutionize_robust_partnerships/layout.html.erb +0 -66
  223. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_article.html.erb +0 -10
  224. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_left_column_image.html.erb +0 -2
  225. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_article.html.erb +0 -5
  226. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_headline.html.erb +0 -1
  227. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_image.html.erb +0 -1
  228. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/elements/_right_column_paragraph.html.erb +0 -3
  229. data/spec/test_app/newsletters/designs/revolutionize_turn-key_bandwidth/layout.html.erb +0 -66
  230. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_article.html.erb +0 -10
  231. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_left_column_image.html.erb +0 -2
  232. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_article.html.erb +0 -5
  233. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_headline.html.erb +0 -1
  234. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_image.html.erb +0 -1
  235. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/elements/_right_column_paragraph.html.erb +0 -3
  236. data/spec/test_app/newsletters/designs/scale_ubiquitous_synergies/layout.html.erb +0 -67
  237. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_article.html.erb +0 -10
  238. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_left_column_image.html.erb +0 -2
  239. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_article.html.erb +0 -5
  240. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_headline.html.erb +0 -1
  241. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_image.html.erb +0 -1
  242. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/elements/_right_column_paragraph.html.erb +0 -3
  243. data/spec/test_app/newsletters/designs/syndicate_visionary_metrics/layout.html.erb +0 -66
  244. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_article.html.erb +0 -10
  245. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_left_column_image.html.erb +0 -2
  246. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_article.html.erb +0 -5
  247. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_headline.html.erb +0 -1
  248. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_image.html.erb +0 -1
  249. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/elements/_right_column_paragraph.html.erb +0 -3
  250. data/spec/test_app/newsletters/designs/target_enterprise_functionalities/layout.html.erb +0 -67
  251. data/spec/test_app/newsletters/designs/transition_enterprise_systems/elements/_left_column_article.html.erb +0 -10
  252. data/spec/test_app/newsletters/designs/transition_enterprise_systems/layout.html.erb +0 -66
  253. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_article.html.erb +0 -10
  254. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_left_column_image.html.erb +0 -2
  255. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_article.html.erb +0 -5
  256. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_headline.html.erb +0 -1
  257. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_image.html.erb +0 -1
  258. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/elements/_right_column_paragraph.html.erb +0 -3
  259. data/spec/test_app/newsletters/designs/utilize_one-to-one_schemas/layout.html.erb +0 -66
@@ -0,0 +1,175 @@
1
+ require 'rails_helper'
2
+
3
+ # This spec was generated by rspec-rails when you ran the scaffold generator.
4
+ # It demonstrates how one might use RSpec to specify the controller code that
5
+ # was generated by Rails when you ran the scaffold generator.
6
+ #
7
+ # It assumes that the implementation code is generated by the rails scaffold
8
+ # generator. If you are using any extension libraries to generate different
9
+ # controller code, this generated spec may or may not pass.
10
+ #
11
+ # It only uses APIs available in rails and/or rspec-rails. There are a number
12
+ # of tools you can use to make these specs even more expressive, but we're
13
+ # sticking to rails and rspec-rails APIs to keep things simple and stable.
14
+ #
15
+ # Compared to earlier versions of this generator, there is very limited use of
16
+ # stubs and message expectations in this spec. Stubs are only used when there
17
+ # is no simpler way to get a handle on the object needed for the example.
18
+ # Message expectations are only used when there is no simpler way to specify
19
+ # that an instance is receiving a specific message.
20
+
21
+ RSpec.describe Newsletter::PiecesController, :type => :controller do
22
+ render_views
23
+ routes {Newsletter::Engine.routes}
24
+ # This should return the minimal set of attributes required to create a valid
25
+ # Newsletter::Piece. As you add validations to Newsletter::Piece, be sure to
26
+ # adjust the attributes here as well.
27
+ before(:each) do
28
+ @design = import_design
29
+ @newsletter = FactoryGirl.create(:newsletter, design: @design)
30
+ @area = @newsletter.area('right_column')
31
+ @element = @area.elements.detect{|e| e.name.eql?('Right Column Headline')}
32
+ @field = @element.fields.first
33
+ end
34
+ let(:valid_attributes) {{
35
+ newsletter_id: @newsletter.id,
36
+ area_id: @area.id,
37
+ element_id: @element.id,
38
+ field_values_attributes: {
39
+ @field.id => {
40
+ text: "Extra! Extra!"
41
+ }
42
+ }
43
+ }}
44
+
45
+ let(:invalid_attributes) {{
46
+ newsletter_id: @newsletter.id,
47
+ element_id: @element.id,
48
+ field_values_attributes: {
49
+ @field.id => {
50
+ text: "Extra! Extra!"
51
+ }
52
+ }
53
+ }}
54
+
55
+ # This should return the minimal set of values that should be in the session
56
+ # in order to pass any filters (e.g. authentication) defined in
57
+ # Newsletter::PiecesController. Be sure to keep this updated too.
58
+ let(:valid_session) { {} }
59
+
60
+ describe "GET #new" do
61
+ it "assigns a new piece as @piece" do
62
+ get :new, {newsletter_id: @newsletter.id, element_id: @element.id, area_id: @area.id},
63
+ valid_session
64
+ expect(assigns(:piece)).to be_a_new(Newsletter::Piece)
65
+ end
66
+ end
67
+
68
+ describe "GET #edit" do
69
+ it "assigns the requested piece as @piece" do
70
+ piece = Newsletter::Piece.create! valid_attributes
71
+ get :edit, {:id => piece.to_param}, valid_session
72
+ expect(assigns(:piece)).to eq(piece)
73
+ end
74
+ end
75
+
76
+ describe "POST #create" do
77
+ context "with valid params" do
78
+ it "creates a new Newsletter::Piece" do
79
+ expect {
80
+ post :create, {:piece => valid_attributes}, valid_session
81
+ }.to change(Newsletter::Piece, :count).by(1)
82
+ end
83
+
84
+ it "assigns a newly created piece as @piece" do
85
+ post :create, {:piece => valid_attributes}, valid_session
86
+ expect(assigns(:piece)).to be_a(Newsletter::Piece)
87
+ expect(assigns(:piece)).to be_persisted
88
+ end
89
+
90
+ it "redirects to the created piece" do
91
+ post :create, {:piece => valid_attributes}, valid_session
92
+ expect(response).to redirect_to(edit_newsletter_path(@newsletter))
93
+ end
94
+ end
95
+
96
+ context "with invalid params" do
97
+ it "assigns a newly created but unsaved piece as @piece" do
98
+ pending "Currently having issues forcing a piece to be valid and save, also except for associations... there are no validations currently"
99
+ post :create, {:piece => invalid_attributes}, valid_session
100
+ expect(assigns(:piece)).to be_a_new(Newsletter::Piece)
101
+ end
102
+
103
+ it "re-renders the 'new' template" do
104
+ pending "Currently having issues forcing a piece to be valid and save, also except for associations... there are no validations currently"
105
+ post :create, {:piece => invalid_attributes}, valid_session
106
+ expect(response).to render_template("new")
107
+ end
108
+ end
109
+ end
110
+
111
+ describe "PUT #update" do
112
+ context "with valid params" do
113
+ let(:new_attributes) {{
114
+ newsletter_id: @newsletter.id,
115
+ area_id: @area.id,
116
+ element_id: @element.id,
117
+ field_values_attributes: {
118
+ @field.id => {
119
+ text: "Extra! Extra!"
120
+ }
121
+ }
122
+ }}
123
+
124
+ it "updates the requested piece" do
125
+ piece = Newsletter::Piece.create! valid_attributes
126
+ put :update, {:id => piece.to_param, :piece => new_attributes}, valid_session
127
+ piece.reload
128
+ skip("Add assertions for updated state")
129
+ end
130
+
131
+ it "assigns the requested piece as @piece" do
132
+ piece = Newsletter::Piece.create! valid_attributes
133
+ put :update, {:id => piece.to_param, :piece => valid_attributes}, valid_session
134
+ expect(assigns(:piece)).to eq(piece)
135
+ end
136
+
137
+ it "redirects to the newsletter edit" do
138
+ piece = Newsletter::Piece.create! valid_attributes
139
+ put :update, {:id => piece.to_param, :piece => valid_attributes}, valid_session
140
+ expect(response).to redirect_to(edit_newsletter_path(@newsletter))
141
+ end
142
+ end
143
+
144
+ context "with invalid params" do
145
+ it "assigns the piece as @piece" do
146
+ piece = Newsletter::Piece.create! valid_attributes
147
+ put :update, {:id => piece.to_param, :piece => invalid_attributes}, valid_session
148
+ expect(assigns(:piece)).to eq(piece)
149
+ end
150
+
151
+ it "re-renders the 'edit' template" do
152
+ pending "Currently having issues forcing a piece to be valid and save, also except for associations... there are no validations currently"
153
+ piece = Newsletter::Piece.create! valid_attributes
154
+ put :update, {:id => piece.to_param, :piece => invalid_attributes}, valid_session
155
+ expect(response).to render_template("edit")
156
+ end
157
+ end
158
+ end
159
+
160
+ describe "DELETE #destroy" do
161
+ it "destroys the requested piece" do
162
+ piece = Newsletter::Piece.create! valid_attributes
163
+ expect {
164
+ delete :destroy, {:id => piece.to_param}, valid_session
165
+ }.to change(Newsletter::Piece, :count).by(-1)
166
+ end
167
+
168
+ it "redirects to the newsletter edit" do
169
+ piece = Newsletter::Piece.create! valid_attributes
170
+ delete :destroy, {:id => piece.to_param}, valid_session
171
+ expect(response).to redirect_to(edit_newsletter_path(@newsletter))
172
+ end
173
+ end
174
+
175
+ end
@@ -0,0 +1,19 @@
1
+ def random_bool
2
+ Kernel.rand(2) == 1
3
+ end
4
+
5
+ def random_int(min,max)
6
+ count = max - min + 1
7
+ Kernel.rand(count) + min
8
+ end
9
+
10
+ def random_decimal(min,max,precision=2)
11
+ multiplier = 10 ** precision
12
+ count = max - min + 1
13
+ puts "multiplier: #{multiplier}"
14
+ (Kernel.rand(count * multiplier) + min * multiplier).to_f / multiplier
15
+ end
16
+
17
+ def random_value(values)
18
+ values[random_int(0,(values.length-1))]
19
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :asset, class: Newsletter::Asset do
3
+ #association :field
4
+ #association :piece
5
+ image File.open(File.join(Newsletter::PLUGIN_ROOT,'spec','test_app',
6
+ 'spec','support','files','iReach_logo.gif'))
7
+ end
8
+ end
@@ -1,7 +1,7 @@
1
1
  # Read about factories at https://github.com/thoughtbot/factory_girl
2
2
  def import_design(file=nil, name=nil)
3
3
  name ||= Faker::Company.bs.split(/\s+/).each(&:capitalize).join(' ')
4
- file ||= File.join(Rails.root,'..','..','designs','exports','example-export.yaml')
4
+ file ||= File.join(Newsletter::PLUGIN_ROOT,'designs','exports','example-export.yaml')
5
5
  Newsletter::Design.import(file,name)
6
6
  end
7
7
 
@@ -2,8 +2,8 @@
2
2
 
3
3
  FactoryGirl.define do
4
4
  factory :newsletter, class: Newsletter::Newsletter do
5
- name {Faker::Lorem.words}
6
- description {Faker::Lorem.paragraphs}
5
+ name {Faker::Company.name}
6
+ description {Faker::Lorem.paragraphs(1)[0..125]}
7
7
  association :design
8
8
  pieces do |newsletter|
9
9
  left_area = newsletter.design.areas.where(name: 'left_column').first
@@ -16,13 +16,75 @@ FactoryGirl.define do
16
16
  #right_area = newsletter.design.areas.where(name: 'right_column').first
17
17
 
18
18
  [ ::Newsletter::Piece.new(
19
- area: left_area,
20
- element: left_image_element,
19
+ area_id: left_area.id,
20
+ element_id: left_image_element.id,
21
21
  field_values_attributes: { image_field.id => {
22
- url: 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRwNmnMYLBp2Sw9vg-snbZ_GKONKo_WY0f3S1ETL2era2DZKKqD'
22
+ url: Faker::Internet.url.gsub(%r#(/[^/]*\.[^/]*)?$#,'/bobo.jpg')
23
23
  }}
24
24
  )]
25
25
  end
26
- end
26
+ factory :newsletter_with_image_asset do
27
+ pieces do | newsletter |
28
+ left_area = newsletter.design.areas.where(name: 'left_column').first
29
+ left_image_element = left_area.elements.where(name: 'Left Column Image').first
30
+ image_field = left_image_element.fields.first
31
+ #article = area.elements.where(name: 'Left Column Article').first
32
+ #link = article.fields.where(name: 'link').first
33
+ #headline = article.fields.where(name: 'headline').first
34
+ #excerpt = article.fields.where(name: 'article_excerpt').first
35
+ #right_area = newsletter.design.areas.where(name: 'right_column').first
36
+
37
+ [ ::Newsletter::Piece.new(
38
+ area_id: left_area.id,
39
+ element_id: left_image_element.id,
40
+ field_values_attributes: { image_field.id => {
41
+ uploaded_data: Rack::Test::UploadedFile.new(File.open(File.join(Rails.root,
42
+ '/spec/support/files/iReach_logo.gif')))
43
+ }}
44
+ )]
45
+ end
46
+ end
47
+ factory :newsletter_with_pdf_asset do
48
+ pieces do | newsletter |
49
+ left_area = newsletter.design.areas.where(name: 'left_column').first
50
+ left_image_element = left_area.elements.where(name: 'Left Column Image').first
51
+ image_field = left_image_element.fields.first
52
+ #article = area.elements.where(name: 'Left Column Article').first
53
+ #link = article.fields.where(name: 'link').first
54
+ #headline = article.fields.where(name: 'headline').first
55
+ #excerpt = article.fields.where(name: 'article_excerpt').first
56
+ #right_area = newsletter.design.areas.where(name: 'right_column').first
57
+
58
+ [ ::Newsletter::Piece.new(
59
+ area_id: left_area.id,
60
+ element_id: left_image_element.id,
61
+ field_values_attributes: { image_field.id => {
62
+ uploaded_data: Rack::Test::UploadedFile.new(File.open(File.join(Rails.root,
63
+ '/spec/support/files/test.pdf')))
64
+ }}
65
+ )]
66
+ end
67
+ end
68
+ factory :newsletter_with_pdf_url do
69
+ pieces do | newsletter |
70
+ left_area = newsletter.design.areas.where(name: 'left_column').first
71
+ left_image_element = left_area.elements.where(name: 'Left Column Image').first
72
+ image_field = left_image_element.fields.first
73
+ #article = area.elements.where(name: 'Left Column Article').first
74
+ #link = article.fields.where(name: 'link').first
75
+ #headline = article.fields.where(name: 'headline').first
76
+ #excerpt = article.fields.where(name: 'article_excerpt').first
77
+ #right_area = newsletter.design.areas.where(name: 'right_column').first
78
+
79
+ [ ::Newsletter::Piece.new(
80
+ area_id: left_area.id,
81
+ element_id: left_image_element.id,
82
+ field_values_attributes: { image_field.id => {
83
+ url: Faker::Internet.url.gsub(%r#(/[^/]*\.[^/]*)?$#,'/bobo.pdf')
84
+ }}
85
+ )]
86
+ end
87
+ end
88
+ end
27
89
  end
28
90
 
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :piece, class: Newsletter::Piece do
3
+ #association :field
4
+ #association :piece
5
+ #image File.open(File.join(Rails.root,
6
+ #'/spec/support/files/iReach_logo.gif'))
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ # Read about factories at https://github.com/thoughtbot/factory_girl
2
+ begin
3
+ FactoryGirl.define do
4
+ factory :user do
5
+ first_name {Faker::Name.first_name}
6
+ last_name {Faker::Name.last_name}
7
+ email {Faker::Internet.email}
8
+ phone {Faker::PhoneNumber.phone_number}
9
+ end
10
+ end
11
+ rescue FactoryGirl::DuplicateDefinitionError => e
12
+ # this is OK ... since it could blow up because of ireach
13
+ end
@@ -0,0 +1,175 @@
1
+ require 'rails_helper'
2
+
3
+ RSpec.feature Newsletter::Design do
4
+ let(:left_area_only_layout) {
5
+ <<EOT
6
+ <%= render left_area %>
7
+ EOT
8
+ }
9
+ let(:full_layout) {
10
+ <<EOT
11
+ <%= render left_area %>
12
+ <%= render right_area %>
13
+ EOT
14
+ }
15
+ context "a new design" do
16
+ it "can be created", js: true do
17
+ visit "/newsletter/designs"
18
+ click_link "New Design"
19
+ fill_in "Name", with: "My Design"
20
+ fill_in "Description", with: "This is an awesome design!"
21
+ fill_in "HTML code", with: left_area_only_layout
22
+ click_link "Add Area"
23
+ find(:css, ".area input").set 'left_area'
24
+ click_button "Submit"
25
+ @design = Newsletter::Design.where(name: 'My Design').first
26
+ expect(Newsletter::Design.count).to eq 1
27
+ expect(@design.description).to eq "This is an awesome design!"
28
+ expect(remove_whitespace(@design.html_text)).to eq remove_whitespace(
29
+ left_area_only_layout)
30
+ expect(@design.areas.count).to eq 1
31
+ @left_area = @design.areas.first
32
+ expect(@left_area.name).to eq "left_area"
33
+ and_it "can be edited" do
34
+ click_link "Add Area"
35
+ find(:css, "#new_area input").set 'right_area'
36
+ fill_in "HTML code", with: full_layout
37
+ click_button "Submit"
38
+ @design = Newsletter::Design.first
39
+ expect(Newsletter::Design.count).to eq 1
40
+ expect(@design.areas.count).to eq 2
41
+ @right_area = @design.areas.detect{|a| a.name.eql?('right_area')}
42
+ @left_area = @design.areas.detect{|a| a.name.eql?('left_area')}
43
+ expect(remove_whitespace(@design.html_text)).to eq remove_whitespace(full_layout)
44
+ end
45
+ and_it "when managing elements" do
46
+ and_it "can create an element with a text area in the left area" do
47
+ click_link "Manage Elements"
48
+ click_link "New Newsletter Element"
49
+ fill_in "Name", with: "Left Area Text"
50
+ fill_in "Description", with: "Left Area Text description instructions"
51
+ fill_in "HTML code", with: "<%= filter(my_paragraph) %>"
52
+ click_link "Add Field"
53
+ within(:css, "#new_field") do
54
+ fill_in "Name", with: "my_paragraph"
55
+ fill_in "Label", with: "My Paragraph"
56
+ fill_in "Description", with: "My Paragraph is a text area for you!"
57
+ select "Textarea", from: "Type"
58
+ end
59
+ check "left_area"
60
+ click_button "Submit"
61
+ expect(Newsletter::Element.count).to eq 1
62
+ @left_area.reload
63
+ expect(@left_area.elements.count).to eq 1
64
+ @left_area_text = @left_area.elements.first
65
+ @left_area_text_field = @left_area_text.fields.first
66
+ expect(@left_area_text.fields.length).to eq 1
67
+ expect(@left_area_text.name).to eq "Left Area Text"
68
+ expect(@left_area_text.description).to eq \
69
+ "Left Area Text description instructions"
70
+ expect(@left_area_text.html_text).to eq "<%= filter(my_paragraph) %>"
71
+ expect(@left_area_text_field.class).to eq Newsletter::Field::TextArea
72
+ expect(@left_area_text_field.name).to eq "my_paragraph"
73
+ expect(@left_area_text_field.description).to eq \
74
+ "My Paragraph is a text area for you!"
75
+ expect(@left_area_text_field.label).to eq "My Paragraph"
76
+ click_link "Edit"
77
+ expect(page).to have_content "Edit Element '#{@left_area_text.name}'"
78
+ click_link "View All"
79
+ click_link "Back to Design"
80
+ end
81
+ and_it "can create an element with a text field in the right area" do
82
+ click_link "Manage Elements"
83
+ click_link "New Newsletter Element"
84
+ fill_in "Name", with: "Right Area Text"
85
+ fill_in "Description", with: "Right Area Text description instructions"
86
+ fill_in "HTML code", with: "<%= filter(my_paragraph) %>"
87
+ click_link "Add Field"
88
+ within(:css, "#new_field") do
89
+ fill_in "Name", with: "my_text"
90
+ fill_in "Label", with: "My Text"
91
+ fill_in "Description", with: "My Text is a text area for you!"
92
+ select "Text", from: "Type"
93
+ end
94
+ check "right_area"
95
+ click_button "Submit"
96
+ expect(Newsletter::Element.count).to eq 2
97
+ @right_area.reload
98
+ expect(@right_area.elements.count).to eq 1
99
+ @right_area_text = @right_area.elements.first
100
+ @right_area_text_field = @right_area_text.fields.first
101
+ expect(@right_area_text.fields.length).to eq 1
102
+ expect(@right_area_text.name).to eq "Right Area Text"
103
+ expect(@right_area_text.description).to eq \
104
+ "Right Area Text description instructions"
105
+ expect(@right_area_text.html_text).to eq "<%= filter(my_paragraph) %>"
106
+ expect(@right_area_text_field.class).to eq Newsletter::Field::Text
107
+ expect(@right_area_text_field.name).to eq "my_text"
108
+ expect(@right_area_text_field.description).to eq \
109
+ "My Text is a text area for you!"
110
+ expect(@right_area_text_field.label).to eq "My Text"
111
+ click_link "Back to Design"
112
+ end
113
+ and_it "can create an element with an inline asset" do
114
+ click_link "Manage Elements"
115
+ click_link "New Newsletter Element"
116
+ fill_in "Name", with: "Nice Image"
117
+ fill_in "Description", with: "Image description instructions"
118
+ fill_in "HTML code", with: "<%= image_tag nice_image.image.url %>"
119
+ click_link "Add Field"
120
+ within(:css, "#new_field") do
121
+ fill_in "Name", with: "nice_image"
122
+ fill_in "Label", with: "Nice Image"
123
+ fill_in "Description", with: "Nice Image is an image for you!"
124
+ select "Inlineasset", from: "Type"
125
+ end
126
+ check "right_area"
127
+ check "left_area"
128
+ click_button "Submit"
129
+ expect(Newsletter::Element.count).to eq 3
130
+ @right_area.reload
131
+ @left_area.reload
132
+ expect(@right_area.elements.count).to eq 2
133
+ expect(@right_area.elements.count).to eq 2
134
+ @nice_image = @left_area.elements.detect{|e| e.name.eql?('Nice Image')}
135
+ expect(@nice_image.fields.length).to eq 1
136
+ @nice_image_field = @nice_image.fields.first
137
+ expect(@nice_image.name).to eq "Nice Image"
138
+ expect(@nice_image.description).to eq \
139
+ "Image description instructions"
140
+ expect(@nice_image.html_text).to eq "<%= image_tag nice_image.image.url %>"
141
+ expect(@nice_image_field.class).to eq Newsletter::Field::InlineAsset
142
+ expect(@nice_image_field.name).to eq "nice_image"
143
+ expect(@nice_image_field.description).to eq \
144
+ "Nice Image is an image for you!"
145
+ expect(@nice_image_field.label).to eq "Nice Image"
146
+ click_link "Back to Design"
147
+ end
148
+ and_it "soft deletes designs" do
149
+ click_link "View All"
150
+ click_link "Delete"
151
+ expect(Newsletter::Design.count).to eq 0
152
+ expect(Newsletter::Design.deleted.count).to eq 1
153
+ end
154
+ end
155
+ end
156
+ end
157
+ it "can sort an element's fields" do
158
+ pending "Not tested"
159
+ design = import_design
160
+ element = design.elements.detect{|e| e.name.eql?('Left Column Article')}
161
+ visit "/newsletter/designs/#{design.id}/edit"
162
+ click_link "Manage Elements"
163
+ within(:css, "#element_1") do
164
+ click_link "Edit"
165
+ end
166
+ raise "Not Tested"
167
+ end
168
+ it "paginates when there are a lot of them" do
169
+ 50.times{import_design(nil,Faker::Company.bs)}
170
+ visit "/newsletter/designs"
171
+ expect(page.body).to match /Next/
172
+ expect(page.body).to match /Previous/
173
+ click_link "Next"
174
+ end
175
+ end