spec/mangopay/dispute_spec.rb in mangopay-3.0.25.pre.alpha.pre.20 vs spec/mangopay/dispute_spec.rb in mangopay-3.0.25

- old
+ new

@@ -1,262 +1,262 @@ -describe MangoPay::Dispute do - -=begin -comment out all Dispute related unit tests please -these require manual actions on our side -and it's infact not suitable like that - - # IMPORTANT NOTE! - # - # Due to the fact the disputes CANNOT be created on user's side, - # a special approach in testing is needed. - # In order to get the tests below pass, a bunch of disputes have - # to be prepared on the API server side - if they're not, you can - # just skip these tests, as they won't pass. - before(:each) do - @disputes = MangoPay::Dispute.fetch({'page' => 1, 'per_page' => 100}) - end - - describe 'FETCH' do - it 'fetches disputes' do - expect(@disputes).to be_kind_of(Array) - expect(@disputes).not_to be_empty - end - it 'fetches a dispute' do - id = @disputes.first['Id'] - dispute = MangoPay::Dispute.fetch(id) - expect(dispute['Id']).to eq(id) - end - end - - describe 'TRANSACTIONS' do - it 'fetches transactions for dispute' do - dispute = @disputes.find { |d| d['DisputeType'] == 'NOT_CONTESTABLE' } - id = dispute['Id'] - transactions = MangoPay::Dispute.transactions(id, {'per_page' => 1}) - expect(transactions).to be_kind_of(Array) - expect(transactions).not_to be_empty - end - end - - describe 'FETCH FOR USER AND WALLET' do - it 'fetches disputes for user' do - dispute = @disputes.find { |d| d['DisputeType'] == 'NOT_CONTESTABLE' } - id = dispute['Id'] - transactions = MangoPay::Dispute.transactions(id, {'per_page' => 1}) - user_id = transactions[0]['AuthorId'] - disputes = MangoPay::Dispute.fetch_for_user(user_id, {'per_page' => 1}) - expect(disputes).to be_kind_of(Array) - expect(disputes).not_to be_empty - end - it 'fetches disputes for wallet' do - dispute = @disputes.find {|disp| disp['InitialTransactionId'] != nil} - expect(dispute).not_to be_nil, "Cannot test fetching disputes for wallet because there's no disputes with transaction ID in the disputes list." - payin = MangoPay::PayIn.fetch(dispute['InitialTransactionId']) - wallet_id = payin['CreditedWalletId'] - disputes = MangoPay::Dispute.fetch_for_wallet(wallet_id, {'per_page' => 1}) - expect(disputes).to be_kind_of(Array) - expect(disputes).not_to be_empty - end - end - - describe 'UPDATE' do - it 'updates a dispute' do - dispute = @disputes.first - id = dispute['Id'] - new_tag = dispute['Tag'] + '.com' - changed_dispute = MangoPay::Dispute.update(id, {Tag: new_tag}) - expect(changed_dispute['Tag']).to eq(new_tag) - end - end - - describe 'FETCH REPUDIATION' do - it 'fetches a repudiation' do - dispute = @disputes.find {|disp| disp['InitialTransactionId'] != nil && disp['DisputeType'] == 'NOT_CONTESTABLE'} - expect(dispute).not_to be_nil, "Cannot test closing dispute because there's no not contestable disputes with transaction ID in the disputes list." - transactions = MangoPay::Dispute.transactions(dispute['Id'], {'per_page' => 1}) - repudiation_id = transactions[0]['Id'] - repudiation = MangoPay::Dispute.fetch_repudiation(repudiation_id) - expect(repudiation['Id']).to eq(repudiation_id) - expect(repudiation['Nature']).to eq('REPUDIATION') - end - end - - describe 'CREATE AND FETCH SETTLEMENT TRANSFER' do - it 'creates and fetches settlement transfer' do - dispute = @disputes.find {|disp| disp['Status'] == 'CLOSED' && disp['DisputeType'] == 'NOT_CONTESTABLE'} - expect(dispute).not_to be_nil, "Cannot test creating settlement transfer because there's no closed, not contestable disputes in the disputes list." - transactions = MangoPay::Dispute.transactions(dispute['Id'], {'per_page' => 1}) - repudiation_id = transactions[0]['Id'] - repudiation = MangoPay::Dispute.fetch_repudiation(repudiation_id) - params = { - AuthorId: repudiation['AuthorId'], - DebitedFunds: {Currency: 'EUR', Amount: 1}, - Fees: {Currency: 'EUR', Amount: 0}, - Tag: 'Custom tag data' - } - - transfer = MangoPay::Dispute.create_settlement_transfer(repudiation_id, params) - expect(transfer['Type']).to eq('TRANSFER') - expect(transfer['Nature']).to eq('SETTLEMENT') - - fetched_transfer = MangoPay::Dispute.fetch_settlement_transfer(transfer['Id']) - expect(fetched_transfer['Id']).to eq(transfer['Id']) - expect(fetched_transfer['CreationDate']).to eq(transfer['CreationDate']) - end - end - - describe 'DISPUTE DOCUMENTS API' do - - def find_dispute - dispute = @disputes.find {|disp| ['PENDING_CLIENT_ACTION', 'REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status'])} - expect(dispute).not_to be_nil, "Cannot test dispute document API because there's no dispute with expected status in the disputes list." - dispute - end - - def create_doc(dispute = nil) - no_dispute_passed = dispute.nil? - dispute = find_dispute if no_dispute_passed - params = { Type: 'DELIVERY_PROOF', Tag: 'Custom tag data' } - doc = MangoPay::Dispute.create_document(dispute['Id'], params) - doc['dispute'] = dispute if no_dispute_passed # add it for testing purposes - doc - end - - it 'creates dispute document' do - doc = create_doc - expect(doc['Type']).to eq('DELIVERY_PROOF') - expect(doc['Tag']).to eq('Custom tag data') - expect(doc['Status']).to eq('CREATED') - end - - it 'fetches dispute document' do - created_doc = create_doc - fetched_doc = MangoPay::Dispute.fetch_document(created_doc['Id']) - fields = ['Id', 'Type', 'Tag', 'Status', 'CreationDate', 'RefusedReasonType', 'RefusedReasonMessage'] - fields.each do |field| - expect(fetched_doc[field]).to eq(created_doc[field]) - end - end - - it 'updates dispute document' do - created_doc = create_doc - changed_doc = MangoPay::Dispute.update_document(created_doc['dispute']['Id'], created_doc['Id'], { - Status: 'VALIDATION_ASKED' - }) - expect(changed_doc['Id']).to eq(created_doc['Id']) - expect(changed_doc['Status']).to eq('VALIDATION_ASKED') - end - - it 'fetches a list of documents' do - disp = @disputes.find {|disp| disp['Status'] == 'SUBMITTED'} - disp = test_contest_dispute if disp == nil - expect(disp).not_to be_nil, "Cannot test fetching dispute documents because there's no dispute with expected status in the disputes list." - - doc1 = create_doc(disp) - doc2 = create_doc(disp) # for the same dispute - - filters = {'per_page' => 2, 'sort' => 'CreationDate:desc'} - - # fetch last 2 docs for the dispute - docs = MangoPay::Dispute.fetch_documents(disp['Id'], filters) - expect(docs).to be_kind_of(Array) - expect(docs.count).to eq 2 # exactly 2 as pagiantion requested - # all 2 are at top as lastly created - # but may share the same CreationDate - # so the order between them is undetermined - expect(docs).to include(doc1, doc2) - - # fetch all docs ever - docs = MangoPay::Dispute.fetch_documents() - expect(docs).to be_kind_of(Array) - expect(docs.count).to be >= 2 - - # fetch last 2 docs ever (sorting by date descending) - docs = MangoPay::Dispute.fetch_documents(nil, filters) - expect(docs).to be_kind_of(Array) - expect(docs.count).to eq 2 # exactly 2 as pagiantion requested - expect(docs).to include(doc1, doc2) - end - - def create_doc_page(file) - disp = find_dispute - doc = create_doc(disp) - MangoPay::Dispute.create_document_page(disp['Id'], doc['Id'], file) - end - - it 'create_document_page accepts Base64 encoded file content' do - fnm = __FILE__.sub('.rb', '.png') - bts = File.open(fnm, 'rb') { |f| f.read } - b64 = Base64.encode64(bts) - ret = create_doc_page(b64) - expect(ret).to be_nil - end - - it 'create_document_page accepts file path' do - fnm = __FILE__.sub('.rb', '.png') - disp = find_dispute - doc = create_doc(disp) - ret = MangoPay::Dispute.create_document_page(disp['Id'], doc['Id'], nil, fnm) - expect(ret).to be_nil - end - - it 'create_document_page fails when input string is not base64-encoded' do - file = 'any file content...' - expect { create_doc_page(file) }.to raise_error { |err| - expect(err).to be_a MangoPay::ResponseError - expect(err.code).to eq '400' - expect(err.type).to eq 'param_error' - } - end - end - - def test_contest_dispute - dispute = @disputes.find do |disp| - ['PENDING_CLIENT_ACTION', 'REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status']) && - ['CONTESTABLE', 'RETRIEVAL'].include?(disp['DisputeType']) - end - expect(dispute).not_to be_nil, "Cannot test contesting dispute because there's no available disputes with expected status and type in the disputes list." - id = dispute['Id'] - contested_funds = dispute['Status'] == 'PENDING_CLIENT_ACTION' ? { Amount: 10, Currency: 'EUR' } : nil; - changed_dispute = MangoPay::Dispute.contest(id, contested_funds) - expect(changed_dispute['Id']).to eq(id) - expect(changed_dispute['Status']).to eq('SUBMITTED') - changed_dispute - end - - describe 'CONTEST' do - it 'contests a dispute' do - test_contest_dispute - end - end - - describe 'RESUBMIT' do - it 'resubmits a dispute' do - dispute = @disputes.find do |disp| - ['REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status']) - end - expect(dispute).not_to be_nil, "Cannot test resubmiting dispute because there's no available disputes with expected status in the disputes list." - id = dispute['Id'] - changed_dispute = MangoPay::Dispute.resubmit(id) - expect(changed_dispute['Id']).to eq(id) - expect(changed_dispute['Status']).to eq('SUBMITTED') - end - end - - describe 'CLOSE' do - it 'closes a dispute' do - dispute = @disputes.find do |disp| - ['PENDING_CLIENT_ACTION', 'REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status']) && - ['CONTESTABLE', 'RETRIEVAL'].include?(disp['DisputeType']) - end - expect(dispute).not_to be_nil, "Cannot test closing dispute because there's no available disputes with expected status in the disputes list." - id = dispute['Id'] - changed_dispute = MangoPay::Dispute.close(id) - expect(changed_dispute['Id']).to eq(id) - expect(changed_dispute['Status']).to eq('CLOSED') - end - end - -=end - -end +describe MangoPay::Dispute do + +=begin +comment out all Dispute related unit tests please +these require manual actions on our side +and it's infact not suitable like that + + # IMPORTANT NOTE! + # + # Due to the fact the disputes CANNOT be created on user's side, + # a special approach in testing is needed. + # In order to get the tests below pass, a bunch of disputes have + # to be prepared on the API server side - if they're not, you can + # just skip these tests, as they won't pass. + before(:each) do + @disputes = MangoPay::Dispute.fetch({'page' => 1, 'per_page' => 100}) + end + + describe 'FETCH' do + it 'fetches disputes' do + expect(@disputes).to be_kind_of(Array) + expect(@disputes).not_to be_empty + end + it 'fetches a dispute' do + id = @disputes.first['Id'] + dispute = MangoPay::Dispute.fetch(id) + expect(dispute['Id']).to eq(id) + end + end + + describe 'TRANSACTIONS' do + it 'fetches transactions for dispute' do + dispute = @disputes.find { |d| d['DisputeType'] == 'NOT_CONTESTABLE' } + id = dispute['Id'] + transactions = MangoPay::Dispute.transactions(id, {'per_page' => 1}) + expect(transactions).to be_kind_of(Array) + expect(transactions).not_to be_empty + end + end + + describe 'FETCH FOR USER AND WALLET' do + it 'fetches disputes for user' do + dispute = @disputes.find { |d| d['DisputeType'] == 'NOT_CONTESTABLE' } + id = dispute['Id'] + transactions = MangoPay::Dispute.transactions(id, {'per_page' => 1}) + user_id = transactions[0]['AuthorId'] + disputes = MangoPay::Dispute.fetch_for_user(user_id, {'per_page' => 1}) + expect(disputes).to be_kind_of(Array) + expect(disputes).not_to be_empty + end + it 'fetches disputes for wallet' do + dispute = @disputes.find {|disp| disp['InitialTransactionId'] != nil} + expect(dispute).not_to be_nil, "Cannot test fetching disputes for wallet because there's no disputes with transaction ID in the disputes list." + payin = MangoPay::PayIn.fetch(dispute['InitialTransactionId']) + wallet_id = payin['CreditedWalletId'] + disputes = MangoPay::Dispute.fetch_for_wallet(wallet_id, {'per_page' => 1}) + expect(disputes).to be_kind_of(Array) + expect(disputes).not_to be_empty + end + end + + describe 'UPDATE' do + it 'updates a dispute' do + dispute = @disputes.first + id = dispute['Id'] + new_tag = dispute['Tag'] + '.com' + changed_dispute = MangoPay::Dispute.update(id, {Tag: new_tag}) + expect(changed_dispute['Tag']).to eq(new_tag) + end + end + + describe 'FETCH REPUDIATION' do + it 'fetches a repudiation' do + dispute = @disputes.find {|disp| disp['InitialTransactionId'] != nil && disp['DisputeType'] == 'NOT_CONTESTABLE'} + expect(dispute).not_to be_nil, "Cannot test closing dispute because there's no not contestable disputes with transaction ID in the disputes list." + transactions = MangoPay::Dispute.transactions(dispute['Id'], {'per_page' => 1}) + repudiation_id = transactions[0]['Id'] + repudiation = MangoPay::Dispute.fetch_repudiation(repudiation_id) + expect(repudiation['Id']).to eq(repudiation_id) + expect(repudiation['Nature']).to eq('REPUDIATION') + end + end + + describe 'CREATE AND FETCH SETTLEMENT TRANSFER' do + it 'creates and fetches settlement transfer' do + dispute = @disputes.find {|disp| disp['Status'] == 'CLOSED' && disp['DisputeType'] == 'NOT_CONTESTABLE'} + expect(dispute).not_to be_nil, "Cannot test creating settlement transfer because there's no closed, not contestable disputes in the disputes list." + transactions = MangoPay::Dispute.transactions(dispute['Id'], {'per_page' => 1}) + repudiation_id = transactions[0]['Id'] + repudiation = MangoPay::Dispute.fetch_repudiation(repudiation_id) + params = { + AuthorId: repudiation['AuthorId'], + DebitedFunds: {Currency: 'EUR', Amount: 1}, + Fees: {Currency: 'EUR', Amount: 0}, + Tag: 'Custom tag data' + } + + transfer = MangoPay::Dispute.create_settlement_transfer(repudiation_id, params) + expect(transfer['Type']).to eq('TRANSFER') + expect(transfer['Nature']).to eq('SETTLEMENT') + + fetched_transfer = MangoPay::Dispute.fetch_settlement_transfer(transfer['Id']) + expect(fetched_transfer['Id']).to eq(transfer['Id']) + expect(fetched_transfer['CreationDate']).to eq(transfer['CreationDate']) + end + end + + describe 'DISPUTE DOCUMENTS API' do + + def find_dispute + dispute = @disputes.find {|disp| ['PENDING_CLIENT_ACTION', 'REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status'])} + expect(dispute).not_to be_nil, "Cannot test dispute document API because there's no dispute with expected status in the disputes list." + dispute + end + + def create_doc(dispute = nil) + no_dispute_passed = dispute.nil? + dispute = find_dispute if no_dispute_passed + params = { Type: 'DELIVERY_PROOF', Tag: 'Custom tag data' } + doc = MangoPay::Dispute.create_document(dispute['Id'], params) + doc['dispute'] = dispute if no_dispute_passed # add it for testing purposes + doc + end + + it 'creates dispute document' do + doc = create_doc + expect(doc['Type']).to eq('DELIVERY_PROOF') + expect(doc['Tag']).to eq('Custom tag data') + expect(doc['Status']).to eq('CREATED') + end + + it 'fetches dispute document' do + created_doc = create_doc + fetched_doc = MangoPay::Dispute.fetch_document(created_doc['Id']) + fields = ['Id', 'Type', 'Tag', 'Status', 'CreationDate', 'RefusedReasonType', 'RefusedReasonMessage'] + fields.each do |field| + expect(fetched_doc[field]).to eq(created_doc[field]) + end + end + + it 'updates dispute document' do + created_doc = create_doc + changed_doc = MangoPay::Dispute.update_document(created_doc['dispute']['Id'], created_doc['Id'], { + Status: 'VALIDATION_ASKED' + }) + expect(changed_doc['Id']).to eq(created_doc['Id']) + expect(changed_doc['Status']).to eq('VALIDATION_ASKED') + end + + it 'fetches a list of documents' do + disp = @disputes.find {|disp| disp['Status'] == 'SUBMITTED'} + disp = test_contest_dispute if disp == nil + expect(disp).not_to be_nil, "Cannot test fetching dispute documents because there's no dispute with expected status in the disputes list." + + doc1 = create_doc(disp) + doc2 = create_doc(disp) # for the same dispute + + filters = {'per_page' => 2, 'sort' => 'CreationDate:desc'} + + # fetch last 2 docs for the dispute + docs = MangoPay::Dispute.fetch_documents(disp['Id'], filters) + expect(docs).to be_kind_of(Array) + expect(docs.count).to eq 2 # exactly 2 as pagiantion requested + # all 2 are at top as lastly created + # but may share the same CreationDate + # so the order between them is undetermined + expect(docs).to include(doc1, doc2) + + # fetch all docs ever + docs = MangoPay::Dispute.fetch_documents() + expect(docs).to be_kind_of(Array) + expect(docs.count).to be >= 2 + + # fetch last 2 docs ever (sorting by date descending) + docs = MangoPay::Dispute.fetch_documents(nil, filters) + expect(docs).to be_kind_of(Array) + expect(docs.count).to eq 2 # exactly 2 as pagiantion requested + expect(docs).to include(doc1, doc2) + end + + def create_doc_page(file) + disp = find_dispute + doc = create_doc(disp) + MangoPay::Dispute.create_document_page(disp['Id'], doc['Id'], file) + end + + it 'create_document_page accepts Base64 encoded file content' do + fnm = __FILE__.sub('.rb', '.png') + bts = File.open(fnm, 'rb') { |f| f.read } + b64 = Base64.encode64(bts) + ret = create_doc_page(b64) + expect(ret).to be_nil + end + + it 'create_document_page accepts file path' do + fnm = __FILE__.sub('.rb', '.png') + disp = find_dispute + doc = create_doc(disp) + ret = MangoPay::Dispute.create_document_page(disp['Id'], doc['Id'], nil, fnm) + expect(ret).to be_nil + end + + it 'create_document_page fails when input string is not base64-encoded' do + file = 'any file content...' + expect { create_doc_page(file) }.to raise_error { |err| + expect(err).to be_a MangoPay::ResponseError + expect(err.code).to eq '400' + expect(err.type).to eq 'param_error' + } + end + end + + def test_contest_dispute + dispute = @disputes.find do |disp| + ['PENDING_CLIENT_ACTION', 'REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status']) && + ['CONTESTABLE', 'RETRIEVAL'].include?(disp['DisputeType']) + end + expect(dispute).not_to be_nil, "Cannot test contesting dispute because there's no available disputes with expected status and type in the disputes list." + id = dispute['Id'] + contested_funds = dispute['Status'] == 'PENDING_CLIENT_ACTION' ? { Amount: 10, Currency: 'EUR' } : nil; + changed_dispute = MangoPay::Dispute.contest(id, contested_funds) + expect(changed_dispute['Id']).to eq(id) + expect(changed_dispute['Status']).to eq('SUBMITTED') + changed_dispute + end + + describe 'CONTEST' do + it 'contests a dispute' do + test_contest_dispute + end + end + + describe 'RESUBMIT' do + it 'resubmits a dispute' do + dispute = @disputes.find do |disp| + ['REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status']) + end + expect(dispute).not_to be_nil, "Cannot test resubmiting dispute because there's no available disputes with expected status in the disputes list." + id = dispute['Id'] + changed_dispute = MangoPay::Dispute.resubmit(id) + expect(changed_dispute['Id']).to eq(id) + expect(changed_dispute['Status']).to eq('SUBMITTED') + end + end + + describe 'CLOSE' do + it 'closes a dispute' do + dispute = @disputes.find do |disp| + ['PENDING_CLIENT_ACTION', 'REOPENED_PENDING_CLIENT_ACTION'].include?(disp['Status']) && + ['CONTESTABLE', 'RETRIEVAL'].include?(disp['DisputeType']) + end + expect(dispute).not_to be_nil, "Cannot test closing dispute because there's no available disputes with expected status in the disputes list." + id = dispute['Id'] + changed_dispute = MangoPay::Dispute.close(id) + expect(changed_dispute['Id']).to eq(id) + expect(changed_dispute['Status']).to eq('CLOSED') + end + end + +=end + +end