LP#1718301: catch it when multiple connection attempts fail
authorGalen Charlton <gmc@equinoxinitiative.org>
Thu, 21 Sep 2017 01:07:37 +0000 (21:07 -0400)
committerBen Shum <ben@evergreener.net>
Thu, 21 Sep 2017 01:26:34 +0000 (21:26 -0400)
Lovefield only allows a single connection at a time, and throws
an exception if a second attempt is made.  In the context of a
page app, wrapping the connection attempt in a promise takes
care of it, but for the test suite, the egLoveField service
gets completely reinitialized... but Lovefield itself still
thinks it's in the middle of connecting.

This patch catches the exception and allows the test suite to
pass, without otherwise affecting use in a real browser.

Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Ben Shum <ben@evergreener.net>
Open-ILS/web/js/ui/default/staff/services/lovefield.js

index 0621911..dfebc4b 100644 (file)
@@ -41,7 +41,7 @@ angular.module('egCoreMod')
 
 .factory('egLovefield', ['$q','$rootScope','egCore','$timeout', 
                  function($q , $rootScope , egCore , $timeout) { 
-    
+
     var service = {};
 
     function connectOrGo() {
@@ -63,20 +63,27 @@ angular.module('egCoreMod')
         var deferred = $q.defer();
 
         console.debug('attempting offline DB connection');
-        osb.connect().then(
-            function(db) {
-                console.debug('successfully connected to offline DB');
-                service.connectPromise = null;
-                lf.offlineDB = db;
-                deferred.resolve();
-            },
-            function(err) {
-                // assumes that a single connection failure means
-                // a connection will never succeed.
-                service.cannotConnect = true;
-                console.error('Cannot connect to offline DB: ' + err);
-            }
-        );
+        try {
+            osb.connect().then(
+                function(db) {
+                    console.debug('successfully connected to offline DB');
+                    service.connectPromise = null;
+                    lf.offlineDB = db;
+                    deferred.resolve();
+                },
+                function(err) {
+                    // assumes that a single connection failure means
+                    // a connection will never succeed.
+                    service.cannotConnect = true;
+                    console.error('Cannot connect to offline DB: ' + err);
+                }
+            );
+        } catch (e) {
+            // .connect() will throw an error if it detects that a connection
+            // attempt is already in progress; this can happen with PhantomJS
+            console.error('Cannot connect to offline DB: ' + e);
+            service.cannotConnect = true;
+        }
 
         service.connectPromise = deferred.promise;
         return service.connectPromise;