kpm 0.7.2 → 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
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