require File.dirname(__FILE__) + '/../test_helper'
require 'movie'

class MovieTestCase < Test::Unit::TestCase

protected

  def test_for_db_error(error_message, &block)
    begin
      yield
    rescue ActiveRecord::StatementInvalid
      database_threw_error = true
    rescue
      something_else_threw_error = true
    end
    assert !something_else_threw_error, "Wystpi bd w kodzie testowym"
    assert database_threw_error && !something_else_threw_error, error_message
  end

public

  def test_db_no_name
    movie = Movie.new(:rating => 'PG', length_minutes => '10')
    test_for_db_error("Nie zakwestionowano braku nazwy filmu") do
      movie.save!
    end
  end

  def test_db_empty_name
    movie = Movie.new(:name => '', :rating => 'PG', length_minutes => '10')
    test_for_db_error("Nie zakwestionowano pustej nazwy filmu") do
      movie.save!
    end
  end

  def test_db_same_movie
    movie = Movie.new(:name => 'Casablanca', :rating => 'PG', length_minutes => '10')
    movie_dup = movie.clone
    test_for_db_error("Nie zakwestionowano zdublowanej nazwy filmu") do
      movie.save!
      movie_dup.save!
    end 
  end

  def test_db_no_rating
    movie = Movie.new(:name => 'Casablanca', length_minutes => '10')
    test_for_db_error("Nie zakwestionowano braku kryterium wieku") do
      movie.save!
    end 
  end

  def test_db_invalid_rating
    movie = Movie.new(:name => 'Casablanca', :rating => 'Fred', length_minutes => '10')
    test_for_db_error("Nie zakwestionowano niedopuszczalnego kryterium wieku") do
      movie.save!
    end 
  end
   
  def test_db_no_length
    movie = Movie.new(:name => 'Casablanca', :rating => 'PG')
    test_for_db_error("Nie zakwestionowano braku dugoci filmu") do
      movie.save!
    end 
  end

  def test_db_zero_length
    movie = Movie.new(:name => 'Casablanca', :rating => 'PG', :length_minutes => '0')
    test_for_db_error("Nie zakwestionowano zerowej dugoci filmu") do
      movie.save!
    end 
  end

  def test_db_negative_length
    movie = Movie.new(:name => 'Casablanca', :rating => 'PG', :length_minutes => '-10')
    test_for_db_error("Nie zakwestionowano ujemnej dugoci filmu") do
      movie.save!
    end 
  end
end

