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,210 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::ProductsIntegrationTest < ActionController::IntegrationTest
4
+ def test_destroy
5
+ @product = Product.find_or_create_by_name 'Chocolate bar'
6
+ post "/admin/products/destroy/#{@product.id}"
7
+
8
+ # should call the custom destroy block
9
+ @product.reload
10
+ assert_not_nil(@product.deleted_at)
11
+ end
12
+
13
+ def test_index_with_at_least_one_Product
14
+ @product = (
15
+ Product.find(:first) || Product.create!(:name => 'product name')
16
+ )
17
+ get "/admin/products"
18
+
19
+ # should have a search form that allows you to specify equals or other options
20
+ assert_select('form[id=search_form][method=get]') do
21
+ assert_select("select[name=?]", "search[price(comparator)]") do
22
+ assert_select("option[value='>']", :text => 'greater than')
23
+ assert_select("option[value='>=']", :text => 'greater than or equal to')
24
+ assert_select("option[value='='][selected=selected]", :text => 'equal to')
25
+ assert_select("option[value='<=']", :text => 'less than or equal to')
26
+ assert_select("option[value='<']", :text => 'less than')
27
+ end
28
+ assert_select('input[name=?]', 'search[price]')
29
+ end
30
+
31
+ # should not have a comparator for the name search field
32
+ assert_select('form[id=search_form][method=get]') do
33
+ assert_select("select[name=?]", "search[name(comparator)]", false)
34
+ end
35
+
36
+ # should not have a Show link
37
+ assert_no_match(%r|<a[^>]*>Show</a>|, response.body)
38
+ end
39
+
40
+ def test_index_search_by_price
41
+ Product.destroy_all
42
+ Product.create!(:name => 'Chocolate bar', :price => 200)
43
+ Product.create!(:name => 'Diamond ring', :price => 200_000)
44
+ get "/admin/products", :search => {"price(comparator)" => '>', :price => 1000}
45
+
46
+ # should only show products more expensive than $10
47
+ assert_no_match(%r|<td[^>]*>Chocolate bar</td>|, response.body)
48
+ assert_select('td', :text => 'Diamond ring')
49
+
50
+ # should show the price comparison in the search form
51
+ assert_select('form[id=search_form][method=get]') do
52
+ assert_select("select[name=?]", "search[price(comparator)]") do
53
+ assert_select(
54
+ "option[value='>'][selected=selected]", :text => 'greater than'
55
+ )
56
+ assert_select("option[value='>=']", :text => 'greater than or equal to')
57
+ assert_select("option[value='=']", :text => 'equal to')
58
+ assert_select("option[value='<=']", :text => 'less than or equal to')
59
+ assert_select("option[value='<']", :text => 'less than')
60
+ end
61
+ assert_select('input[name=?]', 'search[price]')
62
+ end
63
+ end
64
+
65
+ def test_index_sort_by_product_category
66
+ ProductCategory.destroy_all
67
+ Product.destroy_all
68
+ diamond_cat = ProductCategory.create!(
69
+ :category_name => 'diamond', :position => 1
70
+ )
71
+ @diamond = Product.create!(
72
+ :name => 'Diamond', :price => 200_000, :product_category => diamond_cat
73
+ )
74
+ choc_cat = ProductCategory.create!(
75
+ :category_name => 'chocolate', :position => 2
76
+ )
77
+ @chocolate = Product.create!(
78
+ :name => 'Chocolate bar', :price => 200, :product_category => choc_cat
79
+ )
80
+ assert(diamond_cat.id < choc_cat.id)
81
+ get "/admin/products", :sort_order => "asc", :sort => "product_category"
82
+
83
+ # should be a success
84
+ assert_response :success
85
+
86
+ # should order by product_category_id
87
+ assert_match(
88
+ %r|product_#{@diamond.id}.*product_#{@chocolate.id}|m, response.body
89
+ )
90
+ end
91
+
92
+ def test_new
93
+ get "/admin/products/new"
94
+ assert_response :success
95
+
96
+ # should not render the default price input
97
+ assert_select("input[name=?]", 'product[price]', false)
98
+
99
+ # should render the custom price input from _price_input.html.erb
100
+ assert_select("input[name=?]", 'product[price][dollars]')
101
+
102
+ # should show clear links for sale_starts_at and sale_ends_at
103
+ assert_select('a', :text => "Not on sale")
104
+ assert_select('a', :text => "Sale doesn't end")
105
+ end
106
+
107
+ def test_edit
108
+ @product = Product.find_or_create_by_name 'a bird'
109
+ @product.update_attributes(
110
+ :name => 'a bird', :price => 100_00,
111
+ :file_column_image => File.open("./test/data/ruby_throated.jpg"),
112
+ :percent_off => 25
113
+ )
114
+ get "/admin/products/edit/#{@product.id}"
115
+ assert_response :success
116
+
117
+ # should have a multipart form
118
+ assert_select('form[enctype=multipart/form-data]')
119
+
120
+ # should have a file input for image
121
+ assert_select(
122
+ 'input[name=?][type=file]', 'product[file_column_image]'
123
+ )
124
+
125
+ # should show the current image
126
+ assert_select(
127
+ "img[src^=?][height=100][width=100]",
128
+ "/product/file_column_image/#{@product.id}/ruby_throated.jpg"
129
+ )
130
+
131
+ # should have a remove-image option
132
+ assert_select(
133
+ "input[type=checkbox][name=?]", 'product[file_column_image(destroy)]'
134
+ )
135
+
136
+ # should the percent_off value pre-filled
137
+ assert_select(
138
+ 'input[name=?][value=25]', 'product[percent_off]'
139
+ )
140
+ end
141
+
142
+ def test_update_while_updating_a_current_image
143
+ @product = Product.find_or_create_by_name 'a bird'
144
+ @product.update_attributes(
145
+ :name => 'a bird', :price => 100_00,
146
+ :file_column_image => File.open("./test/data/ruby_throated.jpg")
147
+ )
148
+ file = File.new './test/data/tweenbot.jpg'
149
+ post(
150
+ "/admin/products/update/#{@product.id}",
151
+ :product => {
152
+ :file_column_image => fixture_file_upload(
153
+ "../../test/data/tweenbot.jpg"
154
+ )
155
+ },
156
+ :html => {:multipart => true}
157
+ )
158
+
159
+ # should update the image
160
+ product_prime = Product.find_by_id @product.id
161
+ assert_match(/tweenbot/, product_prime.file_column_image)
162
+
163
+ # should save the image locally
164
+ assert(
165
+ File.exist?(
166
+ "./public/product/file_column_image/#{@product.id}/tweenbot.jpg"
167
+ )
168
+ )
169
+ end
170
+
171
+ def test_update_while_removing_the_current_image
172
+ @product = Product.find_or_create_by_name 'a bird'
173
+ @product.update_attributes(
174
+ :name => 'a bird', :price => 100_00,
175
+ :file_column_image => File.open("./test/data/ruby_throated.jpg")
176
+ )
177
+ post(
178
+ "/admin/products/update/#{@product.id}",
179
+ :product => {
180
+ 'file_column_image(destroy)' => '1', :file_column_image => ''
181
+ }
182
+ )
183
+
184
+ # should remove the existing image
185
+ product_prime = Product.find_by_id @product.id
186
+ assert_nil product_prime.file_column_image
187
+ end
188
+
189
+ def test_update_while_trying_to_update_and_remove_at_the_same_time
190
+ @product = Product.find_or_create_by_name 'a bird'
191
+ @product.update_attributes(
192
+ :name => 'a bird', :price => 100_00,
193
+ :file_column_image => File.open("./test/data/ruby_throated.jpg")
194
+ )
195
+ post(
196
+ "/admin/products/update/#{@product.id}",
197
+ :product => {
198
+ :file_column_image => fixture_file_upload(
199
+ "../../test/data/tweenbot.jpg"
200
+ ),
201
+ 'file_column_image(destroy)' => '1'
202
+ },
203
+ :html => {:multipart => true}
204
+ )
205
+
206
+ # should assume you meant to update
207
+ product_prime = Product.find_by_id @product.id
208
+ assert_match(/tweenbot/, product_prime.file_column_image)
209
+ end
210
+ end
@@ -0,0 +1,25 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::TelevisionAiringsIntegrationTest <
4
+ ActionController::IntegrationTest
5
+ def test_new
6
+ TelevisionTimeSlot.destroy_all
7
+ @tv_time_slot1 = TelevisionTimeSlot.create!(
8
+ :time => Time.utc(2010, 2, 14, 9)
9
+ )
10
+ @tv_time_slot2 = TelevisionTimeSlot.create!(
11
+ :time => Time.utc(2010, 2, 14, 14)
12
+ )
13
+ get "/admin/television_airings/new"
14
+ assert_response :success
15
+
16
+ # should sort television time slots by time, not by the time string
17
+ assert_select(
18
+ 'select[name=?]', 'television_airing[television_time_slot_id]'
19
+ ) do
20
+ assert_select 'option:first-child[value=""]'
21
+ assert_select 'option:nth-child(2)[value=?]', @tv_time_slot1.id
22
+ assert_select 'option:nth-child(3)[value=?]', @tv_time_slot2.id
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,48 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::Users2IntegrationTest < ActionController::IntegrationTest
4
+ def test_index
5
+ User.create!(:username => random_word) if User.count == 0
6
+ get "/admin/users2"
7
+
8
+ # should show the empty search form
9
+ assert_select('form#search_form') do
10
+ assert_select('input[name=?]', 'search[blog_posts]')
11
+ end
12
+ end
13
+
14
+ def test_index_when_searching_by_blog_post
15
+ User.destroy_all
16
+ @soren = User.create! :username => 'soren'
17
+ @jean_paul = User.create! :username => 'jean_paul'
18
+ BlogPost.create!(
19
+ :user => @jean_paul, :title => 'No Foobar',
20
+ :body => 'Hell is other foobars'
21
+ )
22
+ @friedrich = User.create! :username => 'friedrich'
23
+ BlogPost.create!(
24
+ :user => @friedrich, :title => 'Thus Spake Zarafoobar',
25
+ :body => 'Man is something that shall be overfoobared.'
26
+ )
27
+ BlogPost.create!(
28
+ :user => @friedrich, :title => 'Beyond Good and Foobar',
29
+ :body =>
30
+ 'And when you gaze long into a foobar the foobar also gazes into you.'
31
+ )
32
+ get "/admin/users2", :search => {:blog_posts => 'foobar'}
33
+
34
+ # should prefill the search form fields
35
+ assert_select('form#search_form') do
36
+ assert_select('input[name=?][value=?]', 'search[blog_posts]', 'foobar')
37
+ end
38
+
39
+ # should not match a user without any matching blog posts
40
+ assert_no_match(%r|<td[^>]*>#{@soren.username}</td>|, response.body)
41
+
42
+ # should match a user with one matching blog post
43
+ assert_select('td', :text => @jean_paul.username)
44
+
45
+ # should match a user with two matching blog posts, only presenting that user once
46
+ assert_select('td', :text => @friedrich.username, :count => 1)
47
+ end
48
+ end
@@ -0,0 +1,266 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::UsersIntegrationTest < ActionController::IntegrationTest
4
+ def setup
5
+ @user = User.find_or_create_by_username 'betty'
6
+ @user.update_attribute :password, 'crocker'
7
+ end
8
+
9
+ def test_create
10
+ post(
11
+ "/admin/users/create", :user => { :username => 'bill', :password => '' }
12
+ )
13
+
14
+ # should assign a new random password
15
+ user = User.find_by_username 'bill'
16
+ assert_not_nil(user)
17
+ assert_not_equal(user.password, '')
18
+ end
19
+
20
+ def test_create_with_the_same_username
21
+ @user_count = User.count
22
+ post(
23
+ "/admin/users/create", :user => {:username => 'betty', :password => ''}
24
+ )
25
+
26
+ # should not save a new user
27
+ assert_equal(User.count, @user_count)
28
+
29
+ # should not call after_save
30
+ assert_response :success
31
+ end
32
+
33
+ def test_destroy
34
+ post "/admin/users/destroy/#{@user.id}"
35
+
36
+ # should destroy the user
37
+ assert_nil(User.find_by_id(@user.id))
38
+ end
39
+
40
+ def test_edit
41
+ @user.update_attributes(
42
+ :has_avatar => true, :avatar_version => 9,
43
+ :force_blog_posts_to_textile => true
44
+ )
45
+ get "/admin/users/edit/#{@user.id}"
46
+
47
+ # should show the default text input for password
48
+ assert_match(%r|<input[^>]*name="user\[password\]"|, response.body)
49
+
50
+ # should show a reset password checkbox
51
+ assert_select("input[type=checkbox][name=reset_password]")
52
+
53
+ # should have a multipart form
54
+ assert_select('form[enctype=multipart/form-data]')
55
+
56
+ # should have a file input for tmp_avatar
57
+ assert_select('input[name=?][type=file]', 'user[tmp_avatar]')
58
+
59
+ # should show the current tmp_avatar with a custom src
60
+ assert_select(
61
+ "img[src^=?]", "http://my-image-server.com/users/#{@user.id}.jpg?v=9"
62
+ )
63
+
64
+ # should have a remove-image option
65
+ assert_select("input[type=checkbox][name=?]", 'user[tmp_avatar(destroy)]')
66
+
67
+ # should show a drop-down for force_blog_posts_to_textile
68
+ assert_select('select[name=?]', 'user[force_blog_posts_to_textile]') do
69
+ assert_select "option:not([selected])[value='']"
70
+ assert_select "option:not([selected])[value=0]", :text => 'false'
71
+ assert_select "option[selected=selected][value=1]", :text => 'true'
72
+ end
73
+ end
74
+
75
+ def test_index
76
+ get "/admin/users"
77
+
78
+ # should show a Delete link and a link to the profile page
79
+ assert_select('td') do
80
+ assert_select(
81
+ "a.destroy[href=?][data-method=?]",
82
+ "/admin/users/destroy/#{@user.id}", 'delete',
83
+ :text => 'Delete'
84
+ )
85
+ assert_select(
86
+ "a[href=?]",
87
+ "/admin/blog_posts/new?blog_post%5Buser_id%5D=#{@user.id}",
88
+ :text => "New blog post"
89
+ )
90
+ end
91
+ end
92
+
93
+ def test_index_with_a_user_with_an_avatar
94
+ @user.update_attributes :has_avatar => true, :avatar_version => 9
95
+ get "/admin/users"
96
+
97
+ # should show the avatar image in the avatar column
98
+ assert_select(
99
+ 'img[src=?]', "http://my-image-server.com/users/#{@user.id}.jpg?v=9"
100
+ )
101
+ end
102
+
103
+ def test_index_search
104
+ User.destroy_all
105
+ @john_doe = User.create! :username => 'johndoe'
106
+ @jane_doe = User.create! :username => 'janedoe', :password => "ihatejohn"
107
+ get "/admin/users", :search => "john"
108
+ assert_response :success
109
+
110
+ # should match username
111
+ assert_select('td', :text => 'johndoe')
112
+
113
+ # should not match password
114
+ assert_no_match(%r|<td[^>]*>janedoe</td>|, response.body)
115
+ end
116
+
117
+ def test_index_search_across_first_name_and_last_name
118
+ User.destroy_all
119
+ @john_doe = User.create!(
120
+ :username => 'johndoe', :first_name => 'john', :last_name => 'doe'
121
+ )
122
+ get "/admin/users", :search => "john doe"
123
+
124
+ # should match
125
+ assert_select('td', :text => 'johndoe')
126
+ end
127
+
128
+ def test_new
129
+ get "/admin/users/new"
130
+
131
+ # should not show an input for password
132
+ assert_match(/autogenerated/, response.body)
133
+ assert_no_match(%r|<input[^>]*name="user\[password\]"|, response.body)
134
+
135
+ # should not show a reset password checkbox
136
+ assert_select("input[type=checkbox][name=reset_password]", false)
137
+
138
+ # should use date dropdowns with nil defaults for birthday
139
+ nums_and_dt_fields = {1 => :year, 2 => :month, 3 => :day}
140
+ nums_and_dt_fields.each do |num, dt_field|
141
+ name = "user[birthday(#{num}i)]"
142
+ assert_select('select[name=?]', name) do
143
+ assert_select "option[value='']"
144
+ assert_select(
145
+ "option:not([selected])[value=?]", Time.now.send(dt_field).to_s
146
+ )
147
+ end
148
+ end
149
+
150
+ # should not try to set an hour or minute for birthday
151
+ nums_and_dt_fields = {4 => :hour, 5 => :min}
152
+ nums_and_dt_fields.each do |num, dt_field|
153
+ name = "blog_post[published_at(#{num}i)]"
154
+ assert_select('select[name=?]', name, false)
155
+ end
156
+
157
+ # should respect start_year and end_year parameters
158
+ assert_select("select[name='user[birthday(1i)]']") do
159
+ (Time.now.year-100).upto(Time.now.year) do |year|
160
+ assert_select "option[value='#{year}']"
161
+ end
162
+ end
163
+
164
+ # should show a drop-down for US states
165
+ assert_select('select[name=?]', 'user[state]') do
166
+ assert_select "option[value='']"
167
+ assert_select "option:not([selected])[value=AK]", :text => 'Alaska'
168
+ assert_select "option:not([selected])[value=NY]", :text => 'New York'
169
+ # blank option, 50 states, DC, Puerto Rico == 53 options
170
+ assert_select "option", :count => 53
171
+ end
172
+
173
+ # should have a multipart form
174
+ assert_select('form[enctype=multipart/form-data]')
175
+
176
+ # should have a file input for tmp_avatar
177
+ assert_match(
178
+ %r|<input[^>]*name="user\[tmp_avatar\]"[^>]*type="file"|, response.body
179
+ )
180
+
181
+ # should show a drop-down for force_blog_posts_to_textile
182
+ assert_select('select[name=?]', 'user[force_blog_posts_to_textile]') do
183
+ assert_select "option[value='']"
184
+ assert_select "option:not([selected])[value=0]", :text => 'false'
185
+ assert_select "option:not([selected])[value=1]", :text => 'true'
186
+ end
187
+
188
+ # should show a select for admin_level
189
+ assert_select("select[name=?]", "user[admin_level]") do
190
+ assert_select("option[value='']", false)
191
+ assert_select "option[value=normal][selected=selected]"
192
+ assert_select "option[value=admin]"
193
+ assert_select "option[value=superuser]"
194
+ end
195
+ end
196
+
197
+ def test_update
198
+ post(
199
+ "/admin/users/update/#{@user.id}",
200
+ :user => {:username => 'bettie', :force_blog_posts_to_textile => ''}
201
+ )
202
+ @user.reload
203
+
204
+ # should not assign a new random password
205
+ assert_equal(@user.password, 'crocker')
206
+
207
+ # should know the difference between nil and false for force_blog_posts_to_textile
208
+ assert_nil(@user.force_blog_posts_to_textile)
209
+ end
210
+
211
+ def test_update_while_resetting_password
212
+ post(
213
+ "/admin/users/update/#{@user.id}",
214
+ :user => {:username => 'bettie'}, :reset_password => '1'
215
+ )
216
+
217
+ # should assign a new random password
218
+ @user.reload
219
+ assert_not_equal(@user.password, 'crocker')
220
+ end
221
+
222
+ def test_update_while_updating_the_current_tmp_avatar
223
+ @user.update_attributes :has_avatar => true, :avatar_version => 9
224
+ post(
225
+ "/admin/users/update/#{@user.id}",
226
+ :user => {
227
+ :tmp_avatar => fixture_file_upload('../../test/data/tweenbot.jpg')
228
+ },
229
+ :html => {:multipart => true}
230
+ )
231
+
232
+ # should increment the avatar_version through before_save
233
+ @user.reload
234
+ assert_equal(@user.avatar_version, 10)
235
+ end
236
+
237
+ def test_update_while_removing_the_current_tmp_avatar
238
+ @user.update_attributes :has_avatar => true, :avatar_version => 9
239
+ post(
240
+ "/admin/users/update/#{@user.id}",
241
+ :user => {:tmp_avatar => '', 'tmp_avatar(destroy)' => '1'},
242
+ :html => {:multipart => true}
243
+ )
244
+
245
+ # should set has_avatar to false
246
+ @user.reload
247
+ assert(!@user.has_avatar?)
248
+ end
249
+
250
+ def test_while_trying_to_update_and_remove_tmp_avatar_at_the_same_time
251
+ @user.update_attributes :has_avatar => true, :avatar_version => 9
252
+ post(
253
+ "/admin/users/update/#{@user.id}",
254
+ :user => {
255
+ :tmp_avatar => fixture_file_upload('../../test/data/tweenbot.jpg'),
256
+ 'tmp_avatar(destroy)' => '1'
257
+ },
258
+ :html => {:multipart => true}
259
+ )
260
+
261
+ # should assume you meant to update
262
+ @user.reload
263
+ assert_equal(@user.avatar_version, 10)
264
+ assert(@user.has_avatar?)
265
+ end
266
+ end
@@ -0,0 +1,9 @@
1
+ $: << 'test'
2
+ require 'test_helper'
3
+
4
+ class BlogPostsIntegrationTest < ActionController::IntegrationTest
5
+ def test_create_should_not_be_defined_by_admin_assistant
6
+ post "/blog_posts/create"
7
+ assert_response :not_found
8
+ end
9
+ end
@@ -0,0 +1,114 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ here = File.dirname(__FILE__)
3
+ require File.expand_path(here + "/../config/environment")
4
+ require 'test_help'
5
+
6
+ module TestHelper
7
+ def assert_a_tag_with_get_args(
8
+ content, href_base, href_get_args, response_body
9
+ )
10
+ regex = %r|<a href="#{ href_base }\?([^"]*)"[^>]*>#{ content }</a>|
11
+ assert(
12
+ response_body =~ regex,
13
+ "#{response_body.inspect} expected to match #{regex.inspect}"
14
+ )
15
+ assert_get_args_equal( href_get_args, $1.gsub( /&amp;/, '&' ) )
16
+ end
17
+
18
+ def assert_no_a_tag_with_get_args(
19
+ content, href_base, href_get_args, response_body
20
+ )
21
+ regex = %r|<a href="#{ href_base }\?([^"]*)"[^>]*>#{ content }</a>|
22
+ if response_body =~ regex
23
+ get_args_string = $1.gsub( /&amp;/, '&' )
24
+ response_h = HashWithIndifferentAccess.new
25
+ CGI::parse( get_args_string ).each do |key, values|
26
+ response_h[key] = values.first
27
+ end
28
+ if href_get_args.size == response_h.size
29
+ raise if href_get_args.all? { |key, value|
30
+ response_h[key] == value
31
+ }
32
+ end
33
+ end
34
+ end
35
+
36
+ def assert_get_args_equal( expected_hash, get_args_string )
37
+ response_h = HashWithIndifferentAccess.new
38
+ CGI::parse( get_args_string ).each do |key, values|
39
+ response_h[key] = values.first
40
+ end
41
+ assert_equal(
42
+ expected_hash.size, response_h.size,
43
+ "<#{ expected_hash.inspect }> expected but was\n<#{ response_h.inspect }>."
44
+ )
45
+ expected_hash.each do |key, value|
46
+ assert_equal( value, response_h[key] )
47
+ end
48
+ end
49
+
50
+ def random_word( length = 25 )
51
+ letters = 'abcdefghijklmnopqrstuvwxyz_'.split //
52
+ ( 1..length ).to_a.map { letters[rand(letters.size)] }.join( '' )
53
+ end
54
+ end
55
+
56
+ class CacheStoreStub
57
+ def initialize
58
+ flush
59
+ end
60
+
61
+ def expires_in(key)
62
+ @expirations[key.to_s]
63
+ end
64
+
65
+ def flush
66
+ @cache = {}
67
+ @expirations = {}
68
+ @raise_on_write = false
69
+ end
70
+
71
+ def raise_on_write
72
+ @raise_on_write = true
73
+ end
74
+
75
+ def read(key, options = nil)
76
+ @cache[key.to_s]
77
+ end
78
+
79
+ def write(key, value, options = nil)
80
+ raise if @raise_on_write
81
+ @cache[key.to_s] = value
82
+ @expirations[key.to_s] = options[:expires_in]
83
+ end
84
+ end
85
+
86
+ $cache = CacheStoreStub.new
87
+
88
+ module Rails
89
+ mattr_accessor :cache
90
+ self.cache = $cache
91
+ end
92
+
93
+ if %w(2.1.0 2.1.2).include?(RAILS_GEM_VERSION)
94
+ class Test::Unit::TestCase
95
+ self.use_transactional_fixtures = true
96
+
97
+ self.use_instantiated_fixtures = false
98
+
99
+ include TestHelper
100
+ end
101
+ else
102
+ class ActiveSupport::TestCase
103
+ self.use_transactional_fixtures = true
104
+
105
+ self.use_instantiated_fixtures = false
106
+
107
+ include TestHelper
108
+ end
109
+ end
110
+
111
+ Webrat.configure do |config|
112
+ config.mode = :rails
113
+ end
114
+