adva_cms 0.0.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 (551) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE +22 -0
  5. data/NOTES +132 -0
  6. data/README.md +29 -0
  7. data/Rakefile +2 -0
  8. data/adva_cms.gemspec +22 -0
  9. data/app/assets/images/adva_cms/admin/header_bg.png +0 -0
  10. data/app/assets/images/adva_cms/admin/section_menu_bg.png +0 -0
  11. data/app/assets/images/adva_cms/admin/tab_action_active.png +0 -0
  12. data/app/assets/images/adva_cms/admin/tab_main_active.png +0 -0
  13. data/app/assets/images/adva_cms/admin/tab_sidebar_active.png +0 -0
  14. data/app/assets/images/adva_cms/admin/tab_top_active.png +0 -0
  15. data/app/assets/images/adva_cms/asset_selected.png +0 -0
  16. data/app/assets/images/adva_cms/avatar.gif +0 -0
  17. data/app/assets/images/adva_cms/filter-bg.png +0 -0
  18. data/app/assets/images/adva_cms/icons/accept.png +0 -0
  19. data/app/assets/images/adva_cms/icons/add.png +0 -0
  20. data/app/assets/images/adva_cms/icons/arrow_cross.png +0 -0
  21. data/app/assets/images/adva_cms/icons/arrow_cross_2.png +0 -0
  22. data/app/assets/images/adva_cms/icons/arrow_cross_3.png +0 -0
  23. data/app/assets/images/adva_cms/icons/arrow_up_down.png +0 -0
  24. data/app/assets/images/adva_cms/icons/assets/audio.png +0 -0
  25. data/app/assets/images/adva_cms/icons/assets/doc.png +0 -0
  26. data/app/assets/images/adva_cms/icons/assets/pdf.png +0 -0
  27. data/app/assets/images/adva_cms/icons/assets/video.png +0 -0
  28. data/app/assets/images/adva_cms/icons/attach.png +0 -0
  29. data/app/assets/images/adva_cms/icons/bin.png +0 -0
  30. data/app/assets/images/adva_cms/icons/bin_closed.png +0 -0
  31. data/app/assets/images/adva_cms/icons/bin_empty.png +0 -0
  32. data/app/assets/images/adva_cms/icons/bullet_black.png +0 -0
  33. data/app/assets/images/adva_cms/icons/bullet_delete.png +0 -0
  34. data/app/assets/images/adva_cms/icons/bullet_error.png +0 -0
  35. data/app/assets/images/adva_cms/icons/bullet_go.png +0 -0
  36. data/app/assets/images/adva_cms/icons/bullet_red.png +0 -0
  37. data/app/assets/images/adva_cms/icons/bullet_white.png +0 -0
  38. data/app/assets/images/adva_cms/icons/bullet_yellow.png +0 -0
  39. data/app/assets/images/adva_cms/icons/cancel.png +0 -0
  40. data/app/assets/images/adva_cms/icons/comment.gif +0 -0
  41. data/app/assets/images/adva_cms/icons/comment.png +0 -0
  42. data/app/assets/images/adva_cms/icons/comment_add.png +0 -0
  43. data/app/assets/images/adva_cms/icons/comment_blue.gif +0 -0
  44. data/app/assets/images/adva_cms/icons/comment_delete.png +0 -0
  45. data/app/assets/images/adva_cms/icons/comment_edit.png +0 -0
  46. data/app/assets/images/adva_cms/icons/comment_yellow.gif +0 -0
  47. data/app/assets/images/adva_cms/icons/cross.png +0 -0
  48. data/app/assets/images/adva_cms/icons/delete.png +0 -0
  49. data/app/assets/images/adva_cms/icons/eye.png +0 -0
  50. data/app/assets/images/adva_cms/icons/favorites.png +0 -0
  51. data/app/assets/images/adva_cms/icons/help.png +0 -0
  52. data/app/assets/images/adva_cms/icons/hourglass.png +0 -0
  53. data/app/assets/images/adva_cms/icons/icon_attachment.gif +0 -0
  54. data/app/assets/images/adva_cms/icons/icon_padlock.gif +0 -0
  55. data/app/assets/images/adva_cms/icons/link.png +0 -0
  56. data/app/assets/images/adva_cms/icons/lock.png +0 -0
  57. data/app/assets/images/adva_cms/icons/magnifier.png +0 -0
  58. data/app/assets/images/adva_cms/icons/minus.gif +0 -0
  59. data/app/assets/images/adva_cms/icons/page_add.png +0 -0
  60. data/app/assets/images/adva_cms/icons/page_delete.png +0 -0
  61. data/app/assets/images/adva_cms/icons/page_edit.png +0 -0
  62. data/app/assets/images/adva_cms/icons/page_favorites.png +0 -0
  63. data/app/assets/images/adva_cms/icons/page_go.png +0 -0
  64. data/app/assets/images/adva_cms/icons/page_green.png +0 -0
  65. data/app/assets/images/adva_cms/icons/page_red.png +0 -0
  66. data/app/assets/images/adva_cms/icons/page_white_add.png +0 -0
  67. data/app/assets/images/adva_cms/icons/page_white_delete.png +0 -0
  68. data/app/assets/images/adva_cms/icons/page_white_edit.png +0 -0
  69. data/app/assets/images/adva_cms/icons/page_white_go.png +0 -0
  70. data/app/assets/images/adva_cms/icons/page_white_link.png +0 -0
  71. data/app/assets/images/adva_cms/icons/page_white_magnify.png +0 -0
  72. data/app/assets/images/adva_cms/icons/pencil.png +0 -0
  73. data/app/assets/images/adva_cms/icons/star.png +0 -0
  74. data/app/assets/images/adva_cms/icons/stop.png +0 -0
  75. data/app/assets/images/adva_cms/icons/tag_green.png +0 -0
  76. data/app/assets/images/adva_cms/icons/tick.png +0 -0
  77. data/app/assets/images/adva_cms/icons/zoom.png +0 -0
  78. data/app/assets/images/adva_cms/indicator.gif +0 -0
  79. data/app/assets/images/adva_cms/preview.png +0 -0
  80. data/app/assets/images/adva_cms/rails.png +0 -0
  81. data/app/assets/images/adva_cms/sortable_tree/drag.png +0 -0
  82. data/app/assets/images/adva_cms/theme_selected.png +0 -0
  83. data/app/assets/javascripts/admin.js +1 -0
  84. data/app/assets/javascripts/adva_cms/admin/jquery.admin.js +23 -0
  85. data/app/assets/javascripts/adva_cms/admin/jquery.article.js +22 -0
  86. data/app/assets/javascripts/adva_cms/admin/jquery.cached_pages.js +14 -0
  87. data/app/assets/javascripts/adva_cms/admin/jquery.table_tree.js +7 -0
  88. data/app/assets/javascripts/adva_cms/application.js +14 -0
  89. data/app/assets/javascripts/adva_cms/base.js +4 -0
  90. data/app/assets/javascripts/adva_cms/cookie.js +49 -0
  91. data/app/assets/javascripts/adva_cms/jquery.common.js +41 -0
  92. data/app/assets/javascripts/adva_cms/jquery.dates.js +51 -0
  93. data/app/assets/javascripts/adva_cms/jquery.flash.js +57 -0
  94. data/app/assets/javascripts/adva_cms/jquery.roles.js +25 -0
  95. data/app/assets/javascripts/adva_cms/jquery/jquery-lowpro.js +224 -0
  96. data/app/assets/javascripts/adva_cms/jquery/jquery.qtip.js +2085 -0
  97. data/app/assets/javascripts/adva_cms/jquery/jquery.table_tree.js +307 -0
  98. data/app/assets/javascripts/adva_cms/jquery/jquery.tablednd_0_5.js +386 -0
  99. data/app/assets/javascripts/adva_cms/json.js +139 -0
  100. data/app/assets/stylesheets/admin.css +1 -0
  101. data/app/assets/stylesheets/adva_cms/admin.css +16 -0
  102. data/app/assets/stylesheets/adva_cms/admin/alternate/common.css +76 -0
  103. data/app/assets/stylesheets/adva_cms/admin/alternate/forms.css +121 -0
  104. data/app/assets/stylesheets/adva_cms/admin/alternate/header.css +125 -0
  105. data/app/assets/stylesheets/adva_cms/admin/alternate/layout.css +103 -0
  106. data/app/assets/stylesheets/adva_cms/admin/alternate/lists.css +153 -0
  107. data/app/assets/stylesheets/adva_cms/admin/alternate/sidebar.css +65 -0
  108. data/app/assets/stylesheets/adva_cms/admin/alternate/top.css +123 -0
  109. data/app/assets/stylesheets/adva_cms/admin/common.css +76 -0
  110. data/app/assets/stylesheets/adva_cms/admin/content.css +11 -0
  111. data/app/assets/stylesheets/adva_cms/admin/forms.css +116 -0
  112. data/app/assets/stylesheets/adva_cms/admin/header.css +114 -0
  113. data/app/assets/stylesheets/adva_cms/admin/helptip.css +35 -0
  114. data/app/assets/stylesheets/adva_cms/admin/layout.css +56 -0
  115. data/app/assets/stylesheets/adva_cms/admin/lists.css +152 -0
  116. data/app/assets/stylesheets/adva_cms/admin/projection.css +118 -0
  117. data/app/assets/stylesheets/adva_cms/admin/reset.css +25 -0
  118. data/app/assets/stylesheets/adva_cms/admin/screen/top.css +8 -0
  119. data/app/assets/stylesheets/adva_cms/admin/sidebar.css +67 -0
  120. data/app/assets/stylesheets/adva_cms/admin/themes.css +49 -0
  121. data/app/assets/stylesheets/adva_cms/admin/top.css +83 -0
  122. data/app/assets/stylesheets/adva_cms/admin/users.css +40 -0
  123. data/app/assets/stylesheets/adva_cms/common.css +49 -0
  124. data/app/assets/stylesheets/adva_cms/default.css +201 -0
  125. data/app/assets/stylesheets/adva_cms/forms.css +60 -0
  126. data/app/assets/stylesheets/adva_cms/jquery/alternate/jquery.tooltip.css +13 -0
  127. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  128. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  129. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  130. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  131. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  132. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  133. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  134. data/app/assets/stylesheets/adva_cms/jquery/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  135. data/app/assets/stylesheets/adva_cms/jquery/images/ui-icons_222222_256x240.png +0 -0
  136. data/app/assets/stylesheets/adva_cms/jquery/images/ui-icons_2e83ff_256x240.png +0 -0
  137. data/app/assets/stylesheets/adva_cms/jquery/images/ui-icons_454545_256x240.png +0 -0
  138. data/app/assets/stylesheets/adva_cms/jquery/images/ui-icons_888888_256x240.png +0 -0
  139. data/app/assets/stylesheets/adva_cms/jquery/images/ui-icons_cd0a0a_256x240.png +0 -0
  140. data/app/assets/stylesheets/adva_cms/jquery/jquery-ui.css +406 -0
  141. data/app/assets/stylesheets/adva_cms/jquery/jquery.tooltip.css +10 -0
  142. data/app/assets/stylesheets/adva_cms/layout/login.css +8 -0
  143. data/app/assets/stylesheets/adva_cms/layout/simple.css +8 -0
  144. data/app/assets/stylesheets/adva_cms/menu.css +129 -0
  145. data/app/assets/stylesheets/adva_cms/reset.css +25 -0
  146. data/app/controllers/admin/base_controller.rb +101 -0
  147. data/app/controllers/admin/categories_controller.rb +3 -0
  148. data/app/controllers/admin/install_controller.rb +61 -0
  149. data/app/controllers/admin/page/articles_controller.rb +150 -0
  150. data/app/controllers/admin/page/categories_controller.rb +62 -0
  151. data/app/controllers/admin/page/contents_controller.rb +52 -0
  152. data/app/controllers/admin/page/links_controller.rb +69 -0
  153. data/app/controllers/admin/pages_controller.rb +2 -0
  154. data/app/controllers/admin/plugins_controller.rb +40 -0
  155. data/app/controllers/admin/sections_controller.rb +91 -0
  156. data/app/controllers/admin/sites_controller.rb +99 -0
  157. data/app/controllers/articles_controller.rb +81 -0
  158. data/app/controllers/base_controller.rb +82 -0
  159. data/app/helpers/admin/base_helper.rb +106 -0
  160. data/app/helpers/base_helper.rb +56 -0
  161. data/app/helpers/content_helper.rb +90 -0
  162. data/app/helpers/resource_helper.rb +127 -0
  163. data/app/models/article.rb +40 -0
  164. data/app/models/categorization.rb +4 -0
  165. data/app/models/category.rb +60 -0
  166. data/app/models/content.rb +155 -0
  167. data/app/models/event.rb +34 -0
  168. data/app/models/link.rb +4 -0
  169. data/app/models/page.rb +36 -0
  170. data/app/models/section.rb +126 -0
  171. data/app/models/site.rb +104 -0
  172. data/app/views/admin/cached_pages/_filter.html.erb +8 -0
  173. data/app/views/admin/cached_pages/destroy.js.erb +18 -0
  174. data/app/views/admin/cached_pages/index.html.erb +26 -0
  175. data/app/views/admin/install/confirmation.html.erb +10 -0
  176. data/app/views/admin/install/index.html.erb +38 -0
  177. data/app/views/admin/page/articles/_form.html.erb +40 -0
  178. data/app/views/admin/page/articles/_options.html.erb +20 -0
  179. data/app/views/admin/page/articles/edit.html.erb +15 -0
  180. data/app/views/admin/page/articles/new.html.erb +12 -0
  181. data/app/views/admin/page/categories/edit.html.erb +22 -0
  182. data/app/views/admin/page/categories/index.html.erb +23 -0
  183. data/app/views/admin/page/categories/new.html.erb +19 -0
  184. data/app/views/admin/page/contents/index.html.erb +40 -0
  185. data/app/views/admin/page/links/_form.html.erb +26 -0
  186. data/app/views/admin/page/links/_options.html.erb +23 -0
  187. data/app/views/admin/page/links/edit.html.erb +12 -0
  188. data/app/views/admin/page/links/new.html.erb +12 -0
  189. data/app/views/admin/plugins/_form.html.erb +11 -0
  190. data/app/views/admin/plugins/index.html.erb +16 -0
  191. data/app/views/admin/plugins/show.html.erb +43 -0
  192. data/app/views/admin/sections/_form.html.haml +20 -0
  193. data/app/views/admin/sections/edit.html.haml +6 -0
  194. data/app/views/admin/sections/index.html.erb +27 -0
  195. data/app/views/admin/sections/new.html.erb +29 -0
  196. data/app/views/admin/sections/settings/_page.html.haml +10 -0
  197. data/app/views/admin/shared/_header.html.erb +18 -0
  198. data/app/views/admin/shared/_language_select.html.erb +6 -0
  199. data/app/views/admin/shared/_section.html.erb +8 -0
  200. data/app/views/admin/shared/_section_summary.html.erb +23 -0
  201. data/app/views/admin/shared/_section_tree.html.erb +23 -0
  202. data/app/views/admin/sites/_email_notifications.html.erb +9 -0
  203. data/app/views/admin/sites/_form.html.erb +15 -0
  204. data/app/views/admin/sites/_recent_users.html.erb +11 -0
  205. data/app/views/admin/sites/_sections.html.erb +10 -0
  206. data/app/views/admin/sites/_unapproved_comments.html.erb +10 -0
  207. data/app/views/admin/sites/edit.html.erb +4 -0
  208. data/app/views/admin/sites/index.html.erb +21 -0
  209. data/app/views/admin/sites/multi_sites_disabled.html.erb +11 -0
  210. data/app/views/admin/sites/new.html.erb +21 -0
  211. data/app/views/admin/sites/show.html.erb +16 -0
  212. data/app/views/categories/_checkboxes.html.erb +12 -0
  213. data/app/views/layouts/admin.html.haml +50 -0
  214. data/app/views/layouts/default.html.erb +38 -0
  215. data/app/views/layouts/simple.html.erb +22 -0
  216. data/app/views/pages/articles/index.html.erb +10 -0
  217. data/app/views/pages/articles/show.html.erb +17 -0
  218. data/app/views/shared/_flash.html.erb +3 -0
  219. data/app/views/shared/_footer.html.erb +4 -0
  220. data/app/views/shared/_menu.html.erb +10 -0
  221. data/app/views/shared/_sidebar.html.erb +19 -0
  222. data/app/views/shared/messages/insufficient_permissions.html.erb +4 -0
  223. data/config/environment.rb +21 -0
  224. data/config/initializers/has_options.rb +2 -0
  225. data/config/initializers/has_permalink.rb +27 -0
  226. data/config/initializers/mailer.rb +12 -0
  227. data/config/initializers/menus.rb +184 -0
  228. data/config/initializers/roles.rb +91 -0
  229. data/config/initializers/settings.rb +26 -0
  230. data/config/initializers/site.rb +5 -0
  231. data/config/initializers/translations_are_a_pain.rb +9 -0
  232. data/config/locales/en.yml +1295 -0
  233. data/config/routes.rb +47 -0
  234. data/db/migrate/20080401000001_create_sites_table.rb +28 -0
  235. data/db/migrate/20080401000002_create_sections_table.rb +25 -0
  236. data/db/migrate/20080401000003_create_contents_table.rb +35 -0
  237. data/db/migrate/20080401000004_create_categories_table.rb +17 -0
  238. data/db/migrate/20080401000005_create_category_assignments.rb +12 -0
  239. data/db/migrate/20080401000006_create_taggable_tables.rb +26 -0
  240. data/db/migrate/20080710000000_create_plugin_configs.rb +13 -0
  241. data/db/migrate/20080715131051_plugin_owner_column.rb +13 -0
  242. data/db/migrate/20081208161500_add_content_type_to_join_tables.rb +10 -0
  243. data/db/migrate/20090216114034_rename_category_assignment_to_categorization.rb +13 -0
  244. data/db/migrate/20090305123429_move_sections_to_pages.rb +9 -0
  245. data/db/migrate/20090519132700_add_published_at_to_sections.rb +10 -0
  246. data/db/migrate/20090702085459_create_section_translations.rb +9 -0
  247. data/db/migrate/20090702200226_create_category_translations.rb +9 -0
  248. data/db/migrate/20090707171100_upgrade_paperclip_paths.rb +31 -0
  249. data/db/migrate/20090709111934_add_email_notification_to_site.rb +12 -0
  250. data/db/migrate/20091026000906_add_nesting_to_articles.rb +26 -0
  251. data/db/migrate/20140721000000_add_title_to_contents.rb +7 -0
  252. data/lib/adva_cms.rb +50 -0
  253. data/lib/adva_cms/version.rb +3 -0
  254. data/lib/core_ext.rb +7 -0
  255. data/lib/extensible_forms.rb +283 -0
  256. data/lib/has_options.rb +46 -0
  257. data/lib/html_diff.rb +48 -0
  258. data/lib/rails_ext.rb +15 -0
  259. data/lib/rails_ext/action_controller/cacheable_flash.rb +30 -0
  260. data/lib/rails_ext/action_controller/content_for_assignments.rb +105 -0
  261. data/lib/rails_ext/action_controller/default_params.rb +19 -0
  262. data/lib/rails_ext/action_controller/event_helper.rb +18 -0
  263. data/lib/rails_ext/action_controller/page_caching.rb +23 -0
  264. data/lib/rails_ext/action_controller/render_with_error_proc.rb +46 -0
  265. data/lib/rails_ext/action_controller/responds_to_parent.rb +46 -0
  266. data/lib/rails_ext/action_controller/url_for_returning.rb +12 -0
  267. data/lib/rails_ext/active_record/exists.rb +5 -0
  268. data/lib/rails_ext/active_record/sti_instantiation.rb +35 -0
  269. data/lib/rails_ext/active_record/sticky_changes.rb +30 -0
  270. data/lib/rails_ext/railties/plugin.rb +58 -0
  271. data/lib/rails_ext/railties/plugin_configuration.rb +72 -0
  272. data/lib/rails_ext/railties/plugin_initializers.rb +25 -0
  273. data/lib/registry.rb +49 -0
  274. data/lib/tasks/adva_cms.rake +178 -0
  275. data/lib/tasks/translation.rake +69 -0
  276. data/lib/time_hacks.rb +57 -0
  277. data/lib/webrat_patch.rb +11 -0
  278. data/locale/rails/fr.yml +123 -0
  279. data/test/NOTES +56 -0
  280. data/test/contexts.rb +365 -0
  281. data/test/fixtures.rb +190 -0
  282. data/test/fixtures/templates/alternative_templates/index.html.erb +1 -0
  283. data/test/fixtures/templates/context_templates_test/index.html.erb +1 -0
  284. data/test/fixtures/templates/context_templates_test/show.html.erb +0 -0
  285. data/test/fixtures/templates/layouts/alternative.html.erb +0 -0
  286. data/test/fixtures/templates/layouts/default.html.erb +0 -0
  287. data/test/fixtures/templates/menu/shared/_menu.html.erb +8 -0
  288. data/test/functional/admin/articles_controller_test.rb +329 -0
  289. data/test/functional/admin/base_controller_test.rb +68 -0
  290. data/test/functional/admin/cached_pages_controller_test.rb +66 -0
  291. data/test/functional/admin/categories_controller_test.rb +164 -0
  292. data/test/functional/admin/cells_controller_spec.rb +32 -0
  293. data/test/functional/admin/install_controller_test.rb +89 -0
  294. data/test/functional/admin/plugins_controller_test.rb +93 -0
  295. data/test/functional/admin/sections_controller_test.rb +201 -0
  296. data/test/functional/admin/sites_controller_test.rb +240 -0
  297. data/test/functional/asset_tag_expansions_test.rb +82 -0
  298. data/test/functional/base_controller_test.rb +73 -0
  299. data/test/functional/page_articles_controller_test.rb +168 -0
  300. data/test/functional/page_articles_routes_test.rb +73 -0
  301. data/test/integration/admin/cached_pages_test.rb +43 -0
  302. data/test/integration/admin/categories_test.rb +66 -0
  303. data/test/integration/admin/custom_templates_test.rb +42 -0
  304. data/test/integration/admin/filtering_articles_test.rb +32 -0
  305. data/test/integration/admin/plugins.rb +32 -0
  306. data/test/integration/admin/section_article_test.rb +150 -0
  307. data/test/integration/admin/section_test.rb +88 -0
  308. data/test/integration/admin/sites_test.rb +48 -0
  309. data/test/integration/installation_test.rb +109 -0
  310. data/test/integration/page_article_comment_test.rb +51 -0
  311. data/test/integration/page_article_test.rb +87 -0
  312. data/test/integration/section_index_test.rb +37 -0
  313. data/test/javascript/assets/jquery-lowpro.js +224 -0
  314. data/test/javascript/assets/jquery-ui.js +298 -0
  315. data/test/javascript/assets/jquery.js +4376 -0
  316. data/test/javascript/assets/testrunner.js +815 -0
  317. data/test/javascript/assets/testsuite.css +120 -0
  318. data/test/javascript/lib/jstest.rb +588 -0
  319. data/test/javascript/templates/test_case.erb +33 -0
  320. data/test/plugins/adva_context_templates/context_templates_test.rb +138 -0
  321. data/test/plugins/adva_post_ping/controller/integration_test.rb +78 -0
  322. data/test/plugins/adva_post_ping/post_ping_test.rb +94 -0
  323. data/test/plugins/adva_url_history/article_test.rb +94 -0
  324. data/test/plugins/adva_url_history/init_url_history.rb +18 -0
  325. data/test/plugins/adva_url_history/section_test.rb +49 -0
  326. data/test/test_helper.rb +75 -0
  327. data/test/test_helper/clear_directories.rb +16 -0
  328. data/test/test_helper/ensure_single_site_mode.rb +10 -0
  329. data/test/test_helper/extensions/cacheable_flash.rb +14 -0
  330. data/test/test_helper/extensions/cronjob.rb +11 -0
  331. data/test/test_helper/extensions/even_test_log.rb +21 -0
  332. data/test/test_helper/extensions/integration_test.rb +78 -0
  333. data/test/test_helper/extensions/matchy.rb +365 -0
  334. data/test/test_helper/extensions/matchy_adva_cms.rb +441 -0
  335. data/test/test_helper/extensions/rails_patch.rb +40 -0
  336. data/test/test_helper/extensions/rr.rb +7 -0
  337. data/test/test_helper/extensions/test_unit.rb +35 -0
  338. data/test/test_helper/extensions/with_sugar.rb +166 -0
  339. data/test/test_helper/parse_options.rb +18 -0
  340. data/test/test_helper/setup_db_transaction.rb +15 -0
  341. data/test/test_helper/setup_webrat.rb +9 -0
  342. data/test/test_helper/test_server/init.rb +15 -0
  343. data/test/unit/helpers/admin/base_helper_test.rb +139 -0
  344. data/test/unit/helpers/base_helper_spec.rb +54 -0
  345. data/test/unit/helpers/base_helper_test.rb +165 -0
  346. data/test/unit/helpers/content_helper_test.rb +127 -0
  347. data/test/unit/helpers/resource_helper_test.rb +180 -0
  348. data/test/unit/i18n_test.rb +22 -0
  349. data/test/unit/lib/cells_ext_spec.rb +96 -0
  350. data/test/unit/lib/extensible_forms_test.rb +362 -0
  351. data/test/unit/lib/menu_test.rb +119 -0
  352. data/test/unit/lib/rails_ext/content_for_assignments_test.rb +75 -0
  353. data/test/unit/lib/rails_ext/plugin_configuration_test.rb +40 -0
  354. data/test/unit/lib/rails_ext/sticky_changes_test.rb +33 -0
  355. data/test/unit/lib/registry_test.rb +91 -0
  356. data/test/unit/lib/routing_filter/routing_filter_categories_spec.rb +63 -0
  357. data/test/unit/lib/routing_filter/routing_filter_categories_test.rb +159 -0
  358. data/test/unit/lib/routing_filter/routing_filter_locale_spec.rb +73 -0
  359. data/test/unit/lib/routing_filter/routing_filter_root_blog_archive_spec.rb +40 -0
  360. data/test/unit/lib/routing_filter/routing_filter_root_section_articles_spec.rb +48 -0
  361. data/test/unit/lib/routing_filter/routing_filter_root_wikipages_spec.rb +40 -0
  362. data/test/unit/lib/routing_filter/routing_filter_sections_spec.rb +143 -0
  363. data/test/unit/lib/routing_filter/routing_filter_sections_test.rb +32 -0
  364. data/test/unit/lib/routing_filter/routing_filter_sets_test.rb +86 -0
  365. data/test/unit/models/article_test.rb +191 -0
  366. data/test/unit/models/category_test.rb +68 -0
  367. data/test/unit/models/content_test.rb +409 -0
  368. data/test/unit/models/counter_test.rb +43 -0
  369. data/test/unit/models/event_test.rb +41 -0
  370. data/test/unit/models/nested_categories_test.rb +34 -0
  371. data/test/unit/models/page_test.rb +63 -0
  372. data/test/unit/models/section_test.rb +315 -0
  373. data/test/unit/models/site_test.rb +199 -0
  374. data/test/unit/observers/activities_article_observer_test.rb +42 -0
  375. data/vendor/gems/belongs_to_cacheable/.gitignore +17 -0
  376. data/vendor/gems/belongs_to_cacheable/Gemfile +4 -0
  377. data/vendor/gems/belongs_to_cacheable/LICENSE +22 -0
  378. data/vendor/gems/belongs_to_cacheable/README.md +29 -0
  379. data/vendor/gems/belongs_to_cacheable/Rakefile +2 -0
  380. data/vendor/gems/belongs_to_cacheable/belongs_to_cacheable.gemspec +22 -0
  381. data/vendor/gems/belongs_to_cacheable/init.rb +1 -0
  382. data/vendor/gems/belongs_to_cacheable/lib/active_record/belongs_to_cacheable.rb +77 -0
  383. data/vendor/gems/belongs_to_cacheable/lib/belongs_to_cacheable.rb +3 -0
  384. data/vendor/gems/belongs_to_cacheable/lib/belongs_to_cacheable/version.rb +3 -0
  385. data/vendor/gems/belongs_to_cacheable/spec/belongs_to_cacheable_spec.rb +52 -0
  386. data/vendor/gems/belongs_to_cacheable/spec/spec_helper.rb +50 -0
  387. data/vendor/gems/filtered_column/.gitignore +17 -0
  388. data/vendor/gems/filtered_column/Gemfile +4 -0
  389. data/vendor/gems/filtered_column/LICENSE +22 -0
  390. data/vendor/gems/filtered_column/README +4 -0
  391. data/vendor/gems/filtered_column/README.md +29 -0
  392. data/vendor/gems/filtered_column/Rakefile +23 -0
  393. data/vendor/gems/filtered_column/filtered_column.gemspec +17 -0
  394. data/vendor/gems/filtered_column/lib/filtered_column.rb +17 -0
  395. data/vendor/gems/filtered_column/lib/filtered_column/filters/base.rb +28 -0
  396. data/vendor/gems/filtered_column/lib/filtered_column/filters/smartypants_filter.rb +14 -0
  397. data/vendor/gems/filtered_column/lib/filtered_column/filters/textile_filter.rb +13 -0
  398. data/vendor/gems/filtered_column/lib/filtered_column/macros/base.rb +25 -0
  399. data/vendor/gems/filtered_column/lib/filtered_column/mixin.rb +46 -0
  400. data/vendor/gems/filtered_column/lib/filtered_column/processor.rb +52 -0
  401. data/vendor/gems/filtered_column/lib/filtered_column/version.rb +3 -0
  402. data/vendor/gems/filtered_column/tasks/filtered_column_tasks.rake +4 -0
  403. data/vendor/gems/filtered_column/test/abstract_unit.rb +73 -0
  404. data/vendor/gems/filtered_column/test/filtered_column_test.rb +53 -0
  405. data/vendor/gems/filtered_column/test/macro_filter_test.rb +23 -0
  406. data/vendor/gems/has_counter/.gitignore +17 -0
  407. data/vendor/gems/has_counter/Gemfile +4 -0
  408. data/vendor/gems/has_counter/LICENSE +22 -0
  409. data/vendor/gems/has_counter/MIT-LICENSE +20 -0
  410. data/vendor/gems/has_counter/README.markdown +64 -0
  411. data/vendor/gems/has_counter/README.md +29 -0
  412. data/vendor/gems/has_counter/Rakefile +2 -0
  413. data/vendor/gems/has_counter/db/migrate/20080601194338_create_counters_table.rb.rb +13 -0
  414. data/vendor/gems/has_counter/has_counter.gemspec +17 -0
  415. data/vendor/gems/has_counter/lib/active_record/has_counter.rb +64 -0
  416. data/vendor/gems/has_counter/lib/counter.rb +23 -0
  417. data/vendor/gems/has_counter/lib/has_counter.rb +4 -0
  418. data/vendor/gems/has_counter/lib/has_counter/version.rb +3 -0
  419. data/vendor/gems/has_counter/spec/has_counter.spec.log +0 -0
  420. data/vendor/gems/has_counter/spec/has_counter.sqlite3.db +0 -0
  421. data/vendor/gems/has_counter/spec/has_counter_spec.rb +55 -0
  422. data/vendor/gems/has_counter/spec/spec_helper.rb +117 -0
  423. data/vendor/gems/has_filter/.gitignore +17 -0
  424. data/vendor/gems/has_filter/Gemfile +4 -0
  425. data/vendor/gems/has_filter/LICENSE +22 -0
  426. data/vendor/gems/has_filter/README.md +29 -0
  427. data/vendor/gems/has_filter/Rakefile +2 -0
  428. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_add.png +0 -0
  429. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_button_left.png +0 -0
  430. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_button_right.png +0 -0
  431. data/vendor/gems/has_filter/app/assets/images/has_filter/filter_remove.png +0 -0
  432. data/vendor/gems/has_filter/app/assets/javascripts/has_filter/filter.js +35 -0
  433. data/vendor/gems/has_filter/app/assets/javascripts/has_filter/jquery.filter.js +23 -0
  434. data/vendor/gems/has_filter/app/assets/stylesheets/has_filter/alternate/filter.css +102 -0
  435. data/vendor/gems/has_filter/app/assets/stylesheets/has_filter/filter.css +100 -0
  436. data/vendor/gems/has_filter/app/helpers/filter_helper.rb +3 -0
  437. data/vendor/gems/has_filter/has_filter.gemspec +17 -0
  438. data/vendor/gems/has_filter/init.rb +3 -0
  439. data/vendor/gems/has_filter/lib/has_filter.rb +22 -0
  440. data/vendor/gems/has_filter/lib/has_filter/active_record/act_macro.rb +102 -0
  441. data/vendor/gems/has_filter/lib/has_filter/filter.rb +17 -0
  442. data/vendor/gems/has_filter/lib/has_filter/filter/base.rb +67 -0
  443. data/vendor/gems/has_filter/lib/has_filter/filter/categorized.rb +24 -0
  444. data/vendor/gems/has_filter/lib/has_filter/filter/chain.rb +45 -0
  445. data/vendor/gems/has_filter/lib/has_filter/filter/set.rb +80 -0
  446. data/vendor/gems/has_filter/lib/has_filter/filter/state.rb +25 -0
  447. data/vendor/gems/has_filter/lib/has_filter/filter/tagged.rb +22 -0
  448. data/vendor/gems/has_filter/lib/has_filter/filter/text.rb +55 -0
  449. data/vendor/gems/has_filter/lib/has_filter/version.rb +3 -0
  450. data/vendor/gems/has_filter/test/db/setup.rb +45 -0
  451. data/vendor/gems/has_filter/test/db/test.sqlite3.db +0 -0
  452. data/vendor/gems/has_filter/test/fixtures.rb +15 -0
  453. data/vendor/gems/has_filter/test/has_filter/filter_chain_test.rb +41 -0
  454. data/vendor/gems/has_filter/test/has_filter/filter_scopes_test.rb +102 -0
  455. data/vendor/gems/has_filter/test/has_filter/filter_tags_test.rb +113 -0
  456. data/vendor/gems/has_filter/test/has_filter/integration.rb +15 -0
  457. data/vendor/gems/has_filter/test/has_filter/scopes_test.rb +48 -0
  458. data/vendor/gems/has_filter/test/log/test.log +34346 -0
  459. data/vendor/gems/has_filter/test/models.rb +23 -0
  460. data/vendor/gems/has_filter/test/templates/has_filter/test/index.html.erb +5 -0
  461. data/vendor/gems/has_filter/test/test_helper.rb +66 -0
  462. data/vendor/gems/simple_taggable/.gitignore +17 -0
  463. data/vendor/gems/simple_taggable/Gemfile +4 -0
  464. data/vendor/gems/simple_taggable/LICENSE +22 -0
  465. data/vendor/gems/simple_taggable/README +24 -0
  466. data/vendor/gems/simple_taggable/README.md +29 -0
  467. data/vendor/gems/simple_taggable/Rakefile +2 -0
  468. data/vendor/gems/simple_taggable/lib/simple_taggable.rb +153 -0
  469. data/vendor/gems/simple_taggable/lib/simple_taggable/version.rb +3 -0
  470. data/vendor/gems/simple_taggable/lib/tag.rb +31 -0
  471. data/vendor/gems/simple_taggable/lib/tag_list.rb +90 -0
  472. data/vendor/gems/simple_taggable/lib/tagging.rb +8 -0
  473. data/vendor/gems/simple_taggable/simple_taggable.gemspec +17 -0
  474. data/vendor/gems/simple_taggable/test/db/schema.rb +41 -0
  475. data/vendor/gems/simple_taggable/test/db/simple_taggable.sqlite3.db +0 -0
  476. data/vendor/gems/simple_taggable/test/fixtures/magazine.rb +3 -0
  477. data/vendor/gems/simple_taggable/test/fixtures/magazines.yml +2 -0
  478. data/vendor/gems/simple_taggable/test/fixtures/photo.rb +8 -0
  479. data/vendor/gems/simple_taggable/test/fixtures/photos.yml +19 -0
  480. data/vendor/gems/simple_taggable/test/fixtures/post.rb +5 -0
  481. data/vendor/gems/simple_taggable/test/fixtures/posts.yml +27 -0
  482. data/vendor/gems/simple_taggable/test/fixtures/subscription.rb +4 -0
  483. data/vendor/gems/simple_taggable/test/fixtures/subscriptions.yml +3 -0
  484. data/vendor/gems/simple_taggable/test/fixtures/taggings.yml +112 -0
  485. data/vendor/gems/simple_taggable/test/fixtures/tags.yml +14 -0
  486. data/vendor/gems/simple_taggable/test/fixtures/user.rb +6 -0
  487. data/vendor/gems/simple_taggable/test/fixtures/users.yml +5 -0
  488. data/vendor/gems/simple_taggable/test/log/simple_taggable.log +1614 -0
  489. data/vendor/gems/simple_taggable/test/simple_taggable_test.rb +226 -0
  490. data/vendor/gems/simple_taggable/test/tag_list_test.rb +105 -0
  491. data/vendor/gems/simple_taggable/test/test_helper.rb +80 -0
  492. data/vendor/gems/table_builder/.gitignore +17 -0
  493. data/vendor/gems/table_builder/Gemfile +4 -0
  494. data/vendor/gems/table_builder/LICENSE +22 -0
  495. data/vendor/gems/table_builder/README.md +29 -0
  496. data/vendor/gems/table_builder/Rakefile +2 -0
  497. data/vendor/gems/table_builder/lib/table_builder.rb +27 -0
  498. data/vendor/gems/table_builder/lib/table_builder/body.rb +28 -0
  499. data/vendor/gems/table_builder/lib/table_builder/cell.rb +21 -0
  500. data/vendor/gems/table_builder/lib/table_builder/column.rb +26 -0
  501. data/vendor/gems/table_builder/lib/table_builder/foot.rb +6 -0
  502. data/vendor/gems/table_builder/lib/table_builder/head.rb +16 -0
  503. data/vendor/gems/table_builder/lib/table_builder/row.rb +40 -0
  504. data/vendor/gems/table_builder/lib/table_builder/rows.rb +26 -0
  505. data/vendor/gems/table_builder/lib/table_builder/table.rb +75 -0
  506. data/vendor/gems/table_builder/lib/table_builder/tag.rb +58 -0
  507. data/vendor/gems/table_builder/lib/table_builder/version.rb +3 -0
  508. data/vendor/gems/table_builder/table_builder.gemspec +17 -0
  509. data/vendor/gems/table_builder/test/fixtures/templates/table_all.html.erb +20 -0
  510. data/vendor/gems/table_builder/test/fixtures/templates/table_auto_body.html.erb +3 -0
  511. data/vendor/gems/table_builder/test/fixtures/templates/table_auto_columns.html.erb +1 -0
  512. data/vendor/gems/table_builder/test/fixtures/templates/table_simple.html.erb +7 -0
  513. data/vendor/gems/table_builder/test/table_builder/table_test.rb +230 -0
  514. data/vendor/gems/table_builder/test/test_helper.rb +49 -0
  515. data/vendor/gems/tags/.gitignore +17 -0
  516. data/vendor/gems/tags/Gemfile +4 -0
  517. data/vendor/gems/tags/LICENSE +22 -0
  518. data/vendor/gems/tags/README.md +29 -0
  519. data/vendor/gems/tags/Rakefile +2 -0
  520. data/vendor/gems/tags/lib/breadcrumbs.rb +13 -0
  521. data/vendor/gems/tags/lib/menu.rb +179 -0
  522. data/vendor/gems/tags/lib/menu/builder.rb +74 -0
  523. data/vendor/gems/tags/lib/tags.rb +7 -0
  524. data/vendor/gems/tags/lib/tags/tag.rb +125 -0
  525. data/vendor/gems/tags/lib/tags/version.rb +3 -0
  526. data/vendor/gems/tags/tags.gemspec +17 -0
  527. data/vendor/gems/tags/test/tags/menu_test.rb +173 -0
  528. data/vendor/gems/tags/test/tags/tag_test.rb +13 -0
  529. data/vendor/gems/tags/test/test_helper.rb +18 -0
  530. data/vendor/gems/xss_terminate/.gitignore +17 -0
  531. data/vendor/gems/xss_terminate/Gemfile +4 -0
  532. data/vendor/gems/xss_terminate/LICENSE +22 -0
  533. data/vendor/gems/xss_terminate/MIT-LICENSE +20 -0
  534. data/vendor/gems/xss_terminate/README +94 -0
  535. data/vendor/gems/xss_terminate/README.md +29 -0
  536. data/vendor/gems/xss_terminate/Rakefile +23 -0
  537. data/vendor/gems/xss_terminate/lib/html5lib_sanitize.rb +2453 -0
  538. data/vendor/gems/xss_terminate/lib/rails_sanitize.rb +8 -0
  539. data/vendor/gems/xss_terminate/lib/xss_terminate.rb +141 -0
  540. data/vendor/gems/xss_terminate/lib/xss_terminate/version.rb +3 -0
  541. data/vendor/gems/xss_terminate/tasks/xss_terminate_tasks.rake +7 -0
  542. data/vendor/gems/xss_terminate/test/models/comment.rb +5 -0
  543. data/vendor/gems/xss_terminate/test/models/entry.rb +7 -0
  544. data/vendor/gems/xss_terminate/test/models/message.rb +3 -0
  545. data/vendor/gems/xss_terminate/test/models/person.rb +5 -0
  546. data/vendor/gems/xss_terminate/test/models/review.rb +5 -0
  547. data/vendor/gems/xss_terminate/test/schema.rb +34 -0
  548. data/vendor/gems/xss_terminate/test/setup_test.rb +16 -0
  549. data/vendor/gems/xss_terminate/test/xss_terminate_test.rb +50 -0
  550. data/vendor/gems/xss_terminate/xss_terminate.gemspec +17 -0
  551. metadata +744 -0
@@ -0,0 +1,191 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+
3
+ class ArticleTest < ActiveSupport::TestCase
4
+ def setup
5
+ super
6
+ @page = Page.first
7
+ @article = @page.articles.published.first
8
+ end
9
+
10
+ test "sanitizes the attributes excerpt, excerpt_html, body and body_html" do
11
+ Article.should filter_attributes(:except => [:excerpt, :excerpt_html, :body, :body_html, :cached_tag_list])
12
+ end
13
+
14
+ test "has many comments" do
15
+ Article.should have_many_comments
16
+ end
17
+
18
+ test "sets the position before create" do
19
+ Article.before_create.should include(:set_position)
20
+ end
21
+
22
+ # validations
23
+
24
+ # FIXME implement!
25
+ test "validates presence of an author (through belongs_to_author)" do
26
+ @article.should validate_presence_of(:author)
27
+ end
28
+
29
+ test "validates that the author is valid (through belongs_to_author)" do
30
+ @article.author = User.new
31
+ @article.should_not be_valid
32
+ end
33
+
34
+ test "validates the uniqueness of the permalink per section" do
35
+ @article = Article.new
36
+ @article.should validate_uniqueness_of(:permalink, :scope => :section_id)
37
+ end
38
+
39
+ # # CLASS METHODS
40
+ #
41
+ # # find_by_permalink
42
+
43
+ test "#find_by_permalink finds articles within passed time span" do
44
+ article = Article.find_by_permalink '2008', '1', '1', 'a-page-article'
45
+ article.permalink.should == 'a-page-article'
46
+ article.published_at.to_date.should == Time.utc('2008', '1', '1').to_date
47
+ end
48
+
49
+ test "#find_by_permalink finds a record when the passed date scope matches the article's published date" do
50
+ date = [:year, :month, :day].map {|key| @article.published_at.send(key).to_s }
51
+ @page.articles.find_by_permalink(*date << @article.permalink).should == @article
52
+ end
53
+
54
+ test "#find_by_permalink does not find a record when the passed date scope does not match the article's published date" do
55
+ date = [:year, :month, :day].map {|key| @article.published_at.send(key).to_s }
56
+ date[2] = date[2].to_i + 1
57
+ @page.articles.find_by_permalink(*date << @article.permalink).should be_nil
58
+ end
59
+
60
+ test "#find_by_permalink finds a record when no date scope is passed" do
61
+ Article.find_by_permalink(@article.permalink).should == @article
62
+ end
63
+
64
+ # INSTANCE METHODS
65
+
66
+ # full_permalink
67
+
68
+ test '#full_permalink returns a hash with the year, month, day and permalink' do
69
+ @article.section = Blog.new
70
+ @article.full_permalink.should == { :year => @article.published_at.year.to_i,
71
+ :month => @article.published_at.month.to_i,
72
+ :day => @article.published_at.day.to_i,
73
+ :permalink => @article.permalink }
74
+ end
75
+
76
+ test '#full_permalink raises an exception when the article does not belong to a Blog' do
77
+ lambda{ @article.full_permalink }.should raise_error
78
+ end
79
+
80
+ # FIXME not true right now, investigate if we want this at all
81
+ # test '#full_permalink raises an exception when the article is not published' do
82
+ # @article.reload
83
+ # @article.published_at = nil
84
+ # lambda{ @article.full_permalink }.should raise_error
85
+ # end
86
+
87
+ # primary?
88
+
89
+ test "#primary? returns true when the article is its section's primary article" do
90
+ @page.articles.primary.should be_primary
91
+ end
92
+
93
+ test "#primary? returns false when the article is not section's primary article" do
94
+ @page.articles.build.should_not be_primary
95
+ end
96
+
97
+ # has_excerpt?
98
+ test "has an excerpt if the excerpt is not blank" do
99
+ @article.excerpt = 'excerpt'
100
+ @article.should have_excerpt
101
+ end
102
+
103
+ test "does not have an excerpt if the excerpt is nil or blank" do
104
+ @article.excerpt = nil
105
+ @article.should_not have_excerpt
106
+
107
+ @article.excerpt = ''
108
+ @article.should_not have_excerpt
109
+ end
110
+
111
+ # accept_comments?
112
+
113
+ test "accepts comments if comments are set to never expire" do
114
+ # FIXME wtf, srsly. use CONSTANTS instead of integers. that's what they are for.
115
+ @article.comment_age = 0
116
+ @article.published_at = 1.days.ago
117
+ @article.should accept_comments
118
+ end
119
+
120
+ test "accepts comments if comments are allowed and not yet expired" do
121
+ @article.comment_age = 3
122
+ @article.published_at = 1.days.ago
123
+ @article.should accept_comments
124
+ end
125
+
126
+ test "does not accept comments if comments are allowed but already expired" do
127
+ @article.comment_age = 1
128
+ @article.published_at = 1.days.ago
129
+ @article.should_not accept_comments
130
+ end
131
+
132
+ test "does not accept comments if comments are not allowed" do
133
+ @article.comment_age = -1
134
+ @article.published_at = 1.days.ago
135
+ @article.should_not accept_comments
136
+ end
137
+
138
+ test "does not accept comments if the article is not published" do
139
+ @article.comment_age = 0
140
+ @article.published_at = nil
141
+ @article.should_not accept_comments
142
+ end
143
+
144
+ # FIXME test the actual model instead
145
+
146
+ # # previous
147
+ #
148
+ # test "#previous finds the previous published article in the article's section" do
149
+ # options = {:conditions => ["published_at < ?", @article.published_at], :order=>:published_at}
150
+ # mock(Article).published(options)
151
+ # @article.previous
152
+ # end
153
+ #
154
+ # # next
155
+ #
156
+ # test "#next finds the next published article in the article's section" do
157
+ # options = {:conditions => ["published_at > ?", @article.published_at], :order=>:published_at}
158
+ # mock(Article).find_published(:first, options)
159
+ # @article.next
160
+ # end
161
+
162
+ # set_position
163
+
164
+ test "#set_position sorts the article to the bottom of the list (sets to max(position) + 1)" do
165
+ article = @page.articles.create! :title => 'title', :body => 'body', :author => User.first
166
+ article.position.should == @page.articles.maximum(:position).to_i
167
+ end
168
+
169
+ # move_to
170
+
171
+ test "#move_to moves the article to the right of given :left_id article" do
172
+ article = @page.articles.create! :title => 'title', :body => 'body', :author => User.first
173
+ article.move_to(:left_id => @page.articles.first.id)
174
+ article.reload.position.should == 2
175
+ Article.find(@page.articles.first.id).position.should == 1
176
+ end
177
+
178
+ test "#has_excerpt? works with fckenabled" do
179
+ @article.excerpt = "<p>&#160;</p>"
180
+ @article.should_not have_excerpt
181
+ end
182
+
183
+ # filtering
184
+
185
+ test "it allows using insecure html in article body and excerpt" do
186
+ @article.body = 'p{position:absolute; top:50px; left:10px; width:150px; height:150px}. insecure css'
187
+ @article.filter = 'textile_filter'
188
+ @article.save(false)
189
+ @article.body_html.should == %(<p style="position:absolute; top:50px; left:10px; width:150px; height:150px;">insecure css</p>)
190
+ end
191
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+
3
+ class CategoryTest < ActiveSupport::TestCase
4
+ def setup
5
+ super
6
+ @page = Page.first
7
+ @category = @page.categories.first
8
+ @new_category = Category.new(:section => @page, :title => 'a category', :parent => @category)
9
+ end
10
+
11
+ test 'acts as a nested set' do
12
+ Category.should act_as_nested_set
13
+ end
14
+
15
+ test "has a permalink generated from the title" do
16
+ Category.should have_permalink(:title)
17
+ end
18
+
19
+ test 'generates a permalink from the title' do
20
+ @category.title = "a category's title"
21
+ @category.permalink = nil
22
+ @category.send :ensure_unique_url
23
+ @category.permalink.should == 'a-categorys-title'
24
+ end
25
+
26
+ # ASSOCIATIONS
27
+
28
+ test "belongs to a section" do
29
+ @category.should belong_to(:section)
30
+ end
31
+
32
+ test "has many contents" do
33
+ @category.should have_many(:contents)
34
+ end
35
+
36
+ test "has many categorizations" do
37
+ @category.should have_many(:categorizations)
38
+ end
39
+
40
+ # VALIDATIONS
41
+
42
+ test 'validates the presence of a section' do
43
+ @category.should validate_presence_of(:section)
44
+ end
45
+
46
+ test 'validates the presence of a title' do
47
+ @category.should validate_presence_of(:title)
48
+ end
49
+
50
+ test 'validates the uniqueness of the permalink per section' do
51
+ @category.section = @page
52
+ @category.should validate_uniqueness_of(:permalink, :scope => :section_id)
53
+ end
54
+
55
+ # CALLBACKS
56
+
57
+ test "#update_paths moves a new category to a child of its parent and updates the category paths" do
58
+ @new_category.save
59
+ @new_category.should be_child_of(@category)
60
+ end
61
+
62
+ # FIXME
63
+ #
64
+ # describe 'instance methods:' do
65
+ # test '#set_path should be specified'
66
+ # test '#update_child_paths usage + behaviour should be specified' # (this certainly can be done better)
67
+ # end
68
+ end
@@ -0,0 +1,409 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')
2
+
3
+ class ContentTest < ActiveSupport::TestCase
4
+ def setup
5
+ super
6
+ @page = Page.first
7
+ @content = @page.articles.first
8
+ @content_attributes = { :title => 'A new content', :body => 'body',:section => @page, :author => User.first }
9
+ end
10
+
11
+ test "acts as a taggable" do
12
+ Content.should act_as_taggable
13
+ end
14
+
15
+ test "acts as a role context for the author role" do
16
+ Content.should act_as_role_context(:roles => :author)
17
+ end
18
+
19
+ test "acts as versioned" do
20
+ Content.versioned_attributes.should_not be_empty
21
+ end
22
+
23
+ test "is configured to save a new version when the title, body or excerpt attribute changes" do
24
+ Content.versioned_attributes.should == [ :title, :body, :excerpt, :body_html, :excerpt_html ]
25
+ end
26
+
27
+ test "is configured to save up to 5 versions" do
28
+ Content.max_version_limit.should == 5
29
+ end
30
+
31
+ test "instantiates with single table inheritance" do
32
+ Content.should instantiate_with_sti
33
+ end
34
+
35
+ test "has a permalink generated from the title" do
36
+ Content.should have_permalink(:title)
37
+ end
38
+
39
+ test "filters the excerpt and body" do
40
+ @content.should filter_column(:excerpt)
41
+ @content.should filter_column(:body)
42
+ end
43
+
44
+ test "has many comments" do
45
+ Content.should have_many_comments
46
+ end
47
+
48
+ test "has a comments counter" do
49
+ Content.should have_counter(:comments)
50
+ end
51
+
52
+ # ASSOCIATIONS
53
+
54
+ test "belongs to a site" do
55
+ @content.should belong_to(:site)
56
+ end
57
+
58
+ test "belongs to a section" do
59
+ @content.should belong_to(:section)
60
+ end
61
+
62
+ test "belongs to an author" do
63
+ @content.should belong_to(:author)
64
+ end
65
+
66
+ test "has many assets" do
67
+ @content.should have_many(:assets)
68
+ end
69
+
70
+ test "has many asset_assignments" do
71
+ @content.should have_many(:asset_assignments)
72
+ end
73
+
74
+ test "has many categories" do
75
+ @content.should have_many(:categories)
76
+ end
77
+
78
+ test "has many categorizations" do
79
+ @content.should have_many(:categorizations)
80
+ end
81
+
82
+ # CALLBACKS
83
+
84
+ test "sets the site before validation" do
85
+ Content.before_validation.should include(:set_site)
86
+ end
87
+
88
+ test "apply filters before save" do
89
+ Content.before_save.should include(:process_filters)
90
+ end
91
+
92
+ # VALIDATIONS
93
+
94
+ test "validates presence of a title" do
95
+ @content.should validate_presence_of(:title)
96
+ end
97
+
98
+ test "validates presence of a body" do
99
+ @content.should validate_presence_of(:body)
100
+ end
101
+
102
+ # SCOPES
103
+
104
+ test "published scope returns published articles" do
105
+ Content.published.map(&:published?).uniq.should == [true]
106
+ end
107
+
108
+ test "published scope given a :year option returns articles published in that year" do
109
+ contents = Content.published('2008')
110
+ years = contents.map(&:published_at).map(&:year).uniq
111
+ years.should == [2008]
112
+ end
113
+
114
+ test "published scope given :year and :month options returns articles published in that month" do
115
+ contents = Content.published('2008', '1')
116
+ months = contents.map(&:published_at).map { |d| [d.year, d.month] }.uniq.flatten
117
+ months.should == [2008, 1]
118
+ end
119
+
120
+ test "published scope given :year, :month and day options returns articles published on that day" do
121
+ contents = Content.published('2008', '1', '1')
122
+ months = contents.map(&:published_at).map { |d| [d.year, d.month, d.day] }.uniq.flatten
123
+ months.should == [2008, 1, 1]
124
+ end
125
+
126
+ # FIXME delete these?
127
+ # # CLASS METHODS
128
+ #
129
+ # test "#find_published finds published articles" do
130
+ # @content.update_attributes! :published_at => 1.hour.ago
131
+ # Content.find_published(:all).should include(@content)
132
+ # end
133
+ #
134
+ # test "#find_published does not find unpublished articles" do
135
+ # @content.update_attributes! :published_at => nil
136
+ # Content.find_published(:all).should_not include(@content)
137
+ # end
138
+ #
139
+ # test "#find_in_time_delta finds articles in the given time delta" do
140
+ # published_at = date = 1.hour.ago
141
+ # delta = date.year, date.month, date.day
142
+ # @content.update_attributes! :published_at => published_at
143
+ # Content.find_in_time_delta(*delta).should include(@content)
144
+ # end
145
+ #
146
+ # test "#find_in_time_delta finds articles prior the given time delta" do
147
+ # published_at = 1.hour.ago
148
+ # date = 2.months.ago
149
+ # delta = date.year, date.month, date.day
150
+ # @content.update_attributes! :published_at => published_at
151
+ # Content.find_in_time_delta(*delta).should_not include(@content)
152
+ # end
153
+ #
154
+ # test "#find_in_time_delta finds articles after the given time delta" do
155
+ # published_at = 2.month.ago
156
+ # date = Time.zone.now
157
+ # delta = date.year, date.month, date.day
158
+ # @content.update_attributes! :published_at => published_at
159
+ # Content.find_in_time_delta(*delta).should_not include(@content)
160
+ # end
161
+ #
162
+ # INSTANCE METHODS
163
+
164
+ test "#owner returns the section" do
165
+ @content.owner.should == @page
166
+ end
167
+
168
+ # published_month
169
+
170
+ test '#published_month returns a time object for the first day of the month the content was published in' do
171
+ @content.published_month.should == Time.local(@content.published_at.year, @content.published_at.month, 1)
172
+ end
173
+
174
+ # draft?
175
+
176
+ test '#draft? returns true when the content has not published_at date' do
177
+ @content.published_at = nil
178
+ @content.should be_draft
179
+ end
180
+
181
+ test '#draft? returns false when the content has a published_at date' do
182
+ @content.published_at = 1.days.ago
183
+ @content.should_not be_draft
184
+ end
185
+
186
+ # published?
187
+
188
+ test "#published? returns true when published_at equals the current time" do
189
+ @content.published_at = Time.zone.now
190
+ @content.should be_published
191
+ end
192
+
193
+ test "#published? returns true when published_at is a past date" do
194
+ @content.published_at = 1.day.ago
195
+ @content.should be_published
196
+ end
197
+
198
+ test "#published? returns false when published_at is a future date" do
199
+ @content.published_at = 1.day.from_now
200
+ @content.should_not be_published
201
+ end
202
+
203
+ test "#published? returns false when published_at is nil" do
204
+ @content.published_at = nil
205
+ @content.should_not be_published
206
+ end
207
+
208
+ # just_published?
209
+
210
+ test "just_published? is true when the content was published during the current request cycle" do
211
+ @content.update_attributes :published_at => Time.now
212
+ @content.just_published?.should be_true
213
+ end
214
+
215
+ test "just_published? is false when the content was published during a previous request cycle" do
216
+ @content.update_attributes :published_at => Time.now
217
+ @content.clear_changes!
218
+ @content.just_published?.should be_false
219
+ end
220
+
221
+ test "just_published? is false when the content is not published" do
222
+ @content.update_attributes :published_at => nil
223
+ @content.clear_changes!
224
+ @content.just_published?.should be_false
225
+ end
226
+
227
+ # FIXME seems to cause some transaction error on sqlite
228
+ # test "#attributes= calls update_categories if attributes include a :category_ids key" do
229
+ # mock(@content).update_categories.with([1, 2, 3])
230
+ # @content.attributes = { :category_ids => [1, 2, 3] }
231
+ # end
232
+
233
+ # # FIXME actually diff something
234
+ # #
235
+ # # describe "#diff_against_version" do
236
+ # # before do
237
+ # # stub(HtmlDiff).diff
238
+ # # @other = Content.new :body_html => 'body', :excerpt_html => 'excerpt'
239
+ # # @content.body_html = 'body'
240
+ # # @content.excerpt_html = 'excerpt'
241
+ # # # stub(@content.versions).find_by_version(anything).returns @other
242
+ # # end
243
+ # #
244
+ # # test "creates a diff" do
245
+ # # expectation do
246
+ # # mock(HtmlDiff).diff.with anything
247
+ # # @content.diff_against_version(1)
248
+ # # end
249
+ # # end
250
+ # #
251
+ # # test "diffs excerpt_html + body_html" do
252
+ # # [@content, @other].each do |target| [:body_html, :excerpt_html].each do |method|
253
+ # # mock(target).stub!(method).returns method.to_s
254
+ # # end end
255
+ # # @content.diff_against_version(1)
256
+ # # end
257
+ # # end
258
+ #
259
+ # FIXME use constants for comment_age!
260
+ test "#comments_expired_at returns a date 1 day after the published_at date if comments expire after 1 day" do
261
+ @content.comment_age = 1
262
+ @content.comments_expired_at.should == @content.published_at + 1.day
263
+ end
264
+
265
+ test "#comments_expired_at returns the published_at date if comments are not allowed (i.e. expire after 0 days)" do
266
+ @content.comment_age = 0
267
+ @content.comments_expired_at.should == @content.published_at
268
+ end
269
+
270
+ test "#comments_expired_at returns a date in far future if comments never expire" do
271
+ @content.comment_age = -1
272
+ @content.comments_expired_at.should > 9998.years.from_now
273
+ end
274
+
275
+ # set_site
276
+ test "#set_site sets the site_id from the section" do
277
+ @content.site_id = nil
278
+ @content.send :set_site
279
+ @content.site_id.should == @content.section.site_id
280
+ end
281
+
282
+ test '#update_categories removes associated categories that are not included in passed category_ids' do
283
+ @foo = Category.create!(:title => 'foo', :section => @page)
284
+ @bar = Category.create!(:title => 'bar', :section => @page)
285
+
286
+ @content.send(:update_categories, [@foo.id, @bar.id])
287
+ @content.categories.should_not include(@category)
288
+ end
289
+
290
+ test '#update_categories assigns categories that are included in passed category_ids but not already associated' do
291
+ @foo = Category.create!(:title => 'foo', :section => @page)
292
+ @bar = Category.create!(:title => 'bar', :section => @page)
293
+
294
+ @content.send(:update_categories, [@foo.id, @bar.id])
295
+ @content.categories.should include(@foo, @bar)
296
+ end
297
+
298
+ # PERMALINK CREATION
299
+
300
+ test "it generates a permalink from the title on create if the given permalink is empty" do
301
+ content = Content.create!(@content_attributes)
302
+ content.permalink.should == 'a-new-content'
303
+ end
304
+
305
+ test "it does not change the permalink on create if the given permalink is not empty" do
306
+ content = Content.create!(@content_attributes.update(:permalink => 'something-else'))
307
+ content.permalink.should == 'something-else'
308
+ end
309
+
310
+ test "it regenerates the permalink from the title on update when the permalink is deleted" do
311
+ old_permalink = @content.permalink
312
+ @content.update_attributes!(:permalink => '')
313
+ @content.permalink.should == old_permalink
314
+ end
315
+
316
+ test "it does not regenerate the permalink on update if not updated with a new permalink" do
317
+ old_permalink = @content.permalink
318
+ @content.update_attributes!(:body => 'just a new body')
319
+ @content.permalink.should == old_permalink
320
+ end
321
+
322
+ test "it does not regenerate the permalink on update if the given permalink is not empty" do
323
+ @content.update_attributes!(:permalink => 'something-else')
324
+ @content.permalink.should == 'something-else'
325
+ end
326
+
327
+ test "creates unique permalinks" do
328
+ content = nil
329
+ 4.times { content = Content.create!(@content_attributes.merge(:title => "unique")) }
330
+ content.permalink.should == 'unique-3'
331
+ end
332
+
333
+ test "it removes characters from the permalink" do
334
+ title = "it's a test title, <em>okay</em>?"
335
+ content = Content.create!(@content_attributes.merge(:title => title))
336
+ content.permalink.should == "its-a-test-title-okay"
337
+ end
338
+
339
+ test "transliterates characters for permalinks" do
340
+ transliterations = {
341
+ %w(À Á Â Ã Å) => "A",
342
+ %w(Ä Æ) => "Ae",
343
+ "Ç" => "C",
344
+ "Ð" => "D",
345
+ %w(È É Ê Ë) => "E",
346
+ %w(Ì Í Î Ï) => "I",
347
+ "Ñ" => "N",
348
+ %w(Ò Ó Ô Õ Ø) => "O",
349
+ "Ö" => "Oe",
350
+ %w(Ù Ú Û) => "U",
351
+ "Ü" => "Ue",
352
+ # "Ý" => "Y", # StringEx transliteration is 'U'
353
+ # "Þ" => "p", # StringEx transliteration is 'th'
354
+ %w(à á â ã å) => "a",
355
+ %w(ä æ) => "ae",
356
+ "ç" => "c",
357
+ "ð" => "d",
358
+ %w(è é ê ë) => "e",
359
+ %w(ì í î ï) => "i",
360
+ "ñ" => "n",
361
+ %w(ò ó ô õ ø) => "o",
362
+ "ö" => "oe",
363
+ "ß" => "ss",
364
+ %w(ù ú û) => "u",
365
+ "ü" => "ue",
366
+ "ý" => "y"
367
+ }
368
+
369
+ source, expected = '', ''
370
+ transliterations.each do |from, to|
371
+ from = [from] unless from.is_a?(Array)
372
+ source << from.join
373
+ expected << to * from.size
374
+ end
375
+
376
+ source.to_url.should == expected.downcase
377
+ end
378
+
379
+ # VERSIONING
380
+
381
+ test "does not create a new version if neither title, excerpt nor body attributes have changed" do
382
+ @content.should_not save_version
383
+ end
384
+
385
+ test "creates a new version if the title attribute has changed" do
386
+ @content.title = 'another title'
387
+ @content.should save_version
388
+ end
389
+
390
+ test "creates a new version if the excerpt attribute has changed" do
391
+ @content.excerpt = 'another excerpt'
392
+ @content.should save_version
393
+ end
394
+
395
+ test "creates a new version if the body attribute has changed" do
396
+ @content.body = 'another body'
397
+ @content.should save_version
398
+ end
399
+
400
+ # TAGGING
401
+
402
+ test "works with quoted tags" do
403
+ @content.tag_list = '"foo bar"'
404
+ @content.save!
405
+ @content.reload
406
+ @content.tag_list.should == ['foo bar']
407
+ @content.cached_tag_list.should == '"foo bar"'
408
+ end
409
+ end