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