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,784 @@
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",
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",
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_destroy
107
+ # should be an unknown action
108
+ assert_raises(AbstractController::ActionNotFound) do
109
+ delete "/admin/blog_posts/123"
110
+ end
111
+ end
112
+
113
+ def test_edit
114
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
115
+
116
+ visit "/admin/blog_posts"
117
+ click_link "Edit"
118
+
119
+ # should show a form
120
+ assert_match(
121
+ %r|<form[^>]*action="/admin/blog_posts/#{@blog_post.id}".*input.*name="blog_post\[title\]"|m,
122
+ response.body
123
+ )
124
+
125
+ # should prefill the values
126
+ assert_match(%r|input.*value="#{@blog_post.title}"|, response.body)
127
+
128
+ # should show a link back to the index page
129
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
130
+ end
131
+
132
+ def test_edit_when_there_is_a_referer_value_on_the_request
133
+ # should have the origin hidden input value
134
+ blog_post = BlogPost.create! :title => random_word, :user => @user
135
+ visit "/admin/blog_posts"
136
+ click_link 'Published at'
137
+ click_link 'Edit'
138
+ assert_select(
139
+ "input#origin[value=?]",
140
+ "/admin/blog_posts?sort=published_at&amp;sort_order=asc"
141
+ )
142
+ end
143
+
144
+ def test_edit_when_there_are_more_than_15_users
145
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
146
+ 1.upto(16) do |i|
147
+ User.create! :username => "--user #{i}--"
148
+ end
149
+ get "/admin/blog_posts/#{@blog_post.id}/edit"
150
+
151
+ # should use the token input instead of a drop-down
152
+ assert_select("select[name=?]", "blog_post[user_id]", false)
153
+ assert_select("input[name=?][value=?]", 'blog_post[user_id]', @user.id)
154
+ assert_match(
155
+ %r|
156
+ \$\("\#blog_post_user_id"\)\.tokenInput\(
157
+ \s*"/admin/blog_posts/autocomplete_user",
158
+ .*prePopulate
159
+ .*"id":\s*#{@user.id}
160
+ |mx,
161
+ response.body
162
+ )
163
+ end
164
+
165
+ def test_edit_when_there_are_less_than_15_users
166
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
167
+ User.count.downto(14) do
168
+ user = User.find(
169
+ :first, :conditions => ['username != ?', @user.username]
170
+ )
171
+ user.destroy
172
+ end
173
+ get "/admin/blog_posts/#{@blog_post.id}/edit"
174
+
175
+ # should use a drop-down with a blank option
176
+ assert_select('select[name=?]', 'blog_post[user_id]') do
177
+ assert_select "option[value='']"
178
+ end
179
+ end
180
+
181
+ def test_index_when_there_are_no_records
182
+ BlogPost.destroy_all
183
+ get "/admin/blog_posts"
184
+ assert_response :success
185
+
186
+ # should say "No blog posts found"
187
+ assert_match(/No blog posts found/, response.body)
188
+
189
+ # should say the name of the model you're editing
190
+ assert_match(/Blog posts/, response.body)
191
+
192
+ # should have a new link
193
+ assert_select(
194
+ "a[href=/admin/blog_posts/new]", 'New blog post'
195
+ )
196
+
197
+ # should have a search form
198
+ assert_select("a#show_search_form", :text => 'Search')
199
+
200
+ # should use the admin layout
201
+ assert_match(/admin_assistant sample Rails app/, response.body)
202
+
203
+ # should use the default admin_assistant CSS
204
+ assert_select(
205
+ 'link[href^=/stylesheets/admin_assistant/default.css]'
206
+ )
207
+ end
208
+
209
+ def test_index_when_there_is_one_record
210
+ BlogPost.destroy_all
211
+ @blog_post = BlogPost.create!(
212
+ :title => "hi there", :user => @user, :textile => false
213
+ )
214
+ get "/admin/blog_posts"
215
+ assert_response :success
216
+
217
+ # should show title by default
218
+ assert_match(/hi there/, response.body)
219
+
220
+ # should say the name of the model you're editing
221
+ assert_match(/Blog posts/, response.body)
222
+
223
+ # should have a new link
224
+ assert_select(
225
+ "a[href=/admin/blog_posts/new]", 'New blog post'
226
+ )
227
+
228
+ # should have an edit link
229
+ assert_select('td.actions') do
230
+ assert_select "a[href=/admin/blog_posts/#{@blog_post.id}/edit]", 'Edit'
231
+ end
232
+
233
+ # should have a show link
234
+ assert_select(
235
+ "a[href=/admin/blog_posts/#{@blog_post.id}]", 'Show'
236
+ )
237
+
238
+ # should show sort links
239
+ pretty_column_names = {
240
+ 'id' => 'ID', 'title' => 'Title', 'body' => 'Body', 'user' => 'User'
241
+ }
242
+ pretty_column_names.each do |field, pretty_column_name|
243
+ assert_a_tag_with_get_args(
244
+ pretty_column_name, '/admin/blog_posts',
245
+ {:sort => field, :sort_order => 'asc'}, response.body
246
+ )
247
+ end
248
+
249
+ # should show pretty column headers
250
+ column_headers = ['ID', 'Title', 'Body', 'User']
251
+ column_headers.each do |column_header|
252
+ assert_select('th') do
253
+ assert_select 'a', column_header
254
+ end
255
+ end
256
+
257
+ # should say how many records are found
258
+ assert_select(
259
+ 'div.aa_footer', :text => '1 blog post found'
260
+ )
261
+
262
+ # should say username because that's one of our default name fields
263
+ assert_select('td', :text => 'soren')
264
+
265
+ # should make the textile field an Ajax toggle
266
+ toggle_div_id = "blog_post_#{@blog_post.id}_textile"
267
+ post_url =
268
+ "/admin/blog_posts/#{@blog_post.id}?" +
269
+ 'blog_post[textile]' + "=1&amp;from=#{toggle_div_id}"
270
+ assert_select("div[id=?]", toggle_div_id) do
271
+ assert_select('a.toggle[href=?]', post_url, :text => 'false')
272
+ end
273
+
274
+ # should not show the page selector form
275
+ assert_select('.pagination') do
276
+ assert_select('form[method=get][action=/admin/blog_posts]', false)
277
+ end
278
+
279
+ # should have a tbody with the ID blog_posts_index_tbody
280
+ assert_select('tbody#blog_posts_index_tbody')
281
+
282
+ # should have a tr with the ID based on @blog_post.id
283
+ assert_select("tr[id=blog_post_#{@blog_post.id}]")
284
+
285
+ # should not show created_at or updated_at by default
286
+ assert_no_match(/Created at/, response.body)
287
+ assert_no_match(/Updated at/, response.body)
288
+ end
289
+
290
+ def test_index_when_there_is_one_record_that_somehow_has_a_nil_User
291
+ @blog_post = BlogPost.create! :title => "hi there", :user => @user
292
+ BlogPost.update_all "user_id = null"
293
+ get "/admin/blog_posts"
294
+
295
+ # should be fine with a nil User
296
+ assert_response :success
297
+ end
298
+
299
+ def test_index_when_there_are_more_than_10_pages_of_results
300
+ BlogPost.count.upto(251) do
301
+ @blog_post = BlogPost.create!(
302
+ :title => "hi there", :user => @user, :textile => false
303
+ )
304
+ end
305
+ get "/admin/blog_posts"
306
+
307
+ # should show the page selector form at the bottom
308
+ assert_select('.pagination') do
309
+ assert_select('form[method=get][action=/admin/blog_posts]') do
310
+ assert_select 'input[name=page]'
311
+ end
312
+ end
313
+ end
314
+
315
+ def test_index_sorting_when_there_are_two_records
316
+ BlogPost.destroy_all
317
+ @blog_post1 = BlogPost.create!(
318
+ :title => "title 1", :body => "body 2", :user => @user
319
+ )
320
+ @blog_post2 = BlogPost.create!(
321
+ :title => "title 2", :body => "body 1", :user => @user
322
+ )
323
+
324
+ get "/admin/blog_posts", :sort => 'title', :sort_order => 'asc'
325
+ assert_response :success
326
+
327
+ # should sort by title asc
328
+ assert_match(%r|title 1.*title 2|m, response.body)
329
+
330
+ # should show a desc sort link for title
331
+ assert_a_tag_with_get_args(
332
+ 'Title', '/admin/blog_posts',
333
+ {:sort => 'title', :sort_order => 'desc'}, response.body
334
+ )
335
+
336
+ # should show asc sort links for other fields
337
+ pretty_column_names = {'id' => 'ID', 'body' => 'Body'}
338
+ pretty_column_names.each do |field, pretty_column_name|
339
+ assert_a_tag_with_get_args(
340
+ pretty_column_name, '/admin/blog_posts',
341
+ {:sort => field, :sort_order => 'asc'}, response.body
342
+ )
343
+ end
344
+
345
+ # should use the right CSS classes in the title header
346
+ assert_select('th[class="sort asc"]') do
347
+ assert_select 'a', :text => 'Title'
348
+ end
349
+
350
+ # should have no CSS sorting classes in the header for ID
351
+ assert_select('th:not([class])') do
352
+ assert_select 'a', :text => 'ID'
353
+ end
354
+
355
+ # should mark the title cells with CSS sorting classes
356
+ assert_select('td[class="sort"]', :text => 'title 1')
357
+
358
+ get "/admin/blog_posts", :sort => 'title', :sort_order => 'desc'
359
+ assert_response :success
360
+
361
+ # should sort by title desc
362
+ assert_match(%r|title 2.*title 1|m, response.body)
363
+
364
+ # should show a no-sort link for title
365
+ assert_select("a[href=/admin/blog_posts]", 'Title')
366
+
367
+ # should show asc sort links for other fields
368
+ pretty_column_names = {'id' => 'ID', 'body' => 'Body'}
369
+ pretty_column_names.each do |field, pretty_column_name|
370
+ assert_a_tag_with_get_args(
371
+ pretty_column_name, '/admin/blog_posts',
372
+ {:sort => field, :sort_order => 'asc'}, response.body
373
+ )
374
+ end
375
+
376
+ # should use the right CSS classes in the title header
377
+ assert_select('th[class="sort desc"]') do
378
+ assert_select 'a', :text => 'Title'
379
+ end
380
+
381
+ # should have no CSS sorting classes in the header for ID
382
+ assert_select('th:not([class])') do
383
+ assert_select 'a', :text => 'ID'
384
+ end
385
+
386
+ # should mark the title cells with CSS sorting classes
387
+ assert_select('td[class="sort"]', :text => 'title 1')
388
+ end
389
+
390
+ def test_index_sorting_by_user
391
+ BlogPost.destroy_all
392
+ jean_paul = User.create! :username => 'jean-paul'
393
+ BlogPost.create!(
394
+ :title => 'title 1', :body => 'body 1', :user => @user
395
+ )
396
+ BlogPost.create!(
397
+ :title => 'title 2', :body => 'body 2', :user => jean_paul
398
+ )
399
+
400
+ get "/admin/blog_posts", :sort => 'user', :sort_order => 'asc'
401
+ assert_response :success
402
+
403
+ # should show jean-paul's blog post before soren's
404
+ assert_match(%r|jean-paul.*soren|m, response.body)
405
+
406
+ # should use the right CSS classes in the user header
407
+ assert_select('th[class="sort asc"]') do
408
+ assert_select 'a', :text => 'User'
409
+ end
410
+
411
+ # should mark the title cells with CSS sorting classes
412
+ assert_select('td[class="sort"]', :text => 'jean-paul')
413
+
414
+ # should show a desc sort link for user
415
+ assert_a_tag_with_get_args(
416
+ 'User', '/admin/blog_posts',
417
+ {:sort => 'user', :sort_order => 'desc'}, response.body
418
+ )
419
+
420
+ get "/admin/blog_posts", :sort => 'user', :sort_order => 'desc'
421
+ assert_response :success
422
+
423
+ # should show soren's blog post before jean-paul's
424
+ assert_match(%r|soren.*jean-paul|m, response.body)
425
+ end
426
+
427
+ def test_index_search_when_there_are_no_records
428
+ BlogPost.destroy_all
429
+ get "/admin/blog_posts", :search => 'foo'
430
+ assert_response :success
431
+
432
+ # should say 'No blog posts found'
433
+ assert_match(/No blog posts found/, response.body)
434
+
435
+ # should display the search with the terms
436
+ assert_select("form#search_form");
437
+ assert_match(
438
+ %r|<script.*\$\('#show_search_form'\).click\(\);|m,
439
+ response.body
440
+ )
441
+ assert_match(%r|input.*value="foo"|, response.body)
442
+
443
+ # should show a link back to the index page
444
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
445
+ end
446
+
447
+ def test_index_search_when_there_are_no_records_that_match
448
+ BlogPost.destroy_all
449
+ BlogPost.create!(
450
+ :title => 'no match', :body => 'no match', :user => @user
451
+ )
452
+ get "/admin/blog_posts", :search => 'foo'
453
+ assert_response :success
454
+
455
+ # should say 'No blog posts found'
456
+ assert_match(/No blog posts found/, response.body)
457
+ end
458
+
459
+ def test_index_search_when_there_is_a_blog_post_with_a_matching_title
460
+ BlogPost.destroy_all
461
+ BlogPost.create!(
462
+ :title => 'foozy', :body => 'blog post body', :user => @user
463
+ )
464
+ get "/admin/blog_posts", :search => 'foo'
465
+ assert_response :success
466
+
467
+ # should show that blog post
468
+ assert_match(/blog post body/, response.body)
469
+ end
470
+
471
+ def test_index_search_when_there_is_a_matching_body
472
+ BlogPost.destroy_all
473
+ BlogPost.create!(
474
+ :title => 'blog post title', :body => 'barfoo', :user => @user
475
+ )
476
+ get "/admin/blog_posts", :search => 'foo'
477
+ assert_response :success
478
+
479
+ # should show that blog post
480
+ assert_match(/blog post title/, response.body)
481
+
482
+ # should say how many records are found
483
+ assert_match(/1 blog post found/, response.body)
484
+ end
485
+
486
+ def test_index_pagination_with_51_records_when_looking_at_the_first_page
487
+ BlogPost.destroy_all
488
+ 1.upto(51) do |i|
489
+ BlogPost.create!(
490
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
491
+ )
492
+ end
493
+
494
+ get "/admin/blog_posts"
495
+ assert_response :success
496
+
497
+ # should have a link to the next page
498
+ assert_select(
499
+ "a[href=/admin/blog_posts?page=2]", 'Next &#8594;'
500
+ )
501
+ assert_select("a[href=/admin/blog_posts?page=2]", '2')
502
+
503
+ # should not have a link to the previous page
504
+ assert_select(
505
+ "a[href=/admin/blog_posts?page=0]", false, '&#8592; Previous'
506
+ )
507
+ assert_select("a[href=/admin/blog_posts?page=0]", false, '0')
508
+
509
+ # should the full number of posts found
510
+ assert_match(/51 blog posts found/, response.body)
511
+ end
512
+
513
+ def test_index_pagination_with_51_records_when_looking_at_the_second_page
514
+ BlogPost.destroy_all
515
+ 1.upto(51) do |i|
516
+ BlogPost.create!(
517
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
518
+ )
519
+ end
520
+
521
+ get "/admin/blog_posts", :page => '2'
522
+ assert_response :success
523
+
524
+ # should have a link to the next page
525
+ assert_select(
526
+ "a[href=/admin/blog_posts?page=3]", 'Next &#8594;'
527
+ )
528
+ assert_select("a[href=/admin/blog_posts?page=3]", '3')
529
+
530
+ # should have a link to the previous page
531
+ assert_select(
532
+ "a[href=/admin/blog_posts?page=1]", '&#8592; Previous'
533
+ )
534
+ assert_select("a[href=/admin/blog_posts?page=1]", '1')
535
+
536
+ # should the full number of posts found
537
+ assert_match(/51 blog posts found/, response.body)
538
+ end
539
+
540
+ def test_index_pagination_with_51_records_when_looking_at_the_third_page
541
+ BlogPost.destroy_all
542
+ 1.upto(51) do |i|
543
+ BlogPost.create!(
544
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
545
+ )
546
+ end
547
+
548
+ get "/admin/blog_posts", :page => '3'
549
+ assert_response :success
550
+
551
+ # should not have a link to the next page
552
+ assert_select(
553
+ "a[href=/admin/blog_posts?page=4]", false, 'Next &#8594;'
554
+ )
555
+ assert_select("a[href=/admin/blog_posts?page=3]", false, '3')
556
+
557
+ # should have a link to the previous page
558
+ assert_select(
559
+ "a[href=/admin/blog_posts?page=2]", '&#8592; Previous'
560
+ )
561
+ assert_select("a[href=/admin/blog_posts?page=2]", '2')
562
+
563
+ # should the full number of posts found
564
+ assert_match(/51 blog posts found/, response.body)
565
+ end
566
+
567
+ def test_index_with_100_000_records
568
+ BlogPost.count.upto(25) do |i|
569
+ BlogPost.create!(
570
+ :title => "title -#{i}-", :body => "body -#{i}-", :user => @user
571
+ )
572
+ end
573
+ def BlogPost.paginate(*args)
574
+ collection = super(*args)
575
+ collection.total_entries = 100_000
576
+ collection
577
+ end
578
+
579
+ get "/admin/blog_posts"
580
+
581
+ # should not offer a link to sort by user
582
+ assert_no_a_tag_with_get_args(
583
+ 'User', '/admin/blog_posts', {:sort => 'user', :sort_order => 'asc'},
584
+ response.body
585
+ )
586
+ end
587
+
588
+ def test_new
589
+ @alfie = User.find_or_create_by_username 'alfie'
590
+ visit "/admin/blog_posts"
591
+ click_link "New blog post"
592
+
593
+ # should show a form
594
+ assert_match(
595
+ %r|<form[^>]*action="/admin/blog_posts".*input.*name="blog_post\[title\]"|m,
596
+ response.body
597
+ )
598
+
599
+ # should use a textarea for the body field
600
+ assert_match(
601
+ %r|<textarea.*name="blog_post\[body\]".*>.*</textarea>|, response.body
602
+ )
603
+
604
+ # should show a link back to the index page
605
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
606
+
607
+ # should show pretty field names
608
+ field_names = ['Title', 'Body']
609
+ field_names.each do |field_name|
610
+ assert_select('label', field_name)
611
+ end
612
+
613
+ # should set the for attribute of the labels
614
+ field_names = ['Title', 'Body']
615
+ field_names.each do |field_name|
616
+ assert_select("label[for=blog_post_#{field_name.downcase}]")
617
+ end
618
+
619
+ # should use a checkbox for the boolean field 'textile'
620
+ assert_match(
621
+ %r!
622
+ <input[^>]*
623
+ (name="blog_post\[textile\][^>]*type="checkbox"|
624
+ type="checkbox"[^>]*name="blog_post\[textile\])
625
+ !x,
626
+ response.body
627
+ )
628
+
629
+ # should use a drop-down for the user field
630
+ assert_select("select[name=?]", "blog_post[user_id]") do
631
+ assert_select "option:nth-child(1)[value='']"
632
+ assert_select "option:nth-child(2)[value=?]", @alfie.id, :text => 'alfie'
633
+ assert_select "option:nth-child(3)[value=?]", @user.id, :text => 'soren'
634
+ end
635
+
636
+ # should set the controller path as a CSS class
637
+ assert_select("div[class~=admin_blog_posts]")
638
+
639
+ # should use dropdowns with nil defaults for published_at
640
+ nums_and_dt_fields = {
641
+ 1 => :year, 2 => :month, 3 => :day, 4 => :hour, 5 => :min
642
+ }
643
+ nums_and_dt_fields.each do |num, dt_field|
644
+ name = "blog_post[published_at(#{num}i)]"
645
+ value_for_now_option = Time.now.send(dt_field).to_s
646
+ if [:hour, :min].include?(dt_field) && value_for_now_option.size == 1
647
+ value_for_now_option = "0#{value_for_now_option}"
648
+ end
649
+ assert_select('select[name=?]', name) do
650
+ assert_select "option[value='']"
651
+ assert_select "option:not([selected])[value=?]", value_for_now_option
652
+ end
653
+ end
654
+
655
+ # should show a clear link for published_at
656
+ assert_select('a', :text => "Clear")
657
+ end
658
+
659
+ def test_new_with_a_preset_value_in_the_GET_arguments
660
+ get "/admin/blog_posts/new", :blog_post => {:user_id => @user.id.to_s}
661
+
662
+ # should set that preselected value
663
+ assert_select("select[name=?]", "blog_post[user_id]") do
664
+ assert_select "option[value=?][selected=selected]",
665
+ @user.id, :text => 'soren'
666
+ assert_select "option[value='']"
667
+ end
668
+ end
669
+
670
+ def test_new_when_there_are_more_than_15_users
671
+ User.destroy_all
672
+ 1.upto(16) do |i|
673
+ User.create! :username => "--user #{i}--"
674
+ end
675
+ get "/admin/blog_posts/new"
676
+
677
+ # should use the token input instead of a drop-down
678
+ assert_select("select[name=?]", "blog_post[user_id]", false)
679
+ assert_select("input[name=?]", 'blog_post[user_id]')
680
+ assert_match(
681
+ %r|
682
+ \$\("\#blog_post_user_id"\)\.tokenInput\(
683
+ \s*"/admin/blog_posts/autocomplete_user"
684
+ |mx,
685
+ response.body
686
+ )
687
+ end
688
+
689
+ def test_show
690
+ BlogPost.destroy_all
691
+ @blog_post = BlogPost.create!(
692
+ :title => "foo > bar & baz", :user => @user, :textile => false
693
+ )
694
+ get "/admin/blog_posts/#{@blog_post.id}"
695
+
696
+ # should show the HTML-escaped title
697
+ assert_match(/foo &gt; bar &amp; baz/, response.body)
698
+
699
+ # should have a link to edit
700
+ assert_select(
701
+ "a[href=/admin/blog_posts/#{@blog_post.id}/edit]", 'Edit'
702
+ )
703
+
704
+ # should show soren
705
+ assert_match(/soren/, response.body)
706
+ end
707
+
708
+ def test_update_when_there_are_no_validation_errors
709
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
710
+ title2 = random_word
711
+ put(
712
+ "/admin/blog_posts/#{@blog_post.id}",
713
+ :blog_post => {
714
+ :title => title2, 'published_at(1i)' => '2009',
715
+ 'published_at(2i)' => '1', 'published_at(3i)' => '2',
716
+ 'published_at(4i)' => '3', 'published_at(5i)' => '4'
717
+ }
718
+ )
719
+ assert_redirected_to(:action => 'index')
720
+ @blog_post_prime = BlogPost.find_by_title(title2)
721
+
722
+ # should update a pre-existing BlogPost
723
+ assert_not_nil(@blog_post_prime)
724
+
725
+ # should set published_at
726
+ assert_equal(Time.utc(2009, 1, 2, 3, 4), @blog_post_prime.published_at)
727
+ end
728
+
729
+ def test_update_when_there_are_validation_errors
730
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
731
+ put(
732
+ "/admin/blog_posts/#{@blog_post.id}",
733
+ :blog_post => {:title => ''}, :origin => '/admin/blog_posts'
734
+ )
735
+
736
+ # should not create a new BlogPost
737
+ assert_nil(BlogPost.find_by_title(''))
738
+
739
+ # should print all the errors
740
+ assert_response :success
741
+ assert_match(/Title can't be blank/, response.body)
742
+
743
+ # should show a link back to the index page
744
+ assert_select("a[href=/admin/blog_posts]", 'Back to index')
745
+ end
746
+
747
+ def test_update_handles_the_origin_param
748
+ @blog_post = BlogPost.create! :title => random_word, :user => @user
749
+
750
+ # should redirect to the origin when there is a origin on the form submit
751
+ origin = 'http://foo.com'
752
+ put(
753
+ "/admin/blog_posts/#{@blog_post.id}",
754
+ :blog_post => {:title => 'foo'}, :origin => origin
755
+ )
756
+ assert_redirected_to(origin)
757
+ end
758
+
759
+ def test_update_as_Ajax_toggle
760
+ @blog_post = BlogPost.create!(
761
+ :title => random_word, :user => @user, :textile => false
762
+ )
763
+ put(
764
+ "/admin/blog_posts/#{@blog_post.id}",
765
+ :from => "blog_post_#{@blog_post.id}_textile",
766
+ :blog_post => {:textile => '1'}
767
+ )
768
+
769
+ # should return success
770
+ assert_response :success
771
+
772
+ # should update the textile field
773
+ assert(@blog_post.reload.textile)
774
+
775
+ # should only render a small snippet of HTML with Ajax in it
776
+ toggle_div_id = "blog_post_#{@blog_post.id}_textile"
777
+ post_url =
778
+ "/admin/blog_posts/#{@blog_post.id}?" +
779
+ 'blog_post[textile]' + "=0&amp;from=#{toggle_div_id}"
780
+ assert_select('div[id=?]', toggle_div_id, false)
781
+ assert_select('a.toggle[href=?]', post_url, :text => 'true')
782
+ assert_no_match(%r|<title>Admin</title>|, response.body)
783
+ end
784
+ end