require 'spec_helper'
require 'shared/shared_examples_spec'

describe "class level API:" do

  describe "translation_model" do

    it "should follow naming conventions" do
      Item.translation_model.should == ItemTranslation
    end

  end

  describe "available_languages" do

    before :each do
      @item  = Item.create
      @provider = Item
    end

    it_should_behave_like "all available_languages providers"

  end

  describe "nr_of_available_languages" do

    describe "with 0 items" do

      it "should return 0" do
        Item.nr_of_available_languages.should == 0
      end

    end

    describe "with 1 item" do

      before :each do
        @l1 = Language.create :code => 'en-US', :name => 'English'
        @l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
        @i1 = Item.create
      end

      describe "and 0 translations" do

        it "should return 0" do
          Item.nr_of_available_languages == 0
        end

      end

      describe "and 1 translation" do

        it "should return 1" do
          ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
          Item.nr_of_available_languages == 1
        end

      end

      describe "and 2 translations" do

        it "should return 2" do
          ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
          ItemTranslation.create :item => @i1, :language => @l2, :name => 'Book', :desc => 'Literature'
          Item.nr_of_available_languages == 2
        end

      end

    end

  end


  describe "translations_complete?" do

    describe "with 0 items" do

      it "should return true" do
        Item.translations_complete?.should be_true
      end

    end

    describe "with 1 item" do

      before :each do
        @i1 = Item.create
        @provider = Item
      end

      describe "and 0 translations" do

        it "should return true" do
          Item.translations_complete?.should be_true
        end

      end

      describe "and 1 translation" do

        it "should return true" do
          l = Language.create :code => 'en-US', :name => 'English'
          ItemTranslation.create :item => @i1, :language => l, :name => 'Book', :desc => 'Literature'
          Item.translations_complete?.should be_true
        end

      end

      describe "and more than 1 translation" do

        it "should return true" do
          l1 = Language.create :code => 'en-US', :name => 'English'
          l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
          ItemTranslation.create :item => @i1, :language => l1, :name => 'Book', :desc => 'Literature'
          ItemTranslation.create :item => @i1, :language => l2, :name => 'Buch', :desc => 'Literatur'
          Item.translations_complete?.should be_true
        end

      end

    end

    describe "with 2 items" do

      before :each do
        @l1 = Language.create :code => 'en-US', :name => 'English'
        @l2 = Language.create :code => 'de-AT', :name => 'Deutsch'
        @i1 = Item.create
        @i2 = Item.create
      end

      describe "and not all items are translated" do

        it "should return false" do
          ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book', :desc => 'Literature'
          ItemTranslation.create :item => @i1, :language => @l2, :name => 'Buch', :desc => 'Literatur'
          Item.translations_complete?.should be_false
        end

      end

      describe "and all items are translated" do

        it "should return true" do
          ItemTranslation.create :item => @i1, :language => @l1, :name => 'Book',  :desc => 'Literature'
          ItemTranslation.create :item => @i1, :language => @l2, :name => 'Buch',  :desc => 'Literatur'
          ItemTranslation.create :item => @i2, :language => @l1, :name => 'Hook',  :desc => 'Tool'
          ItemTranslation.create :item => @i2, :language => @l2, :name => 'Haken', :desc => 'Werkzeug'
          Item.translations_complete?.should be_true
        end

      end

    end

  end

  describe "localizable_properties" do

    it "should return a list of symbols reflecting the localizable properties" do
      Item.localizable_properties.size.should == 2
      Item.localizable_properties.should include(:name)
      Item.localizable_properties.should include(:desc)
    end

  end

end