#!/usr/bin/ruby
 
require_relative '../lib/Item'
require 'test/unit'
require 'yaml'
 
class TestItem < Test::Unit::TestCase
	def setup
		@fixture_file = '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 = {name:     @fixtures['add_new']['name'],
		        group:    @fixtures['add_new']['group'],
		        host:     @fixtures['add_new']['host'],
		        protocol: @fixtures['add_new']['protocol'],
		        user:     @fixtures['add_new']['user'],
		        password: @fixtures['add_new']['password'],
		        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']['name'],      item.name)
		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']['password'],  item.password)
		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'],
		        name:     @fixtures['add_existing']['name'],
		        group:    @fixtures['add_existing']['group'],
		        host:     @fixtures['add_existing']['host'],
		        protocol: @fixtures['add_existing']['protocol'],
		        user:     @fixtures['add_existing']['user'],
		        password: @fixtures['add_existing']['password'],
		        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']['name'],      item.name)
		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']['password'],  item.password)
		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 = {name:     @fixtures['add_new']['name'],
		        group:    @fixtures['add_new']['group'],
		        host:     @fixtures['add_new']['host'],
		        protocol: @fixtures['add_new']['protocol'],
		        user:     @fixtures['add_new']['user'],
		        password: @fixtures['add_new']['password'],
		        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 = {name:     @fixtures['update']['name'],
		        group:    @fixtures['update']['group'],
		        host:     @fixtures['update']['host'],
		        protocol: @fixtures['update']['protocol'],
		        user:     @fixtures['update']['user'],
		        password: @fixtures['update']['password'],
		        port:     @fixtures['update']['port'],
		        comment:  @fixtures['update']['comment'],
		       }
		
		sleep(1)
		assert(item.update(data))

		assert(!item.empty?)

		assert_equal(@fixtures['update']['name'],      item.name)
		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']['password'],  item.password)
		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_04_update_with_empty_name
		data = {name:     @fixtures['add_new']['name'],
		        group:    @fixtures['add_new']['group'],
		        host:     @fixtures['add_new']['host'],
		        protocol: @fixtures['add_new']['protocol'],
		        user:     @fixtures['add_new']['user'],
		        password: @fixtures['add_new']['password'],
		        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({name: ''}))

		assert_equal(last_edit, item.last_edit)
	end

	def test_05_update_one_element
		data = {name:     @fixtures['add_new']['name'],
		        group:    @fixtures['add_new']['group'],
		        host:     @fixtures['add_new']['host'],
		        protocol: @fixtures['add_new']['protocol'],
		        user:     @fixtures['add_new']['user'],
		        password: @fixtures['add_new']['password'],
		        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']['name'],      item.name)
		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']['password'],  item.password)
		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 = {name:     @fixtures['add_new']['name'],
		        group:    @fixtures['add_new']['group'],
		        host:     @fixtures['add_new']['host'],
		        protocol: @fixtures['add_new']['protocol'],
		        user:     @fixtures['add_new']['user'],
		        password: @fixtures['add_new']['password'],
		        port:     @fixtures['add_new']['port'],
		        comment:  @fixtures['add_new']['comment'],
		       }
		
		item = MPW::Item.new(data)

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

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

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