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

		file_gpg = 'test.gpg'
		key      = ENV['MPW_TEST_KEY']

		puts

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

		File.delete(file_gpg) if File.exist?(file_gpg)

		@mpw      = MPW::MPW.new(file_gpg, key)
		@fixtures = YAML.load_file(fixture_file)
	end
 
 	def test_01_import_yaml
		import_file = 'files/test_import.yml'

		assert(@mpw.import(import_file, :yaml))
		assert_equal(2, @mpw.list.length)

		item = @mpw.list[0]
		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_export_yaml
		import_file = 'files/test_import.yml'
		export_file = 'test_export.yml'

		assert(@mpw.import(import_file))
		assert_equal(2, @mpw.list.length)
		assert(@mpw.export(export_file, :yaml))
		export = YAML::load_file(export_file)
		assert_equal(2, export.length)

		result = export.values[0]
		assert_equal(@fixtures['add_new']['name'],      result['name'])
		assert_equal(@fixtures['add_new']['group'],     result['group'])
		assert_equal(@fixtures['add_new']['host'],      result['host'])
		assert_equal(@fixtures['add_new']['protocol'],  result['protocol'])
		assert_equal(@fixtures['add_new']['user'],      result['user'])
		assert_equal(@fixtures['add_new']['password'],  result['password'])
		assert_equal(@fixtures['add_new']['port'].to_i, result['port'])
		assert_equal(@fixtures['add_new']['comment'],   result['comment'])

		File.unlink(export_file)
	end

	def test_03_import_csv
		import_file = 'files/test_import.csv'

		assert(@mpw.import(import_file, :csv))
		assert_equal(2, @mpw.list.length)

		import = CSV.parse(File.read(import_file), headers: true)

		item = @mpw.list[0]
		assert_equal(import[0]['name'],      item.name)
		assert_equal(import[0]['group'],     item.group)
		assert_equal(import[0]['host'],      item.host)
		assert_equal(import[0]['protocol'],  item.protocol)
		assert_equal(import[0]['user'],      item.user)
		assert_equal(import[0]['password'],  item.password)
		assert_equal(import[0]['port'].to_i, item.port)
		assert_equal(import[0]['comment'],   item.comment)
	end

	def test_04_export_csv
		import_file = 'files/test_import.csv'
		export_file = 'test_export.csv'

		assert(@mpw.import(import_file, :csv))
		assert_equal(2, @mpw.list.length)
		assert(@mpw.export(export_file, :csv))
		export = CSV.parse(File.read(export_file), headers: true)
		assert_equal(2, export.length)

		result = export[0]
		assert_equal(@fixtures['add_new']['name'],     result['name'])
		assert_equal(@fixtures['add_new']['group'],    result['group'])
		assert_equal(@fixtures['add_new']['host'],     result['host'])
		assert_equal(@fixtures['add_new']['protocol'], result['protocol'])
		assert_equal(@fixtures['add_new']['user'],     result['user'])
		assert_equal(@fixtures['add_new']['password'], result['password'])
		assert_equal(@fixtures['add_new']['port'],     result['port'])
		assert_equal(@fixtures['add_new']['comment'],  result['comment'])

		File.unlink(export_file)
	end

	def test_05_add_item
		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(@mpw.add(item))

		assert_equal(1, @mpw.list.length)

		item = @mpw.list[0]
		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_11_encrypt_empty_file
		assert(@mpw.encrypt)	
	end

	def test_12_encrypt
		import_file = 'files/test_import.yml'

		assert(@mpw.import(import_file, :yaml))
		assert_equal(2, @mpw.list.length)

		assert(@mpw.encrypt)	
	end

	def test_13_decrypt_empty_file
		assert(@mpw.decrypt)
		assert_equal(0, @mpw.list.length)
	end

	def test_14_decrypt
		import_file = 'files/test_import.yml'

		assert(@mpw.import(import_file, :yaml))
		assert_equal(2, @mpw.list.length)

		assert(@mpw.encrypt)	

		assert(@mpw.decrypt)
		assert_equal(2, @mpw.list.length)

		item = @mpw.list[0]
		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_15_search
		import_file = 'files/test_import.yml'

		assert(@mpw.import(import_file, :yaml))
		assert_equal(2, @mpw.list.length)

		assert_equal(1, @mpw.list(group:    @fixtures['add_new']['group']).length)
		assert_equal(1, @mpw.list(protocol: @fixtures['add_new']['protocol']).length)
		assert_equal(2, @mpw.list(search:   @fixtures['add_new']['name'][0..-2]).length)
	end
end