public inbox for [email protected]  
help / color / mirror / Atom feed
From: Murtuza Zabuawala <[email protected]>
To: pgadmin-hackers <[email protected]>
Subject: [pgAdmin4][RM#3235] Code refactoring in Query tool
Date: Tue, 3 Apr 2018 16:57:21 +0530
Message-ID: <CAKKotZRidfdPkSe=2wiaDsz_F3sAXdWZs_1SQLFks1YeP24UTQ@mail.gmail.com> (raw)

Hi,

PFA patch to extract the common code from query tool to handle ajax errors
& connection handling, Also added unit tests around extracted code.

--
Regards,
Murtuza Zabuawala
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company


Attachments:

  [application/octet-stream] RM_3235.diff (35.2K, 3-RM_3235.diff)
  download | inline diff:
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');
+    });
+  });
+
+});


view thread (6+ messages)  latest in thread

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: [email protected]
  Cc: [email protected]
  Subject: Re: [pgAdmin4][RM#3235] Code refactoring in Query tool
  In-Reply-To: <CAKKotZRidfdPkSe=2wiaDsz_F3sAXdWZs_1SQLFks1YeP24UTQ@mail.gmail.com>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox