alchemy_cms 2.1.12 → 2.2.rc1

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 (405) hide show
  1. data/.travis.yml +1 -1
  2. data/Gemfile +20 -16
  3. data/README.md +11 -7
  4. data/alchemy_cms.gemspec +31 -29
  5. data/app/assets/javascripts/alchemy/alchemy.base.js +234 -233
  6. data/app/assets/javascripts/alchemy/alchemy.buttons.js +26 -26
  7. data/app/assets/javascripts/alchemy/alchemy.datepicker.js +32 -32
  8. data/app/assets/javascripts/alchemy/alchemy.dirty.js +78 -78
  9. data/app/assets/javascripts/alchemy/alchemy.dragndrop.js +103 -103
  10. data/app/assets/javascripts/alchemy/alchemy.element_editor_selector.js +84 -84
  11. data/app/assets/javascripts/alchemy/alchemy.elements_window.js +88 -88
  12. data/app/assets/javascripts/alchemy/alchemy.file_progress.js +92 -0
  13. data/app/assets/javascripts/alchemy/alchemy.growler.js +23 -23
  14. data/app/assets/javascripts/alchemy/alchemy.html5.js +23 -0
  15. data/app/assets/javascripts/alchemy/alchemy.image_cropper.js +53 -52
  16. data/app/assets/javascripts/alchemy/alchemy.jquery_loader.js +33 -30
  17. data/app/assets/javascripts/alchemy/alchemy.js +2 -0
  18. data/app/assets/javascripts/alchemy/alchemy.js_extensions.js +14 -14
  19. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js.coffee +181 -0
  20. data/app/assets/javascripts/alchemy/alchemy.menubar.js +48 -48
  21. data/app/assets/javascripts/alchemy/alchemy.page_sorter.js +39 -39
  22. data/app/assets/javascripts/alchemy/alchemy.preview.js +81 -83
  23. data/app/assets/javascripts/alchemy/alchemy.preview_window.js +86 -86
  24. data/app/assets/javascripts/alchemy/alchemy.routes.js.erb +23 -23
  25. data/app/assets/javascripts/alchemy/alchemy.swf_upload.js +208 -353
  26. data/app/assets/javascripts/alchemy/alchemy.uploader.js +279 -0
  27. data/app/assets/javascripts/alchemy/alchemy.windows.js +268 -268
  28. data/app/assets/javascripts/tiny_mce/plugins/alchemy_link/editor_plugin.js +42 -42
  29. data/app/assets/stylesheets/alchemy/_defaults.scss +89 -89
  30. data/app/assets/stylesheets/alchemy/base.css.scss +790 -804
  31. data/app/assets/stylesheets/alchemy/buttons.css.scss +263 -264
  32. data/app/assets/stylesheets/alchemy/dashboard.css.scss +66 -66
  33. data/app/assets/stylesheets/alchemy/elements.css.scss +575 -564
  34. data/app/assets/stylesheets/alchemy/flash.css.scss +45 -45
  35. data/app/assets/stylesheets/alchemy/frame.css.scss +262 -262
  36. data/app/assets/stylesheets/alchemy/icons.css.scss +86 -86
  37. data/app/assets/stylesheets/alchemy/jquery-ui.alchemy.css.scss +706 -707
  38. data/app/assets/stylesheets/alchemy/jquery.Jcrop.css.scss +46 -27
  39. data/app/assets/stylesheets/alchemy/jquery.sb.css.scss +107 -107
  40. data/app/assets/stylesheets/alchemy/login.css.scss +40 -38
  41. data/app/assets/stylesheets/alchemy/menubar.css.scss +84 -82
  42. data/app/assets/stylesheets/alchemy/modules.css.scss +9 -9
  43. data/app/assets/stylesheets/alchemy/pagination.css.scss +49 -49
  44. data/app/assets/stylesheets/alchemy/print.css +7 -7
  45. data/app/assets/stylesheets/alchemy/sitemap.css.scss +185 -154
  46. data/app/assets/stylesheets/alchemy/standard_set.css +205 -206
  47. data/app/assets/stylesheets/alchemy/tables.css.scss +94 -60
  48. data/app/assets/stylesheets/alchemy/tinymce_content.css.scss +34 -34
  49. data/app/assets/stylesheets/alchemy/tinymce_dialog.css.scss +177 -177
  50. data/app/assets/stylesheets/alchemy/upload.css.scss +68 -45
  51. data/app/assets/stylesheets/tiny_mce/plugins/inlinepopups/skins/alchemy/window.css.scss +222 -221
  52. data/app/controllers/alchemy/admin/attachments_controller.rb +100 -100
  53. data/app/controllers/alchemy/admin/base_controller.rb +116 -116
  54. data/app/controllers/alchemy/admin/clipboard_controller.rb +44 -44
  55. data/app/controllers/alchemy/admin/contents_controller.rb +55 -55
  56. data/app/controllers/alchemy/admin/dashboard_controller.rb +12 -11
  57. data/app/controllers/alchemy/admin/elements_controller.rb +109 -109
  58. data/app/controllers/alchemy/admin/essence_audios_controller.rb +8 -8
  59. data/app/controllers/alchemy/admin/essence_files_controller.rb +20 -20
  60. data/app/controllers/alchemy/admin/essence_flashes_controller.rb +8 -8
  61. data/app/controllers/alchemy/admin/essence_pictures_controller.rb +81 -81
  62. data/app/controllers/alchemy/admin/essence_videos_controller.rb +8 -8
  63. data/app/controllers/alchemy/admin/languages_controller.rb +16 -4
  64. data/app/controllers/alchemy/admin/layoutpages_controller.rb +9 -9
  65. data/app/controllers/alchemy/admin/pages_controller.rb +249 -248
  66. data/app/controllers/alchemy/admin/pictures_controller.rb +105 -105
  67. data/app/controllers/alchemy/admin/resources_controller.rb +111 -166
  68. data/app/controllers/alchemy/admin/trash_controller.rb +18 -18
  69. data/app/controllers/alchemy/admin/users_controller.rb +69 -69
  70. data/app/controllers/alchemy/attachments_controller.rb +27 -27
  71. data/app/controllers/alchemy/base_controller.rb +159 -155
  72. data/app/controllers/alchemy/elements_controller.rb +16 -16
  73. data/app/controllers/alchemy/messages_controller.rb +59 -59
  74. data/app/controllers/alchemy/pages_controller.rb +194 -198
  75. data/app/controllers/alchemy/pictures_controller.rb +57 -57
  76. data/app/controllers/alchemy/user_sessions_controller.rb +70 -70
  77. data/app/helpers/alchemy/admin/attachments_helper.rb +7 -7
  78. data/app/helpers/alchemy/admin/base_helper.rb +425 -425
  79. data/app/helpers/alchemy/admin/contents_helper.rb +72 -72
  80. data/app/helpers/alchemy/admin/elements_helper.rb +108 -107
  81. data/app/helpers/alchemy/admin/essences_helper.rb +108 -108
  82. data/app/helpers/alchemy/admin/pages_helper.rb +42 -42
  83. data/app/helpers/alchemy/admin/pictures_helper.rb +26 -26
  84. data/app/helpers/alchemy/base_helper.rb +90 -90
  85. data/app/helpers/alchemy/elements_helper.rb +167 -168
  86. data/app/helpers/alchemy/essences_helper.rb +133 -133
  87. data/app/helpers/alchemy/pages_helper.rb +515 -526
  88. data/app/helpers/alchemy/pictures_helper.rb +19 -0
  89. data/app/mailers/alchemy/messages.rb +13 -13
  90. data/app/mailers/alchemy/notifications.rb +19 -19
  91. data/app/models/alchemy.rb +3 -3
  92. data/app/models/alchemy/attachment.rb +52 -78
  93. data/app/models/alchemy/cell.rb +48 -48
  94. data/app/models/alchemy/content.rb +196 -196
  95. data/app/models/alchemy/element.rb +500 -490
  96. data/app/models/alchemy/essence_audio.rb +7 -7
  97. data/app/models/alchemy/essence_date.rb +10 -10
  98. data/app/models/alchemy/essence_file.rb +7 -7
  99. data/app/models/alchemy/essence_flash.rb +6 -6
  100. data/app/models/alchemy/essence_html.rb +9 -9
  101. data/app/models/alchemy/essence_picture.rb +17 -17
  102. data/app/models/alchemy/essence_richtext.rb +53 -53
  103. data/app/models/alchemy/essence_text.rb +21 -21
  104. data/app/models/alchemy/essence_video.rb +7 -7
  105. data/app/models/alchemy/folded_page.rb +3 -3
  106. data/app/models/alchemy/language.rb +91 -91
  107. data/app/models/alchemy/language/code.rb +14 -14
  108. data/app/models/alchemy/message.rb +48 -45
  109. data/app/models/alchemy/page.rb +555 -558
  110. data/app/models/alchemy/picture.rb +100 -99
  111. data/app/models/alchemy/user.rb +76 -74
  112. data/app/models/alchemy/user_session.rb +8 -8
  113. data/app/sweepers/alchemy/content_sweeper.rb +15 -15
  114. data/app/sweepers/alchemy/pages_sweeper.rb +50 -50
  115. data/app/sweepers/alchemy/pictures_sweeper.rb +14 -14
  116. data/app/views/alchemy/admin/attachments/_archive_overlay.html.erb +23 -23
  117. data/app/views/alchemy/admin/attachments/_attachment.html.erb +56 -56
  118. data/app/views/alchemy/admin/attachments/_file_to_assign.html.erb +15 -15
  119. data/app/views/alchemy/admin/attachments/_files_list.html.erb +16 -16
  120. data/app/views/alchemy/admin/attachments/create.js.erb +2 -2
  121. data/app/views/alchemy/admin/attachments/destroy.js.erb +3 -3
  122. data/app/views/alchemy/admin/attachments/edit.html.erb +10 -10
  123. data/app/views/alchemy/admin/attachments/index.html.erb +14 -14
  124. data/app/views/alchemy/admin/attachments/new.html.erb +9 -9
  125. data/app/views/alchemy/admin/clipboard/index.html.erb +21 -21
  126. data/app/views/alchemy/admin/clipboard/insert.js.erb +5 -5
  127. data/app/views/alchemy/admin/contents/_missing.html.erb +1 -1
  128. data/app/views/alchemy/admin/contents/create.js.erb +33 -33
  129. data/app/views/alchemy/admin/contents/destroy.js.erb +5 -5
  130. data/app/views/alchemy/admin/contents/new.html.erb +13 -13
  131. data/app/views/alchemy/admin/contents/order.js.erb +2 -2
  132. data/app/views/alchemy/admin/dashboard/index.html.erb +96 -92
  133. data/app/views/alchemy/admin/elements/_add_content.html.erb +12 -12
  134. data/app/views/alchemy/admin/elements/_element.html.erb +3 -3
  135. data/app/views/alchemy/admin/elements/_new_element_form.html.erb +28 -28
  136. data/app/views/alchemy/admin/elements/_picture_editor.html.erb +21 -21
  137. data/app/views/alchemy/admin/elements/create.js.erb +32 -32
  138. data/app/views/alchemy/admin/elements/index.html.erb +2 -2
  139. data/app/views/alchemy/admin/elements/new.html.erb +31 -31
  140. data/app/views/alchemy/admin/elements/order.js.erb +3 -3
  141. data/app/views/alchemy/admin/elements/trash.js.erb +13 -13
  142. data/app/views/alchemy/admin/elements/update.js.erb +6 -6
  143. data/app/views/alchemy/admin/essence_files/assign.js.erb +6 -6
  144. data/app/views/alchemy/admin/essence_pictures/crop.html.erb +32 -32
  145. data/app/views/alchemy/admin/essence_pictures/destroy.js.erb +1 -1
  146. data/app/views/alchemy/admin/essence_pictures/edit.html.erb +1 -1
  147. data/app/views/alchemy/admin/essence_pictures/update.js.erb +11 -11
  148. data/app/views/alchemy/admin/languages/_form.html.erb +51 -45
  149. data/app/views/alchemy/admin/languages/_language.html.erb +45 -45
  150. data/app/views/alchemy/admin/languages/_table.html.erb +25 -25
  151. data/app/views/alchemy/admin/layoutpages/index.html.erb +35 -35
  152. data/app/views/alchemy/admin/pages/_create_language_form.html.erb +42 -42
  153. data/app/views/alchemy/admin/pages/_external_link.html.erb +1 -1
  154. data/app/views/alchemy/admin/pages/_new_page_form.html.erb +27 -27
  155. data/app/views/alchemy/admin/pages/_page.html.erb +112 -112
  156. data/app/views/alchemy/admin/pages/_sitemap.html.erb +1 -1
  157. data/app/views/alchemy/admin/pages/configure.html.erb +71 -69
  158. data/app/views/alchemy/admin/pages/configure_external.html.erb +38 -38
  159. data/app/views/alchemy/admin/pages/destroy.js.erb +10 -10
  160. data/app/views/alchemy/admin/pages/edit.html.erb +165 -165
  161. data/app/views/alchemy/admin/pages/fold.js.erb +2 -2
  162. data/app/views/alchemy/admin/pages/index.html.erb +66 -66
  163. data/app/views/alchemy/admin/pages/locked.html.erb +1 -1
  164. data/app/views/alchemy/admin/pages/new.html.erb +40 -40
  165. data/app/views/alchemy/admin/pages/sort.js.erb +4 -4
  166. data/app/views/alchemy/admin/pages/unlock.js.erb +6 -6
  167. data/app/views/alchemy/admin/pages/update.js.erb +19 -19
  168. data/app/views/alchemy/admin/partials/_flash.html.erb +2 -2
  169. data/app/views/alchemy/admin/partials/_flash_notices.html.erb +1 -1
  170. data/app/views/alchemy/admin/partials/_flash_upload.html.erb +38 -0
  171. data/app/views/alchemy/admin/partials/_language_tree_select.html.erb +15 -15
  172. data/app/views/alchemy/admin/partials/_main_navigation_entry.html.erb +8 -8
  173. data/app/views/alchemy/admin/partials/_remote_search_form.html.erb +35 -35
  174. data/app/views/alchemy/admin/partials/_search_form.html.erb +14 -14
  175. data/app/views/alchemy/admin/partials/_sub_navigation_tab.html.erb +6 -6
  176. data/app/views/alchemy/admin/partials/_upload_form.html.erb +56 -118
  177. data/app/views/alchemy/admin/pictures/_archive_overlay.html.erb +11 -11
  178. data/app/views/alchemy/admin/pictures/_filter_and_size_bar.html.erb +71 -71
  179. data/app/views/alchemy/admin/pictures/_picture.html.erb +32 -32
  180. data/app/views/alchemy/admin/pictures/_picture_to_assign.html.erb +26 -26
  181. data/app/views/alchemy/admin/pictures/_pictures_list.html.erb +6 -6
  182. data/app/views/alchemy/admin/pictures/create.js.erb +7 -7
  183. data/app/views/alchemy/admin/pictures/index.html.erb +67 -67
  184. data/app/views/alchemy/admin/pictures/show_in_window.html.erb +5 -4
  185. data/app/views/alchemy/admin/resources/_form.html.erb +25 -19
  186. data/app/views/alchemy/admin/resources/_resource.html.erb +37 -36
  187. data/app/views/alchemy/admin/resources/_table.html.erb +17 -17
  188. data/app/views/alchemy/admin/resources/destroy.js.erb +1 -1
  189. data/app/views/alchemy/admin/resources/index.html.erb +14 -14
  190. data/app/views/alchemy/admin/trash/index.html.erb +20 -20
  191. data/app/views/alchemy/admin/users/_table.html.erb +52 -52
  192. data/app/views/alchemy/admin/users/_user.html.erb +35 -36
  193. data/app/views/alchemy/admin/users/index.html.erb +26 -27
  194. data/app/views/alchemy/base/error_notice.html.erb +2 -2
  195. data/app/views/alchemy/base/update.js.erb +1 -1
  196. data/app/views/alchemy/elements/_contactform_view.html.erb +76 -76
  197. data/app/views/alchemy/elements/_download_view.html.erb +1 -1
  198. data/app/views/alchemy/elements/_editor_not_found.html.erb +3 -3
  199. data/app/views/alchemy/elements/_searchresult_view.html.erb +2 -2
  200. data/app/views/alchemy/elements/_sitemap_editor.html.erb +1 -1
  201. data/app/views/alchemy/essences/_essence_audio_view.html.erb +13 -13
  202. data/app/views/alchemy/essences/_essence_date_editor.html.erb +10 -10
  203. data/app/views/alchemy/essences/_essence_file_editor.html.erb +62 -62
  204. data/app/views/alchemy/essences/_essence_file_view.html.erb +8 -8
  205. data/app/views/alchemy/essences/_essence_flash_view.html.erb +19 -19
  206. data/app/views/alchemy/essences/_essence_html_editor.html.erb +6 -6
  207. data/app/views/alchemy/essences/_essence_picture_editor.html.erb +73 -73
  208. data/app/views/alchemy/essences/_essence_picture_view.html.erb +34 -34
  209. data/app/views/alchemy/essences/_essence_richtext_editor.html.erb +7 -7
  210. data/app/views/alchemy/essences/_essence_text_editor.html.erb +8 -8
  211. data/app/views/alchemy/navigation/_image_link.html.erb +12 -12
  212. data/app/views/alchemy/navigation/_link.html.erb +13 -13
  213. data/app/views/alchemy/navigation/_renderer.html.erb +17 -17
  214. data/app/views/alchemy/page_layouts/_layout_footer.html.erb +1 -1
  215. data/app/views/alchemy/page_layouts/_layout_header.html.erb +1 -1
  216. data/app/views/alchemy/pages/show.rss.builder +14 -14
  217. data/app/views/alchemy/search/_result.html.erb +7 -7
  218. data/app/views/alchemy/user_sessions/leave.html.erb +9 -9
  219. data/app/views/alchemy/user_sessions/login.html.erb +39 -39
  220. data/app/views/alchemy/user_sessions/logout.html.erb +1 -1
  221. data/app/views/layouts/alchemy/admin.html.erb +81 -81
  222. data/app/views/layouts/alchemy/login.html.erb +36 -36
  223. data/app/views/layouts/alchemy/pages.html.erb +48 -27
  224. data/bin/alchemy +136 -134
  225. data/config/alchemy/config.yml +13 -9
  226. data/config/locales/alchemy.de.yml +24 -30
  227. data/config/locales/alchemy.en.yml +11 -28
  228. data/config/routes.rb +146 -146
  229. data/db/migrate/20100607193638_create_essence_pictures.rb +3 -3
  230. data/db/migrate/20101109150312_alter_pages_visible_column_default.rb +1 -1
  231. data/db/migrate/20101109151812_create_languages.rb +3 -3
  232. data/db/migrate/20110115123343_remove_css_class_default_from_essence_pictures.rb +3 -3
  233. data/db/migrate/20110224105120_change_pages_visible_default.rb +3 -3
  234. data/db/migrate/20110228182659_remove_default_page_layout_from_pages.rb +2 -2
  235. data/db/migrate/20110414163140_remove_display_name_from_elements.rb +3 -3
  236. data/db/migrate/20110511100516_rename_essence_texts_title_to_link_title.rb +2 -2
  237. data/db/migrate/20110529130500_add_cell_id_to_elements.rb +3 -3
  238. data/db/migrate/20110530102804_change_pages_page_layout_column.rb +3 -3
  239. data/db/migrate/20110711142057_change_open_link_in_new_window_to_link_target.rb +1 -1
  240. data/db/migrate/20111116125112_namespace_alchemy_models.rb +21 -21
  241. data/lib/alchemy/auth_engine.rb +5 -5
  242. data/lib/alchemy/capistrano.rb +64 -64
  243. data/lib/alchemy/config.rb +47 -44
  244. data/lib/alchemy/engine.rb +41 -41
  245. data/lib/alchemy/essence.rb +50 -51
  246. data/lib/alchemy/i18n.rb +48 -48
  247. data/lib/alchemy/modules.rb +30 -30
  248. data/lib/alchemy/mount_point.rb +6 -6
  249. data/lib/alchemy/page_layout.rb +94 -93
  250. data/lib/alchemy/resource.rb +82 -0
  251. data/lib/alchemy/resources_helper.rb +56 -0
  252. data/lib/alchemy/scoped_pagination_url_helper.rb +8 -8
  253. data/lib/alchemy/seeder.rb +88 -88
  254. data/lib/alchemy/tinymce.rb +49 -49
  255. data/lib/alchemy/upgrader.rb +103 -103
  256. data/lib/alchemy/version.rb +1 -1
  257. data/lib/alchemy_cms.rb +26 -27
  258. data/lib/extensions/action_view.rb +1 -1
  259. data/lib/extensions/array.rb +3 -3
  260. data/lib/extensions/hash.rb +3 -3
  261. data/lib/middleware/flash_session_cookie.rb +1 -1
  262. data/lib/rails/generators/alchemy/deploy_script/deploy_script_generator.rb +24 -24
  263. data/lib/rails/generators/alchemy/elements/elements_generator.rb +7 -7
  264. data/lib/rails/generators/alchemy/elements/templates/view.html.erb +17 -17
  265. data/lib/rails/generators/alchemy/page_layouts/page_layouts_generator.rb +6 -6
  266. data/lib/rails/generators/alchemy/plugin/templates/authorization_rules.rb +8 -8
  267. data/lib/rails/generators/alchemy/scaffold/files/pages.html.erb +7 -7
  268. data/lib/rails/generators/alchemy/scaffold/scaffold_generator.rb +36 -36
  269. data/lib/rails/templates/alchemy.rb +1 -1
  270. data/lib/tasks/ferret.rake +2 -2
  271. data/lib/tasks/fleximage.rake +32 -32
  272. data/lib/tasks/install.rake +12 -12
  273. data/lib/tasks/upgrade.rake +4 -4
  274. data/spec/controllers/admin/clipboard_controller_spec.rb +43 -43
  275. data/spec/controllers/admin/contents_controller_spec.rb +22 -22
  276. data/spec/controllers/admin/elements_controller_spec.rb +13 -13
  277. data/spec/controllers/admin/languages_controller_spec.rb +31 -0
  278. data/spec/controllers/admin/pages_controller_spec.rb +10 -41
  279. data/spec/controllers/admin/resources_controller_spec.rb +19 -0
  280. data/spec/controllers/admin/trash_controller_spec.rb +11 -11
  281. data/spec/controllers/base_controller_spec.rb +46 -46
  282. data/spec/controllers/pages_controller_spec.rb +102 -92
  283. data/spec/dummy/app/controllers/admin/events_controller.rb +3 -0
  284. data/spec/dummy/app/controllers/errors_controller.rb +5 -0
  285. data/spec/dummy/app/models/event.rb +3 -0
  286. data/spec/dummy/config.ru +1 -1
  287. data/spec/dummy/config/application.rb +3 -0
  288. data/spec/dummy/config/authorization_rules.rb +7 -0
  289. data/spec/dummy/config/environments/development.rb +8 -1
  290. data/spec/dummy/config/environments/production.rb +1 -1
  291. data/spec/dummy/config/environments/test.rb +5 -2
  292. data/spec/dummy/config/routes.rb +9 -1
  293. data/spec/dummy/db/schema.rb +47 -35
  294. data/spec/dummy/public/404.html +19 -7
  295. data/spec/dummy/public/404.html.bak +26 -0
  296. data/spec/dummy/public/422.html +19 -7
  297. data/spec/dummy/public/500.html +19 -7
  298. data/spec/dummy/script/rails +2 -2
  299. data/spec/factories.rb +76 -76
  300. data/spec/helpers/admin/base_helper_spec.rb +21 -21
  301. data/spec/helpers/admin/contents_helper_spec.rb +14 -14
  302. data/spec/helpers/admin/elements_helper_spec.rb +40 -40
  303. data/spec/helpers/admin/essences_helper_spec.rb +7 -7
  304. data/spec/helpers/elements_helper_spec.rb +154 -154
  305. data/spec/helpers/essences_helper_spec.rb +10 -10
  306. data/spec/helpers/pages_helper_spec.rb +369 -372
  307. data/spec/helpers/pictures_helper_spec.rb +14 -0
  308. data/spec/helpers/url_helpers_spec.rb +29 -34
  309. data/spec/integration/admin/pages_controller_spec.rb +50 -50
  310. data/spec/integration/admin/resources_integration_spec.rb +100 -0
  311. data/spec/integration/navigation_spec.rb +1 -1
  312. data/spec/integration/pages_controller_spec.rb +205 -207
  313. data/spec/integration/security_spec.rb +47 -47
  314. data/spec/javascripts/alchemy/link_overlay_spec.js.coffee +42 -0
  315. data/spec/javascripts/alchemy_integration_spec.coffee +12 -0
  316. data/spec/javascripts/fixtures/select.html +3 -0
  317. data/spec/javascripts/helpers/.gitkeep +0 -0
  318. data/spec/javascripts/helpers/jasmine-jquery-1.3.1.js +289 -0
  319. data/spec/javascripts/helpers/mock-ajax.js +207 -0
  320. data/spec/javascripts/helpers/test_responses/test_responses.js +1 -0
  321. data/spec/javascripts/spec.css +3 -0
  322. data/spec/javascripts/spec.js +2 -0
  323. data/spec/libraries/resource_spec.rb +122 -0
  324. data/spec/libraries/resources_helper_spec.rb +105 -0
  325. data/spec/models/content_spec.rb +67 -67
  326. data/spec/models/element_spec.rb +133 -133
  327. data/spec/models/essence_picture_spec.rb +5 -5
  328. data/spec/models/essence_richtext_spec.rb +4 -4
  329. data/spec/models/language_spec.rb +89 -89
  330. data/spec/models/page_spec.rb +436 -506
  331. data/spec/models/picture_spec.rb +34 -34
  332. data/spec/models/user_spec.rb +2 -2
  333. data/spec/page_layout_spec.rb +24 -20
  334. data/spec/routing_spec.rb +253 -253
  335. data/spec/spec_helper.rb +51 -50
  336. data/spec/support/alchemy/controller_hacks.rb +25 -25
  337. data/spec/support/alchemy/specs_helpers.rb +25 -25
  338. data/spec/support/integration_spec_helper.rb +24 -0
  339. data/vendor/assets/javascripts/jquery_plugins/jquery.html5uploader.js +271 -0
  340. data/vendor/assets/javascripts/jquery_plugins/jquery.in-place-edit.js +86 -85
  341. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.nestedSortable.js +380 -377
  342. data/vendor/assets/javascripts/jquery_plugins/jquery.ui.tabspaging.js +285 -279
  343. data/vendor/assets/javascripts/swfupload/SWFObject License.txt +3 -3
  344. data/vendor/assets/javascripts/swfupload/swfupload.cookies.js +47 -47
  345. data/vendor/assets/javascripts/swfupload/swfupload.js +612 -612
  346. data/vendor/assets/javascripts/swfupload/swfupload.queue.js +93 -93
  347. data/vendor/assets/javascripts/swfupload/swfupload.speed.js +337 -337
  348. data/vendor/assets/javascripts/swfupload/swfupload.swfobject.js +706 -102
  349. data/vendor/assets/javascripts/tiny_mce/license.txt +6 -6
  350. data/vendor/assets/javascripts/tiny_mce/plugins/fullscreen/fullscreen.htm +97 -97
  351. data/vendor/assets/javascripts/tiny_mce/plugins/inlinepopups/template.htm +386 -376
  352. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pastetext.js +30 -30
  353. data/vendor/assets/javascripts/tiny_mce/plugins/paste/js/pasteword.js +45 -45
  354. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pastetext.htm +20 -17
  355. data/vendor/assets/javascripts/tiny_mce/plugins/paste/pasteword.htm +12 -12
  356. data/vendor/assets/javascripts/tiny_mce/plugins/table/cell.htm +183 -173
  357. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/cell.css +4 -4
  358. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/row.css +7 -7
  359. data/vendor/assets/javascripts/tiny_mce/plugins/table/css/table.css +3 -3
  360. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/cell.js +282 -280
  361. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/merge_cells.js +15 -15
  362. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/row.js +204 -204
  363. data/vendor/assets/javascripts/tiny_mce/plugins/table/js/table.js +435 -435
  364. data/vendor/assets/javascripts/tiny_mce/plugins/table/merge_cells.htm +24 -22
  365. data/vendor/assets/javascripts/tiny_mce/plugins/table/row.htm +144 -136
  366. data/vendor/assets/javascripts/tiny_mce/plugins/table/table.htm +184 -168
  367. data/vendor/assets/javascripts/tiny_mce/themes/advanced/about.htm +62 -46
  368. data/vendor/assets/javascripts/tiny_mce/themes/advanced/anchor.htm +17 -16
  369. data/vendor/assets/javascripts/tiny_mce/themes/advanced/charmap.htm +56 -47
  370. data/vendor/assets/javascripts/tiny_mce/themes/advanced/color_picker.htm +67 -54
  371. data/vendor/assets/javascripts/tiny_mce/themes/advanced/editor_template.js +852 -1
  372. data/vendor/assets/javascripts/tiny_mce/themes/advanced/image.htm +79 -69
  373. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/about.js +48 -48
  374. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/anchor.js +28 -28
  375. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/charmap.js +317 -317
  376. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/color_picker.js +248 -246
  377. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/image.js +246 -246
  378. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/link.js +146 -146
  379. data/vendor/assets/javascripts/tiny_mce/themes/advanced/js/source_editor.js +31 -31
  380. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de.js +1 -1
  381. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/de_dlg.js +1 -1
  382. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en.js +1 -1
  383. data/vendor/assets/javascripts/tiny_mce/themes/advanced/langs/en_dlg.js +1 -1
  384. data/vendor/assets/javascripts/tiny_mce/themes/advanced/link.htm +53 -46
  385. data/vendor/assets/javascripts/tiny_mce/themes/advanced/shortcuts.htm +57 -45
  386. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/content.css +182 -47
  387. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/dialog.css +399 -92
  388. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/default/ui.css +891 -187
  389. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/content.css +102 -24
  390. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css +377 -78
  391. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css +452 -77
  392. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/content.css +167 -45
  393. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css +399 -92
  394. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui.css +890 -190
  395. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css +33 -7
  396. data/vendor/assets/javascripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css +15 -4
  397. data/vendor/assets/javascripts/tiny_mce/themes/advanced/source_editor.htm +18 -15
  398. data/vendor/assets/javascripts/tiny_mce/utils/editable_selects.js +46 -46
  399. data/vendor/assets/javascripts/tiny_mce/utils/form_utils.js +124 -124
  400. data/vendor/assets/javascripts/tiny_mce/utils/mctabs.js +112 -112
  401. data/vendor/assets/javascripts/tiny_mce/utils/validate.js +213 -213
  402. metadata +102 -115
  403. data/app/assets/javascripts/alchemy/alchemy.link_overlay.js +0 -216
  404. data/lib/tasks/routes.rake +0 -29
  405. data/spec/integration/admin/resources_spec.rb +0 -19
@@ -2,178 +2,178 @@ require 'spec_helper'
2
2
 
3
3
  describe Alchemy::Element do
4
4
 
5
- context "scoped" do
6
-
7
- before(:each) do
8
- Alchemy::Element.delete_all
9
- end
10
-
11
- it "should return all public elements" do
12
- elements = [Factory(:element, :public => true), Factory(:element, :public => true)]
13
- Alchemy::Element.published.all.should == elements
14
- end
15
-
16
- it "should return all elements by name" do
17
- elements = [Factory(:element, :name => 'article'), Factory(:element, :name => 'article')]
18
- Alchemy::Element.named(['article']).all.should == elements
19
- end
20
-
21
- it "should return all elements but excluded ones" do
22
- Factory(:element, :name => 'article')
23
- Factory(:element, :name => 'article')
24
- excluded = [Factory(:element, :name => 'claim')]
25
- Alchemy::Element.excluded(['article']).all.should == excluded
26
- end
27
-
28
- context "not_in_cell" do
29
- it "should return all elements that are not in a cell" do
30
- Factory(:element, :cell_id => 6)
31
- Factory(:element, :cell_id => nil)
32
- Alchemy::Element.not_in_cell.should have(1).element
33
- end
34
- end
35
-
36
- end
5
+ context "scoped" do
6
+
7
+ before(:each) do
8
+ Alchemy::Element.delete_all
9
+ end
10
+
11
+ it "should return all public elements" do
12
+ elements = [Factory(:element, :public => true), Factory(:element, :public => true)]
13
+ Alchemy::Element.published.all.should == elements
14
+ end
15
+
16
+ it "should return all elements by name" do
17
+ elements = [Factory(:element, :name => 'article'), Factory(:element, :name => 'article')]
18
+ Alchemy::Element.named(['article']).all.should == elements
19
+ end
20
+
21
+ it "should return all elements but excluded ones" do
22
+ Factory(:element, :name => 'article')
23
+ Factory(:element, :name => 'article')
24
+ excluded = [Factory(:element, :name => 'claim')]
25
+ Alchemy::Element.excluded(['article']).all.should == excluded
26
+ end
27
+
28
+ context "not_in_cell" do
29
+ it "should return all elements that are not in a cell" do
30
+ Factory(:element, :cell_id => 6)
31
+ Factory(:element, :cell_id => nil)
32
+ Alchemy::Element.not_in_cell.should have(1).element
33
+ end
34
+ end
35
+
36
+ end
37
37
 
38
38
  it "should return a list of element definitions for a list of element names" do
39
- element_names = ["article"]
40
- definitions = Alchemy::Element.all_definitions_for(element_names)
41
- definitions.first.fetch("name").should == 'article'
39
+ element_names = ["article"]
40
+ definitions = Alchemy::Element.all_definitions_for(element_names)
41
+ definitions.first.fetch("name").should == 'article'
42
+ end
43
+
44
+ it "should always return an array calling all_definitions_for()" do
45
+ definitions = Alchemy::Element.all_definitions_for(nil)
46
+ definitions.should == []
42
47
  end
43
48
 
44
- it "should always return an array calling all_definitions_for()" do
45
- definitions = Alchemy::Element.all_definitions_for(nil)
46
- definitions.should == []
47
- end
49
+ it "should raise an error if no descriptions are found" do
50
+ FileUtils.mv(File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml'), File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml.bak'))
51
+ expect { Alchemy::Element.descriptions }.should raise_error
52
+ FileUtils.mv(File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml.bak'), File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml'))
53
+ end
54
+
55
+ context "retrieving contents, essences and ingredients" do
56
+
57
+ before(:each) do
58
+ @element = Factory(:element, :name => 'news')
59
+ end
48
60
 
49
- it "should raise an error if no descriptions are found" do
50
- FileUtils.mv(File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml'), File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml.bak'))
51
- expect { Alchemy::Element.descriptions }.to raise_error
52
- FileUtils.mv(File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml.bak'), File.join(File.dirname(__FILE__), '..', '..', 'config', 'alchemy', 'elements.yml'))
53
- end
61
+ it "should return an ingredient by name" do
62
+ @element.ingredient('news_headline').should == Alchemy::EssenceText.first.ingredient
63
+ end
54
64
 
55
- context "retrieving contents, essences and ingredients" do
65
+ it "should return the content for rss title" do
66
+ @element.content_for_rss_title.should == @element.contents.find_by_name('news_headline')
67
+ end
56
68
 
57
- before(:each) do
58
- @element = Factory(:element, :name => 'news')
59
- end
69
+ it "should return the content for rss description" do
70
+ @element.content_for_rss_description.should == @element.contents.find_by_name('body')
71
+ end
60
72
 
61
- it "should return an ingredient by name" do
62
- @element.ingredient('news_headline').should == Alchemy::EssenceText.first.ingredient
63
- end
73
+ end
64
74
 
65
- it "should return the content for rss title" do
66
- @element.content_for_rss_title.should == @element.contents.find_by_name('news_headline')
67
- end
75
+ it "should return a collection of trashed elements" do
76
+ @element = Factory(:element)
77
+ @element.trash
78
+ Alchemy::Element.trashed.should include(@element)
79
+ end
68
80
 
69
- it "should return the content for rss description" do
70
- @element.content_for_rss_description.should == @element.contents.find_by_name('body')
71
- end
81
+ context "trashed" do
72
82
 
73
- end
83
+ before(:each) do
84
+ @element = Factory(:element)
85
+ @element.trash
86
+ end
74
87
 
75
- it "should return a collection of trashed elements" do
76
- @element = Factory(:element)
77
- @element.trash
78
- Alchemy::Element.trashed.should include(@element)
79
- end
88
+ it "should be not public" do
89
+ @element.public.should be_false
90
+ end
80
91
 
81
- context "trashed" do
92
+ it "should have no page" do
93
+ @element.page.should == nil
94
+ end
82
95
 
83
- before(:each) do
84
- @element = Factory(:element)
85
- @element.trash
86
- end
87
-
88
- it "should be not public" do
89
- @element.public.should be_false
90
- end
91
-
92
- it "should have no page" do
93
- @element.page.should == nil
94
- end
96
+ it "should be folded" do
97
+ @element.folded.should == true
98
+ end
95
99
 
96
- it "should be folded" do
97
- @element.folded.should == true
98
- end
99
-
100
- end
100
+ end
101
101
 
102
- it "should raise error if all_for_page method has no page" do
103
- expect { Alchemy::Element.all_for_page(nil) }.to raise_error(TypeError)
104
- end
102
+ it "should raise error if all_for_page method has no page" do
103
+ expect { Alchemy::Element.all_for_page(nil) }.should raise_error(TypeError)
104
+ end
105
105
 
106
- describe "#content_by_type" do
106
+ describe "#content_by_type" do
107
107
 
108
- before(:each) do
109
- @element = Factory(:element, :name => 'headline')
110
- @content = @element.contents.first
111
- end
108
+ before(:each) do
109
+ @element = Factory(:element, :name => 'headline')
110
+ @content = @element.contents.first
111
+ end
112
112
 
113
- context "with namespaced essence type" do
113
+ context "with namespaced essence type" do
114
114
 
115
- it "should return content by passing a essence type" do
116
- @element.content_by_type('Alchemy::EssenceText').should == @content
117
- end
115
+ it "should return content by passing a essence type" do
116
+ @element.content_by_type('Alchemy::EssenceText').should == @content
117
+ end
118
118
 
119
- end
119
+ end
120
120
 
121
- context "without namespaced essence type" do
121
+ context "without namespaced essence type" do
122
122
 
123
- it "should return content by passing a essence type" do
124
- @element.content_by_type('EssenceText').should == @content
125
- end
123
+ it "should return content by passing a essence type" do
124
+ @element.content_by_type('EssenceText').should == @content
125
+ end
126
126
 
127
- end
127
+ end
128
128
 
129
- end
129
+ end
130
130
 
131
- describe "#all_contents_by_type" do
131
+ describe "#all_contents_by_type" do
132
132
 
133
- before(:each) do
134
- @element = Factory(:element)
135
- @contents = @element.contents.select { |c| c.essence_type == 'Alchemy::EssenceText' }
136
- end
133
+ before(:each) do
134
+ @element = Factory(:element)
135
+ @contents = @element.contents.select { |c| c.essence_type == 'Alchemy::EssenceText' }
136
+ end
137
137
 
138
- context "with namespaced essence type" do
138
+ context "with namespaced essence type" do
139
139
 
140
- it "should return content by passing a essence type" do
141
- @element.all_contents_by_type('Alchemy::EssenceText').should == @contents
142
- end
140
+ it "should return content by passing a essence type" do
141
+ @element.all_contents_by_type('Alchemy::EssenceText').should == @contents
142
+ end
143
143
 
144
- end
144
+ end
145
145
 
146
- context "without namespaced essence type" do
146
+ context "without namespaced essence type" do
147
147
 
148
- it "should return content by passing a essence type" do
149
- @element.all_contents_by_type('EssenceText').should == @contents
150
- end
148
+ it "should return content by passing a essence type" do
149
+ @element.all_contents_by_type('EssenceText').should == @contents
150
+ end
151
151
 
152
- end
152
+ end
153
153
 
154
- end
154
+ end
155
155
 
156
- describe '#copy' do
156
+ describe '#copy' do
157
157
 
158
- before(:each) do
159
- @element = Factory(:element)
160
- end
158
+ before(:each) do
159
+ @element = Factory(:element)
160
+ end
161
161
 
162
- it "should not create contents from scratch" do
163
- copy = Alchemy::Element.copy(@element)
164
- copy.contents.count.should == @element.contents.count
165
- end
162
+ it "should not create contents from scratch" do
163
+ copy = Alchemy::Element.copy(@element)
164
+ copy.contents.count.should == @element.contents.count
165
+ end
166
166
 
167
- it "should create a new record with all attributes of source except given differences" do
168
- copy = Alchemy::Element.copy(@element, {:name => 'foobar'})
169
- copy.name.should == 'foobar'
170
- end
167
+ it "should create a new record with all attributes of source except given differences" do
168
+ copy = Alchemy::Element.copy(@element, {:name => 'foobar'})
169
+ copy.name.should == 'foobar'
170
+ end
171
171
 
172
- it "should make copies of all contents of source" do
173
- copy = Alchemy::Element.copy(@element)
174
- copy.contents.collect(&:id).should_not == @element.contents.collect(&:id)
175
- end
172
+ it "should make copies of all contents of source" do
173
+ copy = Alchemy::Element.copy(@element)
174
+ copy.contents.collect(&:id).should_not == @element.contents.collect(&:id)
175
+ end
176
176
 
177
- end
177
+ end
178
178
 
179
179
  end
@@ -2,10 +2,10 @@ require 'spec_helper'
2
2
 
3
3
  describe Alchemy::EssencePicture do
4
4
 
5
- it "should not store negative values for crop_from" do
6
- essence = Alchemy::EssencePicture.new(:crop_from => '-1x100')
7
- essence.save!
8
- essence.crop_from.should == "0x100"
9
- end
5
+ it "should not store negative values for crop_from" do
6
+ essence = Alchemy::EssencePicture.new(:crop_from => '-1x100')
7
+ essence.save!
8
+ essence.crop_from.should == "0x100"
9
+ end
10
10
 
11
11
  end
@@ -3,9 +3,9 @@ require 'spec_helper'
3
3
  describe Alchemy::EssenceRichtext do
4
4
 
5
5
  it "should save a HTML tag free version of body column" do
6
- essence = Alchemy::EssenceRichtext.new(:body => '<h1>Hello!</h1><p>Welcome to Peters Petshop.</p>')
7
- essence.save!
8
- essence.stripped_body.should == "Hello!Welcome to Peters Petshop."
9
- end
6
+ essence = Alchemy::EssenceRichtext.new(:body => '<h1>Hello!</h1><p>Welcome to Peters Petshop.</p>')
7
+ essence.save!
8
+ essence.stripped_body.should == "Hello!Welcome to Peters Petshop."
9
+ end
10
10
 
11
11
  end
@@ -3,94 +3,94 @@ require 'spec_helper'
3
3
 
4
4
  describe Alchemy::Language do
5
5
 
6
- before(:each) do
7
- @language = Factory(:language)
8
- end
9
-
10
- it "should return a label for code" do
11
- @language.label(:code).should == 'kl'
12
- end
13
-
14
- it "should return a label for name" do
15
- @language.label(:name).should == 'Klingonian'
16
- end
17
-
18
- context "with language_code and empty country_code" do
19
-
20
- it "#code should return language locale only" do
21
- @language.country_code = ''
22
- @language.code.should == 'kl'
23
- end
24
-
25
- context "adding a value for country code" do
26
-
27
- it "#code should return a joined locale" do
28
- @language.country_code = 'cr'
29
- @language.code.should == 'kl-cr'
30
- end
31
-
32
- it "should update all associated Pages with self.code as value for Page#language_code" do
33
- @page = Factory(:page, :language => @language)
34
- @language.country_code = 'cr'
35
- @language.save
36
- @page.reload; @page.language_code.should == 'kl-cr'
37
- end
38
- end
39
-
40
- end
41
-
42
- context "with country_code and_language_code" do
43
-
44
- context "removing the country_code" do
45
- it "should update all associated Pages´s language_code with Language#code" do
46
- language = Factory(:language_with_country_code)
47
- @page = Factory(:page, :language => language)
48
- language.country_code = ''
49
- language.save
50
- @page.reload; @page.language_code.should == "kl"
51
- end
52
- end
53
-
54
- end
55
-
56
- it "should not be deletable if it is the default language" do
57
- @default_language = Alchemy::Language.find_by_default(true)
58
- if !@default_language
59
- @default_language = Factory(:language, :name => "default", :code => "aa", :frontpage_name => "intro", :default => true)
60
- end
61
- expect { @default_language.destroy }.to raise_error
62
- end
63
-
64
- describe "before save" do
65
- describe "#remove_old_default if default attribute has changed to true" do
66
- it "should unset the default status of the old default-language" do
67
- @default_language = Alchemy::Language.get_default
68
- @language.update_attributes(:default => true)
69
- @default_language.reload
70
- @default_language.default.should be(false)
71
- end
72
- end
73
- end
74
-
75
- context "after_update" do
76
- describe "#set_pages_language if language´s code has changed" do
77
- it "should update all its pages with the new code" do
78
- @page = Factory(:page, :language => @language)
79
- @other_page = Factory(:page, :language => @language, :name => 'Another Page')
80
- @language.update_attributes(:code => "fo")
81
- @language.reload; @page.reload; @other_page.reload
82
- [@page.language_code, @other_page.language_code].should == [@language.code, @language.code]
83
- end
84
- end
85
- describe "#unpublish_pages" do
86
- it "should set all pages to unpublic if it gets set to unpublic" do
87
- @page = Factory(:page, :language => @language)
88
- @other_page = Factory(:page, :language => @language, :name => 'Another Page')
89
- @language.update_attributes(:public => false)
90
- @language.reload; @page.reload; @other_page.reload
91
- [@page.public?, @other_page.public?].should == [false, false]
92
- end
93
- end
94
- end
6
+ before(:each) do
7
+ @language = Factory(:language)
8
+ end
9
+
10
+ it "should return a label for code" do
11
+ @language.label(:code).should == 'kl'
12
+ end
13
+
14
+ it "should return a label for name" do
15
+ @language.label(:name).should == 'Klingonian'
16
+ end
17
+
18
+ context "with language_code and empty country_code" do
19
+
20
+ it "#code should return language locale only" do
21
+ @language.country_code = ''
22
+ @language.code.should == 'kl'
23
+ end
24
+
25
+ context "adding a value for country code" do
26
+
27
+ it "#code should return a joined locale" do
28
+ @language.country_code = 'cr'
29
+ @language.code.should == 'kl-cr'
30
+ end
31
+
32
+ it "should update all associated Pages with self.code as value for Page#language_code" do
33
+ @page = Factory(:page, :language => @language)
34
+ @language.country_code = 'cr'
35
+ @language.save
36
+ @page.reload; @page.language_code.should == 'kl-cr'
37
+ end
38
+ end
39
+
40
+ end
41
+
42
+ context "with country_code and_language_code" do
43
+
44
+ context "removing the country_code" do
45
+ it "should update all associated Pages´s language_code with Language#code" do
46
+ language = Factory(:language_with_country_code)
47
+ @page = Factory(:page, :language => language)
48
+ language.country_code = ''
49
+ language.save
50
+ @page.reload; @page.language_code.should == "kl"
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ it "should not be deletable if it is the default language" do
57
+ @default_language = Alchemy::Language.find_by_default(true)
58
+ if !@default_language
59
+ @default_language = Factory(:language, :name => "default", :code => "aa", :frontpage_name => "intro", :default => true)
60
+ end
61
+ expect { @default_language.destroy }.should raise_error
62
+ end
63
+
64
+ describe "before save" do
65
+ describe "#remove_old_default if default attribute has changed to true" do
66
+ it "should unset the default status of the old default-language" do
67
+ @default_language = Alchemy::Language.get_default
68
+ @language.update_attributes(:default => true)
69
+ @default_language.reload
70
+ @default_language.default.should be(false)
71
+ end
72
+ end
73
+ end
74
+
75
+ context "after_update" do
76
+ describe "#set_pages_language if language´s code has changed" do
77
+ it "should update all its pages with the new code" do
78
+ @page = Factory(:page, :language => @language)
79
+ @other_page = Factory(:page, :language => @language)
80
+ @language.update_attributes(:code => "fo")
81
+ @language.reload; @page.reload; @other_page.reload
82
+ [@page.language_code, @other_page.language_code].should == [@language.code, @language.code]
83
+ end
84
+ end
85
+ describe "#unpublish_pages" do
86
+ it "should set all pages to unpublic if it gets set to unpublic" do
87
+ @page = Factory(:page, :language => @language)
88
+ @other_page = Factory(:page, :language => @language)
89
+ @language.update_attributes(:public => false)
90
+ @language.reload; @page.reload; @other_page.reload
91
+ [@page.public?, @other_page.public?].should == [false, false]
92
+ end
93
+ end
94
+ end
95
95
 
96
96
  end