browsercms 3.1.5 → 3.3.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (425) hide show
  1. data/app/controllers/cms/base_controller.rb +3 -3
  2. data/app/controllers/cms/content_block_controller.rb +2 -2
  3. data/app/controllers/cms/content_controller.rb +5 -4
  4. data/app/controllers/cms/error_handling.rb +1 -1
  5. data/app/controllers/cms/routes_controller.rb +4 -5
  6. data/app/controllers/cms/section_nodes_controller.rb +1 -6
  7. data/app/controllers/cms/sections_controller.rb +2 -3
  8. data/app/controllers/cms/tasks_controller.rb +3 -0
  9. data/app/controllers/cms/users_controller.rb +1 -1
  10. data/app/helpers/cms/application_helper.rb +137 -34
  11. data/app/helpers/cms/form_builder.rb +33 -21
  12. data/app/helpers/cms/page_helper.rb +43 -10
  13. data/app/helpers/cms/path_helper.rb +1 -1
  14. data/app/helpers/cms/rendering_helper.rb +3 -4
  15. data/app/helpers/cms/section_nodes_helper.rb +5 -43
  16. data/app/models/abstract_file_block.rb +1 -16
  17. data/app/models/attachment.rb +57 -22
  18. data/app/models/category.rb +4 -4
  19. data/app/models/category_type.rb +2 -2
  20. data/app/models/cms/view_context.rb +46 -0
  21. data/app/models/connector.rb +7 -6
  22. data/app/models/content_type.rb +3 -3
  23. data/app/models/dynamic_view.rb +1 -1
  24. data/app/models/email_message.rb +2 -2
  25. data/app/models/file_block.rb +12 -0
  26. data/app/models/group.rb +4 -4
  27. data/app/models/group_type.rb +4 -4
  28. data/app/models/html_block.rb +1 -1
  29. data/app/models/image_block.rb +12 -0
  30. data/app/models/link.rb +22 -5
  31. data/app/models/page.rb +87 -46
  32. data/app/models/page_route.rb +61 -6
  33. data/app/models/permission.rb +1 -1
  34. data/app/models/portlet.rb +14 -4
  35. data/app/models/section.rb +48 -86
  36. data/app/models/section_node.rb +25 -40
  37. data/app/models/site.rb +1 -1
  38. data/app/models/tag.rb +1 -1
  39. data/app/models/task.rb +8 -7
  40. data/app/models/user.rb +2 -7
  41. data/app/portlets/forgot_password_portlet.rb +6 -2
  42. data/app/portlets/reset_password_portlet.rb +1 -1
  43. data/app/views/cms/blocks/_toolbar.html.erb +1 -1
  44. data/app/views/cms/blocks/_toolbar_for_collection.html.erb +3 -6
  45. data/app/views/cms/blocks/_toolbar_for_member.html.erb +3 -5
  46. data/app/views/cms/blocks/edit.html.erb +4 -4
  47. data/app/views/cms/blocks/index.html.erb +7 -7
  48. data/app/views/cms/blocks/new.html.erb +4 -4
  49. data/app/views/cms/blocks/show.html.erb +2 -2
  50. data/app/views/cms/blocks/usages.html.erb +2 -2
  51. data/app/views/cms/blocks/versions.html.erb +4 -4
  52. data/app/views/cms/cache/show.html.erb +2 -2
  53. data/app/views/cms/categories/_form.html.erb +2 -2
  54. data/app/views/cms/connectors/new.html.erb +6 -8
  55. data/app/views/cms/content/no_page.html.erb +1 -1
  56. data/app/views/cms/content/show.html.erb +2 -7
  57. data/app/views/cms/dashboard/_page_drafts.html.erb +1 -1
  58. data/app/views/cms/dashboard/_tasks.html.erb +1 -1
  59. data/app/views/cms/dashboard/index.html.erb +1 -1
  60. data/app/views/cms/dynamic_views/_form.html.erb +2 -2
  61. data/app/views/cms/dynamic_views/index.html.erb +7 -10
  62. data/app/views/cms/email_messages/show.html.erb +2 -2
  63. data/app/views/cms/file_blocks/_form.html.erb +4 -4
  64. data/app/views/cms/form_builder/_cms_fancy_drop_down.html.erb +2 -2
  65. data/app/views/cms/form_builder/_cms_file_field.html.erb +2 -2
  66. data/app/views/cms/form_builder/_cms_tag_list.html.erb +2 -2
  67. data/app/views/cms/form_builder/_cms_text_editor.html.erb +2 -2
  68. data/app/views/cms/groups/_form.html.erb +5 -5
  69. data/app/views/cms/groups/_permissions.html.erb +4 -4
  70. data/app/views/cms/groups/_sections.html.erb +1 -2
  71. data/app/views/cms/groups/index.html.erb +1 -1
  72. data/app/views/cms/html_blocks/render.html.erb +1 -1
  73. data/app/views/cms/image_blocks/_form.html.erb +4 -5
  74. data/app/views/cms/links/_form.html.erb +1 -1
  75. data/app/views/cms/links/edit.html.erb +2 -2
  76. data/app/views/cms/links/new.html.erb +2 -2
  77. data/app/views/cms/page_routes/_form.html.erb +2 -2
  78. data/app/views/cms/page_routes/index.html.erb +6 -9
  79. data/app/views/cms/page_routes/show.html.erb +5 -8
  80. data/app/views/cms/pages/_edit_connector.html.erb +1 -1
  81. data/app/views/cms/pages/_form.html.erb +3 -3
  82. data/app/views/cms/pages/edit.html.erb +2 -2
  83. data/app/views/cms/pages/new.html.erb +7 -7
  84. data/app/views/cms/pages/versions.html.erb +4 -4
  85. data/app/views/cms/redirects/_form.html.erb +2 -2
  86. data/app/views/cms/redirects/index.html.erb +8 -7
  87. data/app/views/cms/routes/index.html.erb +2 -2
  88. data/app/views/cms/section_nodes/_link.html.erb +3 -6
  89. data/app/views/cms/section_nodes/_node.html.erb +4 -13
  90. data/app/views/cms/section_nodes/_page.html.erb +7 -13
  91. data/app/views/cms/section_nodes/_section.html.erb +8 -24
  92. data/app/views/cms/section_nodes/_section_node.html.erb +10 -0
  93. data/app/views/cms/section_nodes/index.html.erb +18 -30
  94. data/app/views/cms/sections/_form.html.erb +4 -6
  95. data/app/views/cms/sections/edit.html.erb +2 -2
  96. data/app/views/cms/sections/index.html.erb +3 -3
  97. data/app/views/cms/sections/new.html.erb +3 -3
  98. data/app/views/cms/sessions/new.html.erb +3 -3
  99. data/app/views/cms/shared/_pagination.html.erb +1 -1
  100. data/app/views/cms/shared/error.html.erb +1 -1
  101. data/app/views/cms/tags/render.html.erb +2 -2
  102. data/app/views/cms/tasks/new.html.erb +4 -4
  103. data/app/views/cms/users/_form.html.erb +3 -3
  104. data/app/views/cms/users/_toolbar.html.erb +3 -3
  105. data/app/views/cms/users/change_password.html.erb +5 -5
  106. data/app/views/cms/users/edit.html.erb +2 -2
  107. data/app/views/cms/users/index.html.erb +4 -4
  108. data/app/views/cms/users/new.html.erb +2 -2
  109. data/app/views/cms/users/show.html.erb +16 -16
  110. data/app/views/layouts/_cms_toolbar.html.erb +5 -5
  111. data/app/views/layouts/_page_toolbar.html.erb +11 -11
  112. data/app/views/layouts/cms/_footer.erb +1 -1
  113. data/app/views/layouts/cms/_head.html.erb +2 -6
  114. data/app/views/layouts/cms/administration.html.erb +32 -32
  115. data/app/views/layouts/cms/content_library.html.erb +5 -5
  116. data/app/views/layouts/cms/toolbar.html.erb +1 -1
  117. data/app/views/portlets/email_page/render.html.erb +2 -2
  118. data/app/views/portlets/forgot_password/render.html.erb +1 -1
  119. data/app/views/portlets/login/render.html.erb +4 -2
  120. data/app/views/portlets/reset_password/render.html.erb +1 -1
  121. data/app/views/tests/pretend/open_with_layout.html.erb +1 -1
  122. data/bin/bcms +0 -0
  123. data/bin/bcms-upgrade +232 -0
  124. data/bin/browsercms +2 -2
  125. data/browsercms.gemspec +16 -14
  126. data/db/migrate/20100705083859_browsercms_3_3_0.rb +56 -0
  127. data/db/seeds.rb +58 -0
  128. data/doc/guides/html/authentication.html +448 -192
  129. data/doc/guides/html/build_it_yourself.html +454 -175
  130. data/doc/guides/html/building_modules.html +451 -220
  131. data/doc/guides/html/building_templates.html +448 -498
  132. data/doc/guides/html/content_blocks.html +450 -470
  133. data/doc/guides/html/customizing_browsercms.html +453 -169
  134. data/doc/guides/html/deployment_guide.html +443 -82
  135. data/doc/guides/html/files/bcmsorg.js +28 -0
  136. data/doc/guides/html/files/clearfix.css +8 -0
  137. data/doc/guides/html/files/cufon.js +7 -0
  138. data/doc/guides/html/files/global.css +190 -0
  139. data/doc/guides/html/files/helvetica.js +91 -0
  140. data/doc/guides/html/files/jquery.js +11 -0
  141. data/doc/guides/html/getting_started.html +454 -213
  142. data/doc/guides/html/index.html +454 -174
  143. data/doc/guides/html/installing_modules.html +454 -186
  144. data/doc/guides/html/portlets.html +451 -232
  145. data/doc/guides/html/user_guide.html +452 -270
  146. data/doc/guides/html/writing_guides.html +454 -161
  147. data/lib/acts_as_list.rb +1 -1
  148. data/lib/browsercms.rb +10 -6
  149. data/lib/cms/acts.rb +7 -0
  150. data/lib/cms/authentication.rb +4 -0
  151. data/lib/cms/authentication/controller.rb +1 -1
  152. data/lib/cms/behaviors.rb +1 -1
  153. data/lib/cms/behaviors/archiving.rb +2 -2
  154. data/lib/cms/behaviors/attaching.rb +28 -43
  155. data/lib/cms/behaviors/categorizing.rb +1 -1
  156. data/lib/cms/behaviors/connecting.rb +27 -12
  157. data/lib/cms/behaviors/dynamic_attributes.rb +8 -5
  158. data/lib/cms/behaviors/hiding.rb +2 -2
  159. data/lib/cms/behaviors/publishing.rb +32 -22
  160. data/lib/cms/behaviors/rendering.rb +41 -18
  161. data/lib/cms/behaviors/searching.rb +1 -1
  162. data/lib/cms/behaviors/soft_deleting.rb +58 -29
  163. data/lib/cms/behaviors/taggable.rb +1 -1
  164. data/lib/cms/behaviors/userstamping.rb +5 -4
  165. data/lib/cms/behaviors/versioning.rb +192 -111
  166. data/lib/cms/content_rendering_support.rb +3 -3
  167. data/lib/cms/date_picker.rb +23 -0
  168. data/lib/cms/engine.rb +46 -0
  169. data/lib/cms/extensions.rb +1 -1
  170. data/lib/cms/extensions/active_record/errors.rb +2 -2
  171. data/lib/cms/extensions/hash.rb +4 -2
  172. data/lib/cms/extensions/string.rb +7 -2
  173. data/lib/cms/init.rb +32 -21
  174. data/lib/cms/module.rb +22 -0
  175. data/lib/cms/module_installation.rb +38 -0
  176. data/lib/cms/routes.rb +127 -115
  177. data/lib/cms/version.rb +2 -2
  178. data/lib/generators/browser_cms.rb +12 -0
  179. data/lib/generators/browser_cms/cms/USAGE +2 -0
  180. data/lib/generators/browser_cms/cms/cms_generator.rb +36 -0
  181. data/{rails_generators/browser_cms → lib/generators/browser_cms/cms}/templates/README +0 -0
  182. data/{rails_generators/browser_cms_demo_site → lib/generators/browser_cms/demo_site}/USAGE +0 -0
  183. data/lib/generators/browser_cms/demo_site/demo_site_generator.rb +138 -0
  184. data/lib/generators/browser_cms/demo_site/templates/demo_site.rake +11 -0
  185. data/{rails_generators/browser_cms_demo_site/templates/migration.rb → lib/generators/browser_cms/demo_site/templates/migration.erb} +2 -8
  186. data/lib/generators/cms/content_block/USAGE +22 -0
  187. data/lib/generators/cms/content_block/content_block_generator.rb +55 -0
  188. data/{rails_generators → lib/generators/cms}/content_block/templates/_form.html.erb +0 -0
  189. data/{rails_generators → lib/generators/cms}/content_block/templates/content_block.rb +0 -0
  190. data/{rails_generators → lib/generators/cms}/content_block/templates/controller.rb +0 -0
  191. data/{rails_generators → lib/generators/cms}/content_block/templates/functional_test.erb +0 -0
  192. data/{rails_generators/content_block/templates/migration.rb → lib/generators/cms/content_block/templates/migration.erb} +1 -1
  193. data/{rails_generators → lib/generators/cms}/content_block/templates/render.html.erb +0 -0
  194. data/{rails_generators → lib/generators/cms}/content_block/templates/unit_test.erb +0 -0
  195. data/lib/generators/cms/install/USAGE +8 -0
  196. data/lib/generators/cms/install/install_generator.rb +20 -0
  197. data/{rails_generators → lib/generators/cms}/portlet/USAGE +3 -16
  198. data/lib/generators/cms/portlet/portlet_generator.rb +38 -0
  199. data/{rails_generators → lib/generators/cms}/portlet/templates/_form.html.erb +0 -0
  200. data/{rails_generators → lib/generators/cms}/portlet/templates/portlet.rb +0 -0
  201. data/{rails_generators → lib/generators/cms}/portlet/templates/portlet_helper.rb +0 -0
  202. data/{rails_generators → lib/generators/cms}/portlet/templates/render.html.erb +0 -0
  203. data/{rails_generators → lib/generators/cms}/portlet/templates/unit_test.erb +0 -0
  204. data/{rails_generators → lib/generators/cms}/template/USAGE +1 -1
  205. data/lib/generators/cms/template/template_generator.rb +18 -0
  206. data/lib/generators/cms/template/templates/template.erb +2 -0
  207. data/lib/generators/cms/upgrade_module/README.txt +3 -0
  208. data/lib/generators/cms/upgrade_module/templates/20100705083859_browsercms_3_3_0.rb +56 -0
  209. data/lib/generators/cms/upgrade_module/templates/README +1 -0
  210. data/lib/generators/cms/upgrade_module/templates/USAGE.erb +10 -0
  211. data/lib/generators/cms/upgrade_module/templates/build_gem.rake +5 -0
  212. data/lib/generators/cms/upgrade_module/templates/engine.erb +7 -0
  213. data/lib/generators/cms/upgrade_module/templates/gemspec.erb +25 -0
  214. data/lib/generators/cms/upgrade_module/templates/gitignore.erb +11 -0
  215. data/lib/generators/cms/upgrade_module/templates/install.erb +9 -0
  216. data/lib/generators/cms/upgrade_module/templates/module_file.erb +3 -0
  217. data/lib/generators/cms/upgrade_module/templates/routes.erb +7 -0
  218. data/lib/generators/cms/upgrade_module/upgrade_module_generator.rb +61 -0
  219. data/lib/tasks/build_gem.rake +1 -0
  220. data/lib/tasks/cms.rake +34 -6
  221. data/lib/tasks/cucumber.rake +53 -0
  222. data/lib/tasks/db.rake +2 -2
  223. data/public/javascripts/cms/application.js +144 -135
  224. data/public/javascripts/cms/sitemap.js +383 -357
  225. data/public/javascripts/jquery-ui.js +782 -591
  226. data/public/javascripts/jquery.cookie.js +38 -43
  227. data/public/javascripts/jquery.js +13 -8
  228. data/public/javascripts/jquery.taglist.js +7 -0
  229. data/public/stylesheets/cms/date_picker.css +49 -40
  230. data/rails/init.rb +2 -3
  231. data/templates/blank.rb +13 -7
  232. data/templates/demo.rb +15 -7
  233. data/templates/module.rb +12 -75
  234. metadata +87 -407
  235. data/app/helpers/cms/content_block_helper.rb +0 -27
  236. data/app/views/layouts/cms/thickbox.html.erb +0 -24
  237. data/db/migrate/20120117144039_browsercms315.rb +0 -94
  238. data/db/migrate/20121114172307_load_seeds.rb +0 -70
  239. data/lib/cms/addressable.rb +0 -83
  240. data/lib/cms/error_pages.rb +0 -8
  241. data/public/images/cms/thickbox/loadingAnimation.gif +0 -0
  242. data/public/images/cms/thickbox/macFFBgHack.png +0 -0
  243. data/public/javascripts/jquery.contextMenu.js +0 -211
  244. data/public/javascripts/jquery.dimensions.js +0 -119
  245. data/public/javascripts/jquery.thickbox.js +0 -10
  246. data/public/stylesheets/cms/jquery.contextMenu.css +0 -61
  247. data/public/stylesheets/cms/thickbox.css +0 -163
  248. data/rails_generators/browser_cms/USAGE +0 -2
  249. data/rails_generators/browser_cms/browser_cms_generator.rb +0 -35
  250. data/rails_generators/browser_cms_demo_site/browser_cms_demo_site_generator.rb +0 -63
  251. data/rails_generators/content_block/USAGE +0 -32
  252. data/rails_generators/content_block/content_block_generator.rb +0 -69
  253. data/rails_generators/portlet/portlet_generator.rb +0 -35
  254. data/rails_generators/template/template_generator.rb +0 -18
  255. data/rails_generators/template/templates/template.erb +0 -3
  256. data/test/custom_assertions.rb +0 -74
  257. data/test/factories.rb +0 -111
  258. data/test/factories/sitemap_factories.rb +0 -28
  259. data/test/fixtures/connectors.yml +0 -97
  260. data/test/fixtures/content_type_groups.yml +0 -13
  261. data/test/fixtures/content_types.yml +0 -50
  262. data/test/fixtures/dynamic_view_versions.yml +0 -26
  263. data/test/fixtures/dynamic_views.yml +0 -26
  264. data/test/fixtures/group_permissions.yml +0 -16
  265. data/test/fixtures/group_sections.yml +0 -31
  266. data/test/fixtures/group_type_permissions.yml +0 -11
  267. data/test/fixtures/group_types.yml +0 -25
  268. data/test/fixtures/groups.yml +0 -25
  269. data/test/fixtures/html_block_versions.yml +0 -67
  270. data/test/fixtures/html_blocks.yml +0 -63
  271. data/test/fixtures/page_versions.yml +0 -265
  272. data/test/fixtures/pages.yml +0 -85
  273. data/test/fixtures/permissions.yml +0 -28
  274. data/test/fixtures/section_nodes.yml +0 -46
  275. data/test/fixtures/sections.yml +0 -19
  276. data/test/fixtures/sites.yml +0 -9
  277. data/test/fixtures/user_group_memberships.yml +0 -11
  278. data/test/fixtures/users.yml +0 -15
  279. data/test/functional/cms/cache_controller_test.rb +0 -14
  280. data/test/functional/cms/categories_controller_test.rb +0 -25
  281. data/test/functional/cms/connectors_controller_test.rb +0 -60
  282. data/test/functional/cms/content_block_controller_test.rb +0 -120
  283. data/test/functional/cms/content_controller_test.rb +0 -439
  284. data/test/functional/cms/content_types_controller_test.rb +0 -18
  285. data/test/functional/cms/dashboard_controller_test.rb +0 -16
  286. data/test/functional/cms/dynamic_views_controller_test.rb +0 -52
  287. data/test/functional/cms/file_blocks_controller_test.rb +0 -52
  288. data/test/functional/cms/groups_controller_test.rb +0 -50
  289. data/test/functional/cms/home_controller_test.rb +0 -156
  290. data/test/functional/cms/html_blocks_controller_test.rb +0 -164
  291. data/test/functional/cms/image_blocks_controller_test.rb +0 -82
  292. data/test/functional/cms/links_controller_test.rb +0 -148
  293. data/test/functional/cms/pages_controller_test.rb +0 -227
  294. data/test/functional/cms/portlets_controller_test.rb +0 -67
  295. data/test/functional/cms/section_nodes_controller_test.rb +0 -112
  296. data/test/functional/cms/sections_controller_test.rb +0 -227
  297. data/test/functional/cms/sessions_controller_test.rb +0 -76
  298. data/test/functional/cms/toolbar_controller_test.rb +0 -64
  299. data/test/functional/cms/users_controller_test.rb +0 -231
  300. data/test/functional/tests/pretend_controller_test.rb +0 -57
  301. data/test/integration/cms/ckeditor_test.rb +0 -30
  302. data/test/integration/cms/password_management_test.rb +0 -56
  303. data/test/integration/login_test.rb +0 -14
  304. data/test/integration/sitemap_performance_test.rb +0 -26
  305. data/test/selenium-core/Blank.html +0 -7
  306. data/test/selenium-core/InjectedRemoteRunner.html +0 -8
  307. data/test/selenium-core/RemoteRunner.html +0 -110
  308. data/test/selenium-core/SeleniumLog.html +0 -109
  309. data/test/selenium-core/TestPrompt.html +0 -145
  310. data/test/selenium-core/TestRunner-splash.html +0 -55
  311. data/test/selenium-core/TestRunner.hta +0 -176
  312. data/test/selenium-core/TestRunner.html +0 -176
  313. data/test/selenium-core/domviewer/butmin.gif +0 -0
  314. data/test/selenium-core/domviewer/butplus.gif +0 -0
  315. data/test/selenium-core/domviewer/domviewer.css +0 -298
  316. data/test/selenium-core/domviewer/domviewer.html +0 -16
  317. data/test/selenium-core/domviewer/selenium-domviewer.js +0 -205
  318. data/test/selenium-core/icons/all.png +0 -0
  319. data/test/selenium-core/icons/continue.png +0 -0
  320. data/test/selenium-core/icons/continue_disabled.png +0 -0
  321. data/test/selenium-core/icons/pause.png +0 -0
  322. data/test/selenium-core/icons/pause_disabled.png +0 -0
  323. data/test/selenium-core/icons/selected.png +0 -0
  324. data/test/selenium-core/icons/step.png +0 -0
  325. data/test/selenium-core/icons/step_disabled.png +0 -0
  326. data/test/selenium-core/iedoc-core.xml +0 -1515
  327. data/test/selenium-core/iedoc.xml +0 -1469
  328. data/test/selenium-core/lib/cssQuery/cssQuery-p.js +0 -6
  329. data/test/selenium-core/lib/cssQuery/src/cssQuery-level2.js +0 -142
  330. data/test/selenium-core/lib/cssQuery/src/cssQuery-level3.js +0 -150
  331. data/test/selenium-core/lib/cssQuery/src/cssQuery-standard.js +0 -53
  332. data/test/selenium-core/lib/cssQuery/src/cssQuery.js +0 -356
  333. data/test/selenium-core/lib/prototype.js +0 -2006
  334. data/test/selenium-core/lib/scriptaculous/builder.js +0 -101
  335. data/test/selenium-core/lib/scriptaculous/controls.js +0 -815
  336. data/test/selenium-core/lib/scriptaculous/dragdrop.js +0 -915
  337. data/test/selenium-core/lib/scriptaculous/effects.js +0 -958
  338. data/test/selenium-core/lib/scriptaculous/scriptaculous.js +0 -47
  339. data/test/selenium-core/lib/scriptaculous/slider.js +0 -283
  340. data/test/selenium-core/lib/scriptaculous/unittest.js +0 -383
  341. data/test/selenium-core/scripts/find_matching_child.js +0 -69
  342. data/test/selenium-core/scripts/htmlutils.js +0 -894
  343. data/test/selenium-core/scripts/injection.html +0 -72
  344. data/test/selenium-core/scripts/js2html.js +0 -70
  345. data/test/selenium-core/scripts/narcissus-defs.js +0 -175
  346. data/test/selenium-core/scripts/narcissus-exec.js +0 -1054
  347. data/test/selenium-core/scripts/narcissus-parse.js +0 -1003
  348. data/test/selenium-core/scripts/se2html.js +0 -63
  349. data/test/selenium-core/scripts/selenium-api.js +0 -2409
  350. data/test/selenium-core/scripts/selenium-browserbot.js +0 -2203
  351. data/test/selenium-core/scripts/selenium-browserdetect.js +0 -150
  352. data/test/selenium-core/scripts/selenium-commandhandlers.js +0 -377
  353. data/test/selenium-core/scripts/selenium-executionloop.js +0 -175
  354. data/test/selenium-core/scripts/selenium-logging.js +0 -147
  355. data/test/selenium-core/scripts/selenium-remoterunner.js +0 -571
  356. data/test/selenium-core/scripts/selenium-testrunner.js +0 -1333
  357. data/test/selenium-core/scripts/selenium-version.js +0 -5
  358. data/test/selenium-core/scripts/user-extensions.js +0 -3
  359. data/test/selenium-core/scripts/user-extensions.js.sample +0 -75
  360. data/test/selenium-core/scripts/xmlextras.js +0 -153
  361. data/test/selenium-core/selenium-logo.png +0 -0
  362. data/test/selenium-core/selenium-test.css +0 -43
  363. data/test/selenium-core/selenium.css +0 -299
  364. data/test/selenium-core/xpath/dom.js +0 -428
  365. data/test/selenium-core/xpath/misc.js +0 -252
  366. data/test/selenium-core/xpath/xpath.js +0 -2223
  367. data/test/selenium/_login_as_cmsadmin.rsel +0 -4
  368. data/test/selenium/dashboard.rsel +0 -5
  369. data/test/selenium/html_blocks.rsel +0 -4
  370. data/test/selenium/login/failed_login.rsel +0 -8
  371. data/test/selenium/login/successful_login.rsel +0 -9
  372. data/test/selenium/page_templates.rsel +0 -12
  373. data/test/selenium/pages/edit_properties.rsel +0 -5
  374. data/test/selenium/site/view_home_page.rsel +0 -4
  375. data/test/selenium/sitemap/move_page.rsel +0 -9
  376. data/test/selenium/sitemap/open_section.rsel +0 -6
  377. data/test/selenium/sitemap/select_page.rsel +0 -12
  378. data/test/selenium/sitemap/select_section.rsel +0 -17
  379. data/test/test_helper.rb +0 -193
  380. data/test/test_logging.rb +0 -67
  381. data/test/unit/behaviors/attaching_test.rb +0 -357
  382. data/test/unit/behaviors/connectable_test.rb +0 -29
  383. data/test/unit/behaviors/dynamic_attributes_test.rb +0 -38
  384. data/test/unit/behaviors/publishable_test.rb +0 -84
  385. data/test/unit/behaviors/searching_test.rb +0 -102
  386. data/test/unit/behaviors/taggable_test.rb +0 -109
  387. data/test/unit/behaviors/versioning_test.rb +0 -36
  388. data/test/unit/extensions/active_record/base_test.rb +0 -10
  389. data/test/unit/extensions/hash_test.rb +0 -17
  390. data/test/unit/extensions/integer_test.rb +0 -10
  391. data/test/unit/helpers/application_helper_test.rb +0 -77
  392. data/test/unit/helpers/form_builder_test.rb +0 -36
  393. data/test/unit/helpers/menu_helper_test.rb +0 -242
  394. data/test/unit/helpers/page_helper_test.rb +0 -67
  395. data/test/unit/helpers/path_helper_test.rb +0 -57
  396. data/test/unit/lib/acts_as_content_page_test.rb +0 -72
  397. data/test/unit/lib/cms/authentication/controller_test.rb +0 -20
  398. data/test/unit/lib/cms/sitemap_test.rb +0 -206
  399. data/test/unit/lib/cms_domain_support_test.rb +0 -43
  400. data/test/unit/lib/command_line_test.rb +0 -70
  401. data/test/unit/lib/content_block_test.rb +0 -203
  402. data/test/unit/lib/content_rendering_support_test.rb +0 -40
  403. data/test/unit/lib/generators_test.rb +0 -40
  404. data/test/unit/lib/routes_test.rb +0 -57
  405. data/test/unit/models/attachment_test.rb +0 -116
  406. data/test/unit/models/category_test.rb +0 -40
  407. data/test/unit/models/category_type_test.rb +0 -8
  408. data/test/unit/models/connector_test.rb +0 -152
  409. data/test/unit/models/content_type_test.rb +0 -56
  410. data/test/unit/models/email_page_portlet_test.rb +0 -14
  411. data/test/unit/models/file_block_test.rb +0 -230
  412. data/test/unit/models/group_test.rb +0 -13
  413. data/test/unit/models/html_block_test.rb +0 -102
  414. data/test/unit/models/link_test.rb +0 -52
  415. data/test/unit/models/page_partial_test.rb +0 -29
  416. data/test/unit/models/page_route_test.rb +0 -29
  417. data/test/unit/models/page_template_test.rb +0 -40
  418. data/test/unit/models/page_test.rb +0 -792
  419. data/test/unit/models/permission_test.rb +0 -10
  420. data/test/unit/models/portlet_test.rb +0 -69
  421. data/test/unit/models/sections_test.rb +0 -264
  422. data/test/unit/models/site_test.rb +0 -50
  423. data/test/unit/models/task_test.rb +0 -141
  424. data/test/unit/models/user_test.rb +0 -352
  425. data/test/unit/schema_statements_test.rb +0 -41
@@ -1,47 +0,0 @@
1
- // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
2
- //
3
- // Permission is hereby granted, free of charge, to any person obtaining
4
- // a copy of this software and associated documentation files (the
5
- // "Software"), to deal in the Software without restriction, including
6
- // without limitation the rights to use, copy, modify, merge, publish,
7
- // distribute, sublicense, and/or sell copies of the Software, and to
8
- // permit persons to whom the Software is furnished to do so, subject to
9
- // the following conditions:
10
- //
11
- // The above copyright notice and this permission notice shall be
12
- // included in all copies or substantial portions of the Software.
13
- //
14
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21
-
22
- var Scriptaculous = {
23
- Version: '1.6.1',
24
- require: function(libraryName) {
25
- // inserting via DOM fails in Safari 2.0, so brute force approach
26
- document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
27
- },
28
- load: function() {
29
- if((typeof Prototype=='undefined') ||
30
- (typeof Element == 'undefined') ||
31
- (typeof Element.Methods=='undefined') ||
32
- parseFloat(Prototype.Version.split(".")[0] + "." +
33
- Prototype.Version.split(".")[1]) < 1.5)
34
- throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
35
-
36
- $A(document.getElementsByTagName("script")).findAll( function(s) {
37
- return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
38
- }).each( function(s) {
39
- var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
40
- var includes = s.src.match(/\?.*load=([a-z,]*)/);
41
- (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
42
- function(include) { Scriptaculous.require(path+include+'.js') });
43
- });
44
- }
45
- }
46
-
47
- Scriptaculous.load();
@@ -1,283 +0,0 @@
1
- // Copyright (c) 2005 Marty Haught, Thomas Fuchs
2
- //
3
- // See http://script.aculo.us for more info
4
- //
5
- // Permission is hereby granted, free of charge, to any person obtaining
6
- // a copy of this software and associated documentation files (the
7
- // "Software"), to deal in the Software without restriction, including
8
- // without limitation the rights to use, copy, modify, merge, publish,
9
- // distribute, sublicense, and/or sell copies of the Software, and to
10
- // permit persons to whom the Software is furnished to do so, subject to
11
- // the following conditions:
12
- //
13
- // The above copyright notice and this permission notice shall be
14
- // included in all copies or substantial portions of the Software.
15
- //
16
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
-
24
- if(!Control) var Control = {};
25
- Control.Slider = Class.create();
26
-
27
- // options:
28
- // axis: 'vertical', or 'horizontal' (default)
29
- //
30
- // callbacks:
31
- // onChange(value)
32
- // onSlide(value)
33
- Control.Slider.prototype = {
34
- initialize: function(handle, track, options) {
35
- var slider = this;
36
-
37
- if(handle instanceof Array) {
38
- this.handles = handle.collect( function(e) { return $(e) });
39
- } else {
40
- this.handles = [$(handle)];
41
- }
42
-
43
- this.track = $(track);
44
- this.options = options || {};
45
-
46
- this.axis = this.options.axis || 'horizontal';
47
- this.increment = this.options.increment || 1;
48
- this.step = parseInt(this.options.step || '1');
49
- this.range = this.options.range || $R(0,1);
50
-
51
- this.value = 0; // assure backwards compat
52
- this.values = this.handles.map( function() { return 0 });
53
- this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
54
- this.options.startSpan = $(this.options.startSpan || null);
55
- this.options.endSpan = $(this.options.endSpan || null);
56
-
57
- this.restricted = this.options.restricted || false;
58
-
59
- this.maximum = this.options.maximum || this.range.end;
60
- this.minimum = this.options.minimum || this.range.start;
61
-
62
- // Will be used to align the handle onto the track, if necessary
63
- this.alignX = parseInt(this.options.alignX || '0');
64
- this.alignY = parseInt(this.options.alignY || '0');
65
-
66
- this.trackLength = this.maximumOffset() - this.minimumOffset();
67
- this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth;
68
-
69
- this.active = false;
70
- this.dragging = false;
71
- this.disabled = false;
72
-
73
- if(this.options.disabled) this.setDisabled();
74
-
75
- // Allowed values array
76
- this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
77
- if(this.allowedValues) {
78
- this.minimum = this.allowedValues.min();
79
- this.maximum = this.allowedValues.max();
80
- }
81
-
82
- this.eventMouseDown = this.startDrag.bindAsEventListener(this);
83
- this.eventMouseUp = this.endDrag.bindAsEventListener(this);
84
- this.eventMouseMove = this.update.bindAsEventListener(this);
85
-
86
- // Initialize handles in reverse (make sure first handle is active)
87
- this.handles.each( function(h,i) {
88
- i = slider.handles.length-1-i;
89
- slider.setValue(parseFloat(
90
- (slider.options.sliderValue instanceof Array ?
91
- slider.options.sliderValue[i] : slider.options.sliderValue) ||
92
- slider.range.start), i);
93
- Element.makePositioned(h); // fix IE
94
- Event.observe(h, "mousedown", slider.eventMouseDown);
95
- });
96
-
97
- Event.observe(this.track, "mousedown", this.eventMouseDown);
98
- Event.observe(document, "mouseup", this.eventMouseUp);
99
- Event.observe(document, "mousemove", this.eventMouseMove);
100
-
101
- this.initialized = true;
102
- },
103
- dispose: function() {
104
- var slider = this;
105
- Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
106
- Event.stopObserving(document, "mouseup", this.eventMouseUp);
107
- Event.stopObserving(document, "mousemove", this.eventMouseMove);
108
- this.handles.each( function(h) {
109
- Event.stopObserving(h, "mousedown", slider.eventMouseDown);
110
- });
111
- },
112
- setDisabled: function(){
113
- this.disabled = true;
114
- },
115
- setEnabled: function(){
116
- this.disabled = false;
117
- },
118
- getNearestValue: function(value){
119
- if(this.allowedValues){
120
- if(value >= this.allowedValues.max()) return(this.allowedValues.max());
121
- if(value <= this.allowedValues.min()) return(this.allowedValues.min());
122
-
123
- var offset = Math.abs(this.allowedValues[0] - value);
124
- var newValue = this.allowedValues[0];
125
- this.allowedValues.each( function(v) {
126
- var currentOffset = Math.abs(v - value);
127
- if(currentOffset <= offset){
128
- newValue = v;
129
- offset = currentOffset;
130
- }
131
- });
132
- return newValue;
133
- }
134
- if(value > this.range.end) return this.range.end;
135
- if(value < this.range.start) return this.range.start;
136
- return value;
137
- },
138
- setValue: function(sliderValue, handleIdx){
139
- if(!this.active) {
140
- this.activeHandle = this.handles[handleIdx];
141
- this.activeHandleIdx = handleIdx;
142
- this.updateStyles();
143
- }
144
- handleIdx = handleIdx || this.activeHandleIdx || 0;
145
- if(this.initialized && this.restricted) {
146
- if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
147
- sliderValue = this.values[handleIdx-1];
148
- if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
149
- sliderValue = this.values[handleIdx+1];
150
- }
151
- sliderValue = this.getNearestValue(sliderValue);
152
- this.values[handleIdx] = sliderValue;
153
- this.value = this.values[0]; // assure backwards compat
154
-
155
- this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
156
- this.translateToPx(sliderValue);
157
-
158
- this.drawSpans();
159
- if(!this.dragging || !this.event) this.updateFinished();
160
- },
161
- setValueBy: function(delta, handleIdx) {
162
- this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
163
- handleIdx || this.activeHandleIdx || 0);
164
- },
165
- translateToPx: function(value) {
166
- return Math.round(
167
- ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
168
- (value - this.range.start)) + "px";
169
- },
170
- translateToValue: function(offset) {
171
- return ((offset/(this.trackLength-this.handleLength) *
172
- (this.range.end-this.range.start)) + this.range.start);
173
- },
174
- getRange: function(range) {
175
- var v = this.values.sortBy(Prototype.K);
176
- range = range || 0;
177
- return $R(v[range],v[range+1]);
178
- },
179
- minimumOffset: function(){
180
- return(this.isVertical() ? this.alignY : this.alignX);
181
- },
182
- maximumOffset: function(){
183
- return(this.isVertical() ?
184
- this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX);
185
- },
186
- isVertical: function(){
187
- return (this.axis == 'vertical');
188
- },
189
- drawSpans: function() {
190
- var slider = this;
191
- if(this.spans)
192
- $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
193
- if(this.options.startSpan)
194
- this.setSpan(this.options.startSpan,
195
- $R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
196
- if(this.options.endSpan)
197
- this.setSpan(this.options.endSpan,
198
- $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
199
- },
200
- setSpan: function(span, range) {
201
- if(this.isVertical()) {
202
- span.style.top = this.translateToPx(range.start);
203
- span.style.height = this.translateToPx(range.end - range.start + this.range.start);
204
- } else {
205
- span.style.left = this.translateToPx(range.start);
206
- span.style.width = this.translateToPx(range.end - range.start + this.range.start);
207
- }
208
- },
209
- updateStyles: function() {
210
- this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
211
- Element.addClassName(this.activeHandle, 'selected');
212
- },
213
- startDrag: function(event) {
214
- if(Event.isLeftClick(event)) {
215
- if(!this.disabled){
216
- this.active = true;
217
-
218
- var handle = Event.element(event);
219
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
220
- if(handle==this.track) {
221
- var offsets = Position.cumulativeOffset(this.track);
222
- this.event = event;
223
- this.setValue(this.translateToValue(
224
- (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
225
- ));
226
- var offsets = Position.cumulativeOffset(this.activeHandle);
227
- this.offsetX = (pointer[0] - offsets[0]);
228
- this.offsetY = (pointer[1] - offsets[1]);
229
- } else {
230
- // find the handle (prevents issues with Safari)
231
- while((this.handles.indexOf(handle) == -1) && handle.parentNode)
232
- handle = handle.parentNode;
233
-
234
- this.activeHandle = handle;
235
- this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
236
- this.updateStyles();
237
-
238
- var offsets = Position.cumulativeOffset(this.activeHandle);
239
- this.offsetX = (pointer[0] - offsets[0]);
240
- this.offsetY = (pointer[1] - offsets[1]);
241
- }
242
- }
243
- Event.stop(event);
244
- }
245
- },
246
- update: function(event) {
247
- if(this.active) {
248
- if(!this.dragging) this.dragging = true;
249
- this.draw(event);
250
- // fix AppleWebKit rendering
251
- if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
252
- Event.stop(event);
253
- }
254
- },
255
- draw: function(event) {
256
- var pointer = [Event.pointerX(event), Event.pointerY(event)];
257
- var offsets = Position.cumulativeOffset(this.track);
258
- pointer[0] -= this.offsetX + offsets[0];
259
- pointer[1] -= this.offsetY + offsets[1];
260
- this.event = event;
261
- this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
262
- if(this.initialized && this.options.onSlide)
263
- this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
264
- },
265
- endDrag: function(event) {
266
- if(this.active && this.dragging) {
267
- this.finishDrag(event, true);
268
- Event.stop(event);
269
- }
270
- this.active = false;
271
- this.dragging = false;
272
- },
273
- finishDrag: function(event, success) {
274
- this.active = false;
275
- this.dragging = false;
276
- this.updateFinished();
277
- },
278
- updateFinished: function() {
279
- if(this.initialized && this.options.onChange)
280
- this.options.onChange(this.values.length>1 ? this.values : this.value, this);
281
- this.event = null;
282
- }
283
- }
@@ -1,383 +0,0 @@
1
- // Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
2
- // (c) 2005 Jon Tirsen (http://www.tirsen.com)
3
- // (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/)
4
- //
5
- // Permission is hereby granted, free of charge, to any person obtaining
6
- // a copy of this software and associated documentation files (the
7
- // "Software"), to deal in the Software without restriction, including
8
- // without limitation the rights to use, copy, modify, merge, publish,
9
- // distribute, sublicense, and/or sell copies of the Software, and to
10
- // permit persons to whom the Software is furnished to do so, subject to
11
- // the following conditions:
12
- //
13
- // The above copyright notice and this permission notice shall be
14
- // included in all copies or substantial portions of the Software.
15
- //
16
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
- // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
- // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
- // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
- // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
- // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
- // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
-
24
-
25
- // experimental, Firefox-only
26
- Event.simulateMouse = function(element, eventName) {
27
- var options = Object.extend({
28
- pointerX: 0,
29
- pointerY: 0,
30
- buttons: 0
31
- }, arguments[2] || {});
32
- var oEvent = document.createEvent("MouseEvents");
33
- oEvent.initMouseEvent(eventName, true, true, document.defaultView,
34
- options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
35
- false, false, false, false, 0, $(element));
36
-
37
- if(this.mark) Element.remove(this.mark);
38
- this.mark = document.createElement('div');
39
- this.mark.appendChild(document.createTextNode(" "));
40
- document.body.appendChild(this.mark);
41
- this.mark.style.position = 'absolute';
42
- this.mark.style.top = options.pointerY + "px";
43
- this.mark.style.left = options.pointerX + "px";
44
- this.mark.style.width = "5px";
45
- this.mark.style.height = "5px;";
46
- this.mark.style.borderTop = "1px solid red;"
47
- this.mark.style.borderLeft = "1px solid red;"
48
-
49
- if(this.step)
50
- alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
51
-
52
- $(element).dispatchEvent(oEvent);
53
- };
54
-
55
- // Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
56
- // You need to downgrade to 1.0.4 for now to get this working
57
- // See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
58
- Event.simulateKey = function(element, eventName) {
59
- var options = Object.extend({
60
- ctrlKey: false,
61
- altKey: false,
62
- shiftKey: false,
63
- metaKey: false,
64
- keyCode: 0,
65
- charCode: 0
66
- }, arguments[2] || {});
67
-
68
- var oEvent = document.createEvent("KeyEvents");
69
- oEvent.initKeyEvent(eventName, true, true, window,
70
- options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
71
- options.keyCode, options.charCode );
72
- $(element).dispatchEvent(oEvent);
73
- };
74
-
75
- Event.simulateKeys = function(element, command) {
76
- for(var i=0; i<command.length; i++) {
77
- Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
78
- }
79
- };
80
-
81
- var Test = {}
82
- Test.Unit = {};
83
-
84
- // security exception workaround
85
- Test.Unit.inspect = Object.inspect;
86
-
87
- Test.Unit.Logger = Class.create();
88
- Test.Unit.Logger.prototype = {
89
- initialize: function(log) {
90
- this.log = $(log);
91
- if (this.log) {
92
- this._createLogTable();
93
- }
94
- },
95
- start: function(testName) {
96
- if (!this.log) return;
97
- this.testName = testName;
98
- this.lastLogLine = document.createElement('tr');
99
- this.statusCell = document.createElement('td');
100
- this.nameCell = document.createElement('td');
101
- this.nameCell.appendChild(document.createTextNode(testName));
102
- this.messageCell = document.createElement('td');
103
- this.lastLogLine.appendChild(this.statusCell);
104
- this.lastLogLine.appendChild(this.nameCell);
105
- this.lastLogLine.appendChild(this.messageCell);
106
- this.loglines.appendChild(this.lastLogLine);
107
- },
108
- finish: function(status, summary) {
109
- if (!this.log) return;
110
- this.lastLogLine.className = status;
111
- this.statusCell.innerHTML = status;
112
- this.messageCell.innerHTML = this._toHTML(summary);
113
- },
114
- message: function(message) {
115
- if (!this.log) return;
116
- this.messageCell.innerHTML = this._toHTML(message);
117
- },
118
- summary: function(summary) {
119
- if (!this.log) return;
120
- this.logsummary.innerHTML = this._toHTML(summary);
121
- },
122
- _createLogTable: function() {
123
- this.log.innerHTML =
124
- '<div id="logsummary"></div>' +
125
- '<table id="logtable">' +
126
- '<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
127
- '<tbody id="loglines"></tbody>' +
128
- '</table>';
129
- this.logsummary = $('logsummary')
130
- this.loglines = $('loglines');
131
- },
132
- _toHTML: function(txt) {
133
- return txt.escapeHTML().replace(/\n/g,"<br/>");
134
- }
135
- }
136
-
137
- Test.Unit.Runner = Class.create();
138
- Test.Unit.Runner.prototype = {
139
- initialize: function(testcases) {
140
- this.options = Object.extend({
141
- testLog: 'testlog'
142
- }, arguments[1] || {});
143
- this.options.resultsURL = this.parseResultsURLQueryParameter();
144
- if (this.options.testLog) {
145
- this.options.testLog = $(this.options.testLog) || null;
146
- }
147
- if(this.options.tests) {
148
- this.tests = [];
149
- for(var i = 0; i < this.options.tests.length; i++) {
150
- if(/^test/.test(this.options.tests[i])) {
151
- this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
152
- }
153
- }
154
- } else {
155
- if (this.options.test) {
156
- this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
157
- } else {
158
- this.tests = [];
159
- for(var testcase in testcases) {
160
- if(/^test/.test(testcase)) {
161
- this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases["setup"], testcases["teardown"]));
162
- }
163
- }
164
- }
165
- }
166
- this.currentTest = 0;
167
- this.logger = new Test.Unit.Logger(this.options.testLog);
168
- setTimeout(this.runTests.bind(this), 1000);
169
- },
170
- parseResultsURLQueryParameter: function() {
171
- return window.location.search.parseQuery()["resultsURL"];
172
- },
173
- // Returns:
174
- // "ERROR" if there was an error,
175
- // "FAILURE" if there was a failure, or
176
- // "SUCCESS" if there was neither
177
- getResult: function() {
178
- var hasFailure = false;
179
- for(var i=0;i<this.tests.length;i++) {
180
- if (this.tests[i].errors > 0) {
181
- return "ERROR";
182
- }
183
- if (this.tests[i].failures > 0) {
184
- hasFailure = true;
185
- }
186
- }
187
- if (hasFailure) {
188
- return "FAILURE";
189
- } else {
190
- return "SUCCESS";
191
- }
192
- },
193
- postResults: function() {
194
- if (this.options.resultsURL) {
195
- new Ajax.Request(this.options.resultsURL,
196
- { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
197
- }
198
- },
199
- runTests: function() {
200
- var test = this.tests[this.currentTest];
201
- if (!test) {
202
- // finished!
203
- this.postResults();
204
- this.logger.summary(this.summary());
205
- return;
206
- }
207
- if(!test.isWaiting) {
208
- this.logger.start(test.name);
209
- }
210
- test.run();
211
- if(test.isWaiting) {
212
- this.logger.message("Waiting for " + test.timeToWait + "ms");
213
- setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
214
- } else {
215
- this.logger.finish(test.status(), test.summary());
216
- this.currentTest++;
217
- // tail recursive, hopefully the browser will skip the stackframe
218
- this.runTests();
219
- }
220
- },
221
- summary: function() {
222
- var assertions = 0;
223
- var failures = 0;
224
- var errors = 0;
225
- var messages = [];
226
- for(var i=0;i<this.tests.length;i++) {
227
- assertions += this.tests[i].assertions;
228
- failures += this.tests[i].failures;
229
- errors += this.tests[i].errors;
230
- }
231
- return (
232
- this.tests.length + " tests, " +
233
- assertions + " assertions, " +
234
- failures + " failures, " +
235
- errors + " errors");
236
- }
237
- }
238
-
239
- Test.Unit.Assertions = Class.create();
240
- Test.Unit.Assertions.prototype = {
241
- initialize: function() {
242
- this.assertions = 0;
243
- this.failures = 0;
244
- this.errors = 0;
245
- this.messages = [];
246
- },
247
- summary: function() {
248
- return (
249
- this.assertions + " assertions, " +
250
- this.failures + " failures, " +
251
- this.errors + " errors" + "\n" +
252
- this.messages.join("\n"));
253
- },
254
- pass: function() {
255
- this.assertions++;
256
- },
257
- fail: function(message) {
258
- this.failures++;
259
- this.messages.push("Failure: " + message);
260
- },
261
- info: function(message) {
262
- this.messages.push("Info: " + message);
263
- },
264
- error: function(error) {
265
- this.errors++;
266
- this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
267
- },
268
- status: function() {
269
- if (this.failures > 0) return 'failed';
270
- if (this.errors > 0) return 'error';
271
- return 'passed';
272
- },
273
- assert: function(expression) {
274
- var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
275
- try { expression ? this.pass() :
276
- this.fail(message); }
277
- catch(e) { this.error(e); }
278
- },
279
- assertEqual: function(expected, actual) {
280
- var message = arguments[2] || "assertEqual";
281
- try { (expected == actual) ? this.pass() :
282
- this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
283
- '", actual "' + Test.Unit.inspect(actual) + '"'); }
284
- catch(e) { this.error(e); }
285
- },
286
- assertEnumEqual: function(expected, actual) {
287
- var message = arguments[2] || "assertEnumEqual";
288
- try { $A(expected).length == $A(actual).length &&
289
- expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
290
- this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
291
- ', actual ' + Test.Unit.inspect(actual)); }
292
- catch(e) { this.error(e); }
293
- },
294
- assertNotEqual: function(expected, actual) {
295
- var message = arguments[2] || "assertNotEqual";
296
- try { (expected != actual) ? this.pass() :
297
- this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
298
- catch(e) { this.error(e); }
299
- },
300
- assertNull: function(obj) {
301
- var message = arguments[1] || 'assertNull'
302
- try { (obj==null) ? this.pass() :
303
- this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
304
- catch(e) { this.error(e); }
305
- },
306
- assertHidden: function(element) {
307
- var message = arguments[1] || 'assertHidden';
308
- this.assertEqual("none", element.style.display, message);
309
- },
310
- assertNotNull: function(object) {
311
- var message = arguments[1] || 'assertNotNull';
312
- this.assert(object != null, message);
313
- },
314
- assertInstanceOf: function(expected, actual) {
315
- var message = arguments[2] || 'assertInstanceOf';
316
- try {
317
- (actual instanceof expected) ? this.pass() :
318
- this.fail(message + ": object was not an instance of the expected type"); }
319
- catch(e) { this.error(e); }
320
- },
321
- assertNotInstanceOf: function(expected, actual) {
322
- var message = arguments[2] || 'assertNotInstanceOf';
323
- try {
324
- !(actual instanceof expected) ? this.pass() :
325
- this.fail(message + ": object was an instance of the not expected type"); }
326
- catch(e) { this.error(e); }
327
- },
328
- _isVisible: function(element) {
329
- element = $(element);
330
- if(!element.parentNode) return true;
331
- this.assertNotNull(element);
332
- if(element.style && Element.getStyle(element, 'display') == 'none')
333
- return false;
334
-
335
- return this._isVisible(element.parentNode);
336
- },
337
- assertNotVisible: function(element) {
338
- this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
339
- },
340
- assertVisible: function(element) {
341
- this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
342
- },
343
- benchmark: function(operation, iterations) {
344
- var startAt = new Date();
345
- (iterations || 1).times(operation);
346
- var timeTaken = ((new Date())-startAt);
347
- this.info((arguments[2] || 'Operation') + ' finished ' +
348
- iterations + ' iterations in ' + (timeTaken/1000)+'s' );
349
- return timeTaken;
350
- }
351
- }
352
-
353
- Test.Unit.Testcase = Class.create();
354
- Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
355
- initialize: function(name, test, setup, teardown) {
356
- Test.Unit.Assertions.prototype.initialize.bind(this)();
357
- this.name = name;
358
- this.test = test || function() {};
359
- this.setup = setup || function() {};
360
- this.teardown = teardown || function() {};
361
- this.isWaiting = false;
362
- this.timeToWait = 1000;
363
- },
364
- wait: function(time, nextPart) {
365
- this.isWaiting = true;
366
- this.test = nextPart;
367
- this.timeToWait = time;
368
- },
369
- run: function() {
370
- try {
371
- try {
372
- if (!this.isWaiting) this.setup.bind(this)();
373
- this.isWaiting = false;
374
- this.test.bind(this)();
375
- } finally {
376
- if(!this.isWaiting) {
377
- this.teardown.bind(this)();
378
- }
379
- }
380
- }
381
- catch(e) { this.error(e); }
382
- }
383
- });