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,79 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::ImagesIntegrationTest < ActionController::IntegrationTest
4
+ def test_index
5
+ @image = Image.create!(
6
+ :image_file_name => '123.jpg', :image_content_type => 'image/jpeg',
7
+ :image_file_size => '456'
8
+ )
9
+ get "/admin/images"
10
+ assert_response :success
11
+
12
+ # should show the image in-line as an <img> tag
13
+ assert_select("img[src=/images/#{@image.id}/original/123.jpg]")
14
+
15
+ # should not show paperclip-fields
16
+ assert_no_match(/image_file_name/, response.body)
17
+ assert_no_match(/image_content_type/, response.body)
18
+ assert_no_match(/image_file_size/, response.body)
19
+ assert_no_match(/image_updated_at/, response.body)
20
+ end
21
+
22
+ def test_create
23
+ file = File.new './test/data/ruby_throated.jpg'
24
+ post(
25
+ "/admin/images",
26
+ :image => {
27
+ :image => fixture_file_upload('../../test/data/ruby_throated.jpg')
28
+ },
29
+ :html => {:multipart => true}
30
+ )
31
+ @image = Image.find_by_image_file_name 'ruby_throated.jpg'
32
+
33
+ # should save an image record
34
+ assert_not_nil @image
35
+
36
+ # should save the image locally
37
+ assert(
38
+ File.exist?("./public/images/#{@image.id}/original/ruby_throated.jpg")
39
+ )
40
+ end
41
+
42
+ def test_new
43
+ get "/admin/images/new"
44
+ assert_response :success
45
+
46
+ # should have a multipart form
47
+ assert_select('form[enctype=multipart/form-data]')
48
+
49
+ # should have a file input for image
50
+ assert_match(
51
+ %r|<input[^>]*name="image\[image\]"[^>]*type="file"|,
52
+ response.body
53
+ )
54
+
55
+ # should not show paperclip-fields
56
+ assert_no_match(/image_file_name/, response.body)
57
+ assert_no_match(/image_content_type/, response.body)
58
+ assert_no_match(/image_file_size/, response.body)
59
+ assert_no_match(/image_updated_at/, response.body)
60
+ end
61
+
62
+ def test_show
63
+ @image = Image.create!(
64
+ :image_file_name => '123.jpg', :image_content_type => 'image/jpeg',
65
+ :image_file_size => '456'
66
+ )
67
+ get "/admin/images/#{@image.id}"
68
+ assert_response :success
69
+
70
+ # should show the image in-line as an <img> tag
71
+ assert_select("img[src=/images/#{@image.id}/original/123.jpg]")
72
+
73
+ # should not show paperclip-fields
74
+ assert_no_match(/image_file_name/, response.body)
75
+ assert_no_match(/image_content_type/, response.body)
76
+ assert_no_match(/image_file_size/, response.body)
77
+ assert_no_match(/image_updated_at/, response.body)
78
+ end
79
+ end
@@ -0,0 +1,21 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::Misconfigured1IntegrationTest < ActionController::IntegrationTest
4
+ def setup
5
+ User.destroy_all
6
+ @user = User.create! :username => 'soren', :password => 'password'
7
+ end
8
+
9
+ def test_index
10
+ # should raise an explanatory error
11
+ begin
12
+ get "/admin/misconfigured1"
13
+ fail "raise expected"
14
+ rescue ActionView::Template::Error
15
+ assert_match(
16
+ /Virtual search column :has_something needs a conditions block/,
17
+ $!.message
18
+ )
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,179 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::ProductCategories2IntegrationTest <
4
+ ActionController::IntegrationTest
5
+ def test_create_with_3_new_valid_product_categories_and_7_blanks
6
+ ProductCategory.destroy_all
7
+ post(
8
+ "/admin/product_categories2",
9
+ :product_category => {
10
+ 'a' => {'category_name' => 'shiny', 'position' => 1},
11
+ 'b' => {'category_name' => 'bouncy', 'position' => 2},
12
+ 'c' => {'category_name' => 'sparkly', 'position' => 3},
13
+ 'd' => {'category_name' => ''},
14
+ 'e' => {'category_name' => ''},
15
+ 'f' => {'category_name' => ''},
16
+ 'g' => {'category_name' => ''},
17
+ 'h' => {'category_name' => ''},
18
+ 'i' => {'category_name' => ''},
19
+ 'j' => {'category_name' => ''},
20
+ }
21
+ )
22
+
23
+ # should create 3 product categories
24
+ assert_equal(3, ProductCategory.count)
25
+ %w(shiny bouncy sparkly).each do |name|
26
+ assert_not_nil(
27
+ ProductCategory.first(:conditions => {:category_name => name})
28
+ )
29
+ end
30
+
31
+ # should redirect to index
32
+ assert_redirected_to(:action => 'index')
33
+ end
34
+
35
+ def test_create_with_2_new_valid_product_categories_1_invalid_product_category_and_7_blanks
36
+ ProductCategory.destroy_all
37
+ ProductCategory.create! :category_name => 'shiny', :position => 1
38
+ @orig_pc_count = ProductCategory.count
39
+ post(
40
+ "/admin/product_categories2",
41
+ :product_category => {
42
+ 'a' => {'category_name' => ''},
43
+ 'b' => {'category_name' => ''},
44
+ 'c' => {'category_name' => 'shiny', :position => 2},
45
+ 'd' => {'category_name' => ''},
46
+ 'e' => {'category_name' => 'bouncy', :position => 3},
47
+ 'f' => {'category_name' => ''},
48
+ 'g' => {'category_name' => 'sparkly', :position => 4},
49
+ 'h' => {'category_name' => ''},
50
+ 'i' => {'category_name' => ''},
51
+ 'j' => {'category_name' => ''},
52
+ }
53
+ )
54
+ assert_response :success
55
+
56
+ # should not create any product categories
57
+ assert_equal(@orig_pc_count, ProductCategory.count)
58
+
59
+ # should render the error for the invalid product category
60
+ assert_match(/has already been taken/, response.body)
61
+
62
+ # should move non-empty records to the top of the rendered form
63
+ assert_select("form") do
64
+ assert_select(
65
+ 'input[name=?][value=?]', "product_category[a][category_name]",
66
+ 'shiny'
67
+ )
68
+ assert_select(
69
+ 'input[name=?][value=?]', "product_category[b][category_name]",
70
+ 'bouncy'
71
+ )
72
+ assert_select(
73
+ 'input[name=?][value=?]', "product_category[c][category_name]",
74
+ 'sparkly'
75
+ )
76
+ end
77
+
78
+ # should render the error directly above the row with the error in it
79
+ assert_select('form') do
80
+ assert_select('table') do
81
+ assert_select('tr') do
82
+ assert_select('td', :text => /^\s*$/)
83
+ assert_select(
84
+ 'td.errorExplanation:not([colspan])',
85
+ :text => /Category name has already been taken/
86
+ )
87
+ end
88
+ assert_select('td.field_with_errors') do
89
+ assert_select(
90
+ 'input[name=?][value=?]', "product_category[a][category_name]",
91
+ 'shiny'
92
+ )
93
+ end
94
+ end
95
+ end
96
+
97
+ # should have 7 blank slots at the bottom
98
+ 'd'.upto('j') do |prefix|
99
+ assert_select(
100
+ 'input[name=?]', "product_category[#{prefix}][category_name]"
101
+ )
102
+ end
103
+ end
104
+
105
+ def test_create_with_nothing_entered
106
+ post(
107
+ "/admin/product_categories2",
108
+ :product_category => {
109
+ 'a' => {'category_name' => ''},
110
+ 'b' => {'category_name' => ''},
111
+ 'c' => {'category_name' => ''},
112
+ 'd' => {'category_name' => ''},
113
+ 'e' => {'category_name' => ''},
114
+ 'f' => {'category_name' => ''},
115
+ 'g' => {'category_name' => ''},
116
+ 'h' => {'category_name' => ''},
117
+ 'i' => {'category_name' => ''},
118
+ 'j' => {'category_name' => ''},
119
+ }
120
+ )
121
+
122
+ # should redirect to index
123
+ assert_redirected_to(:action => 'index')
124
+ end
125
+
126
+ def test_edit
127
+ ProductCategory.destroy_all
128
+ @pc = ProductCategory.create!(
129
+ :category_name => 'shiny', :position => 1
130
+ )
131
+ get "/admin/product_categories2/#{@pc.id}/edit"
132
+
133
+ # should show the form for one record at a time, like normal
134
+ assert_select(
135
+ 'form[action=?]', "/admin/product_categories2/#{@pc.id}"
136
+ ) do
137
+ assert_select(
138
+ "input[name=?][value=?]", 'product_category[category_name]',
139
+ @pc.category_name
140
+ )
141
+ end
142
+ end
143
+
144
+ def test_index
145
+ get "/admin/product_categories2"
146
+
147
+ # should use different text for the new link because we're doing multiple creates
148
+ assert_select(
149
+ "a[href=/admin/product_categories2/new]", 'New product categories'
150
+ )
151
+ end
152
+
153
+ def test_new
154
+ get "/admin/product_categories2/new"
155
+
156
+ # should show a form for 10 product categories at once
157
+ assert_select('form') do
158
+ 'a'.upto('j') do |i|
159
+ assert_select 'input[name=?]', "product_category[#{i}][category_name]"
160
+ end
161
+ assert_select 'input[type=submit]'
162
+ end
163
+ end
164
+
165
+ def test_update
166
+ ProductCategory.destroy_all
167
+ @pc = ProductCategory.create!(
168
+ :category_name => 'shiny', :position => 1
169
+ )
170
+ put(
171
+ "/admin/product_categories2/#{@pc.id}",
172
+ :product_category => {:category_name => 'SHINY'}
173
+ )
174
+
175
+ # should update one record at a time
176
+ @pc.reload
177
+ assert_equal('SHINY', @pc.category_name)
178
+ end
179
+ end
@@ -0,0 +1,12 @@
1
+ require File.expand_path(File.dirname(__FILE__) + "/../../test_helper")
2
+
3
+ class Admin::ProductCategoriesIntegrationTest <
4
+ ActionController::IntegrationTest
5
+ def test_index_with_no_records
6
+ ProductCategory.destroy_all
7
+ get "/admin/product_categories"
8
+
9
+ # should say 'No product categories found'
10
+ assert_match(/No product categories found/, response.body)
11
+ end
12
+ 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,182 @@
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("/admin/users", :user => { :username => 'bill', :password => '' })
11
+
12
+ # should assign a new random password
13
+ user = User.find_by_username 'bill'
14
+ assert_not_nil(user)
15
+ assert_not_equal(user.password, '')
16
+ end
17
+
18
+ def test_create_with_the_same_username
19
+ @user_count = User.count
20
+ post("/admin/users", :user => {:username => 'betty', :password => ''})
21
+
22
+ # should not save a new user
23
+ assert_equal(User.count, @user_count)
24
+
25
+ # should not call after_save
26
+ assert_response :success
27
+ end
28
+
29
+ def test_destroy
30
+ delete "/admin/users/#{@user.id}"
31
+
32
+ # should destroy the user
33
+ assert_nil(User.find_by_id(@user.id))
34
+ end
35
+
36
+ def test_edit
37
+ @user.update_attributes(:force_blog_posts_to_textile => true)
38
+ get "/admin/users/#{@user.id}/edit"
39
+
40
+ # should show the default text input for password
41
+ assert_match(%r|<input[^>]*name="user\[password\]"|, response.body)
42
+
43
+ # should show a reset password checkbox
44
+ assert_select("input[type=checkbox][name=reset_password]")
45
+
46
+ # should show a drop-down for force_blog_posts_to_textile
47
+ assert_select('select[name=?]', 'user[force_blog_posts_to_textile]') do
48
+ assert_select "option:not([selected])[value='']"
49
+ assert_select "option:not([selected])[value=0]", :text => 'false'
50
+ assert_select "option[selected=selected][value=1]", :text => 'true'
51
+ end
52
+ end
53
+
54
+ def test_index
55
+ get "/admin/users"
56
+
57
+ # should show a Delete link and a link to the profile page
58
+ assert_select('td') do
59
+ assert_select(
60
+ "a.destroy[href=?][data-method=?]",
61
+ "/admin/users/#{@user.id}", 'delete',
62
+ :text => 'Delete'
63
+ )
64
+ assert_select(
65
+ "a[href=?]",
66
+ "/admin/blog_posts/new?blog_post[user_id]=#{@user.id}",
67
+ :text => "New blog post"
68
+ )
69
+ end
70
+ end
71
+
72
+ def test_index_search
73
+ User.destroy_all
74
+ @john_doe = User.create! :username => 'johndoe'
75
+ @jane_doe = User.create! :username => 'janedoe', :password => "ihatejohn"
76
+ get "/admin/users", :search => "john"
77
+ assert_response :success
78
+
79
+ # should match username
80
+ assert_select('td', :text => 'johndoe')
81
+
82
+ # should not match password
83
+ assert_no_match(%r|<td[^>]*>janedoe</td>|, response.body)
84
+ end
85
+
86
+ def test_index_search_across_first_name_and_last_name
87
+ User.destroy_all
88
+ @john_doe = User.create!(
89
+ :username => 'johndoe', :first_name => 'john', :last_name => 'doe'
90
+ )
91
+ get "/admin/users", :search => "john doe"
92
+
93
+ # should match
94
+ assert_select('td', :text => 'johndoe')
95
+ end
96
+
97
+ def test_new
98
+ get "/admin/users/new"
99
+
100
+ # should not show an input for password
101
+ assert_match(/autogenerated/, response.body)
102
+ assert_no_match(%r|<input[^>]*name="user\[password\]"|, response.body)
103
+
104
+ # should not show a reset password checkbox
105
+ assert_select("input[type=checkbox][name=reset_password]", false)
106
+
107
+ # should use date dropdowns with nil defaults for birthday
108
+ nums_and_dt_fields = {1 => :year, 2 => :month, 3 => :day}
109
+ nums_and_dt_fields.each do |num, dt_field|
110
+ name = "user[birthday(#{num}i)]"
111
+ assert_select('select[name=?]', name) do
112
+ assert_select "option[value='']"
113
+ assert_select(
114
+ "option:not([selected])[value=?]", Time.now.send(dt_field).to_s
115
+ )
116
+ end
117
+ end
118
+
119
+ # should not try to set an hour or minute for birthday
120
+ nums_and_dt_fields = {4 => :hour, 5 => :min}
121
+ nums_and_dt_fields.each do |num, dt_field|
122
+ name = "blog_post[published_at(#{num}i)]"
123
+ assert_select('select[name=?]', name, false)
124
+ end
125
+
126
+ # should respect start_year and end_year parameters
127
+ assert_select("select[name='user[birthday(1i)]']") do
128
+ (Time.now.year-100).upto(Time.now.year) do |year|
129
+ assert_select "option[value='#{year}']"
130
+ end
131
+ end
132
+
133
+ # should show a drop-down for US states
134
+ assert_select('select[name=?]', 'user[state]') do
135
+ assert_select "option[value='']"
136
+ assert_select "option:not([selected])[value=AK]", :text => 'Alaska'
137
+ assert_select "option:not([selected])[value=NY]", :text => 'New York'
138
+ # blank option, 50 states, DC, Puerto Rico == 53 options
139
+ assert_select "option", :count => 53
140
+ end
141
+
142
+ # should show a drop-down for force_blog_posts_to_textile
143
+ assert_select('select[name=?]', 'user[force_blog_posts_to_textile]') do
144
+ assert_select "option[value='']"
145
+ assert_select "option:not([selected])[value=0]", :text => 'false'
146
+ assert_select "option:not([selected])[value=1]", :text => 'true'
147
+ end
148
+
149
+ # should show a select for admin_level
150
+ assert_select("select[name=?]", "user[admin_level]") do
151
+ assert_select("option[value='']", false)
152
+ assert_select "option[value=normal][selected=selected]"
153
+ assert_select "option[value=admin]"
154
+ assert_select "option[value=superuser]"
155
+ end
156
+ end
157
+
158
+ def test_update
159
+ put(
160
+ "/admin/users/#{@user.id}",
161
+ :user => {:username => 'bettie', :force_blog_posts_to_textile => ''}
162
+ )
163
+ @user.reload
164
+
165
+ # should not assign a new random password
166
+ assert_equal(@user.password, 'crocker')
167
+
168
+ # should know the difference between nil and false for force_blog_posts_to_textile
169
+ assert_nil(@user.force_blog_posts_to_textile)
170
+ end
171
+
172
+ def test_update_while_resetting_password
173
+ put(
174
+ "/admin/users/#{@user.id}",
175
+ :user => {:username => 'bettie'}, :reset_password => '1'
176
+ )
177
+
178
+ # should assign a new random password
179
+ @user.reload
180
+ assert_not_equal(@user.password, 'crocker')
181
+ end
182
+ end
@@ -0,0 +1,10 @@
1
+ $: << 'test'
2
+ require 'test_helper'
3
+
4
+ class BlogPostsIntegrationTest < ActionController::IntegrationTest
5
+ def test_create_should_not_be_defined_by_admin_assistant
6
+ assert_raise(AbstractController::ActionNotFound) do
7
+ post "/blog_posts/"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,9 @@
1
+ require 'test_helper'
2
+ require 'rails/performance_test_help'
3
+
4
+ # Profiling results for each test method are written to tmp/performance.
5
+ class BrowsingTest < ActionDispatch::PerformanceTest
6
+ def test_homepage
7
+ get '/'
8
+ end
9
+ end
@@ -0,0 +1,98 @@
1
+ ENV["RAILS_ENV"] = "test"
2
+ require File.expand_path('../../config/environment', __FILE__)
3
+ require 'rails/test_help'
4
+
5
+ class ActiveSupport::TestCase
6
+ def assert_a_tag_with_get_args(
7
+ content, href_base, href_get_args, response_body
8
+ )
9
+ regex = %r|<a href="#{ href_base }\?([^"]*)"[^>]*>#{ content }</a>|
10
+ assert(
11
+ response_body =~ regex,
12
+ "#{response_body.inspect} expected to match #{regex.inspect}"
13
+ )
14
+ assert_get_args_equal( href_get_args, $1.gsub( /&amp;/, '&' ) )
15
+ end
16
+
17
+ def assert_get_args_equal( expected_hash, get_args_string )
18
+ response_h = HashWithIndifferentAccess.new
19
+ CGI::parse( get_args_string ).each do |key, values|
20
+ response_h[key] = values.first
21
+ end
22
+ assert_equal(
23
+ expected_hash.size, response_h.size,
24
+ "<#{ expected_hash.inspect }> expected but was\n<#{ response_h.inspect }>."
25
+ )
26
+ expected_hash.each do |key, value|
27
+ assert_equal( value, response_h[key] )
28
+ end
29
+ end
30
+
31
+ def assert_no_a_tag_with_get_args(
32
+ content, href_base, href_get_args, response_body
33
+ )
34
+ regex = %r|<a href="#{ href_base }\?([^"]*)"[^>]*>#{ content }</a>|
35
+ if response_body =~ regex
36
+ get_args_string = $1.gsub( /&amp;/, '&' )
37
+ response_h = HashWithIndifferentAccess.new
38
+ CGI::parse( get_args_string ).each do |key, values|
39
+ response_h[key] = values.first
40
+ end
41
+ if href_get_args.size == response_h.size
42
+ raise if href_get_args.all? { |key, value|
43
+ response_h[key] == value
44
+ }
45
+ end
46
+ end
47
+ end
48
+
49
+ def random_word( length = 25 )
50
+ letters = 'abcdefghijklmnopqrstuvwxyz_'.split //
51
+ ( 1..length ).to_a.map { letters[rand(letters.size)] }.join( '' )
52
+ end
53
+ end
54
+
55
+ class CacheStoreStub
56
+ def initialize
57
+ flush
58
+ end
59
+
60
+ def expires_in(key)
61
+ @expirations[key.to_s]
62
+ end
63
+
64
+ def flush
65
+ @cache = {}
66
+ @expirations = {}
67
+ @raise_on_write = false
68
+ end
69
+
70
+ def raise_on_write
71
+ @raise_on_write = true
72
+ end
73
+
74
+ def read(key, options = nil)
75
+ @cache[key.to_s]
76
+ end
77
+
78
+ def write(key, value, options = nil)
79
+ raise if @raise_on_write
80
+ @cache[key.to_s] = value
81
+ @expirations[key.to_s] = options[:expires_in]
82
+ end
83
+ end
84
+
85
+ $cache = CacheStoreStub.new
86
+
87
+ module Rails
88
+ mattr_accessor :cache
89
+ self.cache = $cache
90
+ end
91
+
92
+ include Webrat::Methods
93
+ include Webrat::Matchers
94
+
95
+ Webrat.configure do |config|
96
+ config.mode = :rails
97
+ end
98
+
File without changes