require "#{File.dirname(__FILE__)}/../test_helper" class PodcastTest < ActionController::IntegrationTest fixtures :users, :programs, :episodes def test_caching quentin = new_session_as('quentin', 'test') # Caching quentin.should_cache_index quentin.should_cache_home_episodes(programs(:bacon_podcast)) quentin.should_cache_episode_list(programs(:bacon_podcast)) quentin.should_cache_single_episode(programs(:bacon_podcast), episodes(:soggy_bacon)) # Expiration quentin.should_expire_upon_change_in_episode(programs(:bacon_podcast), episodes(:soggy_bacon)) quentin.should_expire_upon_change_in_program(programs(:bacon_podcast), episodes(:soggy_bacon)) end def test_feeds program = programs(:bacon_podcast) new_session do |guest| guest.get_transcript(program.to_param, :html) guest.get_transcript(program.to_param, :xml) end end private module PodcastTasks attr_reader :user include Cosinux::PageCacheTest def goes_to_login get login_url assert_response :success end def logs_in_as(login, password) @user = users(login.to_sym) post sessions_url, "login" => login, "password" => password assert_redirected_to home_url end def should_get_program_url(id) get program_url(id) assert_response :success end def should_cache_index assert_cache '/index.html' do get '/' end end def should_cache_home_episodes(program) assert_cache home_episodes_path(program.to_param) end def should_cache_episode_list(program) assert_cache episodes_path(program.to_param) end def should_cache_single_episode(program, episode) assert_cache episode_path(program.to_param, episode.to_param) end def should_expire_upon_change_in_episode(program, episode) assert_expire(episode_path(program.to_param, episode.to_param), formatted_episodes_path(program.to_param, :xml), '/index.html') do |*urls| # Update episode put episode_path(program.to_param, episode.to_param), :episode => {:description => "Now with 50% more bacon!"} end assert_expire(episode_path(program.to_param, episode.to_param), formatted_episodes_path(program.to_param, :xml), '/index.html') do |*urls| delete episode_path(program.to_param, episode.to_param) end end def should_expire_upon_change_in_program(program, episode) # TODO Test create assert_expire(episode_path(program.to_param, episode.to_param), formatted_episodes_path(program.to_param, :xml), '/index.html') do |*urls| # Update program put program_path(program.to_param), :program => {:title => "Cutlery Podcast"} end assert_expire(episode_path(program.to_param, episode.to_param), formatted_episodes_path(program.to_param, :xml), formatted_mpeg4s_path(program.to_param, :xml), formatted_transcripts_path(program.to_param, :xml), '/index.html') do |*urls| delete program_path(program.to_param) end end def get_transcript(program_id, format) get formatted_transcripts_url(program_id, format) assert_response :success end end # Create a session for a user. Block-based. # # new_session do |bob| # bob.go_to_login # ... # end # def new_session open_session do |sess| sess.extend(PodcastTasks) yield sess if block_given? end end # Create a new session and return a user object. # # bob = new_session_as('bob', 'atest') # bob.goes_to_newspaper # bob.publishes_article # bob.wins_pulitzer # def new_session_as(login, password) new_session do |sess| sess.goes_to_login sess.logs_in_as(login, password) yield sess if block_given? end end end