kpm 0.7.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.rubocop.yml +138 -0
  4. data/Gemfile +2 -0
  5. data/README.adoc +144 -107
  6. data/Rakefile +2 -1
  7. data/bin/kpm +4 -2
  8. data/kpm.gemspec +11 -8
  9. data/lib/kpm.rb +3 -0
  10. data/lib/kpm/account.rb +268 -338
  11. data/lib/kpm/base_artifact.rb +33 -39
  12. data/lib/kpm/base_installer.rb +69 -83
  13. data/lib/kpm/blob.rb +29 -0
  14. data/lib/kpm/cli.rb +3 -1
  15. data/lib/kpm/coordinates.rb +10 -12
  16. data/lib/kpm/database.rb +94 -113
  17. data/lib/kpm/diagnostic_file.rb +126 -147
  18. data/lib/kpm/formatter.rb +76 -48
  19. data/lib/kpm/inspector.rb +24 -34
  20. data/lib/kpm/installer.rb +53 -46
  21. data/lib/kpm/kaui_artifact.rb +4 -3
  22. data/lib/kpm/killbill_plugin_artifact.rb +10 -7
  23. data/lib/kpm/killbill_server_artifact.rb +13 -12
  24. data/lib/kpm/migrations.rb +26 -11
  25. data/lib/kpm/nexus_helper/actions.rb +52 -9
  26. data/lib/kpm/nexus_helper/cloudsmith_api_calls.rb +83 -0
  27. data/lib/kpm/nexus_helper/github_api_calls.rb +70 -0
  28. data/lib/kpm/nexus_helper/nexus_api_calls_v2.rb +130 -108
  29. data/lib/kpm/nexus_helper/nexus_facade.rb +5 -3
  30. data/lib/kpm/plugins_directory.rb +9 -8
  31. data/lib/kpm/plugins_directory.yml +14 -173
  32. data/lib/kpm/plugins_manager.rb +29 -24
  33. data/lib/kpm/sha1_checker.rb +31 -18
  34. data/lib/kpm/system.rb +104 -135
  35. data/lib/kpm/system_helpers/cpu_information.rb +56 -55
  36. data/lib/kpm/system_helpers/disk_space_information.rb +60 -63
  37. data/lib/kpm/system_helpers/entropy_available.rb +37 -39
  38. data/lib/kpm/system_helpers/memory_information.rb +52 -51
  39. data/lib/kpm/system_helpers/os_information.rb +45 -47
  40. data/lib/kpm/system_helpers/system_proxy.rb +10 -10
  41. data/lib/kpm/tasks.rb +381 -438
  42. data/lib/kpm/tenant_config.rb +68 -83
  43. data/lib/kpm/tomcat_manager.rb +10 -8
  44. data/lib/kpm/trace_logger.rb +18 -16
  45. data/lib/kpm/uninstaller.rb +81 -14
  46. data/lib/kpm/utils.rb +13 -14
  47. data/lib/kpm/version.rb +3 -1
  48. data/packaging/Gemfile +2 -0
  49. data/pom.xml +211 -40
  50. data/spec/kpm/remote/base_artifact_spec.rb +20 -20
  51. data/spec/kpm/remote/base_installer_spec.rb +35 -34
  52. data/spec/kpm/remote/cloudsmith_api_calls_spec.rb +40 -0
  53. data/spec/kpm/remote/github_api_calls_spec.rb +40 -0
  54. data/spec/kpm/remote/installer_spec.rb +80 -79
  55. data/spec/kpm/remote/kaui_artifact_spec.rb +7 -6
  56. data/spec/kpm/remote/killbill_plugin_artifact_spec.rb +25 -30
  57. data/spec/kpm/remote/killbill_server_artifact_spec.rb +17 -16
  58. data/spec/kpm/remote/migrations_spec.rb +12 -11
  59. data/spec/kpm/remote/nexus_facade_spec.rb +32 -28
  60. data/spec/kpm/remote/tenant_config_spec.rb +30 -29
  61. data/spec/kpm/remote/tomcat_manager_spec.rb +4 -3
  62. data/spec/kpm/unit/actions_spec.rb +52 -0
  63. data/spec/kpm/unit/base_artifact_spec.rb +19 -18
  64. data/spec/kpm/unit/cpu_information_spec.rb +67 -0
  65. data/spec/kpm/unit/disk_space_information_spec.rb +47 -0
  66. data/spec/kpm/unit/entropy_information_spec.rb +36 -0
  67. data/spec/kpm/unit/formatter_spec.rb +163 -0
  68. data/spec/kpm/unit/inspector_spec.rb +34 -42
  69. data/spec/kpm/unit/installer_spec.rb +7 -6
  70. data/spec/kpm/unit/memory_information_spec.rb +102 -0
  71. data/spec/kpm/unit/os_information_spec.rb +38 -0
  72. data/spec/kpm/unit/plugins_directory_spec.rb +38 -22
  73. data/spec/kpm/unit/plugins_manager_spec.rb +62 -66
  74. data/spec/kpm/unit/sha1_checker_spec.rb +107 -60
  75. data/spec/kpm/unit/uninstaller_spec.rb +118 -72
  76. data/spec/kpm/unit_mysql/account_spec.rb +127 -142
  77. data/spec/spec_helper.rb +20 -18
  78. data/tasks/package.rake +18 -18
  79. metadata +42 -22
@@ -1,108 +1,154 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe KPM::Uninstaller do
4
-
6
+ let(:destination) { Dir.mktmpdir('uninstaller_spec') }
5
7
  let(:uninstaller) { KPM::Uninstaller.new(destination) }
6
- let(:destination) { 'somedir' }
7
8
 
8
9
  let(:plugins_manager_mock) { double(KPM::PluginsManager) }
9
10
  let(:sha1_checker_mock) { double(KPM::Sha1Checker) }
11
+
12
+ let(:plugin_info) do
13
+ {
14
+ plugin_name: plugin_name,
15
+ plugin_key: plugin_key,
16
+ plugin_path: plugin_path,
17
+ versions: [{ version: version1, :is_default => false, :is_disabled => false, :sha1 => nil }, { version: version2, :is_default => true, :is_disabled => false, :sha1 => nil }],
18
+ type: 'java',
19
+ group_id: 'group',
20
+ artifact_id: 'artifact',
21
+ packaging: 'jar',
22
+ classifier: nil
23
+ }
24
+ end
25
+ let(:plugin_name) { 'plugin-name' }
26
+ let(:plugin_key) { 'plugin-key' }
27
+ let(:plugin_path) { "#{destination}/plugins/java/#{plugin_name}" }
28
+ let(:version1) { '1.0' }
29
+ let(:version2) { '2.0' }
30
+
10
31
  before do
11
- KPM::Inspector.stub_chain(:new, :inspect).and_return(installed_plugins)
12
- KPM::PluginsManager.stub(:new).and_return(plugins_manager_mock)
13
- KPM::Sha1Checker.stub(:from_file).and_return(sha1_checker_mock)
32
+ allow(KPM::PluginsManager).to receive(:new).and_return(plugins_manager_mock)
33
+ allow(KPM::Sha1Checker).to receive(:from_file).and_return(sha1_checker_mock)
34
+
35
+ # Calls by the Inspector
36
+ allow(plugins_manager_mock).to receive(:get_identifier_key_and_entry) do
37
+ [plugin_key, { 'group_id' => plugin_info[:group_id],
38
+ 'artifact_id' => plugin_info[:artifact_id],
39
+ 'packaging' => plugin_info[:packaging] }]
40
+ end
41
+ allow(sha1_checker_mock).to receive(:all_sha1) { {} }
14
42
  end
15
43
 
16
- context 'when plugin is not installed' do
17
- let(:installed_plugins) { {} }
44
+ context 'utility methods' do
45
+ it 'raises an error when directory to delete is invalid' do
46
+ expect do
47
+ uninstaller.send(:validate_dir_for_rmrf, '/home/john')
48
+ end.to raise_error(ArgumentError, 'Path /home/john is not a valid directory')
49
+ end
50
+ it 'raises an error when directory to delete is not safe' do
51
+ expect do
52
+ uninstaller.send(:validate_dir_for_rmrf, '/tmp')
53
+ end.to raise_error(ArgumentError, "Path /tmp is not a subdirectory of #{destination}")
54
+ end
55
+ end
56
+
57
+ context 'when no plugin is installed' do
58
+ it 'raises an error when uninstalling a plugin' do
59
+ expect do
60
+ uninstaller.uninstall_plugin(plugin_name)
61
+ end.to raise_error(StandardError, "No plugin with key/name '#{plugin_name}' found installed. Try running 'kpm inspect' for more info")
62
+ end
18
63
 
19
- it 'raises a plugin not found error' do
20
- expect {
21
- uninstaller.uninstall_plugin('adyen')
22
- }.to raise_error(StandardError, "No plugin with key/name 'adyen' found installed. Try running 'kpm inspect' for more info")
64
+ it 'raises an internal error when uninstalling a plugin' do
65
+ expect do
66
+ uninstaller.send(:remove_plugin_versions, plugin_info, true, [version1, version2])
67
+ end.to raise_error(ArgumentError, "Path #{plugin_info[:plugin_path]}/#{version1} is not a valid directory")
23
68
  end
69
+
70
+ it 'raises an error when uninstalling a plugin version' do
71
+ expect do
72
+ uninstaller.send(:remove_plugin_version, plugin_info, '3.0')
73
+ end.to raise_error(ArgumentError, "Path #{plugin_info[:plugin_path]}/3.0 is not a valid directory")
74
+ end
75
+
76
+ it { expect(uninstaller.send(:categorize_plugins)).to eq({ to_be_deleted: [], to_keep: [] }) }
24
77
  end
25
78
 
26
79
  context 'when plugin is installed' do
27
- let(:installed_plugins) do
28
- {
29
- plugin_name => {
30
- plugin_key: plugin_key,
31
- plugin_path: plugin_path,
32
- versions: [{version: version}],
33
- group_id: 'group',
34
- artifact_id: 'artifact',
35
- packaging: 'jar'
36
- }
37
- }
80
+ before do
81
+ FileUtils.mkdir_p(plugin_version1_path)
82
+ FileUtils.mkdir_p(plugin_version2_path)
83
+ FileUtils.ln_s(plugin_version2_path, Pathname.new(plugin_path).join('SET_DEFAULT'))
84
+ end
85
+ let(:plugin_version1_path) { File.join(plugin_path, version1) }
86
+ let(:plugin_version2_path) { File.join(plugin_path, version2) }
87
+
88
+ it 'looks up a plugin by name' do
89
+ expect(uninstaller.send(:find_plugin, plugin_name)).to eq(plugin_info)
90
+ end
91
+
92
+ it 'looks up a plugin by key' do
93
+ expect(uninstaller.send(:find_plugin, plugin_key)).to eq(plugin_info)
38
94
  end
39
95
 
40
- let(:plugin_name) { 'plugin-name' }
41
- let(:plugin_key) { 'plugin-key' }
42
- let(:plugin_path) { 'plugin-path' }
43
- let(:version) { '1.0' }
96
+ it 'uninstalls if user confirms action' do
97
+ expect(KPM.ui).to receive(:ask).and_return('y')
44
98
 
45
- it 'uninstalls a plugin by name' do
46
- FileUtils.should_receive(:rmtree).with(plugin_path)
47
- plugins_manager_mock.should_receive(:remove_plugin_identifier_key).with(plugin_key)
48
- sha1_checker_mock.should_receive(:remove_entry!).with("group:artifact:jar:#{version}")
99
+ expect(plugins_manager_mock).to receive(:remove_plugin_identifier_key).with(plugin_key)
100
+ expect(sha1_checker_mock).to receive(:remove_entry!).with("group:artifact:jar:#{version1}")
101
+ expect(sha1_checker_mock).to receive(:remove_entry!).with("group:artifact:jar:#{version2}")
49
102
 
50
- uninstaller.uninstall_plugin(plugin_name).should be_true
103
+ expect(uninstaller.uninstall_plugin(plugin_name)).to be_truthy
51
104
  end
52
105
 
53
- it 'uninstalls a plugin by key' do
54
- FileUtils.should_receive(:rmtree).with(plugin_path)
55
- plugins_manager_mock.should_receive(:remove_plugin_identifier_key).with(plugin_key)
56
- sha1_checker_mock.should_receive(:remove_entry!).with("group:artifact:jar:#{version}")
106
+ it 'does nothing if user cancels' do
107
+ expect(KPM.ui).to receive(:ask).and_return('n')
57
108
 
58
- uninstaller.uninstall_plugin(plugin_key).should be_true
109
+ expect(uninstaller.uninstall_plugin(plugin_name)).to be_falsey
59
110
  end
60
- end
61
111
 
62
- context 'when plugin is installed' do
63
- let(:installed_plugins) do
64
- {
65
- plugin_name => {
66
- plugin_key: plugin_key,
67
- plugin_path: plugin_path,
68
- versions: [{version: version1},{version: version2}],
69
- group_id: 'group',
70
- artifact_id: 'artifact',
71
- packaging: 'jar'
72
- }
73
- }
74
- end
75
-
76
- let(:plugin_name) { 'plugin-name' }
77
- let(:plugin_key) { 'plugin-key' }
78
- let(:plugin_path) { 'plugin-path' }
79
- let(:version1) { '1.0' }
80
- let(:version2) { '2.0' }
112
+ it 'uninstalls all plugins without confirmation if the force option is given' do
113
+ expect(plugins_manager_mock).to receive(:remove_plugin_identifier_key).with(plugin_key)
114
+ expect(sha1_checker_mock).to receive(:remove_entry!).with("group:artifact:jar:#{version1}")
115
+ expect(sha1_checker_mock).to receive(:remove_entry!).with("group:artifact:jar:#{version2}")
81
116
 
82
- it 'uninstalls if user confirms action' do
83
- KPM.ui.should_receive(:ask).and_return('y')
117
+ expect(uninstaller.uninstall_plugin(plugin_name, true)).to be_truthy
118
+ end
84
119
 
85
- FileUtils.should_receive(:rmtree).with(plugin_path)
86
- plugins_manager_mock.should_receive(:remove_plugin_identifier_key).with(plugin_key)
87
- sha1_checker_mock.should_receive(:remove_entry!).with("group:artifact:jar:#{version1}")
88
- sha1_checker_mock.should_receive(:remove_entry!).with("group:artifact:jar:#{version2}")
120
+ it 'uninstalls one version without confirmation if the force option is given' do
121
+ expect(sha1_checker_mock).to receive(:remove_entry!).with("group:artifact:jar:#{version1}")
89
122
 
90
- uninstaller.uninstall_plugin(plugin_name).should be_true
123
+ expect(uninstaller.uninstall_plugin(plugin_name, true, version1)).to be_truthy
91
124
  end
92
125
 
93
- it 'does nothing if user cancels' do
94
- KPM.ui.should_receive(:ask).and_return('n')
126
+ it 'raises an error when uninstalling a version that does not exist' do
127
+ expect do
128
+ uninstaller.uninstall_plugin(plugin_name, true, '3.0')
129
+ end.to raise_error(ArgumentError)
130
+ end
95
131
 
96
- uninstaller.uninstall_plugin(plugin_name).should be_false
132
+ it 'categorizes plugins depending on default flag' do
133
+ expect(uninstaller.send(:categorize_plugins)).to eq({ to_be_deleted: [[plugin_info, version1]], to_keep: [[plugin_info, version2]] })
97
134
  end
98
135
 
99
- it 'uninstalls without confirmation if the force option is given' do
100
- FileUtils.should_receive(:rmtree).with(plugin_path)
101
- plugins_manager_mock.should_receive(:remove_plugin_identifier_key).with(plugin_key)
102
- sha1_checker_mock.should_receive(:remove_entry!).with("group:artifact:jar:#{version1}")
103
- sha1_checker_mock.should_receive(:remove_entry!).with("group:artifact:jar:#{version2}")
136
+ it 'does not cleanup if dry-run is set' do
137
+ expect(uninstaller.uninstall_non_default_plugins(true)).to be_falsey
138
+ end
139
+
140
+ it 'does cleanup if dry-run isn\'t set' do
141
+ expect(sha1_checker_mock).to receive(:remove_entry!).with("group:artifact:jar:#{version1}")
142
+
143
+ plugin_info_copy = Marshal.load(Marshal.dump(plugin_info))
144
+ expect(KPM::Inspector.new.inspect(destination)).to eq({ plugin_name => plugin_info_copy })
145
+
146
+ expect(uninstaller.uninstall_non_default_plugins(false)).to be_truthy
147
+ plugin_info_copy[:versions].delete_at(0)
148
+ expect(KPM::Inspector.new.inspect(destination)).to eq({ plugin_name => plugin_info_copy })
104
149
 
105
- uninstaller.uninstall_plugin(plugin_name, true).should be_true
150
+ # Second time is a no-op
151
+ expect(uninstaller.uninstall_non_default_plugins).to be_falsey
106
152
  end
107
153
  end
108
154
  end
@@ -1,51 +1,50 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'spec_helper'
2
4
 
3
5
  describe KPM::Account do
4
-
5
6
  shared_context 'account' do
6
7
  include_context 'connection_setup'
7
8
 
8
- let(:account_class) { described_class.new(nil,[killbill_api_key,killbill_api_secrets],
9
- [killbill_user, killbill_password],url,
10
- db_name, [db_username, db_password],db_host,db_port,nil,logger)}
11
- let(:dummy_account_id) {SecureRandom.uuid}
12
- let(:account_id_invalid) {SecureRandom.uuid}
13
- let(:dummy_data) {
9
+ let(:account_class) do
10
+ described_class.new(nil, [killbill_api_key, killbill_api_secret],
11
+ [killbill_user, killbill_password], url,
12
+ db_name, [db_username, db_password], db_host, db_port, nil, logger)
13
+ end
14
+ let(:dummy_account_id) { SecureRandom.uuid }
15
+ let(:account_id_invalid) { SecureRandom.uuid }
16
+ let(:account_id) { creating_account_with_client }
17
+ let(:dummy_data) do
14
18
  "-- accounts record_id|id|external_key|email|name|first_name_length|currency|billing_cycle_day_local|parent_account_id|is_payment_delegated_to_parent|payment_method_id|time_zone|locale|address1|address2|company_name|city|state_or_province|country|postal_code|phone|notes|migrated|is_notified_for_invoices|created_date|created_by|updated_date|updated_by|tenant_record_id\n"\
15
19
  "5|#{dummy_account_id}|#{dummy_account_id}|willharnet@example.com|Will Harnet||USD|0||||UTC||||Company\\N{VERTICAL LINE}\\N{LINE FEED}Name||||||||false|2017-04-03T15:50:14.000+0000|demo|2017-04-05T15:01:39.000+0000|Killbill::Stripe::PaymentPlugin|2\n"\
16
20
  "-- account_history record_id|id|target_record_id|external_key|email|name|first_name_length|currency|billing_cycle_day_local|parent_account_id|payment_method_id|is_payment_delegated_to_parent|time_zone|locale|address1|address2|company_name|city|state_or_province|country|postal_code|phone|notes|migrated|is_notified_for_invoices|change_type|created_by|created_date|updated_by|updated_date|tenant_record_id\n"\
17
21
  "3|#{SecureRandom.uuid}|5|#{dummy_account_id}|willharnet@example.com|Will Harnet||USD|0||||UTC||||Company\\N{VERTICAL LINE}\\N{LINE FEED}Name||||||||false|INSERT|demo|2017-04-03T15:50:14.000+0000|demo|2017-04-03T15:50:14.000+0000|2\n"
18
- }
19
- let(:cols_names) {dummy_data.split("\n")[0].split(" ")[2]}
20
- let(:cols_data) {dummy_data.split("\n")[1]}
21
- let(:table_name) {dummy_data.split("\n")[0].split(" ")[1]}
22
- let(:obfuscating_marker) {:email}
23
- let(:mysql_cli) {"mysql --user=#{db_username} --password=#{db_password} --host=#{db_host} --port=#{db_port} "}
24
- let(:test_ddl) {Dir["#{Dir.pwd}/**/account_test_ddl.sql"][0]}
25
-
22
+ end
23
+ let(:cols_names) { dummy_data.split("\n")[0].split(' ')[2] }
24
+ let(:cols_data) { dummy_data.split("\n")[1] }
25
+ let(:table_name) { dummy_data.split("\n")[0].split(' ')[1] }
26
+ let(:obfuscating_marker) { :email }
27
+ let(:mysql_cli) { "mysql --user=#{db_username} --password=#{db_password} --host=#{db_host} --port=#{db_port} " }
28
+ let(:test_ddl) { Dir["#{Dir.pwd}/**/account_test_ddl.sql"][0] }
26
29
  end
27
30
 
28
31
  describe '#initialize' do
29
- include_context 'account'
32
+ include_context 'account'
30
33
 
31
34
  context 'when creating an instance of account class' do
32
-
33
35
  it 'when initialized with defaults' do
34
36
  expect(described_class.new).to be_an_instance_of(KPM::Account)
35
37
  end
36
38
 
37
39
  it 'when initialized with options' do
38
- account_class.should be_an_instance_of(KPM::Account)
40
+ expect(account_class).to be_an_instance_of(KPM::Account)
39
41
  expect(account_class.instance_variable_get(:@killbill_api_key)).to eq(killbill_api_key)
40
- expect(account_class.instance_variable_get(:@killbill_api_secrets)).to eq(killbill_api_secrets)
42
+ expect(account_class.instance_variable_get(:@killbill_api_secret)).to eq(killbill_api_secret)
41
43
  expect(account_class.instance_variable_get(:@killbill_user)).to eq(killbill_user)
42
44
  expect(account_class.instance_variable_get(:@killbill_password)).to eq(killbill_password)
43
45
  expect(account_class.instance_variable_get(:@killbill_url)).to eq(url)
44
-
45
46
  end
46
-
47
47
  end
48
-
49
48
  end
50
49
 
51
50
  # export data tests
@@ -53,46 +52,38 @@ describe KPM::Account do
53
52
  include_context 'account'
54
53
 
55
54
  context 'when fetching account from api' do
56
-
57
55
  it 'when account id not found' do
58
- expect{ account_class.send(:fetch_export_data, account_id_invalid) }.to raise_error(Interrupt, 'Account id not found')
56
+ expect { account_class.send(:fetch_export_data, account_id_invalid) }.to raise_error(Interrupt, 'Account id not found')
59
57
  end
60
58
 
61
59
  it 'when account id found' do
62
- account_id = creating_account_with_client
63
60
  expect(account_id).to match(/\w{8}(-\w{4}){3}-\w{12}?/)
64
- expect{ account_class.send(:fetch_export_data, account_id) }.not_to raise_error(Interrupt, 'Account id not found')
61
+ expect { account_class.send(:fetch_export_data, account_id) }.not_to raise_error
65
62
  expect(account_class.send(:fetch_export_data, account_id)).to match(account_id)
66
63
  end
67
-
68
64
  end
69
-
70
65
  end
71
66
 
72
67
  describe '#process_export_data' do
73
68
  include_context 'account'
74
69
 
75
70
  context 'when processing data to export' do
76
-
77
71
  it 'when column name qty eq column data qty' do
78
- expect(account_class.send(:process_export_data, cols_data, table_name, cols_names.split("|")).split("|").size).to eq(cols_names.split("|").size)
72
+ expect(account_class.send(:process_export_data, cols_data, table_name, cols_names.split('|')).split('|').size).to eq(cols_names.split('|').size)
79
73
  end
80
74
 
81
75
  it 'when obfuscating data' do
82
76
  marker_index = 0
83
- cols_names.split("|").each do |col_name|
84
- if col_name.equal?(obfuscating_marker.to_s)
85
- break
86
- end
77
+ cols_names.split('|').each do |col_name|
78
+ break if col_name.equal?(obfuscating_marker.to_s)
79
+
87
80
  marker_index += 1
88
81
  end
89
82
 
90
- obfuscating_marker_data = account_class.send(:process_export_data, cols_data, table_name, cols_names.split("|")).split("|")
83
+ obfuscating_marker_data = account_class.send(:process_export_data, cols_data, table_name, cols_names.split('|')).split('|')
91
84
  expect(obfuscating_marker_data[marker_index]).to be_nil
92
85
  end
93
-
94
86
  end
95
-
96
87
  end
97
88
 
98
89
  describe '#remove_export_data' do
@@ -101,51 +92,42 @@ describe KPM::Account do
101
92
  it 'when obfuscating value' do
102
93
  expect(account_class.send(:remove_export_data, table_name, obfuscating_marker.to_s, 'willharnet@example.com')).to be_nil
103
94
  end
104
-
105
95
  end
106
96
 
107
97
  describe '#export' do
108
98
  include_context 'account'
109
99
 
110
100
  context 'when exporting data' do
111
-
112
101
  it 'when file created' do
113
- expect(File.exist?(account_class.send(:export, dummy_data))).to be_true
102
+ expect(File.exist?(account_class.send(:export, dummy_data))).to be_truthy
114
103
  end
115
104
 
116
105
  it 'when file contains account record' do
117
- expect(File.readlines(account_class.send(:export, dummy_data)).grep(/#{table_name}/)).to be_true
118
- expect(File.readlines(account_class.send(:export, dummy_data)).grep(/#{cols_names}/)).to be_true
106
+ expect(File.readlines(account_class.send(:export, dummy_data)).grep(/#{table_name}/)).to be_truthy
107
+ expect(File.readlines(account_class.send(:export, dummy_data)).grep(/#{cols_names}/)).to be_truthy
119
108
  end
120
-
121
109
  end
122
-
123
110
  end
124
111
 
125
112
  describe '#export_data' do
126
113
  include_context 'account'
127
114
 
128
115
  context 'when exporting data; main method' do
129
-
130
116
  it 'when no account id' do
131
- expect{ account_class.export_data }.to raise_error(Interrupt, 'Account id not found')
117
+ expect { account_class.export_data }.to raise_error(Interrupt, 'Account id not found')
132
118
  end
133
119
 
134
120
  it 'when file created' do
135
- account_id = creating_account_with_client
136
121
  expect(account_id).to match(/\w{8}(-\w{4}){3}-\w{12}?/)
137
- expect(File.exist?(account_class.export_data(account_id))).to be_true
122
+ expect(File.exist?(account_class.export_data(account_id))).to be_truthy
138
123
  end
139
124
 
140
125
  it 'when file contains account record' do
141
- account_id = creating_account_with_client
142
126
  expect(account_id).to match(/\w{8}(-\w{4}){3}-\w{12}?/)
143
- expect(File.readlines(account_class.export_data(account_id)).grep(/#{table_name}/)).to be_true
144
- expect(File.readlines(account_class.export_data(account_id)).grep(/#{cols_names}/)).to be_true
127
+ expect(File.readlines(account_class.export_data(account_id)).grep(/#{table_name}/)).to be_truthy
128
+ expect(File.readlines(account_class.export_data(account_id)).grep(/#{cols_names}/)).to be_truthy
145
129
  end
146
-
147
130
  end
148
-
149
131
  end
150
132
 
151
133
  # import data tests
@@ -153,14 +135,14 @@ describe KPM::Account do
153
135
  include_context 'account'
154
136
 
155
137
  it 'when data delimiter is sniffed as "|"' do
156
- open (dummy_data_file), 'w' do |io|
157
- io.puts(dummy_data)
138
+ File.open(dummy_data_file, 'w') do |io|
139
+ io.puts(dummy_data)
158
140
  end
159
-
141
+
160
142
  expect(account_class.send(:sniff_delimiter, dummy_data_file)).to eq('|')
161
143
  end
162
144
  end
163
-
145
+
164
146
  describe '#fill_empty_column' do
165
147
  include_context 'account'
166
148
 
@@ -173,7 +155,7 @@ describe KPM::Account do
173
155
  include_context 'account'
174
156
 
175
157
  it 'when valid date value' do
176
- expect{DateTime.parse(account_class.send(:fix_dates, '2017-04-05T15:01:39.000+0000'))}.not_to raise_error(ArgumentError)
158
+ expect { DateTime.parse(account_class.send(:fix_dates, '2017-04-05T15:01:39.000+0000')) }.not_to raise_error
177
159
  end
178
160
 
179
161
  it 'when valid date value match YYYY-MM-DD HH:MM:SS' do
@@ -181,7 +163,7 @@ describe KPM::Account do
181
163
  end
182
164
 
183
165
  it 'when invalid date value' do
184
- expect{DateTime.parse(account_class.send(:fix_dates, 'JO'))}.to raise_error(ArgumentError)
166
+ expect { DateTime.parse(account_class.send(:fix_dates, 'JO')) }.to raise_error(ArgumentError)
185
167
  end
186
168
  end
187
169
 
@@ -196,7 +178,6 @@ describe KPM::Account do
196
178
  it 'when false' do
197
179
  expect(account_class.send(:replace_boolean, false)).to eq(0)
198
180
  end
199
-
200
181
  end
201
182
  end
202
183
 
@@ -222,7 +203,6 @@ describe KPM::Account do
222
203
  it 'when field is search_key1 and table bus_events_history' do
223
204
  expect(account_class.send(:replace_account_record_id, 'bus_events_history', 'search_key1', '1')).to eq(:@account_record_id)
224
205
  end
225
-
226
206
  end
227
207
 
228
208
  describe '#replace_tenant_record_id' do
@@ -242,7 +222,6 @@ describe KPM::Account do
242
222
  account_class.instance_variable_set(:@tenant_record_id, 10)
243
223
  expect(account_class.send(:replace_tenant_record_id, 'bus_events_history', 'search_key2', '1')).to eq(10)
244
224
  end
245
-
246
225
  end
247
226
 
248
227
  describe '#replace_uuid' do
@@ -259,19 +238,39 @@ describe KPM::Account do
259
238
  expect(account_class.send(:replace_uuid, table_name, 'other_id', dummy_account_id)).to eq(dummy_account_id)
260
239
  end
261
240
  end
262
-
263
241
  end
264
242
 
265
243
  describe '#sanitize' do
266
244
  include_context 'account'
267
245
 
268
246
  it 'when skip payment method' do
269
- expect(account_class.send(:sanitize, 'payment_methods', 'plugin_name', 'Payment Method',true)).to eq('__EXTERNAL_PAYMENT__')
247
+ expect(account_class.send(:sanitize, 'payment_methods', 'plugin_name', 'Payment Method', true)).to eq('__EXTERNAL_PAYMENT__')
270
248
  end
271
249
  it 'when nothing to sanitize' do
272
- expect(account_class.send(:sanitize, table_name, 'id', dummy_account_id,false)).to eq(dummy_account_id)
250
+ expect(account_class.send(:sanitize, table_name, 'id', dummy_account_id, false)).to eq(dummy_account_id)
251
+ end
252
+ end
253
+
254
+ describe '#sanitize_for_b64_date' do
255
+ include_context 'account'
256
+
257
+ let(:non_encoded_b64) do
258
+ # This is my test data
259
+ 'This is my test data'
260
+ end
261
+
262
+ let(:encoded_b64) do
263
+ # This is my test data
264
+ 'VGhpcyBpcyBteSB0ZXN0IGRhdGE='
265
+ end
266
+
267
+ it 'when b64 encoded data' do
268
+ expect(account_class.send(:b64_decode_if_needed, encoded_b64).value).to start_with('LOAD_FILE("')
273
269
  end
274
270
 
271
+ it 'when b64 non encoded data' do
272
+ expect(account_class.send(:b64_decode_if_needed, non_encoded_b64)).to eq(non_encoded_b64)
273
+ end
275
274
  end
276
275
 
277
276
  describe '#process_import_data' do
@@ -279,153 +278,139 @@ describe KPM::Account do
279
278
 
280
279
  context 'when processing data to import' do
281
280
  it 'when column name qty eq column data qty without record_id' do
282
- account_class.instance_variable_set(:@generate_record_id,true)
283
- expect(account_class.send(:process_import_data, cols_data, table_name, cols_names.split('|'), false, []).size).to eq(cols_names.split("|").size-1)
281
+ account_class.instance_variable_set(:@generate_record_id, true)
282
+ expect(account_class.send(:process_import_data, cols_data, table_name, cols_names.split('|'), false, []).size).to eq(cols_names.split('|').size - 1)
284
283
  end
285
284
  end
286
-
287
285
  end
288
286
 
289
287
  describe '#import_data' do
290
288
  include_context 'account'
291
289
 
292
290
  context 'when data to import; main import method' do
293
-
294
291
  it 'when creating test schema' do
295
292
  db = create_test_schema
296
293
  expect(db).to eq(db_name)
297
294
  end
298
-
295
+
299
296
  it 'when importing data with empty file' do
300
297
  File.new(dummy_data_file, 'w+').close
301
- expect{account_class.import_data(dummy_data_file,nil,true,false,true) }.to raise_error(Interrupt,"Data on #{dummy_data_file} is invalid")
298
+ expect { account_class.import_data(dummy_data_file, nil, true, false, true) }.to raise_error(Interrupt, "Data on #{dummy_data_file} is invalid")
302
299
  File.delete(dummy_data_file)
303
300
  end
304
-
301
+
305
302
  it 'when importing data with no file' do
306
- expect{account_class.import_data(dummy_data_file,nil,true,false,true) }.to raise_error(Interrupt, "File #{dummy_data_file} does not exist")
303
+ expect { account_class.import_data(dummy_data_file, nil, true, false, true) }.to raise_error(Interrupt, "File #{dummy_data_file} does not exist")
307
304
  end
308
-
305
+
309
306
  it 'when importing data with new record_id' do
310
- open (dummy_data_file), 'w' do |io|
307
+ File.open(dummy_data_file, 'w') do |io|
311
308
  io.puts(dummy_data)
312
309
  end
313
- expect{account_class.import_data(dummy_data_file,nil,true,false,true) }.not_to raise_error(Interrupt)
310
+ expect { account_class.import_data(dummy_data_file, nil, true, false, true) }.not_to raise_error
314
311
 
315
312
  verify_data(dummy_account_id)
316
313
 
317
- row_count_inserted = delete_statement('accounts','id',dummy_account_id)
314
+ row_count_inserted = delete_statement('accounts', 'id', dummy_account_id)
318
315
  expect(row_count_inserted).to eq('1')
319
- row_count_inserted = delete_statement('account_history','external_key',dummy_account_id)
316
+ row_count_inserted = delete_statement('account_history', 'external_key', dummy_account_id)
320
317
  expect(row_count_inserted).to eq('1')
321
318
  end
322
319
 
323
320
  it 'when importing data reusing record_id' do
324
- open (dummy_data_file), 'w' do |io|
321
+ File.open(dummy_data_file, 'w') do |io|
325
322
  io.puts(dummy_data)
326
323
  end
327
- expect{account_class.import_data(dummy_data_file,nil,true,false,false) }.not_to raise_error(Interrupt)
324
+ expect { account_class.import_data(dummy_data_file, nil, true, false, false) }.not_to raise_error
328
325
 
329
326
  verify_data(dummy_account_id)
330
327
 
331
- row_count_inserted = delete_statement('accounts','id',dummy_account_id)
328
+ row_count_inserted = delete_statement('accounts', 'id', dummy_account_id)
332
329
  expect(row_count_inserted).to eq('1')
333
- row_count_inserted = delete_statement('account_history','external_key',dummy_account_id)
330
+ row_count_inserted = delete_statement('account_history', 'external_key', dummy_account_id)
334
331
  expect(row_count_inserted).to eq('1')
335
332
  end
336
333
 
337
334
  it 'when importing data with different tenant_record_id' do
338
- open (dummy_data_file), 'w' do |io|
335
+ File.open(dummy_data_file, 'w') do |io|
339
336
  io.puts(dummy_data)
340
337
  end
341
- expect{account_class.import_data(dummy_data_file,10,true,false,true) }.not_to raise_error(Interrupt)
338
+ expect { account_class.import_data(dummy_data_file, 10, true, false, true) }.not_to raise_error
342
339
 
343
340
  verify_data(dummy_account_id)
344
341
 
345
- row_count_inserted = delete_statement('accounts','id',dummy_account_id)
342
+ row_count_inserted = delete_statement('accounts', 'id', dummy_account_id)
346
343
  expect(row_count_inserted).to eq('1')
347
- row_count_inserted = delete_statement('account_history','external_key',dummy_account_id)
344
+ row_count_inserted = delete_statement('account_history', 'external_key', dummy_account_id)
348
345
  expect(row_count_inserted).to eq('1')
349
346
  end
350
347
 
351
348
  it 'when round trip' do
352
- open (dummy_data_file), 'w' do |io|
349
+ File.open(dummy_data_file, 'w') do |io|
353
350
  io.puts(dummy_data)
354
351
  end
355
- expect{account_class.import_data(dummy_data_file,10,true,true,true) }.not_to raise_error(Interrupt)
352
+ expect { account_class.import_data(dummy_data_file, 10, true, true, true) }.not_to raise_error
356
353
  new_account_id = account_class.instance_variable_get(:@tables_id)
357
354
 
358
355
  verify_data(new_account_id['accounts_id'])
359
356
 
360
- row_count_inserted = delete_statement('accounts','id',new_account_id['accounts_id'])
357
+ row_count_inserted = delete_statement('accounts', 'id', new_account_id['accounts_id'])
361
358
  expect(row_count_inserted).to eq('1')
362
- row_count_inserted = delete_statement('account_history','external_key',new_account_id['accounts_id'])
359
+ row_count_inserted = delete_statement('account_history', 'external_key', new_account_id['accounts_id'])
363
360
  expect(row_count_inserted).to eq('1')
364
361
  end
365
-
362
+
366
363
  it 'when droping test schema' do
367
364
  response = drop_test_schema
368
365
  expect(response).to match('')
369
366
  end
370
-
371
367
  end
372
-
373
368
  end
374
-
375
- private
376
- def creating_account_with_client
377
- if $account_id.nil?
378
- KillBillClient.url = url
379
-
380
- options = {
381
- :username => killbill_user,
382
- :password => killbill_password,
383
- :api_key => killbill_api_key,
384
- :api_secret => killbill_api_secrets
385
- }
386
-
387
- account = KillBillClient::Model::Account.new
388
- account.name = 'KPM Account Test'
389
- account.first_name_length = 3
390
- account.external_key = SecureRandom.uuid
391
- account.currency = 'USD'
392
- account = account.create('kpm_account_test', 'kpm_account_test', 'kpm_account_test', options)
393
-
394
- $account_id = account.account_id
395
369
 
396
- end
397
-
398
- $account_id
399
- end
370
+ private
371
+
372
+ def creating_account_with_client
373
+ KillBillClient.url = url
374
+
375
+ options = {
376
+ username: killbill_user,
377
+ password: killbill_password,
378
+ api_key: killbill_api_key,
379
+ api_secret: killbill_api_secret
380
+ }
381
+
382
+ account = KillBillClient::Model::Account.new
383
+ account.name = 'KPM Account Test'
384
+ account.first_name_length = 3
385
+ account.external_key = SecureRandom.uuid
386
+ account.currency = 'USD'
387
+ account = account.create('kpm_account_test', 'kpm_account_test', 'kpm_account_test', options)
388
+
389
+ account.account_id
390
+ end
400
391
 
401
392
  def verify_data(account_id)
402
393
  response = `#{mysql_cli} #{db_name} -e "select company_name FROM accounts WHERE id = '#{account_id}';" 2>&1`
403
394
  response_msg = response.split("\n")
404
395
  company_name = response_msg[response_msg.size - 1]
405
396
 
406
- expect(company_name).to eq("Company|\\nName")
407
- end
397
+ expect(company_name).to eq('Company|\\nName')
398
+ end
408
399
 
409
- def delete_statement(table_name,column_name,account_id)
410
- response = `#{mysql_cli} #{db_name} -e "DELETE FROM #{table_name} WHERE #{column_name} = '#{account_id}'; SELECT ROW_COUNT();" 2>&1`
411
- response_msg = response.split("\n")
412
- row_count_inserted = response_msg[response_msg.size - 1]
413
-
414
- row_count_inserted
415
- end
416
-
417
- def create_test_schema
418
- response = `#{mysql_cli} -e "CREATE DATABASE IF NOT EXISTS #{db_name};"`
419
- response = `#{mysql_cli} #{db_name} < "#{test_ddl}" 2>&1`
420
- response_msg = response.split("\n")
421
- used_database = response_msg[response_msg.size - 1]
422
-
423
- used_database
424
- end
425
-
426
- def drop_test_schema
427
- response = `#{mysql_cli} -e "DROP DATABASE #{db_name};"`;
428
- response
429
- end
400
+ def delete_statement(table_name, column_name, account_id)
401
+ response = `#{mysql_cli} #{db_name} -e "DELETE FROM #{table_name} WHERE #{column_name} = '#{account_id}'; SELECT ROW_COUNT();" 2>&1`
402
+ response_msg = response.split("\n")
403
+ response_msg[response_msg.size - 1]
404
+ end
430
405
 
431
- end
406
+ def create_test_schema
407
+ `#{mysql_cli} -e "CREATE DATABASE IF NOT EXISTS #{db_name};"`
408
+ response = `#{mysql_cli} #{db_name} < "#{test_ddl}" 2>&1`
409
+ response_msg = response.split("\n")
410
+ response_msg[response_msg.size - 1]
411
+ end
412
+
413
+ def drop_test_schema
414
+ `#{mysql_cli} -e "DROP DATABASE #{db_name};"`
415
+ end
416
+ end