diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..141eab1 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,13 @@ +language: ruby +rvm: + - 2.3.1 + - 2.2.5 + - 2.1.10 +install: + - bundle install + - gem install 'test-unit' + - echo 9999 > VERSION + - gem build mpw.gemspec + - gem install mpw-9999.gem +script: + - ruby ./test/tests.rb diff --git a/README.rst b/README.rst index a62c1e2..432b4d8 100644 --- a/README.rst +++ b/README.rst @@ -1,7 +1,8 @@ MPW: Manage your passwords! ******************************************************* +|Build Status| |License| -mpw is a little software which stores your passwords in `GnuPG ` encrypted files. +mpw is a little software which stores your passwords in `GnuPG `_ encrypted files. Features ======== @@ -48,6 +49,8 @@ Output:: Licence |License| ================= -Full license here: `LICENSE ` +Full license here: `LICENSE `_ .. |License| image:: https://img.shields.io/badge/license-GPL--2.0-blue.svg +.. |Build Status| image:: https://travis-ci.org/nishiki/manage-password.svg?branch=master + :target: https://travis-ci.org/nishiki/manage-password diff --git a/test/files/fixtures.yml b/test/files/fixtures.yml index 73eacf7..5651911 100644 --- a/test/files/fixtures.yml +++ b/test/files/fixtures.yml @@ -1,5 +1,4 @@ add_new: - name: 'test_name' group: 'test_group' host: 'test_host' protocol: 'test_protocol' @@ -10,7 +9,6 @@ add_new: add_existing: id: 'TEST-ID-XXXXX' - name: 'test_name_existing' group: 'test_group_existing' host: 'test_host_existing' protocol: 'test_protocol_existing' @@ -21,7 +19,6 @@ add_existing: created: 1386752948 update: - name: 'test_name_update' group: 'test_group_update' host: 'test_host_update' protocol: 'test_protocol_update' @@ -29,4 +26,3 @@ update: password: 'test_password_update' port: '43' comment: 'test_comment_update' - diff --git a/test/files/test_import.csv b/test/files/test_import.csv deleted file mode 100644 index 74c1844..0000000 --- a/test/files/test_import.csv +++ /dev/null @@ -1,3 +0,0 @@ -name,group,protocol,host,user,password,port,comment -test_name,test_group,test_protocol,test_host,test_user,test_password,42,test_comment -test_name_update,test_group_update,test_protocol_update,test_host_update,test_user_update,test_password_update,43,test_comment_update diff --git a/test/files/test_import.yml b/test/files/test_import.yml deleted file mode 100644 index 889a264..0000000 --- a/test/files/test_import.yml +++ /dev/null @@ -1,23 +0,0 @@ ---- -XWas7vpy0HerhOYd: - id: XWas7vpy0HerhOYd - name: test_name - group: test_group - host: test_host - protocol: test_protocol - user: test_user - password: test_password - port: 42 - comment: test_comment - date: 1419858983 -D7URyJENLa91jt0b: - id: D7URyJENLa91jt0b - name: test_name_update - group: test_group_update - host: test_host_update - protocol: test_protocol_update - user: test_user_update - password: test_password_update - port: 43 - comment: test_comment_update - date: 1419858983 diff --git a/test/test.sh b/test/test.sh new file mode 100644 index 0000000..ab37885 --- /dev/null +++ b/test/test.sh @@ -0,0 +1 @@ +echo "test\ntest\n" | ruby ./bin/mpw config --init test@test.com diff --git a/test/test2.rb b/test/test2.rb new file mode 100644 index 0000000..17af2da --- /dev/null +++ b/test/test2.rb @@ -0,0 +1,11 @@ +require 'open3' + +Open3.popen3("./bin/mpw config --init test@test.com") do |stdin, stdout, stderr, thread| + stdin.puts 'test' + stdin.puts 'test' +end + +Open3.popen3("./bin/mpw list") do |stdin, stdout, stderr, thread| + stdin.puts 'test' + puts stdout +end diff --git a/test/test_config.rb b/test/test_config.rb new file mode 100644 index 0000000..3de438c --- /dev/null +++ b/test/test_config.rb @@ -0,0 +1,40 @@ +#!/usr/bin/ruby + +require 'mpw/config' +require 'test/unit' +require 'locale' +require 'i18n' + +class TestConfig < Test::Unit::TestCase + def setup + lang = Locale::Tag.parse(ENV['LANG']).to_simple.to_s[0..1] + + if defined?(I18n.enforce_available_locales) + I18n.enforce_available_locales = true + end + + I18n::Backend::Simple.send(:include, I18n::Backend::Fallbacks) + I18n.load_path = Dir["#{File.expand_path('../../i18n', __FILE__)}/*.yml"] + I18n.default_locale = :en + I18n.locale = lang.to_sym + end + + def test_00_config + data = { key: 'test@example.com', + lang: 'en', + wallet_dir: '/tmp/test', + gpg_exe: '', + } + + @config = MPW::Config.new + @config.setup(data[:key], data[:lang], data[:wallet_dir], data[:gpg_exe]) + @config.load_config + + data.each do |k,v| + assert_equal(v, @config.send(k)) + end + + @config.setup_gpg_key('password', 'test@example.com', 2048) + assert(@config.check_gpg_key?) + end +end diff --git a/test/test_item.rb b/test/test_item.rb index 923d7af..b9f5961 100644 --- a/test/test_item.rb +++ b/test/test_item.rb @@ -1,19 +1,19 @@ #!/usr/bin/ruby -require_relative '../lib/Item' +require 'mpw/item' require 'test/unit' require 'yaml' class TestItem < Test::Unit::TestCase def setup - @fixture_file = 'files/fixtures.yml' + @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.load_path = Dir['./i18n/cli/*.yml'] I18n.default_locale = :en @@ -25,14 +25,12 @@ class TestItem < Test::Unit::TestCase 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'], + 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) @@ -40,27 +38,23 @@ class TestItem < Test::Unit::TestCase 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'], + 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) @@ -69,26 +63,22 @@ class TestItem < Test::Unit::TestCase 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'], + 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) @@ -99,14 +89,12 @@ class TestItem < Test::Unit::TestCase 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'], + 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) @@ -114,12 +102,10 @@ class TestItem < Test::Unit::TestCase 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) @@ -127,39 +113,13 @@ class TestItem < Test::Unit::TestCase 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'], + 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) @@ -172,12 +132,10 @@ class TestItem < Test::Unit::TestCase 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) @@ -185,14 +143,12 @@ class TestItem < Test::Unit::TestCase 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'], + 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) @@ -200,17 +156,15 @@ class TestItem < Test::Unit::TestCase assert(!item.nil?) assert(!item.empty?) - assert(item.delete) + 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) diff --git a/test/test_mpw.rb b/test/test_mpw.rb index 899b366..0c6a25b 100644 --- a/test/test_mpw.rb +++ b/test/test_mpw.rb @@ -1,121 +1,44 @@ #!/usr/bin/ruby -require_relative '../lib/MPW' -require_relative '../lib/Item' +require 'mpw/mpw' +require 'mpw/item' require 'test/unit' require 'yaml' require 'csv' class TestMPW < Test::Unit::TestCase def setup - fixture_file = 'files/fixtures.yml' + fixture_file = './test/files/fixtures.yml' - file_gpg = 'test.gpg' - key = ENV['MPW_TEST_KEY'] - - puts + wallet_file = 'default.gpg' + key = 'test@example.com' + password = 'password' 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) + @mpw = MPW::MPW.new(key, wallet_file, password) @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) + def test_00_decrypt_empty_file + @mpw.read_data + assert_equal(0, @mpw.list.length) 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) + def test_01_encrypt_empty_file + @mpw.read_data + @mpw.write_data 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'], + 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) @@ -123,69 +46,76 @@ class TestMPW < Test::Unit::TestCase assert(!item.nil?) assert(!item.empty?) - assert(@mpw.add(item)) + @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] - 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) + @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_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) + def test_03_decrypt_file + @mpw.read_data + 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) + @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_15_search - import_file = 'files/test_import.yml' + def test_04_delete_item + @mpw.read_data - assert(@mpw.import(import_file, :yaml)) - assert_equal(2, @mpw.list.length) + 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(protocol: @fixtures['add_new']['protocol']).length) - assert_equal(2, @mpw.list(search: @fixtures['add_new']['name'][0..-2]).length) + assert_equal(1, @mpw.list(pattern: 'existing').length) + assert_equal(2, @mpw.list(pattern: 'host_[eu]').length) end end diff --git a/test/tests.rb b/test/tests.rb index d3735f5..b85efc0 100644 --- a/test/tests.rb +++ b/test/tests.rb @@ -1,4 +1,5 @@ #!/usr/bin/ruby -require_relative 'test_mpw.rb' +require_relative 'test_config.rb' require_relative 'test_item.rb' +require_relative 'test_mpw.rb'