spec/kpm/unit_mysql/account_spec.rb in kpm-0.7.2 vs spec/kpm/unit_mysql/account_spec.rb in kpm-0.8.0

- old
+ new

@@ -1,168 +1,150 @@ +# frozen_string_literal: true + require 'spec_helper' describe KPM::Account do - shared_context 'account' do include_context 'connection_setup' - let(:account_class) { described_class.new(nil,[killbill_api_key,killbill_api_secrets], - [killbill_user, killbill_password],url, - db_name, [db_username, db_password],db_host,db_port,nil,logger)} - let(:dummy_account_id) {SecureRandom.uuid} - let(:account_id_invalid) {SecureRandom.uuid} - let(:dummy_data) { + let(:account_class) do + described_class.new(nil, [killbill_api_key, killbill_api_secret], + [killbill_user, killbill_password], url, + db_name, [db_username, db_password], db_host, db_port, nil, logger) + end + let(:dummy_account_id) { SecureRandom.uuid } + let(:account_id_invalid) { SecureRandom.uuid } + let(:account_id) { creating_account_with_client } + let(:dummy_data) do "-- 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"\ "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"\ "-- 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"\ "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" - } - let(:cols_names) {dummy_data.split("\n")[0].split(" ")[2]} - let(:cols_data) {dummy_data.split("\n")[1]} - let(:table_name) {dummy_data.split("\n")[0].split(" ")[1]} - let(:obfuscating_marker) {:email} - let(:mysql_cli) {"mysql --user=#{db_username} --password=#{db_password} --host=#{db_host} --port=#{db_port} "} - let(:test_ddl) {Dir["#{Dir.pwd}/**/account_test_ddl.sql"][0]} - + end + let(:cols_names) { dummy_data.split("\n")[0].split(' ')[2] } + let(:cols_data) { dummy_data.split("\n")[1] } + let(:table_name) { dummy_data.split("\n")[0].split(' ')[1] } + let(:obfuscating_marker) { :email } + let(:mysql_cli) { "mysql --user=#{db_username} --password=#{db_password} --host=#{db_host} --port=#{db_port} " } + let(:test_ddl) { Dir["#{Dir.pwd}/**/account_test_ddl.sql"][0] } end describe '#initialize' do - include_context 'account' + include_context 'account' context 'when creating an instance of account class' do - it 'when initialized with defaults' do expect(described_class.new).to be_an_instance_of(KPM::Account) end it 'when initialized with options' do account_class.should be_an_instance_of(KPM::Account) expect(account_class.instance_variable_get(:@killbill_api_key)).to eq(killbill_api_key) - expect(account_class.instance_variable_get(:@killbill_api_secrets)).to eq(killbill_api_secrets) + expect(account_class.instance_variable_get(:@killbill_api_secret)).to eq(killbill_api_secret) expect(account_class.instance_variable_get(:@killbill_user)).to eq(killbill_user) expect(account_class.instance_variable_get(:@killbill_password)).to eq(killbill_password) expect(account_class.instance_variable_get(:@killbill_url)).to eq(url) - end - end - end # export data tests describe '#fetch_export_data' do include_context 'account' context 'when fetching account from api' do - it 'when account id not found' do - expect{ account_class.send(:fetch_export_data, account_id_invalid) }.to raise_error(Interrupt, 'Account id not found') + expect { account_class.send(:fetch_export_data, account_id_invalid) }.to raise_error(Interrupt, 'Account id not found') end it 'when account id found' do - account_id = creating_account_with_client expect(account_id).to match(/\w{8}(-\w{4}){3}-\w{12}?/) - expect{ account_class.send(:fetch_export_data, account_id) }.not_to raise_error(Interrupt, 'Account id not found') + expect { account_class.send(:fetch_export_data, account_id) }.not_to raise_error(Interrupt, 'Account id not found') expect(account_class.send(:fetch_export_data, account_id)).to match(account_id) end - end - end describe '#process_export_data' do include_context 'account' context 'when processing data to export' do - it 'when column name qty eq column data qty' do - expect(account_class.send(:process_export_data, cols_data, table_name, cols_names.split("|")).split("|").size).to eq(cols_names.split("|").size) + expect(account_class.send(:process_export_data, cols_data, table_name, cols_names.split('|')).split('|').size).to eq(cols_names.split('|').size) end it 'when obfuscating data' do marker_index = 0 - cols_names.split("|").each do |col_name| - if col_name.equal?(obfuscating_marker.to_s) - break - end + cols_names.split('|').each do |col_name| + break if col_name.equal?(obfuscating_marker.to_s) + marker_index += 1 end - obfuscating_marker_data = account_class.send(:process_export_data, cols_data, table_name, cols_names.split("|")).split("|") + obfuscating_marker_data = account_class.send(:process_export_data, cols_data, table_name, cols_names.split('|')).split('|') expect(obfuscating_marker_data[marker_index]).to be_nil end - end - end describe '#remove_export_data' do include_context 'account' it 'when obfuscating value' do expect(account_class.send(:remove_export_data, table_name, obfuscating_marker.to_s, 'willharnet@example.com')).to be_nil end - end describe '#export' do include_context 'account' context 'when exporting data' do - it 'when file created' do expect(File.exist?(account_class.send(:export, dummy_data))).to be_true end it 'when file contains account record' do expect(File.readlines(account_class.send(:export, dummy_data)).grep(/#{table_name}/)).to be_true expect(File.readlines(account_class.send(:export, dummy_data)).grep(/#{cols_names}/)).to be_true end - end - end describe '#export_data' do include_context 'account' context 'when exporting data; main method' do - it 'when no account id' do - expect{ account_class.export_data }.to raise_error(Interrupt, 'Account id not found') + expect { account_class.export_data }.to raise_error(Interrupt, 'Account id not found') end it 'when file created' do - account_id = creating_account_with_client expect(account_id).to match(/\w{8}(-\w{4}){3}-\w{12}?/) expect(File.exist?(account_class.export_data(account_id))).to be_true end it 'when file contains account record' do - account_id = creating_account_with_client expect(account_id).to match(/\w{8}(-\w{4}){3}-\w{12}?/) expect(File.readlines(account_class.export_data(account_id)).grep(/#{table_name}/)).to be_true expect(File.readlines(account_class.export_data(account_id)).grep(/#{cols_names}/)).to be_true end - end - end # import data tests describe '#sniff_delimiter' do include_context 'account' it 'when data delimiter is sniffed as "|"' do - open (dummy_data_file), 'w' do |io| - io.puts(dummy_data) + File.open(dummy_data_file, 'w') do |io| + io.puts(dummy_data) end - + expect(account_class.send(:sniff_delimiter, dummy_data_file)).to eq('|') end end - + describe '#fill_empty_column' do include_context 'account' it 'when empty value' do expect(account_class.send(:fill_empty_column, '')).to eq(:DEFAULT) @@ -171,19 +153,19 @@ describe '#fix_dates' do include_context 'account' it 'when valid date value' do - expect{DateTime.parse(account_class.send(:fix_dates, '2017-04-05T15:01:39.000+0000'))}.not_to raise_error(ArgumentError) + expect { DateTime.parse(account_class.send(:fix_dates, '2017-04-05T15:01:39.000+0000')) }.not_to raise_error(ArgumentError) end it 'when valid date value match YYYY-MM-DD HH:MM:SS' do expect(account_class.send(:fix_dates, '2017-04-05T15:01:39.000+0000')).to match(/^\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}/) end it 'when invalid date value' do - expect{DateTime.parse(account_class.send(:fix_dates, 'JO'))}.to raise_error(ArgumentError) + expect { DateTime.parse(account_class.send(:fix_dates, 'JO')) }.to raise_error(ArgumentError) end end describe '#replace_boolean' do include_context 'account' @@ -194,11 +176,10 @@ end it 'when false' do expect(account_class.send(:replace_boolean, false)).to eq(0) end - end end describe '#replace_account_record_id' do include_context 'account' @@ -220,11 +201,10 @@ end it 'when field is search_key1 and table bus_events_history' do expect(account_class.send(:replace_account_record_id, 'bus_events_history', 'search_key1', '1')).to eq(:@account_record_id) end - end describe '#replace_tenant_record_id' do include_context 'account' @@ -240,11 +220,10 @@ it 'when field is search_key2 and table bus_events_history' do account_class.instance_variable_set(:@tenant_record_id, 10) expect(account_class.send(:replace_tenant_record_id, 'bus_events_history', 'search_key2', '1')).to eq(10) end - end describe '#replace_uuid' do include_context 'account' @@ -257,175 +236,181 @@ it 'when do not replace value' do account_class.instance_variable_set(:@round_trip_export_import, true) expect(account_class.send(:replace_uuid, table_name, 'other_id', dummy_account_id)).to eq(dummy_account_id) end end - end describe '#sanitize' do include_context 'account' it 'when skip payment method' do - expect(account_class.send(:sanitize, 'payment_methods', 'plugin_name', 'Payment Method',true)).to eq('__EXTERNAL_PAYMENT__') + expect(account_class.send(:sanitize, 'payment_methods', 'plugin_name', 'Payment Method', true)).to eq('__EXTERNAL_PAYMENT__') end it 'when nothing to sanitize' do - expect(account_class.send(:sanitize, table_name, 'id', dummy_account_id,false)).to eq(dummy_account_id) + expect(account_class.send(:sanitize, table_name, 'id', dummy_account_id, false)).to eq(dummy_account_id) end + end + describe '#sanitize_for_b64_date' do + include_context 'account' + + let(:non_encoded_b64) do + # This is my test data + 'This is my test data' + end + + let(:encoded_b64) do + # This is my test data + 'VGhpcyBpcyBteSB0ZXN0IGRhdGE=' + end + + it 'when b64 encoded data' do + expect(account_class.send(:b64_decode_if_needed, encoded_b64).value).to start_with('LOAD_FILE("') + end + + it 'when b64 non encoded data' do + expect(account_class.send(:b64_decode_if_needed, non_encoded_b64)).to eq(non_encoded_b64) + end end describe '#process_import_data' do include_context 'account' context 'when processing data to import' do it 'when column name qty eq column data qty without record_id' do - account_class.instance_variable_set(:@generate_record_id,true) - expect(account_class.send(:process_import_data, cols_data, table_name, cols_names.split('|'), false, []).size).to eq(cols_names.split("|").size-1) + account_class.instance_variable_set(:@generate_record_id, true) + expect(account_class.send(:process_import_data, cols_data, table_name, cols_names.split('|'), false, []).size).to eq(cols_names.split('|').size - 1) end end - end describe '#import_data' do include_context 'account' context 'when data to import; main import method' do - it 'when creating test schema' do db = create_test_schema expect(db).to eq(db_name) end - + it 'when importing data with empty file' do File.new(dummy_data_file, 'w+').close - expect{account_class.import_data(dummy_data_file,nil,true,false,true) }.to raise_error(Interrupt,"Data on #{dummy_data_file} is invalid") + expect { account_class.import_data(dummy_data_file, nil, true, false, true) }.to raise_error(Interrupt, "Data on #{dummy_data_file} is invalid") File.delete(dummy_data_file) end - + it 'when importing data with no file' do - expect{account_class.import_data(dummy_data_file,nil,true,false,true) }.to raise_error(Interrupt, "File #{dummy_data_file} does not exist") + expect { account_class.import_data(dummy_data_file, nil, true, false, true) }.to raise_error(Interrupt, "File #{dummy_data_file} does not exist") end - + it 'when importing data with new record_id' do - open (dummy_data_file), 'w' do |io| + File.open(dummy_data_file, 'w') do |io| io.puts(dummy_data) end - expect{account_class.import_data(dummy_data_file,nil,true,false,true) }.not_to raise_error(Interrupt) + expect { account_class.import_data(dummy_data_file, nil, true, false, true) }.not_to raise_error(Interrupt) verify_data(dummy_account_id) - row_count_inserted = delete_statement('accounts','id',dummy_account_id) + row_count_inserted = delete_statement('accounts', 'id', dummy_account_id) expect(row_count_inserted).to eq('1') - row_count_inserted = delete_statement('account_history','external_key',dummy_account_id) + row_count_inserted = delete_statement('account_history', 'external_key', dummy_account_id) expect(row_count_inserted).to eq('1') end it 'when importing data reusing record_id' do - open (dummy_data_file), 'w' do |io| + File.open(dummy_data_file, 'w') do |io| io.puts(dummy_data) end - expect{account_class.import_data(dummy_data_file,nil,true,false,false) }.not_to raise_error(Interrupt) + expect { account_class.import_data(dummy_data_file, nil, true, false, false) }.not_to raise_error(Interrupt) verify_data(dummy_account_id) - row_count_inserted = delete_statement('accounts','id',dummy_account_id) + row_count_inserted = delete_statement('accounts', 'id', dummy_account_id) expect(row_count_inserted).to eq('1') - row_count_inserted = delete_statement('account_history','external_key',dummy_account_id) + row_count_inserted = delete_statement('account_history', 'external_key', dummy_account_id) expect(row_count_inserted).to eq('1') end it 'when importing data with different tenant_record_id' do - open (dummy_data_file), 'w' do |io| + File.open(dummy_data_file, 'w') do |io| io.puts(dummy_data) end - expect{account_class.import_data(dummy_data_file,10,true,false,true) }.not_to raise_error(Interrupt) + expect { account_class.import_data(dummy_data_file, 10, true, false, true) }.not_to raise_error(Interrupt) verify_data(dummy_account_id) - row_count_inserted = delete_statement('accounts','id',dummy_account_id) + row_count_inserted = delete_statement('accounts', 'id', dummy_account_id) expect(row_count_inserted).to eq('1') - row_count_inserted = delete_statement('account_history','external_key',dummy_account_id) + row_count_inserted = delete_statement('account_history', 'external_key', dummy_account_id) expect(row_count_inserted).to eq('1') end it 'when round trip' do - open (dummy_data_file), 'w' do |io| + File.open(dummy_data_file, 'w') do |io| io.puts(dummy_data) end - expect{account_class.import_data(dummy_data_file,10,true,true,true) }.not_to raise_error(Interrupt) + expect { account_class.import_data(dummy_data_file, 10, true, true, true) }.not_to raise_error(Interrupt) new_account_id = account_class.instance_variable_get(:@tables_id) verify_data(new_account_id['accounts_id']) - row_count_inserted = delete_statement('accounts','id',new_account_id['accounts_id']) + row_count_inserted = delete_statement('accounts', 'id', new_account_id['accounts_id']) expect(row_count_inserted).to eq('1') - row_count_inserted = delete_statement('account_history','external_key',new_account_id['accounts_id']) + row_count_inserted = delete_statement('account_history', 'external_key', new_account_id['accounts_id']) expect(row_count_inserted).to eq('1') end - + it 'when droping test schema' do response = drop_test_schema expect(response).to match('') end - end - end - - private - def creating_account_with_client - if $account_id.nil? - KillBillClient.url = url - - options = { - :username => killbill_user, - :password => killbill_password, - :api_key => killbill_api_key, - :api_secret => killbill_api_secrets - } - - account = KillBillClient::Model::Account.new - account.name = 'KPM Account Test' - account.first_name_length = 3 - account.external_key = SecureRandom.uuid - account.currency = 'USD' - account = account.create('kpm_account_test', 'kpm_account_test', 'kpm_account_test', options) - - $account_id = account.account_id - end - - $account_id - end + private + def creating_account_with_client + KillBillClient.url = url + + options = { + username: killbill_user, + password: killbill_password, + api_key: killbill_api_key, + api_secret: killbill_api_secret + } + + account = KillBillClient::Model::Account.new + account.name = 'KPM Account Test' + account.first_name_length = 3 + account.external_key = SecureRandom.uuid + account.currency = 'USD' + account = account.create('kpm_account_test', 'kpm_account_test', 'kpm_account_test', options) + + account.account_id + end + def verify_data(account_id) response = `#{mysql_cli} #{db_name} -e "select company_name FROM accounts WHERE id = '#{account_id}';" 2>&1` response_msg = response.split("\n") company_name = response_msg[response_msg.size - 1] - expect(company_name).to eq("Company|\\nName") - end + expect(company_name).to eq('Company|\\nName') + end - def delete_statement(table_name,column_name,account_id) - response = `#{mysql_cli} #{db_name} -e "DELETE FROM #{table_name} WHERE #{column_name} = '#{account_id}'; SELECT ROW_COUNT();" 2>&1` - response_msg = response.split("\n") - row_count_inserted = response_msg[response_msg.size - 1] - - row_count_inserted - end - - def create_test_schema - response = `#{mysql_cli} -e "CREATE DATABASE IF NOT EXISTS #{db_name};"` - response = `#{mysql_cli} #{db_name} < "#{test_ddl}" 2>&1` - response_msg = response.split("\n") - used_database = response_msg[response_msg.size - 1] - - used_database - end - - def drop_test_schema - response = `#{mysql_cli} -e "DROP DATABASE #{db_name};"`; - response - end + def delete_statement(table_name, column_name, account_id) + response = `#{mysql_cli} #{db_name} -e "DELETE FROM #{table_name} WHERE #{column_name} = '#{account_id}'; SELECT ROW_COUNT();" 2>&1` + response_msg = response.split("\n") + response_msg[response_msg.size - 1] + end -end \ No newline at end of file + def create_test_schema + `#{mysql_cli} -e "CREATE DATABASE IF NOT EXISTS #{db_name};"` + response = `#{mysql_cli} #{db_name} < "#{test_ddl}" 2>&1` + response_msg = response.split("\n") + response_msg[response_msg.size - 1] + end + + def drop_test_schema + `#{mysql_cli} -e "DROP DATABASE #{db_name};"` + end +end