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,650 @@
1
+ require File.dirname(__FILE__) + '/abstract_unit'
2
+
3
+ require File.dirname(__FILE__) + '/fixtures/entry'
4
+
5
+ class Movie < ActiveRecord::Base
6
+ end
7
+
8
+
9
+ class FileColumnTest < Test::Unit::TestCase
10
+
11
+ def setup
12
+ # we define the file_columns here so that we can change
13
+ # settings easily in a single test
14
+
15
+ Entry.file_column :image
16
+ Entry.file_column :file
17
+ Movie.file_column :movie
18
+
19
+ clear_validations
20
+ end
21
+
22
+ def teardown
23
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
24
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/movie/"
25
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/my_store_dir/"
26
+ end
27
+
28
+ def test_column_write_method
29
+ assert Entry.new.respond_to?("image=")
30
+ end
31
+
32
+ def test_column_read_method
33
+ assert Entry.new.respond_to?("image")
34
+ end
35
+
36
+ def test_sanitize_filename
37
+ assert_equal "test.jpg", FileColumn::sanitize_filename("test.jpg")
38
+ assert FileColumn::sanitize_filename("../../very_tricky/foo.bar") !~ /[\\\/]/, "slashes not removed"
39
+ assert_equal "__foo", FileColumn::sanitize_filename('`*foo')
40
+ assert_equal "foo.txt", FileColumn::sanitize_filename('c:\temp\foo.txt')
41
+ assert_equal "_.", FileColumn::sanitize_filename(".")
42
+ end
43
+
44
+ def test_default_options
45
+ e = Entry.new
46
+ assert_match %r{/public/entry/image}, e.image_options[:store_dir]
47
+ assert_match %r{/public/entry/image/tmp}, e.image_options[:tmp_base_dir]
48
+ end
49
+
50
+ def test_assign_without_save_with_tempfile
51
+ do_test_assign_without_save(:tempfile)
52
+ end
53
+
54
+ def test_assign_without_save_with_stringio
55
+ do_test_assign_without_save(:stringio)
56
+ end
57
+
58
+ def do_test_assign_without_save(upload_type)
59
+ e = Entry.new
60
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png", upload_type)
61
+ assert e.image.is_a?(String), "#{e.image.inspect} is not a String"
62
+ assert File.exists?(e.image)
63
+ assert FileUtils.identical?(e.image, file_path("skanthak.png"))
64
+ end
65
+
66
+ def test_filename_preserved
67
+ e = Entry.new
68
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "local_filename.jpg")
69
+ assert_equal "local_filename.jpg", File.basename(e.image)
70
+ end
71
+
72
+ def test_filename_stored_in_attribute
73
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
74
+ assert_equal "kerb.jpg", e["image"]
75
+ end
76
+
77
+ def test_extension_added
78
+ e = Entry.new
79
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "local_filename")
80
+ assert_equal "local_filename.jpg", File.basename(e.image)
81
+ assert_equal "local_filename.jpg", e["image"]
82
+ end
83
+
84
+ def test_no_extension_without_content_type
85
+ e = Entry.new
86
+ e.image = uploaded_file(file_path("kerb.jpg"), "something/unknown", "local_filename")
87
+ assert_equal "local_filename", File.basename(e.image)
88
+ assert_equal "local_filename", e["image"]
89
+ end
90
+
91
+ def test_extension_unknown_type
92
+ e = Entry.new
93
+ e.image = uploaded_file(file_path("kerb.jpg"), "not/known", "local_filename")
94
+ assert_equal "local_filename", File.basename(e.image)
95
+ assert_equal "local_filename", e["image"]
96
+ end
97
+
98
+ def test_extension_unknown_type_with_extension
99
+ e = Entry.new
100
+ e.image = uploaded_file(file_path("kerb.jpg"), "not/known", "local_filename.abc")
101
+ assert_equal "local_filename.abc", File.basename(e.image)
102
+ assert_equal "local_filename.abc", e["image"]
103
+ end
104
+
105
+ def test_extension_corrected
106
+ e = Entry.new
107
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "local_filename.jpeg")
108
+ assert_equal "local_filename.jpg", File.basename(e.image)
109
+ assert_equal "local_filename.jpg", e["image"]
110
+ end
111
+
112
+ def test_double_extension
113
+ e = Entry.new
114
+ e.image = uploaded_file(file_path("kerb.jpg"), "application/x-tgz", "local_filename.tar.gz")
115
+ assert_equal "local_filename.tar.gz", File.basename(e.image)
116
+ assert_equal "local_filename.tar.gz", e["image"]
117
+ end
118
+
119
+ FILE_UTILITY = "/usr/bin/file"
120
+
121
+ def test_get_content_type_with_file
122
+ Entry.file_column :image, :file_exec => FILE_UTILITY
123
+
124
+ # run this test only if the machine we are running on
125
+ # has the file utility installed
126
+ if File.executable?(FILE_UTILITY)
127
+ e = Entry.new
128
+ file = FileColumn::TempUploadedFile.new(e, "image")
129
+ file.instance_variable_set :@dir, File.dirname(file_path("kerb.jpg"))
130
+ file.instance_variable_set :@filename, File.basename(file_path("kerb.jpg"))
131
+
132
+ assert_equal "image/jpeg", file.get_content_type
133
+ else
134
+ puts "Warning: Skipping test_get_content_type_with_file test as '#{options[:file_exec]}' does not exist"
135
+ end
136
+ end
137
+
138
+ def test_fix_extension_with_file
139
+ Entry.file_column :image, :file_exec => FILE_UTILITY
140
+
141
+ # run this test only if the machine we are running on
142
+ # has the file utility installed
143
+ if File.executable?(FILE_UTILITY)
144
+ e = Entry.new(:image => uploaded_file(file_path("skanthak.png"), "", "skanthak.jpg"))
145
+
146
+ assert_equal "skanthak.png", File.basename(e.image)
147
+ else
148
+ puts "Warning: Skipping test_fix_extension_with_file test as '#{options[:file_exec]}' does not exist"
149
+ end
150
+ end
151
+
152
+ def test_do_not_fix_file_extensions
153
+ Entry.file_column :image, :fix_file_extensions => false
154
+
155
+ e = Entry.new(:image => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb"))
156
+
157
+ assert_equal "kerb", File.basename(e.image)
158
+ end
159
+
160
+ def test_correct_extension
161
+ e = Entry.new
162
+ file = FileColumn::TempUploadedFile.new(e, "image")
163
+
164
+ assert_equal "filename.jpg", file.correct_extension("filename.jpeg","jpg")
165
+ assert_equal "filename.tar.gz", file.correct_extension("filename.jpg","tar.gz")
166
+ assert_equal "filename.jpg", file.correct_extension("filename.tar.gz","jpg")
167
+ assert_equal "Protokoll_01.09.2005.doc", file.correct_extension("Protokoll_01.09.2005","doc")
168
+ assert_equal "strange.filenames.exist.jpg", file.correct_extension("strange.filenames.exist","jpg")
169
+ assert_equal "another.strange.one.jpg", file.correct_extension("another.strange.one.png","jpg")
170
+ end
171
+
172
+ def test_assign_with_save
173
+ e = Entry.new
174
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
175
+ tmp_file_path = e.image
176
+ assert e.save
177
+ assert File.exists?(e.image)
178
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
179
+ assert_equal "#{e.id}/kerb.jpg", e.image_relative_path
180
+ assert !File.exists?(tmp_file_path), "temporary file '#{tmp_file_path}' not removed"
181
+ assert !File.exists?(File.dirname(tmp_file_path)), "temporary directory '#{File.dirname(tmp_file_path)}' not removed"
182
+
183
+ local_path = e.image
184
+ e = Entry.find(e.id)
185
+ assert_equal local_path, e.image
186
+ end
187
+
188
+ def test_dir_methods
189
+ e = Entry.new
190
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
191
+ e.save
192
+
193
+ assert_equal_paths File.join(RAILS_ROOT, "public", "entry", "image", e.id.to_s), e.image_dir
194
+ assert_equal File.join(e.id.to_s), e.image_relative_dir
195
+ end
196
+
197
+ def test_store_dir_callback
198
+ Entry.file_column :image, {:store_dir => :my_store_dir}
199
+ e = Entry.new
200
+
201
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
202
+ assert e.save
203
+
204
+ assert_equal_paths File.join(RAILS_ROOT, "public", "my_store_dir", e.id), e.image_dir
205
+ end
206
+
207
+ def test_tmp_dir_with_store_dir_callback
208
+ Entry.file_column :image, {:store_dir => :my_store_dir}
209
+ e = Entry.new
210
+ e.image = upload(f("kerb.jpg"))
211
+
212
+ assert_equal File.expand_path(File.join(RAILS_ROOT, "public", "my_store_dir", "tmp")), File.expand_path(File.join(e.image_dir,".."))
213
+ end
214
+
215
+ def test_invalid_store_dir_callback
216
+ Entry.file_column :image, {:store_dir => :my_store_dir_doesnt_exit}
217
+ e = Entry.new
218
+ assert_raise(ArgumentError) {
219
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
220
+ e.save
221
+ }
222
+ end
223
+
224
+ def test_subdir_parameter
225
+ e = Entry.new
226
+ assert_nil e.image("thumb")
227
+ assert_nil e.image_relative_path("thumb")
228
+ assert_nil e.image(nil)
229
+
230
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
231
+
232
+ assert_equal "kerb.jpg", File.basename(e.image("thumb"))
233
+ assert_equal "kerb.jpg", File.basename(e.image_relative_path("thumb"))
234
+
235
+ assert_equal File.join(e.image_dir,"thumb","kerb.jpg"), e.image("thumb")
236
+ assert_match %r{/thumb/kerb\.jpg$}, e.image_relative_path("thumb")
237
+
238
+ assert_equal e.image, e.image(nil)
239
+ assert_equal e.image_relative_path, e.image_relative_path(nil)
240
+ end
241
+
242
+ def test_cleanup_after_destroy
243
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
244
+ assert e.save
245
+ local_path = e.image
246
+ assert File.exists?(local_path)
247
+ assert e.destroy
248
+ assert !File.exists?(local_path), "'#{local_path}' still exists although entry was destroyed"
249
+ assert !File.exists?(File.dirname(local_path))
250
+ end
251
+
252
+ def test_keep_tmp_image
253
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
254
+ e.validation_should_fail = true
255
+ assert !e.save, "e should not save due to validation errors"
256
+ assert File.exists?(local_path = e.image)
257
+ image_temp = e.image_temp
258
+ e = Entry.new("image_temp" => image_temp)
259
+ assert_equal local_path, e.image
260
+ assert e.save
261
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
262
+ end
263
+
264
+ def test_keep_tmp_image_with_existing_image
265
+ e = Entry.new("image" =>uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
266
+ assert e.save
267
+ assert File.exists?(local_path = e.image)
268
+ e = Entry.find(e.id)
269
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
270
+ e.validation_should_fail = true
271
+ assert !e.save
272
+ temp_path = e.image_temp
273
+ e = Entry.find(e.id)
274
+ e.image_temp = temp_path
275
+ assert e.save
276
+
277
+ assert FileUtils.identical?(e.image, file_path("skanthak.png"))
278
+ assert !File.exists?(local_path), "old image has not been deleted"
279
+ end
280
+
281
+ def test_replace_tmp_image_temp_first
282
+ do_test_replace_tmp_image([:image_temp, :image])
283
+ end
284
+
285
+ def test_replace_tmp_image_temp_last
286
+ do_test_replace_tmp_image([:image, :image_temp])
287
+ end
288
+
289
+ def do_test_replace_tmp_image(order)
290
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
291
+ e.validation_should_fail = true
292
+ assert !e.save
293
+ image_temp = e.image_temp
294
+ temp_path = e.image
295
+ new_img = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
296
+ e = Entry.new
297
+ for method in order
298
+ case method
299
+ when :image_temp then e.image_temp = image_temp
300
+ when :image then e.image = new_img
301
+ end
302
+ end
303
+ assert e.save
304
+ assert FileUtils.identical?(e.image, file_path("skanthak.png")), "'#{e.image}' is not the expected 'skanthak.png'"
305
+ assert !File.exists?(temp_path), "temporary file '#{temp_path}' is not cleaned up"
306
+ assert !File.exists?(File.dirname(temp_path)), "temporary directory not cleaned up"
307
+ assert e.image_just_uploaded?
308
+ end
309
+
310
+ def test_replace_image_on_saved_object
311
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
312
+ assert e.save
313
+ old_file = e.image
314
+ e = Entry.find(e.id)
315
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
316
+ assert e.save
317
+ assert FileUtils.identical?(file_path("skanthak.png"), e.image)
318
+ assert old_file != e.image
319
+ assert !File.exists?(old_file), "'#{old_file}' has not been cleaned up"
320
+ end
321
+
322
+ def test_edit_without_touching_image
323
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
324
+ assert e.save
325
+ e = Entry.find(e.id)
326
+ assert e.save
327
+ assert FileUtils.identical?(file_path("kerb.jpg"), e.image)
328
+ end
329
+
330
+ def test_save_without_image
331
+ e = Entry.new
332
+ assert e.save
333
+ e.reload
334
+ assert_nil e.image
335
+ end
336
+
337
+ def test_delete_saved_image
338
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
339
+ assert e.save
340
+ local_path = e.image
341
+ e.image = nil
342
+ assert_nil e.image
343
+ assert File.exists?(local_path), "file '#{local_path}' should not be deleted until transaction is saved"
344
+ assert e.save
345
+ assert_nil e.image
346
+ assert !File.exists?(local_path)
347
+ e.reload
348
+ assert e["image"].blank?
349
+ e = Entry.find(e.id)
350
+ assert_nil e.image
351
+ end
352
+
353
+ def test_delete_tmp_image
354
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
355
+ local_path = e.image
356
+ e.image = nil
357
+ assert_nil e.image
358
+ assert e["image"].blank?
359
+ assert !File.exists?(local_path)
360
+ end
361
+
362
+ def test_delete_nonexistant_image
363
+ e = Entry.new
364
+ e.image = nil
365
+ assert e.save
366
+ assert_nil e.image
367
+ end
368
+
369
+ def test_delete_image_on_non_null_column
370
+ e = Entry.new("file" => upload(f("skanthak.png")))
371
+ assert e.save
372
+
373
+ local_path = e.file
374
+ assert File.exists?(local_path)
375
+ e.file = nil
376
+ assert e.save
377
+ assert !File.exists?(local_path)
378
+ end
379
+
380
+ def test_ie_filename
381
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'c:\images\kerb.jpg'))
382
+ assert e.image_relative_path =~ /^tmp\/[\d\.]+\/kerb\.jpg$/, "relative path '#{e.image_relative_path}' was not as expected"
383
+ assert File.exists?(e.image)
384
+ end
385
+
386
+ def test_just_uploaded?
387
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'c:\images\kerb.jpg'))
388
+ assert e.image_just_uploaded?
389
+ assert e.save
390
+ assert e.image_just_uploaded?
391
+
392
+ e = Entry.new("image" => uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'kerb.jpg'))
393
+ temp_path = e.image_temp
394
+ e = Entry.new("image_temp" => temp_path)
395
+ assert !e.image_just_uploaded?
396
+ assert e.save
397
+ assert !e.image_just_uploaded?
398
+ end
399
+
400
+ def test_empty_tmp
401
+ e = Entry.new
402
+ e.image_temp = ""
403
+ assert_nil e.image
404
+ end
405
+
406
+ def test_empty_tmp_with_image
407
+ e = Entry.new
408
+ e.image_temp = ""
409
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", 'c:\images\kerb.jpg')
410
+ local_path = e.image
411
+ assert File.exists?(local_path)
412
+ e.image_temp = ""
413
+ assert local_path, e.image
414
+ end
415
+
416
+ def test_empty_filename
417
+ e = Entry.new
418
+ assert_equal "", e["file"]
419
+ assert_nil e.file
420
+ assert_nil e["image"]
421
+ assert_nil e.image
422
+ end
423
+
424
+ def test_with_two_file_columns
425
+ e = Entry.new
426
+ e.image = uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg")
427
+ e.file = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
428
+ assert e.save
429
+ assert_match %{/entry/image/}, e.image
430
+ assert_match %{/entry/file/}, e.file
431
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
432
+ assert FileUtils.identical?(e.file, file_path("skanthak.png"))
433
+ end
434
+
435
+ def test_with_two_models
436
+ e = Entry.new(:image => uploaded_file(file_path("kerb.jpg"), "image/jpeg", "kerb.jpg"))
437
+ m = Movie.new(:movie => uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png"))
438
+ assert e.save
439
+ assert m.save
440
+ assert_match %{/entry/image/}, e.image
441
+ assert_match %{/movie/movie/}, m.movie
442
+ assert FileUtils.identical?(e.image, file_path("kerb.jpg"))
443
+ assert FileUtils.identical?(m.movie, file_path("skanthak.png"))
444
+ end
445
+
446
+ def test_no_file_uploaded
447
+ e = Entry.new
448
+ assert_nothing_raised { e.image =
449
+ uploaded_file(nil, "application/octet-stream", "", :stringio) }
450
+ assert_equal nil, e.image
451
+ end
452
+
453
+ # when safari submits a form where no file has been
454
+ # selected, it does not transmit a content-type and
455
+ # the result is an empty string ""
456
+ def test_no_file_uploaded_with_safari
457
+ e = Entry.new
458
+ assert_nothing_raised { e.image = "" }
459
+ assert_equal nil, e.image
460
+ end
461
+
462
+ def test_detect_wrong_encoding
463
+ e = Entry.new
464
+ assert_raise(TypeError) { e.image ="img42.jpg" }
465
+ end
466
+
467
+ def test_serializable_before_save
468
+ e = Entry.new
469
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
470
+ assert_nothing_raised {
471
+ flash = Marshal.dump(e)
472
+ e = Marshal.load(flash)
473
+ }
474
+ assert File.exists?(e.image)
475
+ end
476
+
477
+ def test_should_call_after_upload_on_new_upload
478
+ Entry.file_column :image, :after_upload => [:after_assign]
479
+ e = Entry.new
480
+ e.image = upload(f("skanthak.png"))
481
+ assert e.after_assign_called?
482
+ end
483
+
484
+ def test_should_call_user_after_save_on_save
485
+ e = Entry.new(:image => upload(f("skanthak.png")))
486
+ assert e.save
487
+
488
+ assert_kind_of FileColumn::PermanentUploadedFile, e.send(:image_state)
489
+ assert e.after_save_called?
490
+ end
491
+
492
+
493
+ def test_assign_standard_files
494
+ e = Entry.new
495
+ e.image = File.new(file_path('skanthak.png'))
496
+
497
+ assert_equal 'skanthak.png', File.basename(e.image)
498
+ assert FileUtils.identical?(file_path('skanthak.png'), e.image)
499
+
500
+ assert e.save
501
+ end
502
+
503
+
504
+ def test_validates_filesize
505
+ Entry.validates_filesize_of :image, :in => 50.kilobytes..100.kilobytes
506
+
507
+ e = Entry.new(:image => upload(f("kerb.jpg")))
508
+ assert e.save
509
+
510
+ e.image = upload(f("skanthak.png"))
511
+ assert !e.save
512
+ assert e.errors.invalid?("image")
513
+ end
514
+
515
+ def test_validates_file_format_simple
516
+ e = Entry.new(:image => upload(f("skanthak.png")))
517
+ assert e.save
518
+
519
+ Entry.validates_file_format_of :image, :in => ["jpg"]
520
+
521
+ e.image = upload(f("kerb.jpg"))
522
+ assert e.save
523
+
524
+ e.image = upload(f("mysql.sql"))
525
+ assert !e.save
526
+ assert e.errors.invalid?("image")
527
+
528
+ end
529
+
530
+ def test_validates_image_size
531
+ Entry.validates_image_size :image, :min => "640x480"
532
+
533
+ e = Entry.new(:image => upload(f("kerb.jpg")))
534
+ assert e.save
535
+
536
+ e = Entry.new(:image => upload(f("skanthak.png")))
537
+ assert !e.save
538
+ assert e.errors.invalid?("image")
539
+ end
540
+
541
+ def do_permission_test(uploaded_file, permissions=0641)
542
+ Entry.file_column :image, :permissions => permissions
543
+
544
+ e = Entry.new(:image => uploaded_file)
545
+ assert e.save
546
+
547
+ assert_equal permissions, (File.stat(e.image).mode & 0777)
548
+ end
549
+
550
+ def test_permissions_with_small_file
551
+ do_permission_test upload(f("skanthak.png"), :guess, :stringio)
552
+ end
553
+
554
+ def test_permission_with_big_file
555
+ do_permission_test upload(f("kerb.jpg"))
556
+ end
557
+
558
+ def test_permission_that_overrides_umask
559
+ do_permission_test upload(f("skanthak.png"), :guess, :stringio), 0666
560
+ do_permission_test upload(f("kerb.jpg")), 0666
561
+ end
562
+
563
+ def test_access_with_empty_id
564
+ # an empty id might happen after a clone or through some other
565
+ # strange event. Since we would create a path that contains nothing
566
+ # where the id would have been, we should fail fast with an exception
567
+ # in this case
568
+
569
+ e = Entry.new(:image => upload(f("skanthak.png")))
570
+ assert e.save
571
+ id = e.id
572
+
573
+ e = Entry.find(id)
574
+
575
+ e["id"] = ""
576
+ assert_raise(RuntimeError) { e.image }
577
+
578
+ e = Entry.find(id)
579
+ e["id"] = nil
580
+ assert_raise(RuntimeError) { e.image }
581
+ end
582
+ end
583
+
584
+ # Tests for moving temp dir to permanent dir
585
+ class FileColumnMoveTest < Test::Unit::TestCase
586
+
587
+ def setup
588
+ # we define the file_columns here so that we can change
589
+ # settings easily in a single test
590
+
591
+ Entry.file_column :image
592
+
593
+ end
594
+
595
+ def teardown
596
+ FileUtils.rm_rf File.dirname(__FILE__)+"/public/entry/"
597
+ end
598
+
599
+ def test_should_move_additional_files_from_tmp
600
+ e = Entry.new
601
+ e.image = uploaded_file(file_path("skanthak.png"), "image/png", "skanthak.png")
602
+ FileUtils.cp file_path("kerb.jpg"), File.dirname(e.image)
603
+ assert e.save
604
+ dir = File.dirname(e.image)
605
+ assert File.exists?(File.join(dir, "skanthak.png"))
606
+ assert File.exists?(File.join(dir, "kerb.jpg"))
607
+ end
608
+
609
+ def test_should_move_direcotries_on_save
610
+ e = Entry.new(:image => upload(f("skanthak.png")))
611
+
612
+ FileUtils.mkdir( e.image_dir+"/foo" )
613
+ FileUtils.cp file_path("kerb.jpg"), e.image_dir+"/foo/kerb.jpg"
614
+
615
+ assert e.save
616
+
617
+ assert File.exists?(e.image)
618
+ assert File.exists?(File.dirname(e.image)+"/foo/kerb.jpg")
619
+ end
620
+
621
+ def test_should_overwrite_dirs_with_files_on_reupload
622
+ e = Entry.new(:image => upload(f("skanthak.png")))
623
+
624
+ FileUtils.mkdir( e.image_dir+"/kerb.jpg")
625
+ FileUtils.cp file_path("kerb.jpg"), e.image_dir+"/kerb.jpg/"
626
+ assert e.save
627
+
628
+ e.image = upload(f("kerb.jpg"))
629
+ assert e.save
630
+
631
+ assert File.file?(e.image_dir+"/kerb.jpg")
632
+ end
633
+
634
+ def test_should_overwrite_files_with_dirs_on_reupload
635
+ e = Entry.new(:image => upload(f("skanthak.png")))
636
+
637
+ assert e.save
638
+ assert File.file?(e.image_dir+"/skanthak.png")
639
+
640
+ e.image = upload(f("kerb.jpg"))
641
+ FileUtils.mkdir(e.image_dir+"/skanthak.png")
642
+
643
+ assert e.save
644
+ assert File.file?(e.image_dir+"/kerb.jpg")
645
+ assert !File.file?(e.image_dir+"/skanthak.png")
646
+ assert File.directory?(e.image_dir+"/skanthak.png")
647
+ end
648
+
649
+ end
650
+
@@ -0,0 +1,32 @@
1
+ class Entry < ActiveRecord::Base
2
+ attr_accessor :validation_should_fail
3
+
4
+ def validate
5
+ errors.add("image","some stupid error") if @validation_should_fail
6
+ end
7
+
8
+ def after_assign
9
+ @after_assign_called = true
10
+ end
11
+
12
+ def after_assign_called?
13
+ @after_assign_called
14
+ end
15
+
16
+ def after_save
17
+ @after_save_called = true
18
+ end
19
+
20
+ def after_save_called?
21
+ @after_save_called
22
+ end
23
+
24
+ def my_store_dir
25
+ # not really dynamic but at least it could be...
26
+ "my_store_dir"
27
+ end
28
+
29
+ def load_image_with_rmagick(path)
30
+ Magick::Image::read(path).first
31
+ end
32
+ end
@@ -0,0 +1 @@
1
+ this is certainly not a JPEG image