#!/usr/bin/ruby
 
require 'mpw/mpw'
require 'mpw/item'
require 'test/unit'
require 'yaml'
require 'csv'
 
class TestMPW < Test::Unit::TestCase
	def setup
		fixture_file = './test/files/fixtures.yml'

		wallet_file = 'default.gpg'
		key         = 'test@example.com'
		password    = 'password'

		if defined?(I18n.enforce_available_locales)
			I18n.enforce_available_locales = false
		end

		@mpw      = MPW::MPW.new(key, wallet_file, password)
		@fixtures = YAML.load_file(fixture_file)
	end
 
	def test_00_decrypt_empty_file
		@mpw.read_data
		assert_equal(0, @mpw.list.length)
	end

	def test_01_encrypt_empty_file
		@mpw.read_data
		@mpw.write_data
	end

	def test_02_add_item
		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?)

		@mpw.read_data
		@mpw.add(item)
		@mpw.set_password(item.id, @fixtures['add_new']['password'])

		assert_equal(1, @mpw.list.length)

		item = @mpw.list[0]
		@fixtures['add_new'].each do |k,v|
			if k == 'password'
				assert_equal(v, @mpw.get_password(item.id))
			else
				assert_equal(v, item.send(k).to_s)
			end
		end

		@mpw.write_data
	end

	def test_03_decrypt_file
		@mpw.read_data
		assert_equal(1, @mpw.list.length)

		item = @mpw.list[0]
		@fixtures['add_new'].each do |k,v|
			if k == 'password'
				assert_equal(v, @mpw.get_password(item.id))
			else
				assert_equal(v, item.send(k).to_s)
			end
		end
	end

	def test_04_delete_item
		@mpw.read_data

		assert_equal(1, @mpw.list.length)

		@mpw.list.each do |item|
			item.delete
		end

		assert_equal(0, @mpw.list.length)

		@mpw.write_data
	end

	def test_05_search
		@mpw.read_data

		@fixtures.each_value do |v|
			data = { group:    v['group'],
			         host:     v['host'],
			         protocol: v['protocol'],
			         user:     v['user'],
			         port:     v['port'],
			         comment:  v['comment'],
			       }
			
			item = MPW::Item.new(data)
	
			assert(!item.nil?)
			assert(!item.empty?)
	
			@mpw.add(item)
			@mpw.set_password(item.id, v['password'])
		end

		assert_equal(3, @mpw.list.length)
		assert_equal(1, @mpw.list(group:    @fixtures['add_new']['group']).length)
		assert_equal(1, @mpw.list(pattern:  'existing').length)
		assert_equal(2, @mpw.list(pattern:  'host_[eu]').length)
	end

	def test_06_add_gpg_key
		@mpw.read_data

		@mpw.add_key('test2@example.com')
		assert_equal(2, @mpw.list_keys.length)

		@mpw.write_data
	end

	def test_07_delete_gpg_key
		@mpw.read_data
		assert_equal(2, @mpw.list_keys.length)

		@mpw.delete_key('test2@example.com')
		assert_equal(1, @mpw.list_keys.length)

		@mpw.write_data
	end
end