require 'spec_helper' describe QuickbooksWebConnector::SoapWrapper::QBWebConnectorSvcSoap do let(:servant) { described_class.new } describe 'serverVersion' do subject(:response) { servant.serverVersion(double(:parameters)) } it 'returns returns the configured server_version' do QuickbooksWebConnector.config.server_version = '1.2.3' expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ServerVersionResponse) expect(response.serverVersionResult).to eq('1.2.3') end end describe 'clientVersion' do subject(:response) { servant.clientVersion(double(:parameters, strVersion: '2.1.0.30')) } it 'returns nil when no minimum version has been configured' do QuickbooksWebConnector.config.minimum_web_connector_client_version = nil expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ClientVersionResponse) expect(response.clientVersionResult).to be_nil end it 'returns nil when the client version passes the minimum configured version' do QuickbooksWebConnector.config.minimum_web_connector_client_version = '1.0.0' expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ClientVersionResponse) expect(response.clientVersionResult).to be_nil end it 'returns an error when the client version fails the minimum configured version' do QuickbooksWebConnector.config.minimum_web_connector_client_version = '3.0.0' expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ClientVersionResponse) expect(response.clientVersionResult).to eq('E:This version of QuickBooks Web Connector is outdated. Version 3.0.0 or greater is required.') end end describe 'authenticate' do subject(:response) { servant.authenticate(double(:parameters, strUserName: 'foo', strPassword: 'bar')) } context 'unauthorized' do it { should be_a QuickbooksWebConnector::SoapWrapper::AuthenticateResponse } it 'returns "nvu" with an invalid user' do expect(response.authenticateResult[1]).to eq('nvu') end it 'does not run the after authenticate callback' do expect do |block| QuickbooksWebConnector.config.after_authenticate(&block) response end.to_not yield_control end end context 'authorized' do before do QuickbooksWebConnector.config.user 'foo', 'bar', '/path/to/company.qbw' end it 'runs the after authenticate callback' do expect do |block| QuickbooksWebConnector.config.after_authenticate(&block) response end.to yield_control end context 'has no data to send' do it 'is "none" for having no data' do expect(response.authenticateResult[1]).to eq('none') end end context 'has work to do' do before do QuickbooksWebConnector.enqueue '', SomeHandler allow(SecureRandom).to receive(:uuid).and_return('71f1f9d9-8012-487c-af33-c84bab4d4ded') end it { should be_a QuickbooksWebConnector::SoapWrapper::AuthenticateResponse } it 'is a token for future requests' do expect(response.authenticateResult[0]).to eq('71f1f9d9-8012-487c-af33-c84bab4d4ded') end it 'returns the path to the company file' do expect(response.authenticateResult[1]).to eq('/path/to/company.qbw') end it 'is nil for delay' do expect(response.authenticateResult[2]).to be_nil end it 'is nil for the new MinimumRunEveryNSeconds' do expect(response.authenticateResult[3]).to be_nil end it 'stores the number of jobs queued for the session for later calculating progress' do response expect(QuickbooksWebConnector.job_count_for_session).to eq(1) end end end end describe 'sendRequestXML' do subject(:response) { servant.sendRequestXML(double(:parameters)) } it 'returns the resulting XML for the next job' do allow(SomeBuilder).to receive(:perform).with(1).and_return('') QuickbooksWebConnector.enqueue SomeBuilder, SomeHandler, 1 expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::SendRequestXMLResponse) expect(response.sendRequestXMLResult).to eq('') end it 'continues onto the next job when the builder errors' do allow(SomeBuilder).to receive(:perform).with(1).and_return('') QuickbooksWebConnector.enqueue SomeBuilderThatErrors, SomeHandler, 1 QuickbooksWebConnector.enqueue SomeBuilder, SomeHandler, 1 expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::SendRequestXMLResponse) expect(response.sendRequestXMLResult).to eq('') end end describe 'receiveResponseXML' do let(:receive_response_xml) { QuickbooksWebConnector::SoapWrapper::ReceiveResponseXML.new } it 'returns 100 when no more jobs are left' do QuickbooksWebConnector.enqueue '', SomeHandler, 1 allow(SomeHandler).to receive(:perform) receive_response_xml.response = '' response = servant.receiveResponseXML(receive_response_xml) expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ReceiveResponseXMLResponse) expect(response.receiveResponseXMLResult).to eq(100) expect(SomeHandler).to have_received(:perform).with(receive_response_xml.response, 1) end it 'returns the progress for the session when there are jobs left' do QuickbooksWebConnector.enqueue '', SomeHandler, 1 QuickbooksWebConnector.enqueue '', SomeHandler, 2 QuickbooksWebConnector.store_job_count_for_session response = servant.receiveResponseXML(receive_response_xml) expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ReceiveResponseXMLResponse) expect(response.receiveResponseXMLResult).to eq(50) end it 'fails the job when QuickBooks returns an error message' do QuickbooksWebConnector.enqueue '', SomeHandler, 1 receive_response_xml.message = 'QuickBooks found an error when parsing the provided XML text stream.' response = servant.receiveResponseXML(receive_response_xml) expect(response).to be_a(QuickbooksWebConnector::SoapWrapper::ReceiveResponseXMLResponse) expect(response.receiveResponseXMLResult).to eq(100) expect(QuickbooksWebConnector::Failure.count).to be(1) item = QuickbooksWebConnector::Failure.all.first expect(item['exception']).to eq('QuickbooksWebConnector::ReceiveResponseXMLError') expect(item['error']).to eq('QuickBooks found an error when parsing the provided XML text stream.') end end describe 'closeConnection' do subject(:response) { servant.closeConnection(double(:parameters)) } it { should be_a QuickbooksWebConnector::SoapWrapper::CloseConnectionResponse } end end