diff --git a/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js b/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js index e009611..f5bd2a9 100644 --- a/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js +++ b/web/pgadmin/static/js/sqleditor/is_new_transaction_required.js @@ -6,6 +6,7 @@ // This software is released under the PostgreSQL Licence // ////////////////////////////////////////////////////////////////////////// +import gettext from 'sources/gettext'; export function is_new_transaction_required(xhr) { /* If responseJSON is undefined then it could be object of @@ -21,3 +22,55 @@ export function is_new_transaction_required(xhr) { xhr.responseJSON.info && xhr.responseJSON.info === 'DATAGRID_TRANSACTION_REQUIRED'; } + +// Allow us to redirect to login dialog and if required then re-initiate the transaction +export function handleLoginRequiredAndTransactionRequired( + pgAdmin, handler, exception, stateToSave, stateParameters, checkTransaction +) { + stateParameters = stateParameters && stateParameters.length > 0 ? stateParameters : []; + if (pgAdmin.Browser.UserManagement.is_pga_login_required(exception)) { + if (stateToSave) { + handler.save_state(stateToSave, stateParameters); + } + return pgAdmin.Browser.UserManagement.pga_login(); + } + + if(checkTransaction && is_new_transaction_required(exception)) { + if (stateToSave) { + handler.save_state(stateToSave, stateParameters); + } + return handler.init_transaction(); + } +} + +// Allow us to handle the AJAX error from Query tool +export function handleQueryToolAjaxError( + pgAdmin, handler, exception, stateToSave, stateParameters, checkTransaction +) { + if (exception.readyState == 0) { + return gettext('Not connected to the server or the connection to the server has been closed.'); + } + + handleLoginRequiredAndTransactionRequired( + pgAdmin, handler, exception, stateToSave, stateParameters, checkTransaction + ); + + let msg = exception.responseText; + if (exception.responseJSON != undefined) { + if(exception.responseJSON.errormsg != undefined) { + msg = exception.responseJSON.errormsg; + } + + if(exception.status == 503 && exception.responseJSON.info != undefined && + exception.responseJSON.info == 'CONNECTION_LOST') { + setTimeout(function() { + if (stateToSave) { + handler.save_state(stateToSave, stateParameters); + } + handler.handle_connection_lost(false, exception); + }); + } + } + + return msg; +} diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js index 923ccea..8bfffac 100644 --- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js +++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js @@ -482,12 +482,9 @@ define('tools.querytool', [ }); }, error:function(e) { - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - return pgAdmin.Browser.UserManagement.pga_login(); - } - if(transaction.is_new_transaction_required(e)) { - return self.init_transaction(); - } + return transaction.handleLoginRequiredAndTransactionRequired( + pgAdmin, self, e, null, null, null + ); }, }); }.bind(ctx), @@ -1138,16 +1135,11 @@ define('tools.querytool', [ if (typeof cb == 'function') { cb(); } - if (e.readyState == 0) { - self.update_msg_history(false, - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - pgAdmin.Browser.UserManagement.pga_login(); - } + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, null, null, false + ); + self.update_msg_history(false, msg); }, }); }, @@ -1931,18 +1923,12 @@ define('tools.querytool', [ } }) .fail(function(xhr) { - if (pgAdmin.Browser.UserManagement.is_pga_login_required(xhr)) { - pgAdmin.Browser.UserManagement.pga_login(); - } else { - if(xhr.responseJSON && - xhr.responseJSON.result) { - alertify.dlgGetServerPass(gettext('Connect to Server'), - xhr.responseJSON.result); - } else { - alertify.dlgGetServerPass(gettext('Connect to Server'), - xhr.responseText); - } - } + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, xhr, null, null, false + ); + alertify.dlgGetServerPass( + gettext('Connect to Server'), msg + ); }); }, /* This function is used to create instance of SQLEditorView, @@ -2001,22 +1987,13 @@ define('tools.querytool', [ self.init_events(); }, error: function(jqx) { - var msg = ''; + let msg = ''; self.init_events(); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(jqx)) { - return pgAdmin.Browser.UserManagement.pga_login(); - } + msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, jqx, null, null, false + ); - /* Error from the server */ - if (jqx.status == 410 || jqx.status == 500) { - try { - var data = $.parseJSON(jqx.responseText); - msg = data.errormsg; - } catch (e) { - msg = jqx.responseText; - } - } pgBrowser.report_error( S(gettext('Error fetching SQL for script: %s.')).sprintf(msg).value() ); @@ -2185,37 +2162,9 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (e.readyState == 0) { - self.update_msg_history(false, - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_run_query', []); - pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_run_query', []); - self.init_transaction(); - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_run_query', []); - self.handle_connection_lost(false, e); - }); - } - } - + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_run_query', null, true + ); self.update_msg_history(false, msg); }, }); @@ -2871,38 +2820,10 @@ define('tools.querytool', [ } }, error: function(e) { - if (e.readyState == 0) { - self.update_msg_history(false, - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_save', [view, controller, save_as]); - pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_save', [view, controller, save_as]); - self.init_transaction(); - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_save', [view, controller, save_as]); - self.handle_connection_lost(false, e); - }); - } - } - + let stateParams = [view, controller, save_as]; + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_save', stateParams, true + ); self.update_msg_history(false, msg); }, }); @@ -3048,13 +2969,11 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_select_file_handler', [_e]); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - var errmsg = $.parseJSON(e.responseText).errormsg; - alertify.error(errmsg); + let stateParams = [_e]; + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_select_file_handler', stateParams, false + ); + alertify.error(msg); // hide cursor $busy_icon_div.removeClass('show_progress'); }, @@ -3100,17 +3019,11 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_save_file_handler', [_e]); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - var errmsg = $.parseJSON(e.responseText).errormsg; - setTimeout( - function() { - alertify.error(errmsg); - }, 10 + let stateParams = [_e]; + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_save_file_handler', stateParams, false ); + alertify.error(msg); }, }); }, @@ -3206,36 +3119,9 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_show_filter', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_show_filter', []); - return self.init_transaction(); - } - - var msg; - if (e.readyState == 0) { - msg = - gettext('Not connected to the server or the connection to the server has been closed.'); - } else { - msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_show_filter', []); - self.handle_connection_lost(false, e); - }); - } - } - } + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_show_filter', null, true + ); setTimeout( function() { alertify.alert(gettext('Get Filter Error'), msg); @@ -3296,42 +3182,10 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_include_filter', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_include_filter', []); - return self.init_transaction(); - } - - setTimeout( - function() { - if (e.readyState == 0) { - alertify.alert(gettext('Filter By Selection Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_include_filter', []); - self.handle_connection_lost(false, e); - }); - } - } - - alertify.alert(gettext('Filter By Selection Error'), msg); - }, 10 + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_include_filter', null, true ); + alertify.alert(gettext('Filter By Selection Error'), msg); }, }); }, @@ -3387,42 +3241,10 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_exclude_filter', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_exclude_filter', []); - return self.init_transaction(); - } - - setTimeout( - function() { - if (e.readyState == 0) { - alertify.alert(gettext('Filter Exclude Selection Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_exclude_filter', []); - self.handle_connection_lost(false, e); - }); - } - } - - alertify.alert(gettext('Filter Exclude Selection Error'), msg); - }, 10 + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_exclude_filter', null, true ); + alertify.alert(gettext('Filter Exclude Selection Error'), msg); }, }); }, @@ -3457,42 +3279,10 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_remove_filter', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_remove_filter', []); - return self.init_transaction(); - } - - setTimeout( - function() { - if (e.readyState == 0) { - alertify.alert(gettext('Remove Filter Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_remove_filter', []); - self.handle_connection_lost(false, e); - }); - } - } - - alertify.alert(gettext('Remove Filter Error'), msg); - } + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_remove_filter', null, true ); + alertify.alert(gettext('Remove Filter Error'), msg); }, }); }, @@ -3532,42 +3322,10 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_apply_filter', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_apply_filter', []); - return self.init_transaction(); - } - - setTimeout( - function() { - if (e.readyState == 0) { - alertify.alert(gettext('Apply Filter Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_apply_filter', []); - self.handle_connection_lost(false, e); - }); - } - } - - alertify.alert(gettext('Apply Filter Error'), msg); - }, 10 + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_apply_filter', null, true ); + alertify.alert(gettext('Apply Filter Error'), msg); }, }); }, @@ -3687,42 +3445,10 @@ define('tools.querytool', [ }, error: function(e) { self.trigger('pgadmin-sqleditor:loading-icon:hide'); - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_set_limit', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_set_limit', []); - return self.init_transaction(); - } - - setTimeout( - function() { - if (e.readyState == 0) { - alertify.alert(gettext('Change limit Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_set_limit', []); - self.handle_connection_lost(false, e); - }); - } - } - - alertify.alert(gettext('Change limit Error'), msg); - }, 10 + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_set_limit', null, true ); + alertify.alert(gettext('Change limit Error'), msg); }, }); }, @@ -3846,23 +3572,9 @@ define('tools.querytool', [ error: function(e) { self.disable_tool_buttons(false); - if (e.readyState == 0) { - alertify.alert(gettext('Cancel Query Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_cancel_query', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - var msg = e.responseText; - if (e.responseJSON != undefined && - e.responseJSON.errormsg != undefined) - msg = e.responseJSON.errormsg; - + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_cancel_query', null, false + ); alertify.alert(gettext('Cancel Query Error'), msg); }, }); @@ -3907,38 +3619,10 @@ define('tools.querytool', [ alertify.alert(gettext('Auto Rollback Error'), res.data.result); }, error: function(e) { - if (e.readyState == 0) { - alertify.alert(gettext('Auto Rollback Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_auto_rollback', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_auto_rollback', []); - self.init_transaction(); - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_auto_rollback', []); - self.handle_connection_lost(false, e); - }); - } - } + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_auto_rollback', null, true + ); alertify.alert(gettext('Auto Rollback Error'), msg); }, }); @@ -3968,38 +3652,9 @@ define('tools.querytool', [ alertify.alert(gettext('Auto Commit Error'), res.data.result); }, error: function(e) { - if (e.readyState == 0) { - alertify.alert(gettext('Auto Commit Error'), - gettext('Not connected to the server or the connection to the server has been closed.') - ); - return; - } - - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_auto_commit', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_auto_commit', []); - return self.init_transaction(); - } - - var msg = e.responseText; - if (e.responseJSON != undefined) { - if(e.responseJSON.errormsg != undefined) { - msg = e.responseJSON.errormsg; - } - - if(e.status == 503 && e.responseJSON.info != undefined && - e.responseJSON.info == 'CONNECTION_LOST') { - setTimeout(function() { - self.save_state('_auto_commit', []); - self.handle_connection_lost(false, e); - }); - } - } - + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_auto_commit', null, true + ); alertify.alert(gettext('Auto Commit Error'), msg); }, }); @@ -4036,21 +3691,10 @@ define('tools.querytool', [ } }, error: function(e) { - - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_explain_verbose', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_explain_verbose', []); - return self.init_transaction(); - } - - alertify.alert(gettext('Explain options error'), - gettext('Error occurred while setting verbose option in explain.') + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_explain_verbose', null, true ); - return; + alertify.alert(gettext('Explain options error'), msg); }, }); }, @@ -4086,19 +3730,10 @@ define('tools.querytool', [ } }, error: function(e) { - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_explain_costs', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_explain_costs', []); - return self.init_transaction(); - } - - alertify.alert(gettext('Explain options error'), - gettext('Error occurred while setting costs option in explain.') + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_explain_costs', null, true ); + alertify.alert(gettext('Explain options error'), msg); }, }); }, @@ -4134,19 +3769,10 @@ define('tools.querytool', [ } }, error: function(e) { - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_explain_buffers', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_explain_buffers', []); - return self.init_transaction(); - } - - alertify.alert(gettext('Explain options error'), - gettext('Error occurred while setting buffers option in explain.') + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_explain_buffers', null, true ); + alertify.alert(gettext('Explain options error'), msg); }, }); }, @@ -4181,19 +3807,10 @@ define('tools.querytool', [ } }, error: function(e) { - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('_explain_timing', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('_explain_timing', []); - return self.init_transaction(); - } - - alertify.alert(gettext('Explain options error'), - gettext('Error occurred while setting timing option in explain.') + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, '_explain_timing', null, true ); + alertify.alert(gettext('Explain options error'), msg); }, }); }, @@ -4295,21 +3912,11 @@ define('tools.querytool', [ } }, error: function(e) { - if (pgAdmin.Browser.UserManagement.is_pga_login_required(e)) { - self.save_state('get_preferences', []); - return pgAdmin.Browser.UserManagement.pga_login(); - } - - if(transaction.is_new_transaction_required(e)) { - self.save_state('get_preferences', []); - return self.init_transaction(); - } - - updateUI(); - alertify.alert( - gettext('Get Preferences error'), - gettext('Error occurred while getting query tool options.') + let msg = transaction.handleQueryToolAjaxError( + pgAdmin, self, e, 'get_preferences', null, true ); + updateUI(); + alertify.alert(gettext('Get Preferences error'), msg); }, }); }, diff --git a/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js b/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js index 97d1bc5..2fb1f45 100644 --- a/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js +++ b/web/regression/javascript/sqleditor/is_new_transaction_required_spec.js @@ -7,7 +7,10 @@ // ////////////////////////////////////////////////////////////////////////// -import {is_new_transaction_required} from '../../../pgadmin/static/js/sqleditor/is_new_transaction_required'; +import { + is_new_transaction_required, + handleQueryToolAjaxError +} from '../../../pgadmin/static/js/sqleditor/is_new_transaction_required'; describe('#is_new_transaction_required', () => { describe('when status is not 404', () => { @@ -63,3 +66,126 @@ describe('#is_new_transaction_required', () => { }); }); }); + + +describe('#handleQueryToolAjaxError', () => { + let sqlEditorHandler, + exceptionSpy, stateToSave, + stateParameters, checkTransaction, UserManagementMock, + pgBrowserMock; + + beforeEach(() => { + stateToSave = 'testState'; + stateParameters = []; + checkTransaction = false; + sqlEditorHandler = jasmine.createSpyObj( + 'handler', ['init_transaction', 'save_state', 'handle_connection_lost'] + ); + exceptionSpy = { + readyState: 0, + status: 404, + data: { + info: 'CONNECTION_LOST', + }, + }; + pgBrowserMock = { + 'Browser': { + 'UserManagement': jasmine.createSpyObj('UserManagement', ['is_pga_login_required', 'pga_login']) + } + }; + }); + + describe('when ready state is 0', () => { + it('should return connection', () => { + expect( + handleQueryToolAjaxError( + pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave, + stateParameters, checkTransaction + ) + ).toBe('Not connected to the server or the connection to the server has been closed.'); + }); + }); + + describe('when there is an ajax error due to login is required', () => { + beforeEach(() => { + exceptionSpy.readyState = 1; + exceptionSpy.status = 401; + exceptionSpy.data.info = 'PGADMIN_LOGIN_REQUIRED'; + pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(true); + }); + + it('should save the current state and call login handler', () => { + handleQueryToolAjaxError( + pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave, + stateParameters, checkTransaction + ); + expect(sqlEditorHandler.save_state).toHaveBeenCalledWith(stateToSave, stateParameters); + expect(pgBrowserMock.Browser.UserManagement.pga_login).toHaveBeenCalled(); + }); + }); + + describe('when there is an ajax error and new transaction initialization required', () => { + beforeEach(() => { + exceptionSpy.readyState = 1; + exceptionSpy.status = 404; + exceptionSpy.data.info = 'DATAGRID_TRANSACTION_REQUIRED'; + pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(false); + checkTransaction = true; + }); + + it('should save the current state and call login handler', () => { + handleQueryToolAjaxError( + pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave, + stateParameters, checkTransaction + ); + expect(pgBrowserMock.Browser.UserManagement.pga_login).not.toHaveBeenCalled(); + expect(sqlEditorHandler.save_state).toHaveBeenCalledWith(stateToSave, stateParameters); + expect(sqlEditorHandler.init_transaction).toHaveBeenCalled(); + }); + }); + + describe('when there is an ajax error due to database connection has been lost', () => { + beforeEach(() => { + exceptionSpy.readyState = 1; + exceptionSpy.status = 503; + exceptionSpy.responseJSON = { + 'info': 'CONNECTION_LOST' + }; + pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(false); + checkTransaction = false; + }); + + it('should save the current state and call connection lost handler', (done) => { + handleQueryToolAjaxError( + pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave, + stateParameters, checkTransaction + ); + expect(pgBrowserMock.Browser.UserManagement.pga_login).not.toHaveBeenCalled(); + setTimeout(() => { + expect(sqlEditorHandler.save_state).toHaveBeenCalledWith(stateToSave, stateParameters); + expect(sqlEditorHandler.handle_connection_lost).toHaveBeenCalledWith(false, exceptionSpy); + done(); + }, 0); + }); + }); + + describe('when there is an ajax error due to unknown reason', () => { + beforeEach(() => { + exceptionSpy.readyState = 1; + exceptionSpy.status = 803; + exceptionSpy.responseText = 'ajax failed with unknown reason'; + pgBrowserMock.Browser.UserManagement.is_pga_login_required.and.returnValue(false); + checkTransaction = false; + }); + + it('should return proper error message from ajax exception', () => { + expect( + handleQueryToolAjaxError( + pgBrowserMock, sqlEditorHandler, exceptionSpy, stateToSave, + stateParameters, checkTransaction + ) + ).toBe('ajax failed with unknown reason'); + }); + }); + +});