admin_assistant 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. data/Rakefile +2 -2
  2. data/VERSION +1 -1
  3. data/admin_assistant.gemspec +404 -8
  4. data/rails_2_test/README +256 -0
  5. data/rails_2_test/Rakefile +13 -0
  6. data/rails_2_test/app/controllers/admin/appointments2_controller.rb +15 -0
  7. data/rails_2_test/app/controllers/admin/appointments_controller.rb +11 -0
  8. data/rails_2_test/app/controllers/admin/blog_posts2_controller.rb +138 -0
  9. data/rails_2_test/app/controllers/admin/blog_posts3_controller.rb +76 -0
  10. data/rails_2_test/app/controllers/admin/blog_posts4_controller.rb +21 -0
  11. data/rails_2_test/app/controllers/admin/blog_posts5_controller.rb +27 -0
  12. data/rails_2_test/app/controllers/admin/blog_posts6_controller.rb +10 -0
  13. data/rails_2_test/app/controllers/admin/blog_posts_controller.rb +8 -0
  14. data/rails_2_test/app/controllers/admin/blog_posts_custom_new_and_edit_controller.rb +15 -0
  15. data/rails_2_test/app/controllers/admin/blog_posts_read_only_controller.rb +19 -0
  16. data/rails_2_test/app/controllers/admin/bookmarks_controller.rb +11 -0
  17. data/rails_2_test/app/controllers/admin/comments2_controller.rb +14 -0
  18. data/rails_2_test/app/controllers/admin/comments_controller.rb +12 -0
  19. data/rails_2_test/app/controllers/admin/file_column_images2_controller.rb +10 -0
  20. data/rails_2_test/app/controllers/admin/file_column_images_controller.rb +6 -0
  21. data/rails_2_test/app/controllers/admin/images2_controller.rb +11 -0
  22. data/rails_2_test/app/controllers/admin/images_controller.rb +6 -0
  23. data/rails_2_test/app/controllers/admin/misconfigured1_controller.rb +7 -0
  24. data/rails_2_test/app/controllers/admin/not_migrated_yets_controller.rb +9 -0
  25. data/rails_2_test/app/controllers/admin/product_categories2_controller.rb +7 -0
  26. data/rails_2_test/app/controllers/admin/product_categories_controller.rb +5 -0
  27. data/rails_2_test/app/controllers/admin/products2_controller.rb +15 -0
  28. data/rails_2_test/app/controllers/admin/products_controller.rb +31 -0
  29. data/rails_2_test/app/controllers/admin/television_airings_controller.rb +5 -0
  30. data/rails_2_test/app/controllers/admin/television_time_slots_controller.rb +5 -0
  31. data/rails_2_test/app/controllers/admin/users2_controller.rb +10 -0
  32. data/rails_2_test/app/controllers/admin/users_controller.rb +63 -0
  33. data/rails_2_test/app/controllers/application.rb +16 -0
  34. data/rails_2_test/app/controllers/application_controller.rb +16 -0
  35. data/rails_2_test/app/controllers/blog_posts_controller.rb +5 -0
  36. data/rails_2_test/app/helpers/admin/appointments2_helper.rb +2 -0
  37. data/rails_2_test/app/helpers/admin/appointments_helper.rb +2 -0
  38. data/rails_2_test/app/helpers/admin/blog_posts2_helper.rb +27 -0
  39. data/rails_2_test/app/helpers/admin/blog_posts3_helper.rb +2 -0
  40. data/rails_2_test/app/helpers/admin/blog_posts4_helper.rb +2 -0
  41. data/rails_2_test/app/helpers/admin/blog_posts6_helper.rb +16 -0
  42. data/rails_2_test/app/helpers/admin/blog_posts_custom_new_and_edit_helper.rb +29 -0
  43. data/rails_2_test/app/helpers/admin/blog_posts_helper.rb +2 -0
  44. data/rails_2_test/app/helpers/admin/blog_posts_read_only_helper.rb +2 -0
  45. data/rails_2_test/app/helpers/admin/bookmarks_helper.rb +2 -0
  46. data/rails_2_test/app/helpers/admin/comments2_helper.rb +2 -0
  47. data/rails_2_test/app/helpers/admin/comments_helper.rb +2 -0
  48. data/rails_2_test/app/helpers/admin/file_column_images2_helper.rb +2 -0
  49. data/rails_2_test/app/helpers/admin/file_column_images_helper.rb +2 -0
  50. data/rails_2_test/app/helpers/admin/images2_helper.rb +8 -0
  51. data/rails_2_test/app/helpers/admin/images_helper.rb +2 -0
  52. data/rails_2_test/app/helpers/admin/misconfigured1_helper.rb +2 -0
  53. data/rails_2_test/app/helpers/admin/not_migrated_yets_helper.rb +2 -0
  54. data/rails_2_test/app/helpers/admin/product_categories2_helper.rb +2 -0
  55. data/rails_2_test/app/helpers/admin/product_categories_helper.rb +2 -0
  56. data/rails_2_test/app/helpers/admin/products2_helper.rb +3 -0
  57. data/rails_2_test/app/helpers/admin/products_helper.rb +6 -0
  58. data/rails_2_test/app/helpers/admin/television_airings_helper.rb +2 -0
  59. data/rails_2_test/app/helpers/admin/television_time_slots_helper.rb +2 -0
  60. data/rails_2_test/app/helpers/admin/users2_helper.rb +2 -0
  61. data/rails_2_test/app/helpers/admin/users_helper.rb +25 -0
  62. data/rails_2_test/app/helpers/application_helper.rb +3 -0
  63. data/rails_2_test/app/helpers/blog_posts_helper.rb +2 -0
  64. data/rails_2_test/app/models/appointment.rb +5 -0
  65. data/rails_2_test/app/models/blog_post.rb +14 -0
  66. data/rails_2_test/app/models/blog_post_tag.rb +6 -0
  67. data/rails_2_test/app/models/bookmark.rb +6 -0
  68. data/rails_2_test/app/models/comment.rb +4 -0
  69. data/rails_2_test/app/models/file_column_image.rb +3 -0
  70. data/rails_2_test/app/models/image.rb +3 -0
  71. data/rails_2_test/app/models/not_migrated_yet.rb +2 -0
  72. data/rails_2_test/app/models/product.rb +7 -0
  73. data/rails_2_test/app/models/product_category.rb +9 -0
  74. data/rails_2_test/app/models/tag.rb +4 -0
  75. data/rails_2_test/app/models/television_airing.rb +3 -0
  76. data/rails_2_test/app/models/television_time_slot.rb +11 -0
  77. data/rails_2_test/app/models/user.rb +14 -0
  78. data/rails_2_test/app/views/admin/appointments/_subject_input.html.erb +2 -0
  79. data/rails_2_test/app/views/admin/appointments2/_time_input.html.erb +31 -0
  80. data/rails_2_test/app/views/admin/blog_posts2/_after_form.html.erb +5 -0
  81. data/rails_2_test/app/views/admin/blog_posts2/_after_index.html.erb +1 -0
  82. data/rails_2_test/app/views/admin/blog_posts2/_after_tags_input.html.erb +16 -0
  83. data/rails_2_test/app/views/admin/blog_posts2/_before_index.html.erb +2 -0
  84. data/rails_2_test/app/views/admin/blog_posts5/_after_index_header.html.erb +8 -0
  85. data/rails_2_test/app/views/admin/blog_posts_read_only/_body_for_show.html.erb +1 -0
  86. data/rails_2_test/app/views/admin/products/_name_input.html.erb +2 -0
  87. data/rails_2_test/app/views/admin/products/_percent_off_input.html.erb +2 -0
  88. data/rails_2_test/app/views/admin/products/_price_input.html.erb +10 -0
  89. data/rails_2_test/app/views/blog_posts/show.html.erb +13 -0
  90. data/rails_2_test/app/views/layouts/admin.html.erb +31 -0
  91. data/rails_2_test/config/boot.rb +109 -0
  92. data/rails_2_test/config/database.yml +28 -0
  93. data/rails_2_test/config/environment.rb +78 -0
  94. data/rails_2_test/config/environments/development.rb +17 -0
  95. data/rails_2_test/config/environments/production.rb +24 -0
  96. data/rails_2_test/config/environments/test.rb +24 -0
  97. data/rails_2_test/config/initializers/inflections.rb +10 -0
  98. data/rails_2_test/config/initializers/mime_types.rb +5 -0
  99. data/rails_2_test/config/initializers/new_rails_defaults.rb +17 -0
  100. data/rails_2_test/config/locales/en.yml +5 -0
  101. data/rails_2_test/config/routes.rb +43 -0
  102. data/rails_2_test/db/migrate/20090213215514_create_blog_posts.rb +12 -0
  103. data/rails_2_test/db/migrate/20090217225542_add_body_to_blog_posts.rb +9 -0
  104. data/rails_2_test/db/migrate/20090221220917_create_tags.rb +13 -0
  105. data/rails_2_test/db/migrate/20090221220947_create_blog_post_tags.rb +14 -0
  106. data/rails_2_test/db/migrate/20090222162204_add_textile_to_blog_posts.rb +9 -0
  107. data/rails_2_test/db/migrate/20090222163231_add_published_at_to_blog_posts.rb +9 -0
  108. data/rails_2_test/db/migrate/20090301191722_create_images.rb +16 -0
  109. data/rails_2_test/db/migrate/20090305165345_create_accounts.rb +14 -0
  110. data/rails_2_test/db/migrate/20090307225027_rename_accounts_to_users.rb +9 -0
  111. data/rails_2_test/db/migrate/20090307225750_add_user_id_to_blog_posts.rb +9 -0
  112. data/rails_2_test/db/migrate/20090309185114_change_blog_posts_textile.rb +9 -0
  113. data/rails_2_test/db/migrate/20090309193635_create_products.rb +14 -0
  114. data/rails_2_test/db/migrate/20090309203056_create_comments.rb +15 -0
  115. data/rails_2_test/db/migrate/20090323005947_create_file_column_images.rb +12 -0
  116. data/rails_2_test/db/migrate/20090326160049_add_birthday_to_users.rb +9 -0
  117. data/rails_2_test/db/migrate/20090326223606_add_state_to_users.rb +9 -0
  118. data/rails_2_test/db/migrate/20090503134004_add_file_column_image_to_products.rb +9 -0
  119. data/rails_2_test/db/migrate/20090617173651_create_bookmarks.rb +15 -0
  120. data/rails_2_test/db/migrate/20090624165355_add_tags_string_to_blog_post.rb +9 -0
  121. data/rails_2_test/db/migrate/20090625144313_add_avatar_fields_to_user.rb +11 -0
  122. data/rails_2_test/db/migrate/20090629202956_add_merged_into_to_blog_posts.rb +9 -0
  123. data/rails_2_test/db/migrate/20090701171857_add_force_textile_to_users.rb +9 -0
  124. data/rails_2_test/db/migrate/20090704163647_add_deleted_at_to_products.rb +9 -0
  125. data/rails_2_test/db/migrate/20090704173800_add_sale_fields_to_products.rb +13 -0
  126. data/rails_2_test/db/migrate/20090714024501_create_product_categories.rb +15 -0
  127. data/rails_2_test/db/migrate/20090819162835_add_admin_level_to_users.rb +9 -0
  128. data/rails_2_test/db/migrate/20091115134559_add_first_and_last_names_to_users.rb +11 -0
  129. data/rails_2_test/db/migrate/20091221011256_add_position_to_product_categories.rb +9 -0
  130. data/rails_2_test/db/migrate/20091222160814_create_appointments.rb +14 -0
  131. data/rails_2_test/db/migrate/20091227224547_add_user_id_to_appointments.rb +9 -0
  132. data/rails_2_test/db/migrate/20100214213359_create_television_time_slots.rb +13 -0
  133. data/rails_2_test/db/migrate/20100214213451_create_television_airings.rb +15 -0
  134. data/rails_2_test/doc/README_FOR_APP +5 -0
  135. data/rails_2_test/lib/tasks/rspec.rake +163 -0
  136. data/rails_2_test/public/404.html +30 -0
  137. data/rails_2_test/public/422.html +30 -0
  138. data/rails_2_test/public/500.html +33 -0
  139. data/rails_2_test/public/dispatch.cgi +10 -0
  140. data/rails_2_test/public/dispatch.fcgi +24 -0
  141. data/rails_2_test/public/dispatch.rb +10 -0
  142. data/rails_2_test/public/favicon.ico +0 -0
  143. data/rails_2_test/public/images/rails.png +0 -0
  144. data/rails_2_test/public/index.html +274 -0
  145. data/rails_2_test/public/javascripts/application.js +2 -0
  146. data/rails_2_test/public/javascripts/jquery-1.4.4.min.js +167 -0
  147. data/rails_2_test/public/robots.txt +5 -0
  148. data/rails_2_test/public/stylesheets/admin.css +3 -0
  149. data/rails_2_test/public/stylesheets/scaffold.css +54 -0
  150. data/rails_2_test/script/about +4 -0
  151. data/rails_2_test/script/autospec +5 -0
  152. data/rails_2_test/script/console +3 -0
  153. data/rails_2_test/script/dbconsole +3 -0
  154. data/rails_2_test/script/destroy +3 -0
  155. data/rails_2_test/script/generate +3 -0
  156. data/rails_2_test/script/performance/benchmarker +3 -0
  157. data/rails_2_test/script/performance/profiler +3 -0
  158. data/rails_2_test/script/performance/request +3 -0
  159. data/rails_2_test/script/plugin +3 -0
  160. data/rails_2_test/script/populate_tables.rb +49 -0
  161. data/rails_2_test/script/process/inspector +3 -0
  162. data/rails_2_test/script/process/reaper +3 -0
  163. data/rails_2_test/script/process/spawner +3 -0
  164. data/rails_2_test/script/runner +3 -0
  165. data/rails_2_test/script/server +3 -0
  166. data/rails_2_test/script/spec +5 -0
  167. data/rails_2_test/script/spec_server +125 -0
  168. data/rails_2_test/test/data/ruby_throated.jpg +0 -0
  169. data/rails_2_test/test/data/tweenbot.jpg +0 -0
  170. data/rails_2_test/test/fixtures/file_column_images.yml +7 -0
  171. data/rails_2_test/test/integration/admin/appointments2_integration_test.rb +79 -0
  172. data/rails_2_test/test/integration/admin/appointments_integration_test.rb +367 -0
  173. data/rails_2_test/test/integration/admin/blog_posts2_integration_test.rb +806 -0
  174. data/rails_2_test/test/integration/admin/blog_posts3_integration_test.rb +418 -0
  175. data/rails_2_test/test/integration/admin/blog_posts4_integration_test.rb +189 -0
  176. data/rails_2_test/test/integration/admin/blog_posts5_integration_test.rb +75 -0
  177. data/rails_2_test/test/integration/admin/blog_posts6_integration_test.rb +39 -0
  178. data/rails_2_test/test/integration/admin/blog_posts_custom_new_and_edit_integration_test.rb +89 -0
  179. data/rails_2_test/test/integration/admin/blog_posts_integration_test.rb +788 -0
  180. data/rails_2_test/test/integration/admin/blog_posts_read_only_integration_test.rb +69 -0
  181. data/rails_2_test/test/integration/admin/bookmarks_integration_test.rb +445 -0
  182. data/rails_2_test/test/integration/admin/comments2_integration_test.rb +52 -0
  183. data/rails_2_test/test/integration/admin/comments_integration_test.rb +50 -0
  184. data/rails_2_test/test/integration/admin/file_column_images2_integration_test.rb +19 -0
  185. data/rails_2_test/test/integration/admin/file_column_images_integration_test.rb +69 -0
  186. data/rails_2_test/test/integration/admin/images2_integration_test.rb +33 -0
  187. data/rails_2_test/test/integration/admin/images_integration_test.rb +79 -0
  188. data/rails_2_test/test/integration/admin/misconfigured1_integration_test.rb +17 -0
  189. data/rails_2_test/test/integration/admin/product_categories2_integration_test.rb +179 -0
  190. data/rails_2_test/test/integration/admin/product_categories_integration_test.rb +12 -0
  191. data/rails_2_test/test/integration/admin/products2_integration_test.rb +155 -0
  192. data/rails_2_test/test/integration/admin/products_integration_test.rb +210 -0
  193. data/rails_2_test/test/integration/admin/television_airings_integration_test.rb +25 -0
  194. data/rails_2_test/test/integration/admin/users2_integration_test.rb +48 -0
  195. data/rails_2_test/test/integration/admin/users_integration_test.rb +266 -0
  196. data/rails_2_test/test/integration/blog_posts_integration_test.rb +9 -0
  197. data/rails_2_test/test/test_helper.rb +114 -0
  198. data/rails_2_test/vendor/plugins/file_column/CHANGELOG +69 -0
  199. data/rails_2_test/vendor/plugins/file_column/README +54 -0
  200. data/rails_2_test/vendor/plugins/file_column/Rakefile +36 -0
  201. data/rails_2_test/vendor/plugins/file_column/TODO +6 -0
  202. data/rails_2_test/vendor/plugins/file_column/init.rb +13 -0
  203. data/rails_2_test/vendor/plugins/file_column/lib/file_column.rb +723 -0
  204. data/rails_2_test/vendor/plugins/file_column/lib/file_column_helper.rb +150 -0
  205. data/rails_2_test/vendor/plugins/file_column/lib/file_compat.rb +28 -0
  206. data/rails_2_test/vendor/plugins/file_column/lib/magick_file_column.rb +260 -0
  207. data/rails_2_test/vendor/plugins/file_column/lib/rails_file_column.rb +19 -0
  208. data/rails_2_test/vendor/plugins/file_column/lib/test_case.rb +124 -0
  209. data/rails_2_test/vendor/plugins/file_column/lib/validations.rb +112 -0
  210. data/rails_2_test/vendor/plugins/file_column/test/abstract_unit.rb +63 -0
  211. data/rails_2_test/vendor/plugins/file_column/test/connection.rb +17 -0
  212. data/rails_2_test/vendor/plugins/file_column/test/file_column_helper_test.rb +97 -0
  213. data/rails_2_test/vendor/plugins/file_column/test/file_column_test.rb +650 -0
  214. data/rails_2_test/vendor/plugins/file_column/test/fixtures/entry.rb +32 -0
  215. data/rails_2_test/vendor/plugins/file_column/test/fixtures/invalid-image.jpg +1 -0
  216. data/rails_2_test/vendor/plugins/file_column/test/fixtures/kerb.jpg +0 -0
  217. data/rails_2_test/vendor/plugins/file_column/test/fixtures/mysql.sql +25 -0
  218. data/rails_2_test/vendor/plugins/file_column/test/fixtures/schema.rb +10 -0
  219. data/rails_2_test/vendor/plugins/file_column/test/fixtures/skanthak.png +0 -0
  220. data/rails_2_test/vendor/plugins/file_column/test/magick_test.rb +380 -0
  221. data/rails_2_test/vendor/plugins/file_column/test/magick_view_only_test.rb +21 -0
  222. data/rails_3_test/.gitignore +4 -0
  223. data/rails_3_test/Gemfile +12 -0
  224. data/rails_3_test/Gemfile.lock +100 -0
  225. data/rails_3_test/README +256 -0
  226. data/rails_3_test/Rakefile +7 -0
  227. data/rails_3_test/app/controllers/admin/appointments2_controller.rb +15 -0
  228. data/rails_3_test/app/controllers/admin/appointments_controller.rb +11 -0
  229. data/rails_3_test/app/controllers/admin/blog_posts2_controller.rb +138 -0
  230. data/rails_3_test/app/controllers/admin/blog_posts3_controller.rb +76 -0
  231. data/rails_3_test/app/controllers/admin/blog_posts4_controller.rb +21 -0
  232. data/rails_3_test/app/controllers/admin/blog_posts5_controller.rb +27 -0
  233. data/rails_3_test/app/controllers/admin/blog_posts6_controller.rb +10 -0
  234. data/rails_3_test/app/controllers/admin/blog_posts_controller.rb +9 -0
  235. data/rails_3_test/app/controllers/admin/blog_posts_custom_new_and_edit_controller.rb +15 -0
  236. data/rails_3_test/app/controllers/admin/blog_posts_read_only_controller.rb +19 -0
  237. data/rails_3_test/app/controllers/admin/bookmarks_controller.rb +11 -0
  238. data/rails_3_test/app/controllers/admin/comments2_controller.rb +14 -0
  239. data/rails_3_test/app/controllers/admin/comments_controller.rb +12 -0
  240. data/rails_3_test/app/controllers/admin/images2_controller.rb +11 -0
  241. data/rails_3_test/app/controllers/admin/images_controller.rb +6 -0
  242. data/rails_3_test/app/controllers/admin/misconfigured1_controller.rb +7 -0
  243. data/rails_3_test/app/controllers/admin/not_migrated_yets_controller.rb +9 -0
  244. data/rails_3_test/app/controllers/admin/product_categories2_controller.rb +7 -0
  245. data/rails_3_test/app/controllers/admin/product_categories_controller.rb +5 -0
  246. data/rails_3_test/app/controllers/admin/television_airings_controller.rb +5 -0
  247. data/rails_3_test/app/controllers/admin/television_time_slots_controller.rb +5 -0
  248. data/rails_3_test/app/controllers/admin/users2_controller.rb +10 -0
  249. data/rails_3_test/app/controllers/admin/users_controller.rb +48 -0
  250. data/rails_3_test/app/controllers/application_controller.rb +7 -0
  251. data/rails_3_test/app/controllers/blog_posts_controller.rb +5 -0
  252. data/rails_3_test/app/helpers/admin/appointments_helper.rb +2 -0
  253. data/rails_3_test/app/helpers/admin/blog_posts2_helper.rb +27 -0
  254. data/rails_3_test/app/helpers/admin/blog_posts3_helper.rb +2 -0
  255. data/rails_3_test/app/helpers/admin/blog_posts4_helper.rb +2 -0
  256. data/rails_3_test/app/helpers/admin/blog_posts6_helper.rb +13 -0
  257. data/rails_3_test/app/helpers/admin/blog_posts_custom_new_and_edit_helper.rb +29 -0
  258. data/rails_3_test/app/helpers/admin/blog_posts_helper.rb +2 -0
  259. data/rails_3_test/app/helpers/admin/blog_posts_read_only_helper.rb +2 -0
  260. data/rails_3_test/app/helpers/admin/bookmarks_helper.rb +2 -0
  261. data/rails_3_test/app/helpers/admin/comments2_helper.rb +2 -0
  262. data/rails_3_test/app/helpers/admin/comments_helper.rb +2 -0
  263. data/rails_3_test/app/helpers/admin/images2_helper.rb +8 -0
  264. data/rails_3_test/app/helpers/admin/images_helper.rb +2 -0
  265. data/rails_3_test/app/helpers/admin/misconfigured1_helper.rb +2 -0
  266. data/rails_3_test/app/helpers/admin/not_migrated_yets_helper.rb +2 -0
  267. data/rails_3_test/app/helpers/admin/product_categories2_helper.rb +2 -0
  268. data/rails_3_test/app/helpers/admin/product_categories_helper.rb +2 -0
  269. data/rails_3_test/app/helpers/admin/television_airings_helper.rb +2 -0
  270. data/rails_3_test/app/helpers/admin/television_time_slots_helper.rb +2 -0
  271. data/rails_3_test/app/helpers/admin/users2_helper.rb +2 -0
  272. data/rails_3_test/app/helpers/admin/users_helper.rb +13 -0
  273. data/rails_3_test/app/helpers/application_helper.rb +2 -0
  274. data/rails_3_test/app/models/appointment.rb +5 -0
  275. data/rails_3_test/app/models/blog_post.rb +14 -0
  276. data/rails_3_test/app/models/blog_post_tag.rb +6 -0
  277. data/rails_3_test/app/models/bookmark.rb +6 -0
  278. data/rails_3_test/app/models/comment.rb +4 -0
  279. data/rails_3_test/app/models/image.rb +3 -0
  280. data/rails_3_test/app/models/not_migrated_yet.rb +2 -0
  281. data/rails_3_test/app/models/product.rb +5 -0
  282. data/rails_3_test/app/models/product_category.rb +9 -0
  283. data/rails_3_test/app/models/tag.rb +4 -0
  284. data/rails_3_test/app/models/television_airing.rb +3 -0
  285. data/rails_3_test/app/models/television_time_slot.rb +11 -0
  286. data/rails_3_test/app/models/user.rb +11 -0
  287. data/rails_3_test/app/views/admin/appointments/_subject_input.html.erb +2 -0
  288. data/rails_3_test/app/views/admin/appointments2/_time_input.html.erb +31 -0
  289. data/rails_3_test/app/views/admin/blog_posts2/_after_form.html.erb +5 -0
  290. data/rails_3_test/app/views/admin/blog_posts2/_after_index.html.erb +1 -0
  291. data/rails_3_test/app/views/admin/blog_posts2/_after_tags_input.html.erb +16 -0
  292. data/rails_3_test/app/views/admin/blog_posts2/_before_index.html.erb +2 -0
  293. data/rails_3_test/app/views/admin/blog_posts5/_after_index_header.html.erb +8 -0
  294. data/rails_3_test/app/views/admin/blog_posts_read_only/_body_for_show.html.erb +1 -0
  295. data/rails_3_test/app/views/layouts/admin.html.erb +32 -0
  296. data/rails_3_test/app/views/layouts/application.html.erb +14 -0
  297. data/rails_3_test/config/application.rb +42 -0
  298. data/rails_3_test/config/boot.rb +6 -0
  299. data/rails_3_test/config/database.yml +22 -0
  300. data/rails_3_test/config/environment.rb +5 -0
  301. data/rails_3_test/config/environments/development.rb +26 -0
  302. data/rails_3_test/config/environments/production.rb +49 -0
  303. data/rails_3_test/config/environments/test.rb +35 -0
  304. data/rails_3_test/config/initializers/backtrace_silencers.rb +7 -0
  305. data/rails_3_test/config/initializers/inflections.rb +10 -0
  306. data/rails_3_test/config/initializers/mime_types.rb +5 -0
  307. data/rails_3_test/config/initializers/secret_token.rb +7 -0
  308. data/rails_3_test/config/initializers/session_store.rb +8 -0
  309. data/rails_3_test/config/locales/en.yml +5 -0
  310. data/rails_3_test/config/routes.rb +63 -0
  311. data/rails_3_test/config.ru +4 -0
  312. data/rails_3_test/db/migrate/20090213215514_create_blog_posts.rb +12 -0
  313. data/rails_3_test/db/migrate/20090217225542_add_body_to_blog_posts.rb +9 -0
  314. data/rails_3_test/db/migrate/20090221220917_create_tags.rb +13 -0
  315. data/rails_3_test/db/migrate/20090221220947_create_blog_post_tags.rb +14 -0
  316. data/rails_3_test/db/migrate/20090222162204_add_textile_to_blog_posts.rb +9 -0
  317. data/rails_3_test/db/migrate/20090222163231_add_published_at_to_blog_posts.rb +9 -0
  318. data/rails_3_test/db/migrate/20090301191722_create_images.rb +16 -0
  319. data/rails_3_test/db/migrate/20090305165345_create_accounts.rb +14 -0
  320. data/rails_3_test/db/migrate/20090307225027_rename_accounts_to_users.rb +9 -0
  321. data/rails_3_test/db/migrate/20090307225750_add_user_id_to_blog_posts.rb +9 -0
  322. data/rails_3_test/db/migrate/20090309185114_change_blog_posts_textile.rb +9 -0
  323. data/rails_3_test/db/migrate/20090309193635_create_products.rb +14 -0
  324. data/rails_3_test/db/migrate/20090309203056_create_comments.rb +15 -0
  325. data/rails_3_test/db/migrate/20090323005947_create_file_column_images.rb +12 -0
  326. data/rails_3_test/db/migrate/20090326160049_add_birthday_to_users.rb +9 -0
  327. data/rails_3_test/db/migrate/20090326223606_add_state_to_users.rb +9 -0
  328. data/rails_3_test/db/migrate/20090503134004_add_file_column_image_to_products.rb +9 -0
  329. data/rails_3_test/db/migrate/20090617173651_create_bookmarks.rb +15 -0
  330. data/rails_3_test/db/migrate/20090624165355_add_tags_string_to_blog_post.rb +9 -0
  331. data/rails_3_test/db/migrate/20090625144313_add_avatar_fields_to_user.rb +11 -0
  332. data/rails_3_test/db/migrate/20090629202956_add_merged_into_to_blog_posts.rb +9 -0
  333. data/rails_3_test/db/migrate/20090701171857_add_force_textile_to_users.rb +9 -0
  334. data/rails_3_test/db/migrate/20090704163647_add_deleted_at_to_products.rb +9 -0
  335. data/rails_3_test/db/migrate/20090704173800_add_sale_fields_to_products.rb +13 -0
  336. data/rails_3_test/db/migrate/20090714024501_create_product_categories.rb +15 -0
  337. data/rails_3_test/db/migrate/20090819162835_add_admin_level_to_users.rb +9 -0
  338. data/rails_3_test/db/migrate/20091115134559_add_first_and_last_names_to_users.rb +11 -0
  339. data/rails_3_test/db/migrate/20091221011256_add_position_to_product_categories.rb +9 -0
  340. data/rails_3_test/db/migrate/20091222160814_create_appointments.rb +14 -0
  341. data/rails_3_test/db/migrate/20091227224547_add_user_id_to_appointments.rb +9 -0
  342. data/rails_3_test/db/migrate/20100214213359_create_television_time_slots.rb +13 -0
  343. data/rails_3_test/db/migrate/20100214213451_create_television_airings.rb +15 -0
  344. data/rails_3_test/db/migrate/20110426215702_remove_avatar_fields_from_users.rb +11 -0
  345. data/rails_3_test/db/seeds.rb +7 -0
  346. data/rails_3_test/doc/README_FOR_APP +2 -0
  347. data/rails_3_test/lib/tasks/.gitkeep +0 -0
  348. data/rails_3_test/public/404.html +26 -0
  349. data/rails_3_test/public/422.html +26 -0
  350. data/rails_3_test/public/500.html +26 -0
  351. data/rails_3_test/public/favicon.ico +0 -0
  352. data/rails_3_test/public/images/rails.png +0 -0
  353. data/rails_3_test/public/index.html +239 -0
  354. data/rails_3_test/public/javascripts/application.js +2 -0
  355. data/rails_3_test/public/javascripts/jquery-1.4.4.min.js +167 -0
  356. data/rails_3_test/public/javascripts/rails.js +191 -0
  357. data/rails_3_test/public/robots.txt +5 -0
  358. data/rails_3_test/public/stylesheets/.gitkeep +0 -0
  359. data/rails_3_test/public/stylesheets/admin.css +3 -0
  360. data/rails_3_test/public/stylesheets/scaffold.css +54 -0
  361. data/rails_3_test/script/rails +6 -0
  362. data/rails_3_test/test/data/ruby_throated.jpg +0 -0
  363. data/rails_3_test/test/data/tweenbot.jpg +0 -0
  364. data/rails_3_test/test/fixtures/placeholder.txt +0 -0
  365. data/rails_3_test/test/integration/admin/appointments2_integration_test.rb +79 -0
  366. data/rails_3_test/test/integration/admin/appointments_integration_test.rb +367 -0
  367. data/rails_3_test/test/integration/admin/blog_posts2_integration_test.rb +789 -0
  368. data/rails_3_test/test/integration/admin/blog_posts3_integration_test.rb +418 -0
  369. data/rails_3_test/test/integration/admin/blog_posts4_integration_test.rb +189 -0
  370. data/rails_3_test/test/integration/admin/blog_posts5_integration_test.rb +75 -0
  371. data/rails_3_test/test/integration/admin/blog_posts6_integration_test.rb +39 -0
  372. data/rails_3_test/test/integration/admin/blog_posts_custom_new_and_edit_integration_test.rb +89 -0
  373. data/rails_3_test/test/integration/admin/blog_posts_integration_test.rb +784 -0
  374. data/rails_3_test/test/integration/admin/blog_posts_read_only_integration_test.rb +69 -0
  375. data/rails_3_test/test/integration/admin/bookmarks_integration_test.rb +445 -0
  376. data/rails_3_test/test/integration/admin/comments2_integration_test.rb +52 -0
  377. data/rails_3_test/test/integration/admin/comments_integration_test.rb +50 -0
  378. data/rails_3_test/test/integration/admin/images2_integration_test.rb +33 -0
  379. data/rails_3_test/test/integration/admin/images_integration_test.rb +79 -0
  380. data/rails_3_test/test/integration/admin/misconfigured1_integration_test.rb +21 -0
  381. data/rails_3_test/test/integration/admin/product_categories2_integration_test.rb +179 -0
  382. data/rails_3_test/test/integration/admin/product_categories_integration_test.rb +12 -0
  383. data/rails_3_test/test/integration/admin/television_airings_integration_test.rb +25 -0
  384. data/rails_3_test/test/integration/admin/users2_integration_test.rb +48 -0
  385. data/rails_3_test/test/integration/admin/users_integration_test.rb +182 -0
  386. data/rails_3_test/test/integration/blog_posts_integration_test.rb +10 -0
  387. data/rails_3_test/test/performance/browsing_test.rb +9 -0
  388. data/rails_3_test/test/test_helper.rb +98 -0
  389. data/rails_3_test/vendor/plugins/.gitkeep +0 -0
  390. data/website/_layouts/api.html +20 -17
  391. data/website/_layouts/api1.html +42 -0
  392. data/website/_layouts/default.html +42 -18
  393. data/website/api/core.markdown +6 -3
  394. data/website/api/destroy.markdown +4 -2
  395. data/website/api/form.markdown +6 -5
  396. data/website/api/idx.markdown +8 -7
  397. data/website/api/index.markdown +9 -7
  398. data/website/api/search.markdown +5 -3
  399. data/website/api/show.markdown +4 -2
  400. data/website/community.markdown +3 -2
  401. data/website/css/main.css +83 -17
  402. data/website/design_principles.markdown +3 -8
  403. data/website/index.markdown +13 -9
  404. data/website/js/lightbox.js +2 -2
  405. data/website/quick_start.markdown +10 -10
  406. data/website/screenshots.markdown +11 -11
  407. data/website/tutorial.markdown +23 -14
  408. data/website/v1/api/core.markdown +108 -0
  409. data/website/v1/api/destroy.markdown +27 -0
  410. data/website/v1/api/form.markdown +293 -0
  411. data/website/v1/api/idx.markdown +288 -0
  412. data/website/v1/api/index.markdown +149 -0
  413. data/website/v1/api/search.markdown +110 -0
  414. data/website/v1/api/show.markdown +24 -0
  415. data/website/v1/index.markdown +10 -0
  416. data/website/v1/quick_start.markdown +48 -0
  417. data/website/v1/tutorial.markdown +60 -0
  418. metadata +407 -9
@@ -0,0 +1,788 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::BlogPostsIntegrationTest < ActionController::IntegrationTest
4
+ def setup
5
+ User.destroy_all
6
+ @user = User.create! :username => 'soren'
7
+ end
8
+
9
+ def teardown
10
+ # undoing mocking done for test_index_with_100_000_records
11
+ def BlogPost.paginate(*args)
12
+ super
13
+ end
14
+ end
15
+
16
+ def test_autocomplete_user
17
+ @bill1 = User.create! :username => 'Bill 1'
18
+ @bill2 = User.create! :username => 'Bill 2'
19
+ 1.upto(11) do |i|
20
+ User.create! :username => "Bob #{i}"
21
+ end
22
+ User.create! :username => 'Bob'
23
+
24
+ get "/admin/blog_posts/autocomplete_user?q=Jane"
25
+ results = JSON.parse(response.body)
26
+ assert results.empty?
27
+
28
+ get "/admin/blog_posts/autocomplete_user?q=Bill"
29
+ results = JSON.parse(response.body)
30
+ assert_equal(2, results.size)
31
+ assert(
32
+ results.any? { |r| r['id'] == @bill1.id.to_s && r['name'] == 'Bill 1' }
33
+ )
34
+ assert(
35
+ results.any? { |r| r['id'] == @bill2.id.to_s && r['name'] == 'Bill 2' }
36
+ )
37
+
38
+ get "/admin/blog_posts/autocomplete_user?q=Bob"
39
+ results = JSON.parse(response.body)
40
+ # should return a max of ten users
41
+ assert_equal(10, results.size)
42
+ # should make sure the shortest matches are included in the results
43
+ assert(results.any? { |r| r['name'] == 'Bob' })
44
+ end
45
+
46
+ def test_back_to_index_comes_back_to_index_sorted_by_published_at
47
+ user = User.find_or_create_by_username 'soren'
48
+ BlogPost.create! :title => random_word, :user => user
49
+ visit "/admin/blog_posts"
50
+ click_link "Published at"
51
+ click_link "New blog post"
52
+ click_link "Back to index"
53
+ assert_select 'th.asc', :text => 'Published at'
54
+ end
55
+
56
+ def test_comes_back_to_index_sorted_by_published_at_after_successful_creation
57
+ user = User.find_or_create_by_username 'soren'
58
+ BlogPost.create! :title => random_word, :user => user
59
+ visit "/admin/blog_posts"
60
+ click_link "Published at"
61
+ click_link "New blog post"
62
+ fill_in "blog_post[title]", :with => 'Funny ha ha'
63
+ select "soren", :from => "blog_post[user_id]"
64
+ click_button 'Create'
65
+ assert_select 'th.asc', :text => 'Published at'
66
+ end
67
+
68
+ def test_create_when_there_are_no_validation_errors
69
+ title = random_word
70
+ post(
71
+ "/admin/blog_posts/create",
72
+ :blog_post => {
73
+ :title => title, :textile => '1', :user_id => @user.id,
74
+ 'published_at(1i)' => '', 'published_at(2i)' => '',
75
+ 'published_at(3i)' => '', 'published_at(4i)' => '',
76
+ 'published_at(5i)' => ''
77
+ }
78
+ )
79
+ @blog_post = BlogPost.find_by_title(title)
80
+
81
+ # should create a new BlogPost
82
+ assert_not_nil(@blog_post)
83
+ assert(@blog_post.textile?)
84
+
85
+ # should not set published_at
86
+ assert_nil(@blog_post.published_at)
87
+ end
88
+
89
+ def test_create_when_there_are_validation_errors
90
+ post(
91
+ "/admin/blog_posts/create",
92
+ :blog_post => {:title => ''}, :origin => '/admin/blog_posts'
93
+ )
94
+
95
+ # should not create a new BlogPost
96
+ assert_nil(BlogPost.find_by_title(''))
97
+
98
+ # should print all the errors
99
+ assert_response :success
100
+ assert_match(/Title can't be blank/, response.body)
101
+
102
+ # should show a link back to the index page
103
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
104
+ end
105
+
106
+ def test_create_when_somebody_GETs_for_some_reason
107
+ get "/admin/blog_posts/create"
108
+
109
+ # should just redirect to #new
110
+ assert_redirected_to(:action => 'new')
111
+ end
112
+
113
+ def test_destroy
114
+ # should be an unknown action
115
+ post "/admin/blog_posts/destroy/123"
116
+ assert_response 404
117
+ end
118
+
119
+ def test_edit
120
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
121
+
122
+ get(
123
+ "/admin/blog_posts/edit/#{@blog_post.id}", {},
124
+ {:referer => '/admin/blog_posts'}
125
+ )
126
+
127
+ # should show a form
128
+ assert_match(
129
+ %r|<form action="/admin/blog_posts/update/#{@blog_post.id}".*input.*name="blog_post\[title\]"|m,
130
+ response.body
131
+ )
132
+
133
+ # should prefill the values
134
+ assert_match(%r|input.*value="#{@blog_post.title}"|, response.body)
135
+
136
+ # should show a link back to the index page
137
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
138
+ end
139
+
140
+ def test_edit_when_there_is_a_referer_value_on_the_request
141
+ # should have the origin hidden input value
142
+ blog_post = BlogPost.create! :title => random_word, :user => @user
143
+ referer_page = 'referer_page'
144
+ get(
145
+ "/admin/blog_posts/edit/#{blog_post.id}", {}, {:referer => referer_page}
146
+ )
147
+ assert_select("input#origin[value=#{referer_page}]")
148
+ end
149
+
150
+ def test_edit_when_there_are_more_than_15_users
151
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
152
+ 1.upto(16) do |i|
153
+ User.create! :username => "--user #{i}--"
154
+ end
155
+ get "/admin/blog_posts/edit/#{@blog_post.id}"
156
+
157
+ # should use the token input instead of a drop-down
158
+ assert_select("select[name=?]", "blog_post[user_id]", false)
159
+ assert_select("input[name=?][value=?]", 'blog_post[user_id]', @user.id)
160
+ assert_match(
161
+ %r|
162
+ \$\("\#blog_post_user_id"\)\.tokenInput\(
163
+ \s*"/admin/blog_posts/autocomplete_user",
164
+ .*prePopulate
165
+ .*"id":\s*#{@user.id}
166
+ |mx,
167
+ response.body
168
+ )
169
+ end
170
+
171
+ def test_edit_when_there_are_less_than_15_users
172
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
173
+ User.count.downto(14) do
174
+ user = User.find(
175
+ :first, :conditions => ['username != ?', @user.username]
176
+ )
177
+ user.destroy
178
+ end
179
+ get "/admin/blog_posts/edit/#{@blog_post.id}"
180
+
181
+ # should use a drop-down with a blank option
182
+ assert_select('select[name=?]', 'blog_post[user_id]') do
183
+ assert_select "option[value='']"
184
+ end
185
+ end
186
+
187
+ def test_index_when_there_are_no_records
188
+ BlogPost.destroy_all
189
+ get "/admin/blog_posts"
190
+ assert_response :success
191
+
192
+ # should say "No blog posts found"
193
+ assert_match(/No blog posts found/, response.body)
194
+
195
+ # should say the name of the model you're editing
196
+ assert_match(/Blog posts/, response.body)
197
+
198
+ # should have a new link
199
+ assert_select(
200
+ "a[href=/admin/blog_posts/new]", 'New blog post'
201
+ )
202
+
203
+ # should have a search form
204
+ assert_select("a#show_search_form", :text => 'Search')
205
+
206
+ # should use the admin layout
207
+ assert_match(/admin_assistant sample Rails app/, response.body)
208
+
209
+ # should use the default admin_assistant CSS
210
+ assert_select(
211
+ 'link[href^=/stylesheets/admin_assistant/default.css]'
212
+ )
213
+ end
214
+
215
+ def test_index_when_there_is_one_record
216
+ BlogPost.destroy_all
217
+ @blog_post = BlogPost.create!(
218
+ :title => "hi there", :user => @user, :textile => false
219
+ )
220
+ get "/admin/blog_posts"
221
+ assert_response :success
222
+
223
+ # should show title by default
224
+ assert_match(/hi there/, response.body)
225
+
226
+ # should say the name of the model you're editing
227
+ assert_match(/Blog posts/, response.body)
228
+
229
+ # should have a new link
230
+ assert_select(
231
+ "a[href=/admin/blog_posts/new]", 'New blog post'
232
+ )
233
+
234
+ # should have an edit link
235
+ assert_select('td.actions') do
236
+ assert_select "a[href=/admin/blog_posts/edit/#{@blog_post.id}]", 'Edit'
237
+ end
238
+
239
+ # should have a show link
240
+ assert_select(
241
+ "a[href=/admin/blog_posts/show/#{@blog_post.id}]", 'Show'
242
+ )
243
+
244
+ # should show sort links
245
+ pretty_column_names = {
246
+ 'id' => 'ID', 'title' => 'Title', 'body' => 'Body', 'user' => 'User'
247
+ }
248
+ pretty_column_names.each do |field, pretty_column_name|
249
+ assert_a_tag_with_get_args(
250
+ pretty_column_name, '/admin/blog_posts',
251
+ {:sort => field, :sort_order => 'asc'}, response.body
252
+ )
253
+ end
254
+
255
+ # should show pretty column headers
256
+ column_headers = ['ID', 'Title', 'Body', 'User']
257
+ column_headers.each do |column_header|
258
+ assert_select('th') do
259
+ assert_select 'a', column_header
260
+ end
261
+ end
262
+
263
+ # should say how many records are found
264
+ assert_select(
265
+ 'div.aa_footer', :text => '1 blog post found'
266
+ )
267
+
268
+ # should say username because that's one of our default name fields
269
+ assert_select('td', :text => 'soren')
270
+
271
+ # should make the textile field an Ajax toggle
272
+ toggle_div_id = "blog_post_#{@blog_post.id}_textile"
273
+ post_url =
274
+ "/admin/blog_posts/update/#{@blog_post.id}?" +
275
+ CGI.escape('blog_post[textile]') + "=1&amp;from=#{toggle_div_id}"
276
+ assert_select("div[id=?]", toggle_div_id) do
277
+ assert_select('a.toggle[href=?]', post_url, :text => 'false')
278
+ end
279
+
280
+ # should not show the page selector form
281
+ assert_select('.pagination') do
282
+ assert_select('form[method=get][action=/admin/blog_posts]', false)
283
+ end
284
+
285
+ # should have a tbody with the ID blog_posts_index_tbody
286
+ assert_select('tbody#blog_posts_index_tbody')
287
+
288
+ # should have a tr with the ID based on @blog_post.id
289
+ assert_select("tr[id=blog_post_#{@blog_post.id}]")
290
+
291
+ # should not show created_at or updated_at by default
292
+ assert_no_match(/Created at/, response.body)
293
+ assert_no_match(/Updated at/, response.body)
294
+ end
295
+
296
+ def test_index_when_there_is_one_record_that_somehow_has_a_nil_User
297
+ @blog_post = BlogPost.create! :title => "hi there", :user => @user
298
+ BlogPost.update_all "user_id = null"
299
+ get "/admin/blog_posts"
300
+
301
+ # should be fine with a nil User
302
+ assert_response :success
303
+ end
304
+
305
+ def test_index_when_there_are_more_than_10_pages_of_results
306
+ BlogPost.count.upto(251) do
307
+ @blog_post = BlogPost.create!(
308
+ :title => "hi there", :user => @user, :textile => false
309
+ )
310
+ end
311
+ get "/admin/blog_posts"
312
+
313
+ # should show the page selector form at the bottom
314
+ assert_select('.pagination') do
315
+ assert_select('form[method=get][action=/admin/blog_posts]') do
316
+ assert_select 'input[name=page]'
317
+ end
318
+ end
319
+ end
320
+
321
+ def test_index_sorting_when_there_are_two_records
322
+ BlogPost.destroy_all
323
+ @blog_post1 = BlogPost.create!(
324
+ :title => "title 1", :body => "body 2", :user => @user
325
+ )
326
+ @blog_post2 = BlogPost.create!(
327
+ :title => "title 2", :body => "body 1", :user => @user
328
+ )
329
+
330
+ get "/admin/blog_posts", :sort => 'title', :sort_order => 'asc'
331
+ assert_response :success
332
+
333
+ # should sort by title asc
334
+ assert_match(%r|title 1.*title 2|m, response.body)
335
+
336
+ # should show a desc sort link for title
337
+ assert_a_tag_with_get_args(
338
+ 'Title', '/admin/blog_posts',
339
+ {:sort => 'title', :sort_order => 'desc'}, response.body
340
+ )
341
+
342
+ # should show asc sort links for other fields
343
+ pretty_column_names = {'id' => 'ID', 'body' => 'Body'}
344
+ pretty_column_names.each do |field, pretty_column_name|
345
+ assert_a_tag_with_get_args(
346
+ pretty_column_name, '/admin/blog_posts',
347
+ {:sort => field, :sort_order => 'asc'}, response.body
348
+ )
349
+ end
350
+
351
+ # should use the right CSS classes in the title header
352
+ assert_select('th[class="sort asc"]') do
353
+ assert_select 'a', :text => 'Title'
354
+ end
355
+
356
+ # should have no CSS sorting classes in the header for ID
357
+ assert_select('th:not([class])') do
358
+ assert_select 'a', :text => 'ID'
359
+ end
360
+
361
+ # should mark the title cells with CSS sorting classes
362
+ assert_select('td[class="sort"]', :text => 'title 1')
363
+
364
+ get "/admin/blog_posts", :sort => 'title', :sort_order => 'desc'
365
+ assert_response :success
366
+
367
+ # should sort by title desc
368
+ assert_match(%r|title 2.*title 1|m, response.body)
369
+
370
+ # should show a no-sort link for title
371
+ assert_select("a[href=/admin/blog_posts]", 'Title')
372
+
373
+ # should show asc sort links for other fields
374
+ pretty_column_names = {'id' => 'ID', 'body' => 'Body'}
375
+ pretty_column_names.each do |field, pretty_column_name|
376
+ assert_a_tag_with_get_args(
377
+ pretty_column_name, '/admin/blog_posts',
378
+ {:sort => field, :sort_order => 'asc'}, response.body
379
+ )
380
+ end
381
+
382
+ # should use the right CSS classes in the title header
383
+ assert_select('th[class="sort desc"]') do
384
+ assert_select 'a', :text => 'Title'
385
+ end
386
+
387
+ # should have no CSS sorting classes in the header for ID
388
+ assert_select('th:not([class])') do
389
+ assert_select 'a', :text => 'ID'
390
+ end
391
+
392
+ # should mark the title cells with CSS sorting classes
393
+ assert_select('td[class="sort"]', :text => 'title 1')
394
+ end
395
+
396
+ def test_index_sorting_by_user
397
+ BlogPost.destroy_all
398
+ jean_paul = User.create! :username => 'jean-paul'
399
+ BlogPost.create!(
400
+ :title => 'title 1', :body => 'body 1', :user => @user
401
+ )
402
+ BlogPost.create!(
403
+ :title => 'title 2', :body => 'body 2', :user => jean_paul
404
+ )
405
+
406
+ get "/admin/blog_posts", :sort => 'user', :sort_order => 'asc'
407
+ assert_response :success
408
+
409
+ # should show jean-paul's blog post before soren's
410
+ assert_match(%r|jean-paul.*soren|m, response.body)
411
+
412
+ # should use the right CSS classes in the user header
413
+ assert_select('th[class="sort asc"]') do
414
+ assert_select 'a', :text => 'User'
415
+ end
416
+
417
+ # should mark the title cells with CSS sorting classes
418
+ assert_select('td[class="sort"]', :text => 'jean-paul')
419
+
420
+ # should show a desc sort link for user
421
+ assert_a_tag_with_get_args(
422
+ 'User', '/admin/blog_posts',
423
+ {:sort => 'user', :sort_order => 'desc'}, response.body
424
+ )
425
+
426
+ get "/admin/blog_posts", :sort => 'user', :sort_order => 'desc'
427
+ assert_response :success
428
+
429
+ # should show soren's blog post before jean-paul's
430
+ assert_match(%r|soren.*jean-paul|m, response.body)
431
+ end
432
+
433
+ def test_index_search_when_there_are_no_records
434
+ BlogPost.destroy_all
435
+ get "/admin/blog_posts", :search => 'foo'
436
+ assert_response :success
437
+
438
+ # should say 'No blog posts found'
439
+ assert_match(/No blog posts found/, response.body)
440
+
441
+ # should display the search with the terms
442
+ assert_select("form#search_form");
443
+ assert_match(
444
+ %r|<script.*\$\('#show_search_form'\).click\(\);|m,
445
+ response.body
446
+ )
447
+ assert_match(%r|input.*value="foo"|, response.body)
448
+
449
+ # should show a link back to the index page
450
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
451
+ end
452
+
453
+ def test_index_search_when_there_are_no_records_that_match
454
+ BlogPost.destroy_all
455
+ BlogPost.create!(
456
+ :title => 'no match', :body => 'no match', :user => @user
457
+ )
458
+ get "/admin/blog_posts", :search => 'foo'
459
+ assert_response :success
460
+
461
+ # should say 'No blog posts found'
462
+ assert_match(/No blog posts found/, response.body)
463
+ end
464
+
465
+ def test_index_search_when_there_is_a_blog_post_with_a_matching_title
466
+ BlogPost.destroy_all
467
+ BlogPost.create!(
468
+ :title => 'foozy', :body => 'blog post body', :user => @user
469
+ )
470
+ get "/admin/blog_posts", :search => 'foo'
471
+ assert_response :success
472
+
473
+ # should show that blog post
474
+ assert_match(/blog post body/, response.body)
475
+ end
476
+
477
+ def test_index_search_when_there_is_a_matching_body
478
+ BlogPost.destroy_all
479
+ BlogPost.create!(
480
+ :title => 'blog post title', :body => 'barfoo', :user => @user
481
+ )
482
+ get "/admin/blog_posts", :search => 'foo'
483
+ assert_response :success
484
+
485
+ # should show that blog post
486
+ assert_match(/blog post title/, response.body)
487
+
488
+ # should say how many records are found
489
+ assert_match(/1 blog post found/, response.body)
490
+ end
491
+
492
+ def test_index_pagination_with_51_records_when_looking_at_the_first_page
493
+ BlogPost.destroy_all
494
+ 1.upto(51) do |i|
495
+ BlogPost.create!(
496
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
497
+ )
498
+ end
499
+
500
+ get "/admin/blog_posts"
501
+ assert_response :success
502
+
503
+ # should have a link to the next page
504
+ assert_select(
505
+ "a[href=/admin/blog_posts?page=2]", 'Next &raquo;'
506
+ )
507
+ assert_select("a[href=/admin/blog_posts?page=2]", '2')
508
+
509
+ # should not have a link to the previous page
510
+ assert_select(
511
+ "a[href=/admin/blog_posts?page=0]", false, '&laquo; Previous'
512
+ )
513
+ assert_select("a[href=/admin/blog_posts?page=0]", false, '0')
514
+
515
+ # should the full number of posts found
516
+ assert_match(/51 blog posts found/, response.body)
517
+ end
518
+
519
+ def test_index_pagination_with_51_records_when_looking_at_the_second_page
520
+ BlogPost.destroy_all
521
+ 1.upto(51) do |i|
522
+ BlogPost.create!(
523
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
524
+ )
525
+ end
526
+
527
+ get "/admin/blog_posts", :page => '2'
528
+ assert_response :success
529
+
530
+ # should have a link to the next page
531
+ assert_select(
532
+ "a[href=/admin/blog_posts?page=3]", 'Next &raquo;'
533
+ )
534
+ assert_select("a[href=/admin/blog_posts?page=3]", '3')
535
+
536
+ # should have a link to the previous page
537
+ assert_select(
538
+ "a[href=/admin/blog_posts?page=1]", '&laquo; Previous'
539
+ )
540
+ assert_select("a[href=/admin/blog_posts?page=1]", '1')
541
+
542
+ # should the full number of posts found
543
+ assert_match(/51 blog posts found/, response.body)
544
+ end
545
+
546
+ def test_index_pagination_with_51_records_when_looking_at_the_third_page
547
+ BlogPost.destroy_all
548
+ 1.upto(51) do |i|
549
+ BlogPost.create!(
550
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
551
+ )
552
+ end
553
+
554
+ get "/admin/blog_posts", :page => '3'
555
+ assert_response :success
556
+
557
+ # should not have a link to the next page
558
+ assert_select(
559
+ "a[href=/admin/blog_posts?page=4]", false, 'Next &raquo;'
560
+ )
561
+ assert_select("a[href=/admin/blog_posts?page=3]", false, '3')
562
+
563
+ # should have a link to the previous page
564
+ assert_select(
565
+ "a[href=/admin/blog_posts?page=2]", '&laquo; Previous'
566
+ )
567
+ assert_select("a[href=/admin/blog_posts?page=2]", '2')
568
+
569
+ # should the full number of posts found
570
+ assert_match(/51 blog posts found/, response.body)
571
+ end
572
+
573
+ def test_index_with_100_000_records
574
+ BlogPost.count.upto(25) do |i|
575
+ BlogPost.create!(
576
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
577
+ )
578
+ end
579
+ def BlogPost.paginate(*args)
580
+ collection = super(*args)
581
+ collection.total_entries = 100_000
582
+ collection
583
+ end
584
+
585
+ get "/admin/blog_posts"
586
+
587
+ # should not offer a link to sort by user
588
+ assert_no_a_tag_with_get_args(
589
+ 'User', '/admin/blog_posts', {:sort => 'user', :sort_order => 'asc'},
590
+ response.body
591
+ )
592
+ end
593
+
594
+ def test_new
595
+ @alfie = User.find_or_create_by_username 'alfie'
596
+ get("/admin/blog_posts/new", {}, {:referer => '/admin/blog_posts'})
597
+
598
+ # should show a form
599
+ assert_match(
600
+ %r|<form action="/admin/blog_posts/create".*input.*name="blog_post\[title\]"|m,
601
+ response.body
602
+ )
603
+
604
+ # should use a textarea for the body field
605
+ assert_match(
606
+ %r|<textarea.*name="blog_post\[body\]".*>.*</textarea>|, response.body
607
+ )
608
+
609
+ # should show a link back to the index page
610
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
611
+
612
+ # should show pretty field names
613
+ field_names = ['Title', 'Body']
614
+ field_names.each do |field_name|
615
+ assert_select('label', field_name)
616
+ end
617
+
618
+ # should set the for attribute of the labels
619
+ field_names = ['Title', 'Body']
620
+ field_names.each do |field_name|
621
+ assert_select("label[for=blog_post_#{field_name.downcase}]")
622
+ end
623
+
624
+ # should use a checkbox for the boolean field 'textile'
625
+ assert_match(
626
+ %r!
627
+ <input[^>]*
628
+ (name="blog_post\[textile\][^>]*type="checkbox"|
629
+ type="checkbox"[^>]*name="blog_post\[textile\])
630
+ !x,
631
+ response.body
632
+ )
633
+
634
+ # should use a drop-down for the user field
635
+ assert_select("select[name=?]", "blog_post[user_id]") do
636
+ assert_select "option:nth-child(1)[value='']"
637
+ assert_select "option:nth-child(2)[value=?]", @alfie.id, :text => 'alfie'
638
+ assert_select "option:nth-child(3)[value=?]", @user.id, :text => 'soren'
639
+ end
640
+
641
+ # should set the controller path as a CSS class
642
+ assert_select("div[class~=admin_blog_posts]")
643
+
644
+ # should use dropdowns with nil defaults for published_at
645
+ nums_and_dt_fields = {
646
+ 1 => :year, 2 => :month, 3 => :day, 4 => :hour, 5 => :min
647
+ }
648
+ nums_and_dt_fields.each do |num, dt_field|
649
+ name = "blog_post[published_at(#{num}i)]"
650
+ value_for_now_option = Time.now.send(dt_field).to_s
651
+ if [:hour, :min].include?(dt_field) && value_for_now_option.size == 1
652
+ value_for_now_option = "0#{value_for_now_option}"
653
+ end
654
+ assert_select('select[name=?]', name) do
655
+ assert_select "option[value='']"
656
+ assert_select "option:not([selected])[value=?]", value_for_now_option
657
+ end
658
+ end
659
+
660
+ # should show a clear link for published_at
661
+ assert_select('a', :text => "Clear")
662
+ end
663
+
664
+ def test_new_with_a_preset_value_in_the_GET_arguments
665
+ get "/admin/blog_posts/new", :blog_post => {:user_id => @user.id.to_s}
666
+
667
+ # should set that preselected value
668
+ assert_select("select[name=?]", "blog_post[user_id]") do
669
+ assert_select "option[value=?][selected=selected]",
670
+ @user.id, :text => 'soren'
671
+ assert_select "option[value='']"
672
+ end
673
+ end
674
+
675
+ def test_new_when_there_are_more_than_15_users
676
+ User.destroy_all
677
+ 1.upto(16) do |i|
678
+ User.create! :username => "--user #{i}--"
679
+ end
680
+ get "/admin/blog_posts/new"
681
+
682
+ # should use the token input instead of a drop-down
683
+ assert_select("select[name=?]", "blog_post[user_id]", false)
684
+ assert_select("input[name=?]", 'blog_post[user_id]')
685
+ assert_match(
686
+ %r|
687
+ \$\("\#blog_post_user_id"\)\.tokenInput\(
688
+ \s*"/admin/blog_posts/autocomplete_user"
689
+ |mx,
690
+ response.body
691
+ )
692
+ end
693
+
694
+ def test_show
695
+ BlogPost.destroy_all
696
+ @blog_post = BlogPost.create!(
697
+ :title => "foo > bar & baz", :user => @user, :textile => false
698
+ )
699
+ get "/admin/blog_posts/show/#{@blog_post.id}"
700
+
701
+ # should show the HTML-escaped title
702
+ assert_match(/foo &gt; bar &amp; baz/, response.body)
703
+
704
+ # should have a link to edit
705
+ assert_select(
706
+ "a[href=/admin/blog_posts/edit/#{@blog_post.id}]", 'Edit'
707
+ )
708
+
709
+ # should show soren
710
+ assert_match(/soren/, response.body)
711
+ end
712
+
713
+ def test_update_when_there_are_no_validation_errors
714
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
715
+ title2 = random_word
716
+ post(
717
+ "/admin/blog_posts/update",
718
+ :id => @blog_post.id,
719
+ :blog_post => {
720
+ :title => title2, 'published_at(1i)' => '2009',
721
+ 'published_at(2i)' => '1', 'published_at(3i)' => '2',
722
+ 'published_at(4i)' => '3', 'published_at(5i)' => '4'
723
+ }
724
+ )
725
+ assert_redirected_to(:action => 'index')
726
+ @blog_post_prime = BlogPost.find_by_title(title2)
727
+
728
+ # should update a pre-existing BlogPost
729
+ assert_not_nil(@blog_post_prime)
730
+
731
+ # should set published_at
732
+ assert_equal(Time.utc(2009, 1, 2, 3, 4), @blog_post_prime.published_at)
733
+ end
734
+
735
+ def test_update_when_there_are_validation_errors
736
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
737
+ post(
738
+ "/admin/blog_posts/update",
739
+ :id => @blog_post.id, :blog_post => {:title => ''},
740
+ :origin => '/admin/blog_posts'
741
+ )
742
+
743
+ # should not create a new BlogPost
744
+ assert_nil(BlogPost.find_by_title(''))
745
+
746
+ # should print all the errors
747
+ assert_response :success
748
+ assert_match(/Title can't be blank/, response.body)
749
+
750
+ # should show a link back to the index page
751
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
752
+ end
753
+
754
+ def test_update_handles_the_origin_param
755
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
756
+
757
+ # should redirect to the origin when there is a origin on the form submit
758
+ origin = 'http://foo.com'
759
+ post "/admin/blog_posts/update", :id => @blog_post.id, :blog_post => {:title => 'foo'}, :origin => origin
760
+ assert_redirected_to(origin)
761
+ end
762
+
763
+ def test_update_as_Ajax_toggle
764
+ @blog_post = BlogPost.create!(
765
+ :title => random_word, :user => @user, :textile => false
766
+ )
767
+ post(
768
+ "/admin/blog_posts/update",
769
+ :id => @blog_post.id, :from => "blog_post_#{@blog_post.id}_textile",
770
+ :blog_post => {:textile => '1'}
771
+ )
772
+
773
+ # should return success
774
+ assert_response :success
775
+
776
+ # should update the textile field
777
+ assert(@blog_post.reload.textile)
778
+
779
+ # should only render a small snippet of HTML with Ajax in it
780
+ toggle_div_id = "blog_post_#{@blog_post.id}_textile"
781
+ post_url =
782
+ "/admin/blog_posts/update/#{@blog_post.id}?" +
783
+ CGI.escape('blog_post[textile]') + "=0&amp;from=#{toggle_div_id}"
784
+ assert_select('div[id=?]', toggle_div_id, false)
785
+ assert_select('a.toggle[href=?]', post_url, :text => 'true')
786
+ assert_no_match(%r|<title>Admin</title>|, response.body)
787
+ end
788
+ end