#!/usr/bin/ruby
 
require 'mpw/item'
require 'test/unit'
require 'yaml'
 
class TestItem < Test::Unit::TestCase
	def setup
		@fixture_file = 'test/files/fixtures.yml'
		@fixtures = YAML.load_file(@fixture_file)
		
		if defined?(I18n.enforce_available_locales)
			I18n.enforce_available_locales = false
		end

		I18n.load_path      = Dir['./i18n/cli/*.yml']
		I18n.default_locale = :en


		puts
	end

	def test_00_add_without_name
		assert_raise(RuntimeError){MPW::Item.new}
	end

	def test_01_add_new
		data = { group:    @fixtures['add_new']['group'],
		         host:     @fixtures['add_new']['host'],
		         protocol: @fixtures['add_new']['protocol'],
		         user:     @fixtures['add_new']['user'],
		         port:     @fixtures['add_new']['port'],
		         comment:  @fixtures['add_new']['comment'],
		       }
		
		item = MPW::Item.new(data)

		assert(!item.nil?)
		assert(!item.empty?)

		assert_equal(@fixtures['add_new']['group'],     item.group)
		assert_equal(@fixtures['add_new']['host'],      item.host)
		assert_equal(@fixtures['add_new']['protocol'],  item.protocol)
		assert_equal(@fixtures['add_new']['user'],      item.user)
		assert_equal(@fixtures['add_new']['port'].to_i, item.port)
		assert_equal(@fixtures['add_new']['comment'],   item.comment)
	end

	def test_02_add_existing
		data = { id:       @fixtures['add_existing']['id'],
		         group:    @fixtures['add_existing']['group'],
		         host:     @fixtures['add_existing']['host'],
		         protocol: @fixtures['add_existing']['protocol'],
		         user:     @fixtures['add_existing']['user'],
		         port:     @fixtures['add_existing']['port'],
		         comment:  @fixtures['add_existing']['comment'],
		         created:  @fixtures['add_existing']['created'],
		       }

		item = MPW::Item.new(data)

		assert(!item.nil?)
		assert(!item.empty?)

		assert_equal(@fixtures['add_existing']['id'],        item.id)
		assert_equal(@fixtures['add_existing']['group'],     item.group)
		assert_equal(@fixtures['add_existing']['host'],      item.host)
		assert_equal(@fixtures['add_existing']['protocol'],  item.protocol)
		assert_equal(@fixtures['add_existing']['user'],      item.user)
		assert_equal(@fixtures['add_existing']['port'].to_i, item.port)
		assert_equal(@fixtures['add_existing']['comment'],   item.comment)
		assert_equal(@fixtures['add_existing']['created'],   item.created)
	end

	def test_03_update
		data = { group:    @fixtures['add_new']['group'],
		         host:     @fixtures['add_new']['host'],
		         protocol: @fixtures['add_new']['protocol'],
		         user:     @fixtures['add_new']['user'],
		         port:     @fixtures['add_new']['port'],
		         comment:  @fixtures['add_new']['comment'],
		       }
		
		item = MPW::Item.new(data)

		assert(!item.nil?)
		assert(!item.empty?)

		created   = item.created
		last_edit = item.last_edit

		data = { group:    @fixtures['update']['group'],
		         host:     @fixtures['update']['host'],
		         protocol: @fixtures['update']['protocol'],
		         user:     @fixtures['update']['user'],
		         port:     @fixtures['update']['port'],
		         comment:  @fixtures['update']['comment'],
		       }
		
		sleep(1)
		assert(item.update(data))

		assert(!item.empty?)

		assert_equal(@fixtures['update']['group'],     item.group)
		assert_equal(@fixtures['update']['host'],      item.host)
		assert_equal(@fixtures['update']['protocol'],  item.protocol)
		assert_equal(@fixtures['update']['user'],      item.user)
		assert_equal(@fixtures['update']['port'].to_i, item.port)
		assert_equal(@fixtures['update']['comment'],   item.comment)

		assert_equal(created, item.created)
		assert_not_equal(last_edit, item.last_edit)
	end

	def test_05_update_one_element
		data = { group:    @fixtures['add_new']['group'],
		         host:     @fixtures['add_new']['host'],
		         protocol: @fixtures['add_new']['protocol'],
		         user:     @fixtures['add_new']['user'],
		         port:     @fixtures['add_new']['port'],
		         comment:  @fixtures['add_new']['comment'],
		       }
		
		item = MPW::Item.new(data)

		assert(!item.nil?)
		assert(!item.empty?)

		last_edit = item.last_edit

		sleep(1)
		assert(item.update({comment: @fixtures['update']['comment']}))

		assert_equal(@fixtures['add_new']['group'],     item.group)
		assert_equal(@fixtures['add_new']['host'],      item.host)
		assert_equal(@fixtures['add_new']['protocol'],  item.protocol)
		assert_equal(@fixtures['add_new']['user'],      item.user)
		assert_equal(@fixtures['add_new']['port'].to_i, item.port)
		assert_equal(@fixtures['update']['comment'],    item.comment)
	
		assert_not_equal(last_edit, item.last_edit)
	end

	def test_05_delete
		data = { group:    @fixtures['add_new']['group'],
		         host:     @fixtures['add_new']['host'],
		         protocol: @fixtures['add_new']['protocol'],
		         user:     @fixtures['add_new']['user'],
		         port:     @fixtures['add_new']['port'],
		         comment:  @fixtures['add_new']['comment'],
		       }
		
		item = MPW::Item.new(data)

		assert(!item.nil?)
		assert(!item.empty?)

		item.delete
		assert(!item.nil?)
		assert(item.empty?)

		assert_equal(nil, item.id)
		assert_equal(nil, item.group)
		assert_equal(nil, item.host)
		assert_equal(nil, item.protocol)
		assert_equal(nil, item.user)
		assert_equal(nil, item.port)
		assert_equal(nil, item.comment)
		assert_equal(nil, item.created)
	end
end