diff --git a/caravel/templates/caravel/models/database/macros.html b/caravel/templates/caravel/models/database/macros.html index c667c31b0b33..a547a6adcb71 100644 --- a/caravel/templates/caravel/models/database/macros.html +++ b/caravel/templates/caravel/models/database/macros.html @@ -8,7 +8,11 @@ var data = {}; try{ - data = JSON.stringify({ uri: $("#sqlalchemy_uri").val(), extras: JSON.parse($("#extra").val()) }) + data = JSON.stringify({ + uri: $("#sqlalchemy_uri").val(), + name: $('#database_name').val(), + extras: JSON.parse($("#extra").val()) + }) } catch(parse_error){ alert("Malformed JSON in the extras field: " + parse_error); return false diff --git a/caravel/views.py b/caravel/views.py index 0f0e69070ab7..ceafcf723eb5 100755 --- a/caravel/views.py +++ b/caravel/views.py @@ -1251,6 +1251,16 @@ def testconn(self): """Tests a sqla connection""" try: uri = request.json.get('uri') + db_name = request.json.get('name') + if db_name and ':XXXXXXXXXX@' in uri: + database = ( + db.session() + .query(models.Database) + .filter_by(database_name=db_name).first() + ) + if database is not None: + uri = database.sqlalchemy_uri_decrypted + connect_args = ( request.json .get('extras', {}) diff --git a/tests/core_tests.py b/tests/core_tests.py index e3954cc4914f..4e8e96199730 100644 --- a/tests/core_tests.py +++ b/tests/core_tests.py @@ -114,6 +114,18 @@ def test_misc(self): assert self.client.get('/health').data.decode('utf-8') == "OK" assert self.client.get('/ping').data.decode('utf-8') == "OK" + def test_testconn(self): + data = json.dumps({'uri': 'sqlite:////tmp/caravel_unittests.db'}) + response = self.client.post('/caravel/testconn', data=data, content_type='application/json') + assert response.status_code == 200 + + data = json.dumps({ + 'uri': 'postgresql+psycopg2://foo:XXXXXXXXXX@127.0.0.1/bar', + 'name': 'main' + }) + response = self.client.post('/caravel/testconn', data=data, content_type='application/json') + assert response.status_code == 200 + def test_warm_up_cache(self): slice = db.session.query(models.Slice).first() resp = self.client.get(