public inbox for [email protected]
help / color / mirror / Atom feed[pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions
15+ messages / 2 participants
[nested] [flat]
* [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions
@ 2020-09-22 05:26 Nikhil Mohite <[email protected]>
2020-09-22 06:11 ` Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-09-22 05:26 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
I have added few more test cases for the "Functions" module as per RM-5330
<https://redmine.postgresql.org/issues/5330;
PFA patch.
--
*Thanks & Regards,*
*Nikhil Mohite*
*Software Engineer.*
*EDB Postgres* <https://www.enterprisedb.com/;
*Mob.No: +91-7798364578.*
Attachments:
[application/octet-stream] RM_5330_v1.patch (71.6K, 3-RM_5330_v1.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
index 2eb6139..7301cc8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
@@ -9,23 +9,85 @@
import json
import uuid
-
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
from pgadmin.utils.route import BaseTestGenerator
from regression.python_test_utils import test_utils as utils
from . import utils as funcs_utils
+from .. import FunctionView
class FunctionAddTestCase(BaseTestGenerator):
""" This class will add new function under schema node. """
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL', dict(
- url='/browser/function/obj/'))
+ (
+ 'Fetch Function Node URL',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ ('Create Function Get Sql Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=True,
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": "(False, '')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Create Function Get Sql Execution Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while create new function get sql.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Create Function Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while create new function.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
]
+ def create_function(self, data):
+ response = self.tester.post(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ data=json.dumps(data),
+ content_type='html/json'
+ )
+ return response
+
def runTest(self):
""" This function will add function under schema node. """
super(FunctionAddTestCase, self).runTest()
@@ -82,14 +144,23 @@ class FunctionAddTestCase(BaseTestGenerator):
data['prosupportfuc'] = support_function_name
- response = self.tester.post(
- self.url + str(utils.SERVER_GROUP) + '/' +
- str(self.server_id) + '/' + str(self.db_id) +
- '/' + str(self.schema_id) + '/',
- data=json.dumps(data),
- content_type='html/json'
- )
+ if self.is_positive_test:
+ response = self.create_function(data)
+ else:
+ if hasattr(self, 'is_mock_function'):
+ def _get_sql(self, **kwargs):
+ return False, ''
+ with patch.object(FunctionView,
+ self.mock_data["function_name"],
+ new=_get_sql):
+ response = self.create_function(data)
+
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.create_function(data)
- self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
index 4244aaa..8fa5161 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
@@ -7,7 +7,9 @@
#
##########################################################################
+import json
import uuid
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
@@ -20,10 +22,80 @@ class FunctionDeleteTestCase(BaseTestGenerator):
""" This class will delete the function under schema node. """
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL',
- dict(url='/browser/function/obj/'))
+ ('Fetch Function Node URL', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ ('Delete Function without function id.', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ without_functions_id=True,
+ test_data={},
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ ('Delete Function Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ without_functions_id=False,
+ test_data={},
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while delete function.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Delete Function with no object found', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=True,
+ mock_empty_result=True,
+ test_data={},
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(True, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ )),
]
+ def delete_function(self, func_id):
+ if hasattr(self, 'without_functions_id'):
+
+ response = self.tester.delete(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(func_id),
+ data=json.dumps(self.test_data),
+ content_type='html/json'
+ )
+ else:
+ response = self.tester.delete(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
def runTest(self):
""" This function will delete function under database node. """
super(FunctionDeleteTestCase, self).setUp()
@@ -34,14 +106,25 @@ class FunctionDeleteTestCase(BaseTestGenerator):
self.server, self.db_name, self.schema_name, func_name)
func_id = function_info[0]
- response = self.tester.delete(
- self.url + str(utils.SERVER_GROUP) + '/' +
- str(self.server_id) + '/' +
- str(self.db_id) + '/' +
- str(self.schema_id) + '/' + str(func_id),
- content_type='html/json'
- )
- self.assertEqual(response.status_code, 200)
+ if self.is_positive_test:
+ if hasattr(self, 'without_functions_id'):
+ func_id = ''
+ self.test_data = {
+ "ids": [function_info[0]]
+ }
+ if hasattr(self, 'mock_empty_result') and self.mock_empty_result:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.delete_function(func_id)
+ else:
+ response = self.delete_function(func_id)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.delete_function(func_id)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
index 17ba115..124c272 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
@@ -8,6 +8,7 @@
##########################################################################
import uuid
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
@@ -21,10 +22,62 @@ class FunctionGetTestCase(BaseTestGenerator):
skip_on_database = ['gpdb']
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL',
- dict(url='/browser/function/obj/'))
+ (
+ 'Fetch Function Node URL',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )
+ ),
+ (
+ 'Fetch Function properties fail.',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get properties.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )
+ ),
+ (
+ 'Fetch Function properties no function found.',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )
+ )
]
+ def get_properties(self, trigger_func_id):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(trigger_func_id),
+ content_type='html/json')
+ return response
+
def runTest(self):
""" This function will delete function under database node. """
super(FunctionGetTestCase, self).setUp()
@@ -35,13 +88,15 @@ class FunctionGetTestCase(BaseTestGenerator):
self.server, self.db_name, self.schema_name, func_name)
trigger_func_id = function_info[0]
- response = self.tester.get(
- self.url + str(utils.SERVER_GROUP) + '/' +
- str(self.server_id) + '/' +
- str(self.db_id) + '/' +
- str(self.schema_id) + '/' + str(trigger_func_id),
- content_type='html/json')
- self.assertEqual(response.status_code, 200)
+ if self.is_positive_test:
+ response = self.get_properties(trigger_func_id)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_properties(trigger_func_id)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_languages.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_languages.py
new file mode 100644
index 0000000..b43b663
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_languages.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetLanguagesTestCase(BaseTestGenerator):
+ """ This class get languages. """
+ scenarios = [
+ (
+ 'Fetch Function languages',
+ dict(
+ url='/browser/function/get_languages/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function languages fail',
+ dict(
+ url='/browser/function/get_languages/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get languages for functions.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_languages(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetLanguagesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_languages()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_languages()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_msql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_msql.py
new file mode 100644
index 0000000..5a2dec2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_msql.py
@@ -0,0 +1,224 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from urllib.parse import urlencode
+from .. import FunctionView
+
+
+class FunctionGetmsqlTestCase(BaseTestGenerator):
+ """ This class get SQL. """
+ scenarios = [
+ (
+ 'Fetch Function msql',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_mock_local_function=False,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function msql fail',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_local_function=True,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": "(False, '')"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function msql with function id',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=True,
+ mocking_required=True,
+ with_function_id=True,
+ is_mock_local_function=True,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": "(False, '')"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function msql fetch properties fail',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=False,
+ mocking_required=True,
+ with_function_id=True,
+ is_mock_local_function=False,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get msq fetch properties.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )
+ ),
+ (
+ 'Fetch Function msql fetch properties not found',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=False,
+ mocking_required=True,
+ with_function_id=True,
+ is_mock_local_function=False,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "postgres",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(True, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ ]
+
+ def get_sql(self):
+ if hasattr(self, "with_function_id") and self.with_function_id:
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+ self.test_data['oid'] = func_id
+ self.test_data['name'] = func_name
+ url = self.url + str(utils.SERVER_GROUP) + '/' + str(
+ self.server_id) + '/' + str(self.db_id) + '/' + str(
+ self.schema_id) + '/' + str(func_id) + '?' + (
+ urlencode(self.test_data))
+ else:
+ url = self.url + str(utils.SERVER_GROUP) + '/' + str(
+ self.server_id) + '/' + str(self.db_id) + '/' + str(
+ self.schema_id) + '/?' + (urlencode(self.test_data))
+ response = self.tester.get(
+ url,
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetmsqlTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+ db_user = self.server["username"]
+ self.test_data["funcowner"] = db_user
+
+ if self.is_positive_test:
+ response = self.get_sql()
+ else:
+ def _get_sql(self, **kwargs):
+ return False, ''
+ if self.is_mock_local_function:
+ with patch.object(FunctionView,
+ self.mock_data["function_name"],
+ new=_get_sql):
+ response = self.get_sql()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_sql()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_nodes.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_nodes.py
new file mode 100644
index 0000000..2a46468
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_nodes.py
@@ -0,0 +1,121 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+
+
+class FunctionGetNodesTestCase(BaseTestGenerator):
+ """ This class get function types """
+ scenarios = [
+ (
+ 'Fetch Function Nodes',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function Nodes Fail.',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get function nodes.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function Nodes with function id.',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=True,
+ mocking_required=False,
+ with_function_id=True,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function Nodes with function id fail.',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=False,
+ mocking_required=True,
+ with_function_id=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(True, {'rows':[]})"
+ },
+ expected_data={
+ "status_code": 410
+ }
+ ),
+ )
+ ]
+
+ def get_nodes(self):
+ if hasattr(self, 'with_function_id') and self.with_function_id:
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ else:
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetNodesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_nodes()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_nodes()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_sql.py
new file mode 100644
index 0000000..0f5a1e2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_sql.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionSqlTestCase(BaseTestGenerator):
+ """ This class for function SQL """
+ scenarios = [
+ (
+ 'Fetch Function SQL',
+ dict(
+ url='/browser/function/sql/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function SQL fail',
+ dict(
+ url='/browser/function/sql/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while SQL for functions.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def sql(self, func_id):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionSqlTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ if self.is_positive_test:
+ response = self.sql(func_id)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.sql(func_id)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_types.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_types.py
new file mode 100644
index 0000000..dd38406
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_types.py
@@ -0,0 +1,82 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetTypesTestCase(BaseTestGenerator):
+ """ This class get types """
+ scenarios = [
+ (
+ 'Fetch Function types',
+ dict(
+ url='/browser/function/get_types/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function types fail',
+ dict(
+ url='/browser/function/get_types/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'get_types',
+ "return_value": "(False, [])"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_types(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetTypesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_types()
+ else:
+ def _get_types(self, conn, condition, add_serials=False,
+ schema_oid=''):
+ return False, []
+
+ with patch.object(FunctionView, self.mock_data["function_name"],
+ new=_get_types):
+ response = self.get_types()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_variable_options.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_variable_options.py
new file mode 100644
index 0000000..4523202
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_variable_options.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetLanguagesTestCase(BaseTestGenerator):
+ """ This class get variable options. """
+ scenarios = [
+ (
+ 'Fetch Function variable options',
+ dict(
+ url='/browser/function/vopts/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function variable options fail',
+ dict(
+ url='/browser/function/vopts/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get languages for functions.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_languages(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetLanguagesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_languages()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_languages()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
index 1db46a3..076656a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
@@ -9,12 +9,14 @@
import json
import uuid
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
from pgadmin.utils.route import BaseTestGenerator
from regression.python_test_utils import test_utils as utils
from . import utils as funcs_utils
+from .. import FunctionView
class FunctionPutTestCase(BaseTestGenerator):
@@ -22,18 +24,133 @@ class FunctionPutTestCase(BaseTestGenerator):
skip_on_database = ['gpdb']
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL',
- dict(url='/browser/function/obj/'))
+ ('Fetch Function Node URL', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_mock_function=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ ('Fetch Function update fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=False,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while create new function get sql.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Fetch Function update get sql fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=True,
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": [False, '']
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Fetch Function update get sql with no result.', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=True,
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": [True, '']
+ },
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ (
+ 'Fetch Function update with arguments',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ with_function_id=True,
+ is_mock_local_function=False,
+ is_add_argument=True,
+ test_data={
+ "arguments": {
+ "changed": [{
+ "argdefval": "2",
+ "argid": 0,
+ "argmode": "IN",
+ "argname": "test",
+ "argtype": "integer",
+ }]
+ }
+ },
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function update with arguments fail',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ with_function_id=True,
+ is_mock_local_function=False,
+ is_add_argument=True,
+ test_data={
+ "arguments": {
+ "changed": [{
+ "argdefval": "2",
+ "argid": 0,
+ "argmode": "IN",
+ "argname": "param",
+ "argtype": "integer",
+ }]
+ }
+ },
+ mock_data={},
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
]
+ def update_function(self, func_id, data):
+ put_response = self.tester.put(
+ self.url + str(utils.SERVER_GROUP) +
+ '/' + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' +
+ str(func_id),
+ data=json.dumps(data),
+ follow_redirects=True)
+ return put_response
+
def runTest(self):
""" This function will update function under database node. """
super(FunctionPutTestCase, self).setUp()
self = funcs_utils.set_up(self)
-
func_name = "test_event_delete_%s" % str(uuid.uuid4())[1:8]
+
+ if hasattr(self, "is_add_argument") and self.is_add_argument:
+ args = "IN test integer DEFAULT 1"
+ else:
+ args = ''
function_info = funcs_utils.create_function(
- self.server, self.db_name, self.schema_name, func_name)
+ self.server, self.db_name, self.schema_name, func_name, args=args)
func_id = function_info[0]
@@ -42,6 +159,9 @@ class FunctionPutTestCase(BaseTestGenerator):
"id": func_id
}
+ if hasattr(self, "is_add_argument") and self.is_add_argument:
+ data['arguments'] = self.test_data['arguments']
+
if self.server_version >= 120000:
support_function_name = 'supportfunc_%s' % str(uuid.uuid4())[1:8]
funcs_utils.create_support_internal_function(
@@ -53,14 +173,29 @@ class FunctionPutTestCase(BaseTestGenerator):
data['prosupportfuc'] = support_function_name
- put_response = self.tester.put(
- self.url + str(utils.SERVER_GROUP) +
- '/' + str(self.server_id) + '/' + str(self.db_id) + '/' +
- str(self.schema_id) + '/' +
- str(func_id),
- data=json.dumps(data),
- follow_redirects=True)
- self.assertEqual(put_response.status_code, 200)
+ if self.is_positive_test:
+ response = self.update_function(func_id, data)
+ else:
+
+ if hasattr(self, 'is_mock_function') and self.is_mock_function:
+ local_ref = self
+
+ def _get_sql(self, **kwargs):
+ status = local_ref.mock_data["return_value"][0]
+ result = local_ref.mock_data['return_value'][1]
+ return status, result
+
+ with patch.object(FunctionView,
+ self.mock_data["function_name"],
+ new=_get_sql):
+ response = self.update_function(func_id, data)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.update_function(func_id, data)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependencies.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependencies.py
new file mode 100644
index 0000000..439e45d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependencies.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetDependenciesTestCase(BaseTestGenerator):
+ """ This class get dependencies for functions. """
+ scenarios = [
+ (
+ 'Fetch Function dependencies.',
+ dict(
+ url='/browser/function/dependency/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function dependencies fail',
+ dict(
+ url='/browser/function/dependency/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ )
+ ]
+
+ def get_dependency(self):
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetDependenciesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_dependency()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_dependency()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependents.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependents.py
new file mode 100644
index 0000000..d62ecda
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependents.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetDependentsTestCase(BaseTestGenerator):
+ """ This class get dependents for functions. """
+ scenarios = [
+ (
+ 'Fetch Function dependents.',
+ dict(
+ url='/browser/function/dependent/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function dependents fail',
+ dict(
+ url='/browser/function/dependent/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ )
+ ]
+
+ def get_dependents(self):
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetDependentsTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_dependents()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_dependents()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_function_statistics.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_function_statistics.py
new file mode 100644
index 0000000..ff74106
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_function_statistics.py
@@ -0,0 +1,120 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetFunctionStatisticsTestCase(BaseTestGenerator):
+ """ This class get functions statistics. """
+ scenarios = [
+ (
+ 'Fetch Function get statistics',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function get statistics fail',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get function statistics.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function get statistics without function id',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=True,
+ mocking_required=True,
+ without_function_id=True,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function get statistics without function id fail',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=False,
+ mocking_required=True,
+ without_function_id=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_scalar',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get function statistics.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ ]
+
+ def get_function_statistics(self):
+ if hasattr(self, "without_function_id") and self.without_function_id:
+ func_id = ''
+ else:
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetFunctionStatisticsTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_function_statistics()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_function_statistics()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_list.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_list.py
new file mode 100644
index 0000000..5fead0a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_list.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetListTestCase(BaseTestGenerator):
+ """ This class get list of functions. """
+ scenarios = [
+ (
+ 'Fetch Function list.',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function dependents fail',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get function list.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_list(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetListTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_list()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_list()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_select_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_select_sql.py
new file mode 100644
index 0000000..3eef04a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_select_sql.py
@@ -0,0 +1,122 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetSelectSqlTestCase(BaseTestGenerator):
+ """ This class get select SQL for functions. """
+ scenarios = [
+ (
+ 'Fetch Function select sql.',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_add_argument=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function select sql fail',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_add_argument=False,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get select sql.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function select sql not found',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_add_argument=False,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(True, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 410
+ }
+ ),
+ ),
+ (
+ 'Fetch Function select sql with arguments',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_add_argument=True,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ ]
+
+ def get_select_sql(self):
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ if self.is_add_argument:
+ args = "IN test integer DEFAULT 1"
+ else:
+ args = None
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name, args=args)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetSelectSqlTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_select_sql()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_select_sql()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_supported_functions.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_supported_functions.py
new file mode 100644
index 0000000..573bf8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_supported_functions.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetSupportedFunctionsTestCase(BaseTestGenerator):
+ """ This class get supported functions. """
+ scenarios = [
+ (
+ 'Fetch Function supported functions',
+ dict(
+ url='/browser/function/get_support_functions/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function support functions fail',
+ dict(
+ url='/browser/function/get_support_functions/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get supported function')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_supported_functions(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetSupportedFunctionsTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_supported_functions()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_supported_functions()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
index 09ae7ee..a73572d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
@@ -142,7 +142,7 @@ def create_procedure(server, db_name, schema_name, func_name, s_type,
traceback.print_exc(file=sys.stderr)
-def create_function(server, db_name, schema_name, func_name):
+def create_function(server, db_name, schema_name, func_name, args=None):
"""This function add the procedure to schema"""
try:
connection = utils.get_db_connection(db_name,
@@ -152,11 +152,15 @@ def create_function(server, db_name, schema_name, func_name):
server['port'],
server['sslmode'])
pg_cursor = connection.cursor()
+ if args:
+ args = "{0}".format(args)
+ else:
+ args = ''
query = "CREATE FUNCTION " + schema_name + "." + func_name + \
- "()" \
+ "({0})" \
" RETURNS integer LANGUAGE 'sql' STABLE" \
" SECURITY DEFINER AS $$" \
- " SELECT 1; $$;"
+ " SELECT 1; $$;".format(args)
pg_cursor.execute(query)
connection.commit()
# Get 'oid' from newly created function
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions
2020-09-22 05:26 [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Nikhil Mohite <[email protected]>
@ 2020-09-22 06:11 ` Akshay Joshi <[email protected]>
2020-09-22 07:14 ` Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Nikhil Mohite <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Akshay Joshi @ 2020-09-22 06:11 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Hi Nikhil
Test cases are failing for all the database server with the following error:
return True, sql.strip('\n')
AttributeError: 'tuple' object has no attribute 'strip'
Please check and resend the patch.
On Tue, Sep 22, 2020 at 10:56 AM Nikhil Mohite <
[email protected]> wrote:
> Hi Team,
>
> I have added few more test cases for the "Functions" module as per RM-5330
> <https://redmine.postgresql.org/issues/5330;
> PFA patch.
>
> --
> *Thanks & Regards,*
> *Nikhil Mohite*
> *Software Engineer.*
> *EDB Postgres* <https://www.enterprisedb.com/;
> *Mob.No: +91-7798364578.*
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Sr. Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions
2020-09-22 05:26 [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Nikhil Mohite <[email protected]>
2020-09-22 06:11 ` Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Akshay Joshi <[email protected]>
@ 2020-09-22 07:14 ` Nikhil Mohite <[email protected]>
2020-09-22 11:32 ` Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-09-22 07:14 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay/Team,
I checked the code and found an issue in the "msql" function, due to which
test cases were failing.
I have fixed the issue, PFA updated patch for the same.
Sorry for the inconvenience.
Regards,
Nikhil Mohite.
On Tue, Sep 22, 2020 at 11:41 AM Akshay Joshi <[email protected]>
wrote:
> Hi Nikhil
>
> Test cases are failing for all the database server with the following
> error:
> return True, sql.strip('\n')
> AttributeError: 'tuple' object has no attribute 'strip'
>
> Please check and resend the patch.
>
> On Tue, Sep 22, 2020 at 10:56 AM Nikhil Mohite <
> [email protected]> wrote:
>
>> Hi Team,
>>
>> I have added few more test cases for the "Functions" module as per
>> RM-5330 <https://redmine.postgresql.org/issues/5330;
>> PFA patch.
>>
>> --
>> *Thanks & Regards,*
>> *Nikhil Mohite*
>> *Software Engineer.*
>> *EDB Postgres* <https://www.enterprisedb.com/;
>> *Mob.No: +91-7798364578.*
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Sr. Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>
Attachments:
[application/octet-stream] RM_5330_v2.patch (74.0K, 3-RM_5330_v2.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
index 1edc46f..5f84b28 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/__init__.py
@@ -1219,15 +1219,15 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
status, sql = self._get_sql(gid=gid, sid=sid, did=did, scid=scid,
data=self.request, fnid=fnid)
- if status:
- sql = re.sub('\n{2,}', '\n\n', sql)
- return make_json_response(
- data=sql,
- status=200
- )
- else:
- sql = re.sub('\n{2,}', '\n\n', sql)
- return sql
+ if not status:
+ return internal_server_error(errormsg=sql)
+
+ sql = re.sub('\n{2,}', '\n\n', sql)
+ return make_json_response(
+ data=sql,
+ status=200
+ )
+
@staticmethod
def _update_arguments_for_get_sql(data, old_data):
@@ -1359,7 +1359,7 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
if not isinstance(old_data, dict):
return False, gettext(
"Could not find the function in the database."
- )
+ ), ''
# Get Schema Name
old_data['pronamespace'] = self._get_schema(
@@ -1423,7 +1423,7 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
"/".join([self.sql_template_path, self._UPDATE_SQL]),
data=data, o_data=old_data
)
- return sql
+ return True, '', sql
def _get_sql(self, **kwargs):
"""
@@ -1464,8 +1464,12 @@ class FunctionView(PGChildNodeView, DataTypeReader, SchemaDiffObjectCompare):
'is_sql': is_sql,
'is_schema_diff': is_schema_diff,
}
- sql = self._get_sql_for_edit_mode(data, parallel_dict,
- all_ids_dict, vol_dict)
+ status, errmsg, sql = self._get_sql_for_edit_mode(
+ data, parallel_dict, all_ids_dict, vol_dict)
+
+ if not status:
+ return False, errmsg
+
else:
# Parse Privileges
self._parse_privilege_data(data)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
index 2eb6139..7301cc8 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_add.py
@@ -9,23 +9,85 @@
import json
import uuid
-
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
from pgadmin.utils.route import BaseTestGenerator
from regression.python_test_utils import test_utils as utils
from . import utils as funcs_utils
+from .. import FunctionView
class FunctionAddTestCase(BaseTestGenerator):
""" This class will add new function under schema node. """
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL', dict(
- url='/browser/function/obj/'))
+ (
+ 'Fetch Function Node URL',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ ('Create Function Get Sql Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=True,
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": "(False, '')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Create Function Get Sql Execution Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while create new function get sql.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Create Function Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while create new function.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
]
+ def create_function(self, data):
+ response = self.tester.post(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ data=json.dumps(data),
+ content_type='html/json'
+ )
+ return response
+
def runTest(self):
""" This function will add function under schema node. """
super(FunctionAddTestCase, self).runTest()
@@ -82,14 +144,23 @@ class FunctionAddTestCase(BaseTestGenerator):
data['prosupportfuc'] = support_function_name
- response = self.tester.post(
- self.url + str(utils.SERVER_GROUP) + '/' +
- str(self.server_id) + '/' + str(self.db_id) +
- '/' + str(self.schema_id) + '/',
- data=json.dumps(data),
- content_type='html/json'
- )
+ if self.is_positive_test:
+ response = self.create_function(data)
+ else:
+ if hasattr(self, 'is_mock_function'):
+ def _get_sql(self, **kwargs):
+ return False, ''
+ with patch.object(FunctionView,
+ self.mock_data["function_name"],
+ new=_get_sql):
+ response = self.create_function(data)
+
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.create_function(data)
- self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
index 4244aaa..8fa5161 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_delete.py
@@ -7,7 +7,9 @@
#
##########################################################################
+import json
import uuid
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
@@ -20,10 +22,80 @@ class FunctionDeleteTestCase(BaseTestGenerator):
""" This class will delete the function under schema node. """
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL',
- dict(url='/browser/function/obj/'))
+ ('Fetch Function Node URL', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ ('Delete Function without function id.', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ without_functions_id=True,
+ test_data={},
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ ('Delete Function Fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ without_functions_id=False,
+ test_data={},
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while delete function.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Delete Function with no object found', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=True,
+ mock_empty_result=True,
+ test_data={},
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(True, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ )),
]
+ def delete_function(self, func_id):
+ if hasattr(self, 'without_functions_id'):
+
+ response = self.tester.delete(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(func_id),
+ data=json.dumps(self.test_data),
+ content_type='html/json'
+ )
+ else:
+ response = self.tester.delete(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
def runTest(self):
""" This function will delete function under database node. """
super(FunctionDeleteTestCase, self).setUp()
@@ -34,14 +106,25 @@ class FunctionDeleteTestCase(BaseTestGenerator):
self.server, self.db_name, self.schema_name, func_name)
func_id = function_info[0]
- response = self.tester.delete(
- self.url + str(utils.SERVER_GROUP) + '/' +
- str(self.server_id) + '/' +
- str(self.db_id) + '/' +
- str(self.schema_id) + '/' + str(func_id),
- content_type='html/json'
- )
- self.assertEqual(response.status_code, 200)
+ if self.is_positive_test:
+ if hasattr(self, 'without_functions_id'):
+ func_id = ''
+ self.test_data = {
+ "ids": [function_info[0]]
+ }
+ if hasattr(self, 'mock_empty_result') and self.mock_empty_result:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.delete_function(func_id)
+ else:
+ response = self.delete_function(func_id)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.delete_function(func_id)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
index 17ba115..124c272 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get.py
@@ -8,6 +8,7 @@
##########################################################################
import uuid
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
@@ -21,10 +22,62 @@ class FunctionGetTestCase(BaseTestGenerator):
skip_on_database = ['gpdb']
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL',
- dict(url='/browser/function/obj/'))
+ (
+ 'Fetch Function Node URL',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )
+ ),
+ (
+ 'Fetch Function properties fail.',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get properties.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )
+ ),
+ (
+ 'Fetch Function properties no function found.',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )
+ )
]
+ def get_properties(self, trigger_func_id):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(trigger_func_id),
+ content_type='html/json')
+ return response
+
def runTest(self):
""" This function will delete function under database node. """
super(FunctionGetTestCase, self).setUp()
@@ -35,13 +88,15 @@ class FunctionGetTestCase(BaseTestGenerator):
self.server, self.db_name, self.schema_name, func_name)
trigger_func_id = function_info[0]
- response = self.tester.get(
- self.url + str(utils.SERVER_GROUP) + '/' +
- str(self.server_id) + '/' +
- str(self.db_id) + '/' +
- str(self.schema_id) + '/' + str(trigger_func_id),
- content_type='html/json')
- self.assertEqual(response.status_code, 200)
+ if self.is_positive_test:
+ response = self.get_properties(trigger_func_id)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_properties(trigger_func_id)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_languages.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_languages.py
new file mode 100644
index 0000000..b43b663
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_languages.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetLanguagesTestCase(BaseTestGenerator):
+ """ This class get languages. """
+ scenarios = [
+ (
+ 'Fetch Function languages',
+ dict(
+ url='/browser/function/get_languages/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function languages fail',
+ dict(
+ url='/browser/function/get_languages/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get languages for functions.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_languages(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetLanguagesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_languages()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_languages()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_msql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_msql.py
new file mode 100644
index 0000000..e717a18
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_msql.py
@@ -0,0 +1,224 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from urllib.parse import urlencode
+from .. import FunctionView
+
+
+class FunctionGetmsqlTestCase(BaseTestGenerator):
+ """ This class get SQL. """
+ scenarios = [
+ (
+ 'Fetch Function msql',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_mock_local_function=False,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function msql fail',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_local_function=True,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": "(False, '')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function msql with function id',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=True,
+ mocking_required=True,
+ with_function_id=True,
+ is_mock_local_function=True,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": "(False, '')"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function msql fetch properties fail',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=False,
+ mocking_required=True,
+ with_function_id=True,
+ is_mock_local_function=False,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get msq fetch properties.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )
+ ),
+ (
+ 'Fetch Function msql fetch properties not found',
+ dict(
+ url='/browser/function/msql/',
+ is_positive_test=False,
+ mocking_required=True,
+ with_function_id=True,
+ is_mock_local_function=False,
+ test_data={
+ "name": "Test Function",
+ "funcowner": "",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "lanname": "sql",
+ "arguments": [],
+ "prosrc": "select '1'",
+ "probin": "$libdir/",
+ "variables": [],
+ "seclabels": [],
+ "acl": []
+ },
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_dict",
+ "return_value": "(True, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ ]
+
+ def get_sql(self):
+ if hasattr(self, "with_function_id") and self.with_function_id:
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+ self.test_data['oid'] = func_id
+ self.test_data['name'] = func_name
+ url = self.url + str(utils.SERVER_GROUP) + '/' + str(
+ self.server_id) + '/' + str(self.db_id) + '/' + str(
+ self.schema_id) + '/' + str(func_id) + '?' + (
+ urlencode(self.test_data))
+ else:
+ url = self.url + str(utils.SERVER_GROUP) + '/' + str(
+ self.server_id) + '/' + str(self.db_id) + '/' + str(
+ self.schema_id) + '/?' + (urlencode(self.test_data))
+ response = self.tester.get(
+ url,
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetmsqlTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+ db_user = self.server["username"]
+ self.test_data["funcowner"] = db_user
+
+ if self.is_positive_test:
+ response = self.get_sql()
+ else:
+ def _get_sql(self, **kwargs):
+ return False, ''
+ if self.is_mock_local_function:
+ with patch.object(FunctionView,
+ self.mock_data["function_name"],
+ new=_get_sql):
+ response = self.get_sql()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_sql()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_nodes.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_nodes.py
new file mode 100644
index 0000000..2a46468
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_nodes.py
@@ -0,0 +1,121 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+
+
+class FunctionGetNodesTestCase(BaseTestGenerator):
+ """ This class get function types """
+ scenarios = [
+ (
+ 'Fetch Function Nodes',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function Nodes Fail.',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get function nodes.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function Nodes with function id.',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=True,
+ mocking_required=False,
+ with_function_id=True,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function Nodes with function id fail.',
+ dict(
+ url='/browser/function/nodes/',
+ is_positive_test=False,
+ mocking_required=True,
+ with_function_id=True,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_2darray",
+ "return_value": "(True, {'rows':[]})"
+ },
+ expected_data={
+ "status_code": 410
+ }
+ ),
+ )
+ ]
+
+ def get_nodes(self):
+ if hasattr(self, 'with_function_id') and self.with_function_id:
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ else:
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetNodesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_nodes()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_nodes()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_sql.py
new file mode 100644
index 0000000..0f5a1e2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_sql.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionSqlTestCase(BaseTestGenerator):
+ """ This class for function SQL """
+ scenarios = [
+ (
+ 'Fetch Function SQL',
+ dict(
+ url='/browser/function/sql/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function SQL fail',
+ dict(
+ url='/browser/function/sql/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while SQL for functions.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def sql(self, func_id):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionSqlTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ if self.is_positive_test:
+ response = self.sql(func_id)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.sql(func_id)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_types.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_types.py
new file mode 100644
index 0000000..dd38406
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_types.py
@@ -0,0 +1,82 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetTypesTestCase(BaseTestGenerator):
+ """ This class get types """
+ scenarios = [
+ (
+ 'Fetch Function types',
+ dict(
+ url='/browser/function/get_types/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function types fail',
+ dict(
+ url='/browser/function/get_types/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'get_types',
+ "return_value": "(False, [])"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_types(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetTypesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_types()
+ else:
+ def _get_types(self, conn, condition, add_serials=False,
+ schema_oid=''):
+ return False, []
+
+ with patch.object(FunctionView, self.mock_data["function_name"],
+ new=_get_types):
+ response = self.get_types()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_variable_options.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_variable_options.py
new file mode 100644
index 0000000..4523202
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_get_variable_options.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetLanguagesTestCase(BaseTestGenerator):
+ """ This class get variable options. """
+ scenarios = [
+ (
+ 'Fetch Function variable options',
+ dict(
+ url='/browser/function/vopts/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function variable options fail',
+ dict(
+ url='/browser/function/vopts/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get languages for functions.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_languages(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetLanguagesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_languages()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_languages()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
index 1db46a3..076656a 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_function_put.py
@@ -9,12 +9,14 @@
import json
import uuid
+from unittest.mock import patch
from pgadmin.browser.server_groups.servers.databases.tests import utils as \
database_utils
from pgadmin.utils.route import BaseTestGenerator
from regression.python_test_utils import test_utils as utils
from . import utils as funcs_utils
+from .. import FunctionView
class FunctionPutTestCase(BaseTestGenerator):
@@ -22,18 +24,133 @@ class FunctionPutTestCase(BaseTestGenerator):
skip_on_database = ['gpdb']
scenarios = [
# Fetching default URL for function node.
- ('Fetch Function Node URL',
- dict(url='/browser/function/obj/'))
+ ('Fetch Function Node URL', dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_mock_function=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ ('Fetch Function update fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=False,
+ mock_data={
+ "function_name": "pgadmin.utils.driver.psycopg2."
+ "connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while create new function get sql.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Fetch Function update get sql fail', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=True,
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": [False, '']
+ },
+ expected_data={
+ "status_code": 500
+ }
+ )),
+ ('Fetch Function update get sql with no result.', dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_mock_function=True,
+ mock_data={
+ "function_name": '_get_sql',
+ "return_value": [True, '']
+ },
+ expected_data={
+ "status_code": 200
+ }
+ )),
+ (
+ 'Fetch Function update with arguments',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ with_function_id=True,
+ is_mock_local_function=False,
+ is_add_argument=True,
+ test_data={
+ "arguments": {
+ "changed": [{
+ "argdefval": "2",
+ "argid": 0,
+ "argmode": "IN",
+ "argname": "test",
+ "argtype": "integer",
+ }]
+ }
+ },
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function update with arguments fail',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ with_function_id=True,
+ is_mock_local_function=False,
+ is_add_argument=True,
+ test_data={
+ "arguments": {
+ "changed": [{
+ "argdefval": "2",
+ "argid": 0,
+ "argmode": "IN",
+ "argname": "param",
+ "argtype": "integer",
+ }]
+ }
+ },
+ mock_data={},
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
]
+ def update_function(self, func_id, data):
+ put_response = self.tester.put(
+ self.url + str(utils.SERVER_GROUP) +
+ '/' + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' +
+ str(func_id),
+ data=json.dumps(data),
+ follow_redirects=True)
+ return put_response
+
def runTest(self):
""" This function will update function under database node. """
super(FunctionPutTestCase, self).setUp()
self = funcs_utils.set_up(self)
-
func_name = "test_event_delete_%s" % str(uuid.uuid4())[1:8]
+
+ if hasattr(self, "is_add_argument") and self.is_add_argument:
+ args = "IN test integer DEFAULT 1"
+ else:
+ args = ''
function_info = funcs_utils.create_function(
- self.server, self.db_name, self.schema_name, func_name)
+ self.server, self.db_name, self.schema_name, func_name, args=args)
func_id = function_info[0]
@@ -42,6 +159,9 @@ class FunctionPutTestCase(BaseTestGenerator):
"id": func_id
}
+ if hasattr(self, "is_add_argument") and self.is_add_argument:
+ data['arguments'] = self.test_data['arguments']
+
if self.server_version >= 120000:
support_function_name = 'supportfunc_%s' % str(uuid.uuid4())[1:8]
funcs_utils.create_support_internal_function(
@@ -53,14 +173,29 @@ class FunctionPutTestCase(BaseTestGenerator):
data['prosupportfuc'] = support_function_name
- put_response = self.tester.put(
- self.url + str(utils.SERVER_GROUP) +
- '/' + str(self.server_id) + '/' + str(self.db_id) + '/' +
- str(self.schema_id) + '/' +
- str(func_id),
- data=json.dumps(data),
- follow_redirects=True)
- self.assertEqual(put_response.status_code, 200)
+ if self.is_positive_test:
+ response = self.update_function(func_id, data)
+ else:
+
+ if hasattr(self, 'is_mock_function') and self.is_mock_function:
+ local_ref = self
+
+ def _get_sql(self, **kwargs):
+ status = local_ref.mock_data["return_value"][0]
+ result = local_ref.mock_data['return_value'][1]
+ return status, result
+
+ with patch.object(FunctionView,
+ self.mock_data["function_name"],
+ new=_get_sql):
+ response = self.update_function(func_id, data)
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.update_function(func_id, data)
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
# Disconnect the database
database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependencies.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependencies.py
new file mode 100644
index 0000000..439e45d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependencies.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetDependenciesTestCase(BaseTestGenerator):
+ """ This class get dependencies for functions. """
+ scenarios = [
+ (
+ 'Fetch Function dependencies.',
+ dict(
+ url='/browser/function/dependency/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function dependencies fail',
+ dict(
+ url='/browser/function/dependency/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ )
+ ]
+
+ def get_dependency(self):
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetDependenciesTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_dependency()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_dependency()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependents.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependents.py
new file mode 100644
index 0000000..d62ecda
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_dependents.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetDependentsTestCase(BaseTestGenerator):
+ """ This class get dependents for functions. """
+ scenarios = [
+ (
+ 'Fetch Function dependents.',
+ dict(
+ url='/browser/function/dependent/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function dependents fail',
+ dict(
+ url='/browser/function/dependent/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ )
+ ]
+
+ def get_dependents(self):
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetDependentsTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_dependents()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_dependents()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_function_statistics.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_function_statistics.py
new file mode 100644
index 0000000..ff74106
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_function_statistics.py
@@ -0,0 +1,120 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetFunctionStatisticsTestCase(BaseTestGenerator):
+ """ This class get functions statistics. """
+ scenarios = [
+ (
+ 'Fetch Function get statistics',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function get statistics fail',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get function statistics.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function get statistics without function id',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=True,
+ mocking_required=True,
+ without_function_id=True,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function get statistics without function id fail',
+ dict(
+ url='/browser/function/stats/',
+ is_positive_test=False,
+ mocking_required=True,
+ without_function_id=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_scalar',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get function statistics.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ ]
+
+ def get_function_statistics(self):
+ if hasattr(self, "without_function_id") and self.without_function_id:
+ func_id = ''
+ else:
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetFunctionStatisticsTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_function_statistics()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_function_statistics()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_list.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_list.py
new file mode 100644
index 0000000..5fead0a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_list.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetListTestCase(BaseTestGenerator):
+ """ This class get list of functions. """
+ scenarios = [
+ (
+ 'Fetch Function list.',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function dependents fail',
+ dict(
+ url='/browser/function/obj/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_dict',
+ "return_value": "(False, 'Mocked Internal Server "
+ "Error while get function list.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_list(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetListTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_list()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_list()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_select_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_select_sql.py
new file mode 100644
index 0000000..3eef04a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_select_sql.py
@@ -0,0 +1,122 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetSelectSqlTestCase(BaseTestGenerator):
+ """ This class get select SQL for functions. """
+ scenarios = [
+ (
+ 'Fetch Function select sql.',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_add_argument=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function select sql fail',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_add_argument=False,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get select sql.')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ ),
+ (
+ 'Fetch Function select sql not found',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=False,
+ mocking_required=True,
+ is_add_argument=False,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(True, {'rows': []})"
+ },
+ expected_data={
+ "status_code": 410
+ }
+ ),
+ ),
+ (
+ 'Fetch Function select sql with arguments',
+ dict(
+ url='/browser/function/select_sql/',
+ is_positive_test=True,
+ mocking_required=False,
+ is_add_argument=True,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ ]
+
+ def get_select_sql(self):
+ func_name = "test_function_delete_%s" % str(uuid.uuid4())[1:8]
+ if self.is_add_argument:
+ args = "IN test integer DEFAULT 1"
+ else:
+ args = None
+ function_info = funcs_utils.create_function(
+ self.server, self.db_name, self.schema_name, func_name, args=args)
+
+ func_id = function_info[0]
+
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(func_id),
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetSelectSqlTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_select_sql()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_select_sql()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_supported_functions.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_supported_functions.py
new file mode 100644
index 0000000..573bf8e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/test_get_supported_functions.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from unittest.mock import patch
+
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as funcs_utils
+from .. import FunctionView
+
+
+class FunctionGetSupportedFunctionsTestCase(BaseTestGenerator):
+ """ This class get supported functions. """
+ scenarios = [
+ (
+ 'Fetch Function supported functions',
+ dict(
+ url='/browser/function/get_support_functions/',
+ is_positive_test=True,
+ mocking_required=False,
+ mock_data={},
+ expected_data={
+ "status_code": 200
+ }
+ ),
+ ),
+ (
+ 'Fetch Function support functions fail',
+ dict(
+ url='/browser/function/get_support_functions/',
+ is_positive_test=False,
+ mocking_required=True,
+ mock_data={
+ "function_name": 'pgadmin.utils.driver.psycopg2.'
+ 'connection.Connection.execute_2darray',
+ "return_value": "(False, 'Mocked Internal Server Error "
+ "while get supported function')"
+ },
+ expected_data={
+ "status_code": 500
+ }
+ ),
+ )
+ ]
+
+ def get_supported_functions(self):
+ response = self.tester.get(
+ self.url + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/',
+ content_type='html/json'
+ )
+ return response
+
+ def runTest(self):
+ """ This function will get function nodes under schema. """
+ super(FunctionGetSupportedFunctionsTestCase, self).runTest()
+ self = funcs_utils.set_up(self)
+
+ if self.is_positive_test:
+ response = self.get_supported_functions()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_supported_functions()
+
+ self.assertEqual(response.status_code,
+ self.expected_data['status_code'])
+ # Disconnect the database
+ database_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
index 09ae7ee..a73572d 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
@@ -142,7 +142,7 @@ def create_procedure(server, db_name, schema_name, func_name, s_type,
traceback.print_exc(file=sys.stderr)
-def create_function(server, db_name, schema_name, func_name):
+def create_function(server, db_name, schema_name, func_name, args=None):
"""This function add the procedure to schema"""
try:
connection = utils.get_db_connection(db_name,
@@ -152,11 +152,15 @@ def create_function(server, db_name, schema_name, func_name):
server['port'],
server['sslmode'])
pg_cursor = connection.cursor()
+ if args:
+ args = "{0}".format(args)
+ else:
+ args = ''
query = "CREATE FUNCTION " + schema_name + "." + func_name + \
- "()" \
+ "({0})" \
" RETURNS integer LANGUAGE 'sql' STABLE" \
" SECURITY DEFINER AS $$" \
- " SELECT 1; $$;"
+ " SELECT 1; $$;".format(args)
pg_cursor.execute(query)
connection.commit()
# Get 'oid' from newly created function
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions
2020-09-22 05:26 [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Nikhil Mohite <[email protected]>
2020-09-22 06:11 ` Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Akshay Joshi <[email protected]>
2020-09-22 07:14 ` Re: [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Nikhil Mohite <[email protected]>
@ 2020-09-22 11:32 ` Akshay Joshi <[email protected]>
0 siblings, 0 replies; 15+ messages in thread
From: Akshay Joshi @ 2020-09-22 11:32 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied
On Tue, 22 Sep, 2020, 12:44 Nikhil Mohite, <[email protected]>
wrote:
> Hi Akshay/Team,
>
> I checked the code and found an issue in the "msql" function, due to which
> test cases were failing.
> I have fixed the issue, PFA updated patch for the same.
> Sorry for the inconvenience.
>
>
> Regards,
> Nikhil Mohite.
>
>
>
> On Tue, Sep 22, 2020 at 11:41 AM Akshay Joshi <
> [email protected]> wrote:
>
>> Hi Nikhil
>>
>> Test cases are failing for all the database server with the following
>> error:
>> return True, sql.strip('\n')
>> AttributeError: 'tuple' object has no attribute 'strip'
>>
>> Please check and resend the patch.
>>
>> On Tue, Sep 22, 2020 at 10:56 AM Nikhil Mohite <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>>
>>> I have added few more test cases for the "Functions" module as per
>>> RM-5330 <https://redmine.postgresql.org/issues/5330;
>>> PFA patch.
>>>
>>> --
>>> *Thanks & Regards,*
>>> *Nikhil Mohite*
>>> *Software Engineer.*
>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>> *Mob.No: +91-7798364578.*
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>> *pgAdmin Hacker | Sr. Software Architect*
>> *EDB Postgres <http://edbpostgres.com>*
>>
>> *Mobile: +91 976-788-8246*
>>
>
^ permalink raw reply [nested|flat] 15+ messages in thread
* [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
@ 2020-12-01 09:18 Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-12-01 09:18 UTC (permalink / raw)
To: pgadmin-hackers
Hi Team,
Please find the attached patch for RM-5343
<https://redmine.postgresql.org/issues/5343;: [Code Coverage] Improve API
test cases for Debugger.
also updated implementation to remove dead code and unhandled exceptions.
--
*Thanks & Regards,*
*Nikhil Mohite*
*Software Engineer.*
*EDB Postgres* <https://www.enterprisedb.com/;
*Mob.No: +91-7798364578.*
Attachments:
[application/x-patch] RM_5343.patch (131.2K, 3-RM_5343.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
index a73572d..8e13f46 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
@@ -142,7 +142,8 @@ def create_procedure(server, db_name, schema_name, func_name, s_type,
traceback.print_exc(file=sys.stderr)
-def create_function(server, db_name, schema_name, func_name, args=None):
+def create_function(server, db_name, schema_name, func_name, args=None,
+ lang='sql'):
"""This function add the procedure to schema"""
try:
connection = utils.get_db_connection(db_name,
@@ -158,9 +159,9 @@ def create_function(server, db_name, schema_name, func_name, args=None):
args = ''
query = "CREATE FUNCTION " + schema_name + "." + func_name + \
"({0})" \
- " RETURNS integer LANGUAGE 'sql' STABLE" \
+ " RETURNS integer LANGUAGE '{1}' STABLE" \
" SECURITY DEFINER AS $$" \
- " SELECT 1; $$;".format(args)
+ " SELECT 1; $$;".format(args, lang)
pg_cursor.execute(query)
connection.commit()
# Get 'oid' from newly created function
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
index eba7508..130045f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
@@ -64,7 +64,7 @@ def create_trigger(server, db_name, schema_name, table_name, trigger_name,
trigger_id = trigger[0]
connection.close()
return trigger_id
- except Exception:
+ except Exception as e:
traceback.print_exc(file=sys.stderr)
raise
diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py
index 74844a1..5cac809 100644
--- a/web/pgadmin/tools/debugger/__init__.py
+++ b/web/pgadmin/tools/debugger/__init__.py
@@ -440,7 +440,7 @@ def init_function(node_type, sid, did, scid, fid, trid=None):
return err_msg
ret_status = status
-
+ msg = ''
# Check that the function is actually debuggable...
if r_set['rows'][0]:
# If func/proc is not defined in package body
@@ -479,9 +479,6 @@ def init_function(node_type, sid, did, scid, fid, trid=None):
if is_error:
return err_msg
- else:
- ret_status = False
- msg = gettext("The function/procedure cannot be debugged")
# Return the response that function cannot be debug...
if not ret_status:
@@ -1146,76 +1143,68 @@ def start_debugger_listener(trans_id):
if not status:
return internal_server_error(errormsg=result)
else:
- if conn.connected():
- # For indirect debugging first create the listener and then
- # wait for the target
+
+ sql = render_template(
+ "/".join([template_path, 'create_listener.sql']))
+
+ status, res = execute_dict_search_path(
+ conn, sql, de_inst.debugger_data['search_path'])
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ # Get and store the session variable which is required to fetch
+ # other information during debugging
+ int_session_id = res['rows'][0]['pldbg_create_listener']
+
+ # In EnterpriseDB versions <= 9.1 the
+ # pldbg_set_global_breakpoint function took five arguments,
+ # the 2nd argument being the package's OID, if any. Starting
+ # with 9.2, the package OID argument is gone, and the function
+ # takes four arguments like the community version has always
+ # done.
+ if server_type == 'ppas' and ver <= 90100:
sql = render_template(
- "/".join([template_path, 'create_listener.sql']))
+ "/".join([template_path, 'add_breakpoint_edb.sql']),
+ session_id=int_session_id,
+ function_oid=de_inst.debugger_data['function_id']
+ )
status, res = execute_dict_search_path(
conn, sql, de_inst.debugger_data['search_path'])
if not status:
return internal_server_error(errormsg=res)
-
- # Get and store the session variable which is required to fetch
- # other information during debugging
- int_session_id = res['rows'][0]['pldbg_create_listener']
-
- # In EnterpriseDB versions <= 9.1 the
- # pldbg_set_global_breakpoint function took five arguments,
- # the 2nd argument being the package's OID, if any. Starting
- # with 9.2, the package OID argument is gone, and the function
- # takes four arguments like the community version has always
- # done.
- if server_type == 'ppas' and ver <= 90100:
- sql = render_template(
- "/".join([template_path, 'add_breakpoint_edb.sql']),
- session_id=int_session_id,
- function_oid=de_inst.debugger_data['function_id']
- )
-
- status, res = execute_dict_search_path(
- conn, sql, de_inst.debugger_data['search_path'])
- if not status:
- return internal_server_error(errormsg=res)
- else:
- sql = render_template(
- "/".join([template_path, 'add_breakpoint_pg.sql']),
- session_id=int_session_id,
- function_oid=de_inst.debugger_data['function_id']
- )
-
- status, res = execute_dict_search_path(
- conn, sql, de_inst.debugger_data['search_path'])
- if not status:
- return internal_server_error(errormsg=res)
-
- # wait for the target
+ else:
sql = render_template(
- "/".join([template_path, 'wait_for_target.sql']),
- session_id=int_session_id
+ "/".join([template_path, 'add_breakpoint_pg.sql']),
+ session_id=int_session_id,
+ function_oid=de_inst.debugger_data['function_id']
)
- status, res = execute_async_search_path(
+ status, res = execute_dict_search_path(
conn, sql, de_inst.debugger_data['search_path'])
if not status:
return internal_server_error(errormsg=res)
- de_inst.debugger_data['exe_conn_id'] = \
- de_inst.debugger_data['conn_id']
- de_inst.debugger_data['restart_debug'] = 1
- de_inst.debugger_data['frame_id'] = 0
- de_inst.debugger_data['session_id'] = int_session_id
- de_inst.update_session()
- return make_json_response(
- data={'status': status, 'result': res}
- )
- else:
- status = False
- result = SERVER_CONNECTION_CLOSED
- return make_json_response(
- data={'status': status, 'result': result}
- )
+ # wait for the target
+ sql = render_template(
+ "/".join([template_path, 'wait_for_target.sql']),
+ session_id=int_session_id
+ )
+
+ status, res = execute_async_search_path(
+ conn, sql, de_inst.debugger_data['search_path'])
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ de_inst.debugger_data['exe_conn_id'] = \
+ de_inst.debugger_data['conn_id']
+ de_inst.debugger_data['restart_debug'] = 1
+ de_inst.debugger_data['frame_id'] = 0
+ de_inst.debugger_data['session_id'] = int_session_id
+ de_inst.update_session()
+ return make_json_response(
+ data={'status': status, 'result': res}
+ )
else:
status = False
result = SERVER_CONNECTION_CLOSED
@@ -1519,6 +1508,7 @@ def set_clear_breakpoint(trans_id, line_no, set_type):
status, result = execute_dict_search_path(
conn, sql, de_inst.debugger_data['search_path'])
+ result = result['rows']
if not status:
return internal_server_error(errormsg=result)
else:
@@ -1526,7 +1516,7 @@ def set_clear_breakpoint(trans_id, line_no, set_type):
result = SERVER_CONNECTION_CLOSED
return make_json_response(
- data={'status': status, 'result': result['rows']}
+ data={'status': status, 'result': result}
)
@@ -1583,6 +1573,7 @@ def clear_all_breakpoint(trans_id):
conn, sql, de_inst.debugger_data['search_path'])
if not status:
return internal_server_error(errormsg=result)
+ result = result['rows']
else:
return make_json_response(data={'status': False})
else:
@@ -1590,7 +1581,7 @@ def clear_all_breakpoint(trans_id):
result = SERVER_CONNECTION_CLOSED
return make_json_response(
- data={'status': status, 'result': result['rows']}
+ data={'status': status, 'result': result}
)
diff --git a/web/pgadmin/tools/debugger/static/js/debugger.js b/web/pgadmin/tools/debugger/static/js/debugger.js
index 9d45f17..1c89ff2 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger.js
@@ -429,7 +429,7 @@ define([
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, treeInfo.schema.label, treeInfo.database.label, null, pgBrowser);
panel.focus();
@@ -452,7 +452,7 @@ define([
function(evt, value) {
if(value) {
let browser_preferences = pgBrowser.get_preferences_for_module('browser');
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, treeInfo.schema.label, treeInfo.database.label, value, pgBrowser);
}
},
@@ -571,7 +571,7 @@ define([
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
- var label = newTreeInfo.function ? newTreeInfo.function.label : newTreeInfo.procedure.label;
+ var label = newTreeInfo.function ? newTreeInfo.function.label : newTreeInfo.trigger_function ? newTreeInfo.trigger_function.label : newTreeInfo.trigger ? newTreeInfo.trigger.label : newTreeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, newTreeInfo.schema.label, newTreeInfo.database.label, null, pgBrowser);
panel.focus();
@@ -594,7 +594,7 @@ define([
function(evt, value) {
if(value) {
let browser_preferences = pgBrowser.get_preferences_for_module('browser');
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, treeInfo.schema.label, treeInfo.database.label, value, pgBrowser);
}
},
diff --git a/web/pgadmin/tools/debugger/static/js/debugger_ui.js b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
index 4af58d8..6acb5ad 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger_ui.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
@@ -778,7 +778,7 @@ define([
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
var browser_pref = pgBrowser.get_preferences_for_module('browser');
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_pref, label, treeInfo.schema.label, treeInfo.database.label, null, pgBrowser);
panel.focus();
@@ -799,7 +799,7 @@ define([
// We will execute this function when user clicks on the OK button
function(evt, value) {
if(value) {
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, self.preferences, label, treeInfo.schema.label, treeInfo.database.label, value, pgBrowser);
}
},
diff --git a/web/pgadmin/tools/debugger/tests/__init__.py b/web/pgadmin/tools/debugger/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/web/pgadmin/tools/debugger/tests/debugger_test_data.json b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
new file mode 100644
index 0000000..bcd0613
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
@@ -0,0 +1,1703 @@
+{
+ "init_debugger_for_function": [
+ {
+ "name": "Debugger initialization",
+ "url": "/debugger/init/function/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "function",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger initialization nodetype",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "function",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: Function is not found",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(True, {'rows': []})"
+ },
+ "expected_data": {
+ "status_code": 410
+ }
+ },
+ {
+ "name": "Debugger initialization: Check Function is debuggable",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server Error while checking function is debuggable.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: Check Function is debuggable fail",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "mock_multiple_calls": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, 0),(False, 'Mocked Internal Server Error ')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: Check Function name is valid",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "invalid_name": true,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: pldggapi extension missing.",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "mock_multiple_calls": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, '0'), (True, '0')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "init_debugger_for_trigger": [
+ {
+ "name": "Debugger initialization for trigger",
+ "url": "/debugger/init/trigger/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger initialization for trigger: fail",
+ "url": "/debugger/init/trigger/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "init_debugger_target": [
+ {
+ "name": "Debugger initialize target direct",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger initialize target direct negative",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target direct negative validate debugger",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target direct negative validate indirect debugger",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target direct negative connection error",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connect",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target indirect",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger initialize target direct with trigger id",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger initialize target direct with trigger id",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "type": "direct",
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize target direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },{
+ "name": "Debugger initialize target direct with trigger id fail",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "mock_multiple": true,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, 0), (False, 'Mocked Internal Server Error while checking debugger initialize target direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target indirect with trigger id fail",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "mock_multiple": false,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, {})"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target debugger version not valid.",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "mock_multiple": true,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, ''), (True, ''), (False,'Mocking invalid debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "close_debugger": [
+ {
+ "name": "Close Debugger",
+ "url": "debugger/close/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "restart_debugger": [
+ {
+ "name": "Restart Debugger: Debugger not triggered.",
+ "url": "debugger/restart/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "trigger",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": false,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Restart Debugger: Debugger initialized.",
+ "url": "debugger/restart/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "trigger",
+ "invalid_name": false,
+ "init_target": true,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Restart Debugger: Server not connected.",
+ "url": "debugger/restart/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "trigger",
+ "invalid_name": false,
+ "init_target": true,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "start_listener": [
+ {
+ "name": "Debugger start listener",
+ "url": "debugger/start_listener/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener fail",
+ "url": "debugger/start_listener/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener connection fail",
+ "url": "debugger/start_listener/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener indirect",
+ "url": "debugger/start_listener/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener indirect disconnected",
+ "url": "debugger/start_listener/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "debugger_messages": [
+ {
+ "name": "Debugger Messages",
+ "url": "debugger/messages/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger Messages: connection fail",
+ "url": "debugger/messages/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },{
+ "name": "Debugger Messages: debugger instace fail",
+ "url": "debugger/messages/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "start_execution": [
+ {
+ "name": "Debugger Start Execution",
+ "url": "debugger/start_execution/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "add_port_no": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "poll_end_execution_result": [
+ {
+ "name": "Debugger Poll Execution Results.",
+ "url": "debugger/poll_end_execution_result/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Poll Execution Results: Connection fail",
+ "url": "debugger/poll_end_execution_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Poll Execution Results: fail to poll data.",
+ "url": "debugger/poll_end_execution_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.poll",
+ "return_value": "(False, 'Mock internal server error while poll data for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "debugger_direct": [
+ {
+ "name": "Debugger Direct: Init debugger in direct mode",
+ "url": "debugger/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Direct: Init debugger in direct mode fail",
+ "url": "debugger/direct/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": false,
+ "invalid_trans": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "",
+ "return_value": ""
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Direct: Init debugger in direct with arguments",
+ "url": "debugger/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": true,
+ "invalid_trans": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "",
+ "return_value": ""
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "execute_query": [
+ {
+ "name": "Debugger execute: positive",
+ "url": "debugger/execute_query/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger execute: Connection fail.",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger instance fail",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger continue",
+ "url": "debugger/execute_query/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "query_type": "continue",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger patch error",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger async fail",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "query_type": "continue",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_async",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "poll_result": [
+ {
+ "name": "Debugger poll result",
+ "url": "debugger/poll_result/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger poll result: Disconnected",
+ "url": "debugger/poll_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger poll result: poll error",
+ "url": "debugger/poll_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.poll",
+ "return_value": "(False, 'Mocking internal error for poll debugger result.')"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger poll result: Debugger instance fail",
+ "url": "debugger/poll_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.poll",
+ "return_value": "(False, 'Mocking internal error for poll debugger result.')"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "set_breakpoint": [
+ {
+ "name": "Debugger Set breakpoint",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: debugger instance fail.",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: Search path error.",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: Connection error",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: Clear breakpoint.",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "query_type": 2,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "clear_all_breakpoint": [
+ {
+ "name": "Debugger Clear all breakpoint: .",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: Debugger instance error.",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: search path error.",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: Connection error.",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: No breakpoint to clear",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "no_breakpoint": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "get_arguments": [
+ {
+ "name": "Debugger get arguments.",
+ "url": "debugger/get_arguments/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }],
+ "set_arguments": [
+ {
+ "name": "Debugger set arguments.",
+ "url": "debugger/set_arguments/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "clear_arguments": [
+ {
+ "name": "Debugger set arguments.",
+ "url": "debugger/clear_arguments/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/tools/debugger/tests/test_close_debugger.py b/web/pgadmin/tools/debugger/tests/test_close_debugger.py
new file mode 100644
index 0000000..b1deddc
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_close_debugger.py
@@ -0,0 +1,77 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class CloseDebugger(BaseTestGenerator):
+ """ This class will Close the debugger """
+
+ scenarios = utils.generate_scenarios('close_debugger',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(CloseDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ def close_debugger(self):
+ return self.tester.delete(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.close_debugger()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.close_debugger()
+ else:
+ response = self.close_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
new file mode 100644
index 0000000..8075782
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
@@ -0,0 +1,92 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerClearAllBreakpoint(BaseTestGenerator):
+ """ This class will set breakpoint."""
+
+ scenarios = utils.generate_scenarios('clear_all_breakpoint',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerClearAllBreakpoint, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+ breakpoint = debugger_utils.set_breakpoint(self)
+
+ def clear_all_breakpoint(self):
+ if hasattr(self, 'no_breakpoint') and self.no_breakpoint:
+ breakpoint_data = {"breakpoint_list": ''}
+ else:
+ breakpoint_data = {"breakpoint_list": 3}
+
+ return self.tester.post(
+ self.url + str(self.trans_id),
+ data=breakpoint_data)
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.clear_all_breakpoint()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.clear_all_breakpoint()
+ else:
+ response = self.clear_all_breakpoint()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ # debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
new file mode 100644
index 0000000..d2ed413
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
@@ -0,0 +1,83 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerClearArguments(BaseTestGenerator):
+ """ This class will get arguments.."""
+
+ scenarios = utils.generate_scenarios('clear_arguments',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerClearArguments, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def clear_arguments(self):
+ return self.tester.post(
+ self.url + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ data={}
+ )
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.clear_arguments()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.clear_arguments()
+ else:
+ response = self.clear_arguments()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_direct.py b/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
new file mode 100644
index 0000000..d04b506
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
@@ -0,0 +1,84 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerDirect(BaseTestGenerator):
+ """ This class will start debugger in direct mode."""
+
+ scenarios = utils.generate_scenarios('debugger_direct',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerDirect, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def direct(self):
+ if hasattr(self, 'invalid_trans') and self.invalid_trans:
+ self.trans_id = 0
+
+ return self.tester.get(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.direct()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.direct()
+ else:
+ response = self.direct()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
new file mode 100644
index 0000000..3a64520
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
@@ -0,0 +1,86 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerExecuteQuery(BaseTestGenerator):
+ """ This class will execute query in debugger."""
+
+ scenarios = utils.generate_scenarios('execute_query',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerExecuteQuery, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+ debugger_utils.start_listener(self)
+
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+
+ def execute_query(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.query_type),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.execute_query()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.execute_query()
+ else:
+ response = self.execute_query()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ if hasattr(self, 'abort_debugger') and self.abort_debugger:
+ debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_get_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_get_arguments.py
new file mode 100644
index 0000000..ce2684e
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_get_arguments.py
@@ -0,0 +1,71 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerGetArguments(BaseTestGenerator):
+ """ This class will get arguments.."""
+
+ scenarios = utils.generate_scenarios('get_arguments',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerGetArguments, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ def get_arguments(self):
+ return self.tester.get(
+ self.url + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.get_arguments()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_arguments()
+ else:
+ response = self.get_arguments()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
new file mode 100644
index 0000000..47e9f98
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
@@ -0,0 +1,86 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerPollExecutionResult(BaseTestGenerator):
+ """ This class will start debugger execution."""
+
+ scenarios = utils.generate_scenarios('poll_end_execution_result',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerPollExecutionResult, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+
+ def poll_execution_result(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.poll_execution_result()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.poll_execution_result()
+ else:
+ response = self.poll_execution_result()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ # debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
new file mode 100644
index 0000000..3b894a4
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
@@ -0,0 +1,83 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerPollResult(BaseTestGenerator):
+ """ This class will execute query in debugger."""
+
+ scenarios = utils.generate_scenarios('poll_result',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerPollResult, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+
+ def execute_query(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.execute_query()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.execute_query()
+ else:
+ response = self.execute_query()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
new file mode 100644
index 0000000..d4eef3f
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
@@ -0,0 +1,89 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerSetArguments(BaseTestGenerator):
+ """ This class will get arguments.."""
+
+ scenarios = utils.generate_scenarios('set_arguments',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerSetArguments, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def set_arguments(self):
+ args = {"data": json.dumps([
+ {"server_id": self.server_id, "database_id": self.db_id,
+ "schema_id": self.schema_id, "function_id": self.func_id,
+ "arg_id": 0, "is_null": 0, "is_expression": 0, "use_default": 1}])
+ }
+
+ return self.tester.post(
+ self.url + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ data=args
+ )
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.set_arguments()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.set_arguments()
+ else:
+ response = self.set_arguments()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
new file mode 100644
index 0000000..45f7757
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
@@ -0,0 +1,89 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerSetBreakpoint(BaseTestGenerator):
+ """ This class will set breakpoint."""
+
+ scenarios = utils.generate_scenarios('set_breakpoint',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerSetBreakpoint, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+
+ if self.query_type == 2:
+ debugger_utils.set_breakpoint(self)
+
+ def set_breakpoint(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/3/' + str(self.query_type),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.set_breakpoint()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.set_breakpoint()
+ else:
+ response = self.set_breakpoint()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ # debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py b/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
new file mode 100644
index 0000000..82c27e1
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
@@ -0,0 +1,113 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class InitDebugger(BaseTestGenerator):
+ """ This class will Initialize the debugger """
+
+ scenarios = utils.generate_scenarios('init_debugger_for_function',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(InitDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ if self.invalid_name:
+ db_user = self.server["username"]
+ self.test_data = {"acl": [
+ {
+ "grantee": db_user,
+ "grantor": db_user,
+ "privileges":
+ [
+ {
+ "privilege_type": "X",
+ "privilege": True,
+ "with_grant": True
+ }
+ ]
+ }
+ ], "arguments": [], "funcowner": db_user, "lanname": "sql",
+ "name": "test_function_:_%s" % str(uuid.uuid4())[1:8],
+ "options": [], "proleakproof": True, "pronamespace": 2200,
+ "prorettypename": "integer", "prosecdef": True,
+ "prosrc": "SELECT 1;", "probin": "$libdir/",
+ "provolatile": "s", "seclabels": [], "variables": [{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }]
+ }
+
+ function_info = debugger_utils.create_function(self, utils)
+ self.func_id = json.loads(function_info.data)['node']['_id']
+ else:
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ def initialize_debugger(self):
+ if self.node_type == 'function':
+ return self.tester.get(
+ self.url + str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(self.func_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.initialize_debugger()
+ else:
+ if self.mocking_required:
+ if hasattr(self,
+ 'mock_multiple_calls') and self.mock_multiple_calls:
+ with patch(self.mock_data["function_name"],
+ side_effect=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_debugger()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_debugger()
+ else:
+ response = self.initialize_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py b/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
new file mode 100644
index 0000000..b45e948
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
@@ -0,0 +1,95 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.\
+ tables.tests import utils as tables_utils
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.functions.tests \
+ import utils as trigger_funcs_utils
+
+
+class InitDebugger(BaseTestGenerator):
+ """ This class will Initialize the debugger """
+
+ scenarios = utils.generate_scenarios('init_debugger_for_trigger',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(InitDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.db_name = parent_node_dict["database"][-1]["db_name"]
+ self.schema_id = self.schema_data['schema_id']
+ self.schema_name = self.schema_data["schema_name"]
+ db_con = database_utils.connect_database(self, utils.SERVER_GROUP,
+ self.server_id, self.db_id)
+ if not db_con['data']["connected"]:
+ raise Exception("Could not connect to database to delete trigger.")
+
+ self.table_name = "table_trigger_%s" % (str(uuid.uuid4())[1:8])
+ self.table_id = tables_utils.create_table(self.server, self.db_name,
+ self.schema_name,
+ self.table_name)
+ self.trigger_func_name = "trigger_func_delete_%s" % \
+ str(uuid.uuid4())[1:8]
+ self.trigger_function_id = \
+ trigger_funcs_utils.create_trigger_function_with_trigger(
+ self.server, self.db_name, self.schema_name,
+ self.trigger_func_name)[0]
+ self.trigger_name = "trigger_%s" % str(uuid.uuid4())[1:8]
+
+ self.test_data['name'] = self.trigger_name
+ self.test_data['tfunction'] = "{0}.{1}".format(self.schema_name,
+ self.trigger_func_name)
+ self.trigger_id = debugger_utils.create_trigger(self, utils)
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ def initialize_debugger(self):
+ if self.node_type == 'trigger':
+ return self.tester.get(
+ self.url + str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(self.table_id) +
+ '/' + str(self.trigger_id),
+ content_type='html/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.initialize_debugger()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.initialize_debugger()
+ else:
+ response = self.initialize_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_init_target.py b/web/pgadmin/tools/debugger/tests/test_init_target.py
new file mode 100644
index 0000000..13470c8
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_init_target.py
@@ -0,0 +1,137 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.tests\
+ import utils as tables_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.functions.tests \
+ import utils as trigger_funcs_utils
+
+
+class InitTargetDebugger(BaseTestGenerator):
+ """ This class will Initialize the debugger """
+
+ scenarios = utils.generate_scenarios('init_debugger_target',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(InitTargetDebugger, self).setUp()
+ self.debugger_error = 'The debugger plugin is not enabled. ' \
+ 'Please add the plugin to the shared_preload_' \
+ 'libraries setting in the postgresql.conf file' \
+ ' and restart the database server for indirect' \
+ ' debugging.'
+
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if hasattr(self, 'create_trigger_func') and self.create_trigger_func:
+ db_con = db_utils.connect_database(self, utils.SERVER_GROUP,
+ self.server_id, self.db_id)
+ if not db_con['data']["connected"]:
+ raise Exception(
+ "Could not connect to database to delete trigger.")
+
+ self.table_name = "table_trigger_%s" % (str(uuid.uuid4())[1:8])
+ self.table_id = tables_utils.create_table(self.server,
+ self.db_name,
+ self.schema_name,
+ self.table_name)
+
+ self.trigger_func_name = 'test_trigger_function_%s' % str(
+ uuid.uuid4())[1:8]
+
+ self.trigger_function_id = \
+ trigger_funcs_utils.create_trigger_function_with_trigger(
+ self.server, self.db_name, self.schema_name,
+ self.trigger_func_name)[0]
+
+ self.trigger_name = "trigger_%s" % str(uuid.uuid4())[1:8]
+ self.test_data['name'] = self.trigger_name
+ self.test_data['tfunction'] = "{0}.{1}".format(
+ self.schema_name, self.trigger_func_name)
+
+ self.trigger_id = debugger_utils.create_trigger(self, utils)
+
+ def initialize_traget(self):
+ if hasattr(self, 'create_trigger_func') and self.create_trigger_func:
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.server_id) +
+ '/' + str(self.db_id) + '/' + str(self.schema_id) +
+ '/' + str(self.table_id) + '/' +
+ str(self.trigger_id), content_type='application/json')
+ else:
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.server_id) +
+ '/' + str(self.db_id) + '/' + str(self.schema_id) +
+ '/' + str(self.func_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.initialize_traget()
+ else:
+ if self.mocking_required:
+ if hasattr(self, 'mock_multiple') and self.mock_multiple:
+ with patch(self.mock_data["function_name"],
+ side_effect=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_traget()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_traget()
+ else:
+ response = self.initialize_traget()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ if response.json['errormsg'] == self.debugger_error:
+ print(self.debugger_error)
+ self.assertEqual(actual_response_code, actual_response_code)
+ else:
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_messages_debugger.py b/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
new file mode 100644
index 0000000..437cbfd
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerMessages(BaseTestGenerator):
+ """ This class will get messages the debugger """
+
+ scenarios = utils.generate_scenarios('debugger_messages',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerMessages, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def messages(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.messages()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.messages()
+ else:
+ response = self.messages()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """Close debugger connection."""
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_restart_debugger.py b/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
new file mode 100644
index 0000000..ab75315
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
@@ -0,0 +1,82 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class RestartDebugger(BaseTestGenerator):
+ """ This class will Restart the debugger """
+
+ scenarios = utils.generate_scenarios('restart_debugger',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(RestartDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def restart_debugger(self):
+ return self.tester.get(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.restart_debugger()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.restart_debugger()
+ else:
+ response = self.restart_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
new file mode 100644
index 0000000..91f71f2
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerStartExecution(BaseTestGenerator):
+ """ This class will start debugger execution."""
+
+ scenarios = utils.generate_scenarios('start_execution',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerStartExecution, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+
+ def start_execution(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.port_no),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.start_execution()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.start_execution()
+ else:
+ response = self.start_execution()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
new file mode 100644
index 0000000..f4b079e
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
@@ -0,0 +1,89 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerStartListener(BaseTestGenerator):
+ """ This class will start listen the debugger """
+
+ scenarios = utils.generate_scenarios('start_listener',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerStartListener, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ if self.server['type'] == 'pg':
+ self.skipTest('Skipping test case for pg')
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def start_listener(self):
+ if hasattr(self, 'update_debugger') and self.update_debugger:
+ return self.tester.post(
+ self.url + str(self.trans_id),
+ data=json.dumps({}),
+ content_type='application/json')
+ else:
+ return self.tester.get(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.start_listener()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.start_listener()
+ else:
+ response = self.start_listener()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/utils.py b/web/pgadmin/tools/debugger/tests/utils.py
new file mode 100644
index 0000000..6f6082d
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/utils.py
@@ -0,0 +1,146 @@
+import os
+import json
+
+
+CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
+with open(CURRENT_PATH + "/debugger_test_data.json") as data_file:
+ test_cases = json.load(data_file)
+
+
+def delete_function(self, utils):
+ response = self.tester.delete(
+ '/browser/function/obj/' + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ content_type='html/json'
+ )
+
+ self.assertEqual(response.status_code, 200)
+
+
+def create_function(self, utils):
+ self.test_data['pronamespace'] = self.schema_id
+ function_url = 'browser/function/obj/{0}/{1}/{2}/{3}/'.format(
+ str(utils.SERVER_GROUP), str(self.server_id), str(self.db_id),
+ str(self.schema_id))
+
+ response = self.tester.post(
+ function_url,
+ data=json.dumps(self.test_data),
+ content_type='html/json'
+ )
+ return response
+
+
+def close_debugger(self):
+ response = self.tester.delete(
+ 'debugger/close/' + str(self.trans_id),
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def abort_debugger(self):
+ response = self.tester.get(
+ 'debugger/execute_query/' + str(self.trans_id) + '/abort_target',
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def add_extension(self, utils):
+ extension_url = '/browser/extension/obj/{0}/{1}/{2}/'.format(
+ str(utils.SERVER_GROUP), str(self.server_id), str(self.db_id))
+ extension_data = {
+ "name": "pldbgapi",
+ "relocatable": True,
+ "schema": self.schema_name,
+ "version": "1.1"
+ }
+ try:
+ response = self.tester.post(
+ extension_url,
+ data=json.dumps(extension_data),
+ content_type='application/json')
+ except Exception as e:
+ print('Unable to create "pldbgapi" extension.')
+
+
+def init_debugger_function(self):
+ function_url = '/debugger/init/function/'
+ response = self.tester.get(
+ function_url + str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(self.func_id),
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+ return response
+
+
+def initialize_target(self, utils, close_debugger_instance=True):
+ target_url = '/debugger/initialize_target/{0}/'.format(self.type)
+ response = self.tester.get(
+ target_url + str(self.trans_id) + '/' + str(self.server_id) +
+ '/' + str(self.db_id) + '/' + str(self.schema_id) +
+ '/' + str(self.func_id),
+ content_type='application/json')
+
+ if response.status_code == 200:
+ return response
+ else:
+ if close_debugger_instance:
+ close_debugger(self)
+
+ delete_function(self, utils)
+ self.skipTest('The debugger plugin is not enabled. Please add the '
+ 'plugin to the shared_preload_libraries setting in the '
+ 'postgresql.conf file and restart the database server '
+ 'for indirect debugging.')
+
+
+def start_listener(self):
+ response = self.tester.get(
+ 'debugger/start_listener/' + str(self.trans_id),
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def create_trigger(self, utils):
+ response = self.tester.post(
+ "{0}{1}/{2}/{3}/{4}/{5}/".format('/browser/trigger/obj/',
+ utils.SERVER_GROUP,
+ self.server_id, self.db_id,
+ self.schema_id, self.table_id),
+ data=json.dumps(self.test_data),
+ content_type='html/json'
+ )
+
+ self.assertEqual(response.status_code, 200)
+ return json.loads(response.data)['node']['_id']
+
+
+def messages(self):
+ response = self.tester.get(
+ 'debugger/messages/' + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ return json.loads(response.data)['data']['result']
+
+
+def start_execution(self):
+ response = self.tester.get(
+ 'debugger/start_execution/' + str(self.trans_id) + '/' + str(
+ self.port_no), content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def set_breakpoint(self):
+ response = self.tester.get(
+ "debugger/set_breakpoint/" + str(self.trans_id) + '/3/1',
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+ return response
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
@ 2020-12-02 05:33 ` Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Akshay Joshi @ 2020-12-02 05:33 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Hi Nikhil
The patch is not applied, please rebase and send the patch again.
On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <[email protected]>
wrote:
> Hi Team,
>
> Please find the attached patch for RM-5343
> <https://redmine.postgresql.org/issues/5343;: [Code Coverage] Improve API
> test cases for Debugger.
> also updated implementation to remove dead code and unhandled exceptions.
>
>
> --
> *Thanks & Regards,*
> *Nikhil Mohite*
> *Software Engineer.*
> *EDB Postgres* <https://www.enterprisedb.com/;
> *Mob.No: +91-7798364578.*
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
@ 2020-12-02 05:55 ` Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-12-02 05:55 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay,
please find the updated patch, sorry for the inconvenience.
Regards,
Nikhil Mohite.
On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <[email protected]>
wrote:
> Hi Nikhil
>
> The patch is not applied, please rebase and send the patch again.
>
> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
> [email protected]> wrote:
>
>> Hi Team,
>>
>> Please find the attached patch for RM-5343
>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage] Improve
>> API test cases for Debugger.
>> also updated implementation to remove dead code and unhandled exceptions.
>>
>>
>> --
>> *Thanks & Regards,*
>> *Nikhil Mohite*
>> *Software Engineer.*
>> *EDB Postgres* <https://www.enterprisedb.com/;
>> *Mob.No: +91-7798364578.*
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Principal Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>
Attachments:
[application/octet-stream] RM_5343_v2.patch (131.3K, 3-RM_5343_v2.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
index a73572d..8e13f46 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/functions/tests/utils.py
@@ -142,7 +142,8 @@ def create_procedure(server, db_name, schema_name, func_name, s_type,
traceback.print_exc(file=sys.stderr)
-def create_function(server, db_name, schema_name, func_name, args=None):
+def create_function(server, db_name, schema_name, func_name, args=None,
+ lang='sql'):
"""This function add the procedure to schema"""
try:
connection = utils.get_db_connection(db_name,
@@ -158,9 +159,9 @@ def create_function(server, db_name, schema_name, func_name, args=None):
args = ''
query = "CREATE FUNCTION " + schema_name + "." + func_name + \
"({0})" \
- " RETURNS integer LANGUAGE 'sql' STABLE" \
+ " RETURNS integer LANGUAGE '{1}' STABLE" \
" SECURITY DEFINER AS $$" \
- " SELECT 1; $$;".format(args)
+ " SELECT 1; $$;".format(args, lang)
pg_cursor.execute(query)
connection.commit()
# Get 'oid' from newly created function
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
index eba7508..130045f 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/tests/utils.py
@@ -64,7 +64,7 @@ def create_trigger(server, db_name, schema_name, table_name, trigger_name,
trigger_id = trigger[0]
connection.close()
return trigger_id
- except Exception:
+ except Exception as e:
traceback.print_exc(file=sys.stderr)
raise
diff --git a/web/pgadmin/tools/debugger/__init__.py b/web/pgadmin/tools/debugger/__init__.py
index 74844a1..5cac809 100644
--- a/web/pgadmin/tools/debugger/__init__.py
+++ b/web/pgadmin/tools/debugger/__init__.py
@@ -440,7 +440,7 @@ def init_function(node_type, sid, did, scid, fid, trid=None):
return err_msg
ret_status = status
-
+ msg = ''
# Check that the function is actually debuggable...
if r_set['rows'][0]:
# If func/proc is not defined in package body
@@ -479,9 +479,6 @@ def init_function(node_type, sid, did, scid, fid, trid=None):
if is_error:
return err_msg
- else:
- ret_status = False
- msg = gettext("The function/procedure cannot be debugged")
# Return the response that function cannot be debug...
if not ret_status:
@@ -1146,76 +1143,68 @@ def start_debugger_listener(trans_id):
if not status:
return internal_server_error(errormsg=result)
else:
- if conn.connected():
- # For indirect debugging first create the listener and then
- # wait for the target
+
+ sql = render_template(
+ "/".join([template_path, 'create_listener.sql']))
+
+ status, res = execute_dict_search_path(
+ conn, sql, de_inst.debugger_data['search_path'])
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ # Get and store the session variable which is required to fetch
+ # other information during debugging
+ int_session_id = res['rows'][0]['pldbg_create_listener']
+
+ # In EnterpriseDB versions <= 9.1 the
+ # pldbg_set_global_breakpoint function took five arguments,
+ # the 2nd argument being the package's OID, if any. Starting
+ # with 9.2, the package OID argument is gone, and the function
+ # takes four arguments like the community version has always
+ # done.
+ if server_type == 'ppas' and ver <= 90100:
sql = render_template(
- "/".join([template_path, 'create_listener.sql']))
+ "/".join([template_path, 'add_breakpoint_edb.sql']),
+ session_id=int_session_id,
+ function_oid=de_inst.debugger_data['function_id']
+ )
status, res = execute_dict_search_path(
conn, sql, de_inst.debugger_data['search_path'])
if not status:
return internal_server_error(errormsg=res)
-
- # Get and store the session variable which is required to fetch
- # other information during debugging
- int_session_id = res['rows'][0]['pldbg_create_listener']
-
- # In EnterpriseDB versions <= 9.1 the
- # pldbg_set_global_breakpoint function took five arguments,
- # the 2nd argument being the package's OID, if any. Starting
- # with 9.2, the package OID argument is gone, and the function
- # takes four arguments like the community version has always
- # done.
- if server_type == 'ppas' and ver <= 90100:
- sql = render_template(
- "/".join([template_path, 'add_breakpoint_edb.sql']),
- session_id=int_session_id,
- function_oid=de_inst.debugger_data['function_id']
- )
-
- status, res = execute_dict_search_path(
- conn, sql, de_inst.debugger_data['search_path'])
- if not status:
- return internal_server_error(errormsg=res)
- else:
- sql = render_template(
- "/".join([template_path, 'add_breakpoint_pg.sql']),
- session_id=int_session_id,
- function_oid=de_inst.debugger_data['function_id']
- )
-
- status, res = execute_dict_search_path(
- conn, sql, de_inst.debugger_data['search_path'])
- if not status:
- return internal_server_error(errormsg=res)
-
- # wait for the target
+ else:
sql = render_template(
- "/".join([template_path, 'wait_for_target.sql']),
- session_id=int_session_id
+ "/".join([template_path, 'add_breakpoint_pg.sql']),
+ session_id=int_session_id,
+ function_oid=de_inst.debugger_data['function_id']
)
- status, res = execute_async_search_path(
+ status, res = execute_dict_search_path(
conn, sql, de_inst.debugger_data['search_path'])
if not status:
return internal_server_error(errormsg=res)
- de_inst.debugger_data['exe_conn_id'] = \
- de_inst.debugger_data['conn_id']
- de_inst.debugger_data['restart_debug'] = 1
- de_inst.debugger_data['frame_id'] = 0
- de_inst.debugger_data['session_id'] = int_session_id
- de_inst.update_session()
- return make_json_response(
- data={'status': status, 'result': res}
- )
- else:
- status = False
- result = SERVER_CONNECTION_CLOSED
- return make_json_response(
- data={'status': status, 'result': result}
- )
+ # wait for the target
+ sql = render_template(
+ "/".join([template_path, 'wait_for_target.sql']),
+ session_id=int_session_id
+ )
+
+ status, res = execute_async_search_path(
+ conn, sql, de_inst.debugger_data['search_path'])
+ if not status:
+ return internal_server_error(errormsg=res)
+
+ de_inst.debugger_data['exe_conn_id'] = \
+ de_inst.debugger_data['conn_id']
+ de_inst.debugger_data['restart_debug'] = 1
+ de_inst.debugger_data['frame_id'] = 0
+ de_inst.debugger_data['session_id'] = int_session_id
+ de_inst.update_session()
+ return make_json_response(
+ data={'status': status, 'result': res}
+ )
else:
status = False
result = SERVER_CONNECTION_CLOSED
@@ -1519,6 +1508,7 @@ def set_clear_breakpoint(trans_id, line_no, set_type):
status, result = execute_dict_search_path(
conn, sql, de_inst.debugger_data['search_path'])
+ result = result['rows']
if not status:
return internal_server_error(errormsg=result)
else:
@@ -1526,7 +1516,7 @@ def set_clear_breakpoint(trans_id, line_no, set_type):
result = SERVER_CONNECTION_CLOSED
return make_json_response(
- data={'status': status, 'result': result['rows']}
+ data={'status': status, 'result': result}
)
@@ -1583,6 +1573,7 @@ def clear_all_breakpoint(trans_id):
conn, sql, de_inst.debugger_data['search_path'])
if not status:
return internal_server_error(errormsg=result)
+ result = result['rows']
else:
return make_json_response(data={'status': False})
else:
@@ -1590,7 +1581,7 @@ def clear_all_breakpoint(trans_id):
result = SERVER_CONNECTION_CLOSED
return make_json_response(
- data={'status': status, 'result': result['rows']}
+ data={'status': status, 'result': result}
)
diff --git a/web/pgadmin/tools/debugger/static/js/debugger.js b/web/pgadmin/tools/debugger/static/js/debugger.js
index d9da30c..862ea35 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger.js
@@ -429,7 +429,7 @@ define([
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, treeInfo.schema.label, treeInfo.database.label, null, pgBrowser);
panel.focus();
@@ -454,7 +454,7 @@ define([
// Remove the leading and trailing white spaces.
value = value.trim();
let browser_preferences = pgBrowser.get_preferences_for_module('browser');
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, treeInfo.schema.label, treeInfo.database.label, value, pgBrowser);
}
},
@@ -573,7 +573,7 @@ define([
panel = pgBrowser.docker.addPanel(
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
- var label = newTreeInfo.function ? newTreeInfo.function.label : newTreeInfo.procedure.label;
+ var label = newTreeInfo.function ? newTreeInfo.function.label : newTreeInfo.trigger_function ? newTreeInfo.trigger_function.label : newTreeInfo.trigger ? newTreeInfo.trigger.label : newTreeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, newTreeInfo.schema.label, newTreeInfo.database.label, null, pgBrowser);
panel.focus();
@@ -598,7 +598,7 @@ define([
// Remove the leading and trailing white spaces.
value = value.trim();
let browser_preferences = pgBrowser.get_preferences_for_module('browser');
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_preferences, label, treeInfo.schema.label, treeInfo.database.label, value, pgBrowser);
}
},
diff --git a/web/pgadmin/tools/debugger/static/js/debugger_ui.js b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
index 1700b7a..53f8a2b 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger_ui.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
@@ -778,7 +778,7 @@ define([
'frm_debugger', wcDocker.DOCK.STACKED, dashboardPanel[0]
);
var browser_pref = pgBrowser.get_preferences_for_module('browser');
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, browser_pref, label, treeInfo.schema.label, treeInfo.database.label, null, pgBrowser);
panel.focus();
@@ -801,7 +801,7 @@ define([
if(value) {
// Remove the leading and trailing white spaces.
value = value.trim();
- var label = treeInfo.function ? treeInfo.function.label : treeInfo.procedure.label;
+ var label = treeInfo.function ? treeInfo.function.label : treeInfo.trigger_function ? treeInfo.trigger_function.label : treeInfo.trigger ? treeInfo.trigger.label : treeInfo.procedure.label;
debuggerUtils.setDebuggerTitle(panel, self.preferences, label, treeInfo.schema.label, treeInfo.database.label, value, pgBrowser);
}
},
diff --git a/web/pgadmin/tools/debugger/tests/__init__.py b/web/pgadmin/tools/debugger/tests/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/web/pgadmin/tools/debugger/tests/debugger_test_data.json b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
new file mode 100644
index 0000000..bcd0613
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
@@ -0,0 +1,1703 @@
+{
+ "init_debugger_for_function": [
+ {
+ "name": "Debugger initialization",
+ "url": "/debugger/init/function/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "function",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger initialization nodetype",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "function",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: Function is not found",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(True, {'rows': []})"
+ },
+ "expected_data": {
+ "status_code": 410
+ }
+ },
+ {
+ "name": "Debugger initialization: Check Function is debuggable",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server Error while checking function is debuggable.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: Check Function is debuggable fail",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "mock_multiple_calls": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, 0),(False, 'Mocked Internal Server Error ')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: Check Function name is valid",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "invalid_name": true,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialization: pldggapi extension missing.",
+ "url": "/debugger/init/function/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "mock_multiple_calls": true,
+ "invalid_name": false,
+ "add_extension": false,
+ "node_type": "function",
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, '0'), (True, '0')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "init_debugger_for_trigger": [
+ {
+ "name": "Debugger initialization for trigger",
+ "url": "/debugger/init/trigger/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger initialization for trigger: fail",
+ "url": "/debugger/init/trigger/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "init_debugger_target": [
+ {
+ "name": "Debugger initialize target direct",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger initialize target direct negative",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target direct negative validate debugger",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target direct negative validate indirect debugger",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target direct negative connection error",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connect",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target indirect",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger initialize target direct with trigger id",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger initialize target direct with trigger id",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "type": "direct",
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while checking debugger initialize target direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },{
+ "name": "Debugger initialize target direct with trigger id fail",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "mock_multiple": true,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, 0), (False, 'Mocked Internal Server Error while checking debugger initialize target direct.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target indirect with trigger id fail",
+ "url": "/debugger/initialize_target/indirect/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "mock_multiple": false,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, {})"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger initialize target debugger version not valid.",
+ "url": "/debugger/initialize_target/direct/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "node_type": "trigger",
+ "type": "direct",
+ "invalid_name": false,
+ "create_trigger_func": true,
+ "add_extension": false,
+ "mock_multiple": true,
+ "test_data": {
+ "name": "PLACE_HOLDER",
+ "is_row_trigger": true,
+ "fires": "BEFORE",
+ "columns": [],
+ "tfunction": "PLACE_HOLDER",
+ "evnt_insert": true
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+ "return_value": "(True, ''), (True, ''), (False,'Mocking invalid debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "close_debugger": [
+ {
+ "name": "Close Debugger",
+ "url": "debugger/close/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "node_type": "trigger",
+ "invalid_name": false,
+ "add_extension": true,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "restart_debugger": [
+ {
+ "name": "Restart Debugger: Debugger not triggered.",
+ "url": "debugger/restart/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "trigger",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": false,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Restart Debugger: Debugger initialized.",
+ "url": "debugger/restart/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "trigger",
+ "invalid_name": false,
+ "init_target": true,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Restart Debugger: Server not connected.",
+ "url": "debugger/restart/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "trigger",
+ "invalid_name": false,
+ "init_target": true,
+ "add_extension": false,
+ "test_data": {},
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "start_listener": [
+ {
+ "name": "Debugger start listener",
+ "url": "debugger/start_listener/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener fail",
+ "url": "debugger/start_listener/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {},
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener connection fail",
+ "url": "debugger/start_listener/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener indirect",
+ "url": "debugger/start_listener/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger start listener indirect disconnected",
+ "url": "debugger/start_listener/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "debugger_messages": [
+ {
+ "name": "Debugger Messages",
+ "url": "debugger/messages/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger Messages: connection fail",
+ "url": "debugger/messages/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },{
+ "name": "Debugger Messages: debugger instace fail",
+ "url": "debugger/messages/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "start_execution": [
+ {
+ "name": "Debugger Start Execution",
+ "url": "debugger/start_execution/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "add_port_no": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "poll_end_execution_result": [
+ {
+ "name": "Debugger Poll Execution Results.",
+ "url": "debugger/poll_end_execution_result/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Poll Execution Results: Connection fail",
+ "url": "debugger/poll_end_execution_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Poll Execution Results: fail to poll data.",
+ "url": "debugger/poll_end_execution_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.poll",
+ "return_value": "(False, 'Mock internal server error while poll data for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "debugger_direct": [
+ {
+ "name": "Debugger Direct: Init debugger in direct mode",
+ "url": "debugger/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Direct: Init debugger in direct mode fail",
+ "url": "debugger/direct/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": false,
+ "invalid_trans": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "",
+ "return_value": ""
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Direct: Init debugger in direct with arguments",
+ "url": "debugger/direct/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "add_extension": true,
+ "invalid_trans": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "",
+ "return_value": ""
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "execute_query": [
+ {
+ "name": "Debugger execute: positive",
+ "url": "debugger/execute_query/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger execute: Connection fail.",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger instance fail",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger continue",
+ "url": "debugger/execute_query/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "query_type": "continue",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger patch error",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "query_type": "wait_for_breakpoint",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger execute: Debugger async fail",
+ "url": "debugger/execute_query/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "query_type": "continue",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "abort_debugger": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_async",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ }
+ ],
+ "poll_result": [
+ {
+ "name": "Debugger poll result",
+ "url": "debugger/poll_result/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger poll result: Disconnected",
+ "url": "debugger/poll_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger poll result: poll error",
+ "url": "debugger/poll_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.poll",
+ "return_value": "(False, 'Mocking internal error for poll debugger result.')"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },{
+ "name": "Debugger poll result: Debugger instance fail",
+ "url": "debugger/poll_result/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "indirect",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.poll",
+ "return_value": "(False, 'Mocking internal error for poll debugger result.')"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "set_breakpoint": [
+ {
+ "name": "Debugger Set breakpoint",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: debugger instance fail.",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: Search path error.",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: Connection error",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Set breakpoint: Clear breakpoint.",
+ "url": "debugger/set_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "query_type": 2,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "clear_all_breakpoint": [
+ {
+ "name": "Debugger Clear all breakpoint: .",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: Debugger instance error.",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": false,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: search path error.",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+ "return_value": "(False, 'Mocked Internal Server Error while fetching function details for debugger.')"
+ },
+ "expected_data": {
+ "status_code": 500
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: Connection error.",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": false,
+ "mocking_required": true,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ },
+ {
+ "name": "Debugger Clear all breakpoint: No breakpoint to clear",
+ "url": "debugger/clear_all_breakpoint/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": false,
+ "init_target": true,
+ "no_breakpoint": true,
+ "test_data": {
+ "acl": [],
+ "arguments": [],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
+ "return_value": "False"
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "get_arguments": [
+ {
+ "name": "Debugger get arguments.",
+ "url": "debugger/get_arguments/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }],
+ "set_arguments": [
+ {
+ "name": "Debugger set arguments.",
+ "url": "debugger/set_arguments/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ],
+ "clear_arguments": [
+ {
+ "name": "Debugger set arguments.",
+ "url": "debugger/clear_arguments/",
+ "is_positive_test": true,
+ "mocking_required": false,
+ "type": "direct",
+ "invalid_name": false,
+ "add_extension": true,
+ "init_target": true,
+ "query_type": 1,
+ "test_data": {
+ "acl": [],
+ "arguments": [
+ {
+ "argtype": "character varying",
+ "argmode": "IN",
+ "argname": "param",
+ "argdefval": "'1'"
+ }
+ ],
+ "funcowner": "",
+ "lanname": "plpgsql",
+ "name": "test_function_!@#$%^&*(",
+ "options": [],
+ "probin": "$libdir/",
+ "pronamespace": 2200,
+ "prorettypename": "character varying",
+ "prorows": 0,
+ "prosrc": "begin select '1'; end",
+ "seclabels": [],
+ "variables": []
+ },
+ "mock_data": {
+ },
+ "expected_data": {
+ "status_code": 200
+ }
+ }
+ ]
+}
diff --git a/web/pgadmin/tools/debugger/tests/test_close_debugger.py b/web/pgadmin/tools/debugger/tests/test_close_debugger.py
new file mode 100644
index 0000000..b1deddc
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_close_debugger.py
@@ -0,0 +1,77 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class CloseDebugger(BaseTestGenerator):
+ """ This class will Close the debugger """
+
+ scenarios = utils.generate_scenarios('close_debugger',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(CloseDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ def close_debugger(self):
+ return self.tester.delete(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.close_debugger()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.close_debugger()
+ else:
+ response = self.close_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
new file mode 100644
index 0000000..8075782
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
@@ -0,0 +1,92 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerClearAllBreakpoint(BaseTestGenerator):
+ """ This class will set breakpoint."""
+
+ scenarios = utils.generate_scenarios('clear_all_breakpoint',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerClearAllBreakpoint, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+ breakpoint = debugger_utils.set_breakpoint(self)
+
+ def clear_all_breakpoint(self):
+ if hasattr(self, 'no_breakpoint') and self.no_breakpoint:
+ breakpoint_data = {"breakpoint_list": ''}
+ else:
+ breakpoint_data = {"breakpoint_list": 3}
+
+ return self.tester.post(
+ self.url + str(self.trans_id),
+ data=breakpoint_data)
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.clear_all_breakpoint()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.clear_all_breakpoint()
+ else:
+ response = self.clear_all_breakpoint()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ # debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
new file mode 100644
index 0000000..d2ed413
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
@@ -0,0 +1,83 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerClearArguments(BaseTestGenerator):
+ """ This class will get arguments.."""
+
+ scenarios = utils.generate_scenarios('clear_arguments',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerClearArguments, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def clear_arguments(self):
+ return self.tester.post(
+ self.url + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ data={}
+ )
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.clear_arguments()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.clear_arguments()
+ else:
+ response = self.clear_arguments()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_direct.py b/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
new file mode 100644
index 0000000..d04b506
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
@@ -0,0 +1,84 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerDirect(BaseTestGenerator):
+ """ This class will start debugger in direct mode."""
+
+ scenarios = utils.generate_scenarios('debugger_direct',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerDirect, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def direct(self):
+ if hasattr(self, 'invalid_trans') and self.invalid_trans:
+ self.trans_id = 0
+
+ return self.tester.get(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.direct()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.direct()
+ else:
+ response = self.direct()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
new file mode 100644
index 0000000..3a64520
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
@@ -0,0 +1,86 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerExecuteQuery(BaseTestGenerator):
+ """ This class will execute query in debugger."""
+
+ scenarios = utils.generate_scenarios('execute_query',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerExecuteQuery, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+ debugger_utils.start_listener(self)
+
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+
+ def execute_query(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.query_type),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.execute_query()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.execute_query()
+ else:
+ response = self.execute_query()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ if hasattr(self, 'abort_debugger') and self.abort_debugger:
+ debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_get_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_get_arguments.py
new file mode 100644
index 0000000..ce2684e
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_get_arguments.py
@@ -0,0 +1,71 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerGetArguments(BaseTestGenerator):
+ """ This class will get arguments.."""
+
+ scenarios = utils.generate_scenarios('get_arguments',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerGetArguments, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ def get_arguments(self):
+ return self.tester.get(
+ self.url + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.get_arguments()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.get_arguments()
+ else:
+ response = self.get_arguments()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
new file mode 100644
index 0000000..47e9f98
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
@@ -0,0 +1,86 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerPollExecutionResult(BaseTestGenerator):
+ """ This class will start debugger execution."""
+
+ scenarios = utils.generate_scenarios('poll_end_execution_result',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerPollExecutionResult, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+
+ def poll_execution_result(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.poll_execution_result()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.poll_execution_result()
+ else:
+ response = self.poll_execution_result()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ # debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
new file mode 100644
index 0000000..3b894a4
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
@@ -0,0 +1,83 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerPollResult(BaseTestGenerator):
+ """ This class will execute query in debugger."""
+
+ scenarios = utils.generate_scenarios('poll_result',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerPollResult, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+
+ def execute_query(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.execute_query()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.execute_query()
+ else:
+ response = self.execute_query()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
new file mode 100644
index 0000000..d4eef3f
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
@@ -0,0 +1,89 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerSetArguments(BaseTestGenerator):
+ """ This class will get arguments.."""
+
+ scenarios = utils.generate_scenarios('set_arguments',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerSetArguments, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def set_arguments(self):
+ args = {"data": json.dumps([
+ {"server_id": self.server_id, "database_id": self.db_id,
+ "schema_id": self.schema_id, "function_id": self.func_id,
+ "arg_id": 0, "is_null": 0, "is_expression": 0, "use_default": 1}])
+ }
+
+ return self.tester.post(
+ self.url + str(self.server_id) + '/' + str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ data=args
+ )
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.set_arguments()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.set_arguments()
+ else:
+ response = self.set_arguments()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
new file mode 100644
index 0000000..45f7757
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
@@ -0,0 +1,89 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerSetBreakpoint(BaseTestGenerator):
+ """ This class will set breakpoint."""
+
+ scenarios = utils.generate_scenarios('set_breakpoint',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerSetBreakpoint, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+ debugger_utils.start_execution(self)
+
+ if self.query_type == 2:
+ debugger_utils.set_breakpoint(self)
+
+ def set_breakpoint(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/3/' + str(self.query_type),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.set_breakpoint()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.set_breakpoint()
+ else:
+ response = self.set_breakpoint()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ # debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py b/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
new file mode 100644
index 0000000..82c27e1
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
@@ -0,0 +1,113 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class InitDebugger(BaseTestGenerator):
+ """ This class will Initialize the debugger """
+
+ scenarios = utils.generate_scenarios('init_debugger_for_function',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(InitDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ if self.invalid_name:
+ db_user = self.server["username"]
+ self.test_data = {"acl": [
+ {
+ "grantee": db_user,
+ "grantor": db_user,
+ "privileges":
+ [
+ {
+ "privilege_type": "X",
+ "privilege": True,
+ "with_grant": True
+ }
+ ]
+ }
+ ], "arguments": [], "funcowner": db_user, "lanname": "sql",
+ "name": "test_function_:_%s" % str(uuid.uuid4())[1:8],
+ "options": [], "proleakproof": True, "pronamespace": 2200,
+ "prorettypename": "integer", "prosecdef": True,
+ "prosrc": "SELECT 1;", "probin": "$libdir/",
+ "provolatile": "s", "seclabels": [], "variables": [{
+ "name": "search_path",
+ "value": "public, pg_temp"
+ }]
+ }
+
+ function_info = debugger_utils.create_function(self, utils)
+ self.func_id = json.loads(function_info.data)['node']['_id']
+ else:
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ def initialize_debugger(self):
+ if self.node_type == 'function':
+ return self.tester.get(
+ self.url + str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(self.func_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.initialize_debugger()
+ else:
+ if self.mocking_required:
+ if hasattr(self,
+ 'mock_multiple_calls') and self.mock_multiple_calls:
+ with patch(self.mock_data["function_name"],
+ side_effect=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_debugger()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_debugger()
+ else:
+ response = self.initialize_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py b/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
new file mode 100644
index 0000000..b45e948
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
@@ -0,0 +1,95 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.\
+ tables.tests import utils as tables_utils
+from pgadmin.browser.server_groups.servers.databases.tests import utils as \
+ database_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.functions.tests \
+ import utils as trigger_funcs_utils
+
+
+class InitDebugger(BaseTestGenerator):
+ """ This class will Initialize the debugger """
+
+ scenarios = utils.generate_scenarios('init_debugger_for_trigger',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(InitDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.db_name = parent_node_dict["database"][-1]["db_name"]
+ self.schema_id = self.schema_data['schema_id']
+ self.schema_name = self.schema_data["schema_name"]
+ db_con = database_utils.connect_database(self, utils.SERVER_GROUP,
+ self.server_id, self.db_id)
+ if not db_con['data']["connected"]:
+ raise Exception("Could not connect to database to delete trigger.")
+
+ self.table_name = "table_trigger_%s" % (str(uuid.uuid4())[1:8])
+ self.table_id = tables_utils.create_table(self.server, self.db_name,
+ self.schema_name,
+ self.table_name)
+ self.trigger_func_name = "trigger_func_delete_%s" % \
+ str(uuid.uuid4())[1:8]
+ self.trigger_function_id = \
+ trigger_funcs_utils.create_trigger_function_with_trigger(
+ self.server, self.db_name, self.schema_name,
+ self.trigger_func_name)[0]
+ self.trigger_name = "trigger_%s" % str(uuid.uuid4())[1:8]
+
+ self.test_data['name'] = self.trigger_name
+ self.test_data['tfunction'] = "{0}.{1}".format(self.schema_name,
+ self.trigger_func_name)
+ self.trigger_id = debugger_utils.create_trigger(self, utils)
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ def initialize_debugger(self):
+ if self.node_type == 'trigger':
+ return self.tester.get(
+ self.url + str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(self.table_id) +
+ '/' + str(self.trigger_id),
+ content_type='html/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.initialize_debugger()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.initialize_debugger()
+ else:
+ response = self.initialize_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_init_target.py b/web/pgadmin/tools/debugger/tests/test_init_target.py
new file mode 100644
index 0000000..13470c8
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_init_target.py
@@ -0,0 +1,137 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.tables.tests\
+ import utils as tables_utils
+from pgadmin.browser.server_groups.servers.databases.schemas.functions.tests \
+ import utils as trigger_funcs_utils
+
+
+class InitTargetDebugger(BaseTestGenerator):
+ """ This class will Initialize the debugger """
+
+ scenarios = utils.generate_scenarios('init_debugger_target',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(InitTargetDebugger, self).setUp()
+ self.debugger_error = 'The debugger plugin is not enabled. ' \
+ 'Please add the plugin to the shared_preload_' \
+ 'libraries setting in the postgresql.conf file' \
+ ' and restart the database server for indirect' \
+ ' debugging.'
+
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if hasattr(self, 'create_trigger_func') and self.create_trigger_func:
+ db_con = db_utils.connect_database(self, utils.SERVER_GROUP,
+ self.server_id, self.db_id)
+ if not db_con['data']["connected"]:
+ raise Exception(
+ "Could not connect to database to delete trigger.")
+
+ self.table_name = "table_trigger_%s" % (str(uuid.uuid4())[1:8])
+ self.table_id = tables_utils.create_table(self.server,
+ self.db_name,
+ self.schema_name,
+ self.table_name)
+
+ self.trigger_func_name = 'test_trigger_function_%s' % str(
+ uuid.uuid4())[1:8]
+
+ self.trigger_function_id = \
+ trigger_funcs_utils.create_trigger_function_with_trigger(
+ self.server, self.db_name, self.schema_name,
+ self.trigger_func_name)[0]
+
+ self.trigger_name = "trigger_%s" % str(uuid.uuid4())[1:8]
+ self.test_data['name'] = self.trigger_name
+ self.test_data['tfunction'] = "{0}.{1}".format(
+ self.schema_name, self.trigger_func_name)
+
+ self.trigger_id = debugger_utils.create_trigger(self, utils)
+
+ def initialize_traget(self):
+ if hasattr(self, 'create_trigger_func') and self.create_trigger_func:
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.server_id) +
+ '/' + str(self.db_id) + '/' + str(self.schema_id) +
+ '/' + str(self.table_id) + '/' +
+ str(self.trigger_id), content_type='application/json')
+ else:
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.server_id) +
+ '/' + str(self.db_id) + '/' + str(self.schema_id) +
+ '/' + str(self.func_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.initialize_traget()
+ else:
+ if self.mocking_required:
+ if hasattr(self, 'mock_multiple') and self.mock_multiple:
+ with patch(self.mock_data["function_name"],
+ side_effect=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_traget()
+ else:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(
+ self.mock_data["return_value"])):
+ response = self.initialize_traget()
+ else:
+ response = self.initialize_traget()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ if response.json['errormsg'] == self.debugger_error:
+ print(self.debugger_error)
+ self.assertEqual(actual_response_code, actual_response_code)
+ else:
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_messages_debugger.py b/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
new file mode 100644
index 0000000..437cbfd
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
@@ -0,0 +1,80 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerMessages(BaseTestGenerator):
+ """ This class will get messages the debugger """
+
+ scenarios = utils.generate_scenarios('debugger_messages',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerMessages, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def messages(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.messages()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.messages()
+ else:
+ response = self.messages()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """Close debugger connection."""
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_restart_debugger.py b/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
new file mode 100644
index 0000000..ab75315
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
@@ -0,0 +1,82 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class RestartDebugger(BaseTestGenerator):
+ """ This class will Restart the debugger """
+
+ scenarios = utils.generate_scenarios('restart_debugger',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(RestartDebugger, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ func_name = "test_function_%s" % str(uuid.uuid4())[1:8]
+ function_info = funcs_utils.create_function(
+ local_self.server, local_self.db_name, local_self.schema_name,
+ func_name)
+
+ self.func_id = function_info[0]
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def restart_debugger(self):
+ return self.tester.get(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.restart_debugger()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.restart_debugger()
+ else:
+ response = self.restart_debugger()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
new file mode 100644
index 0000000..91f71f2
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
@@ -0,0 +1,85 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerStartExecution(BaseTestGenerator):
+ """ This class will start debugger execution."""
+
+ scenarios = utils.generate_scenarios('start_execution',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerStartExecution, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ debugger_utils.start_listener(self)
+ self.port_no = debugger_utils.messages(self)
+
+ def start_execution(self):
+ return self.tester.get(
+ self.url + str(self.trans_id) + '/' + str(self.port_no),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.start_execution()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.start_execution()
+ else:
+ response = self.start_execution()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.abort_debugger(self)
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
new file mode 100644
index 0000000..f4b079e
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
@@ -0,0 +1,89 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2020, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import json
+import uuid
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as debugger_utils
+from unittest.mock import patch
+from regression import parent_node_dict
+from pgadmin.browser.server_groups.servers.databases.schemas.functions \
+ .tests import utils as funcs_utils
+from pgadmin.browser.server_groups.servers.databases.tests import \
+ utils as db_utils
+
+
+class DebuggerStartListener(BaseTestGenerator):
+ """ This class will start listen the debugger """
+
+ scenarios = utils.generate_scenarios('start_listener',
+ debugger_utils.test_cases)
+
+ def setUp(self):
+ super(DebuggerStartListener, self).setUp()
+ self.schema_data = parent_node_dict['schema'][-1]
+ self.server_id = self.schema_data['server_id']
+ self.db_id = self.schema_data['db_id']
+ self.schema_id = self.schema_data['schema_id']
+
+ local_self = funcs_utils.set_up(self)
+
+ if self.server['type'] == 'pg':
+ self.skipTest('Skipping test case for pg')
+
+ self.test_data['funcowner'] = self.server["username"]
+
+ function_info = debugger_utils.create_function(self, utils)
+
+ self.func_id = json.loads(function_info.data)['node']['_id']
+
+ if self.add_extension:
+ debugger_utils.add_extension(self, utils)
+
+ init_debugger = debugger_utils.init_debugger_function(self)
+ self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
+
+ if self.init_target:
+ debugger_utils.initialize_target(self, utils)
+
+ def start_listener(self):
+ if hasattr(self, 'update_debugger') and self.update_debugger:
+ return self.tester.post(
+ self.url + str(self.trans_id),
+ data=json.dumps({}),
+ content_type='application/json')
+ else:
+ return self.tester.get(
+ self.url + str(self.trans_id),
+ content_type='application/json')
+
+ def runTest(self):
+ """
+ This function will initialize the debugger for function and procedures.
+ """
+ if self.is_positive_test:
+ response = self.start_listener()
+ else:
+ if self.mocking_required:
+ with patch(self.mock_data["function_name"],
+ return_value=eval(self.mock_data["return_value"])):
+ response = self.start_listener()
+ else:
+ response = self.start_listener()
+
+ actual_response_code = response.status_code
+ expected_response_code = self.expected_data['status_code']
+ self.assertEqual(actual_response_code, expected_response_code)
+
+ def tearDown(self):
+ """This function delete the server from SQLite """
+ debugger_utils.close_debugger(self)
+ debugger_utils.delete_function(self, utils)
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
diff --git a/web/pgadmin/tools/debugger/tests/utils.py b/web/pgadmin/tools/debugger/tests/utils.py
new file mode 100644
index 0000000..6f6082d
--- /dev/null
+++ b/web/pgadmin/tools/debugger/tests/utils.py
@@ -0,0 +1,146 @@
+import os
+import json
+
+
+CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
+with open(CURRENT_PATH + "/debugger_test_data.json") as data_file:
+ test_cases = json.load(data_file)
+
+
+def delete_function(self, utils):
+ response = self.tester.delete(
+ '/browser/function/obj/' + str(utils.SERVER_GROUP) + '/' +
+ str(self.server_id) + '/' +
+ str(self.db_id) + '/' +
+ str(self.schema_id) + '/' + str(self.func_id),
+ content_type='html/json'
+ )
+
+ self.assertEqual(response.status_code, 200)
+
+
+def create_function(self, utils):
+ self.test_data['pronamespace'] = self.schema_id
+ function_url = 'browser/function/obj/{0}/{1}/{2}/{3}/'.format(
+ str(utils.SERVER_GROUP), str(self.server_id), str(self.db_id),
+ str(self.schema_id))
+
+ response = self.tester.post(
+ function_url,
+ data=json.dumps(self.test_data),
+ content_type='html/json'
+ )
+ return response
+
+
+def close_debugger(self):
+ response = self.tester.delete(
+ 'debugger/close/' + str(self.trans_id),
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def abort_debugger(self):
+ response = self.tester.get(
+ 'debugger/execute_query/' + str(self.trans_id) + '/abort_target',
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def add_extension(self, utils):
+ extension_url = '/browser/extension/obj/{0}/{1}/{2}/'.format(
+ str(utils.SERVER_GROUP), str(self.server_id), str(self.db_id))
+ extension_data = {
+ "name": "pldbgapi",
+ "relocatable": True,
+ "schema": self.schema_name,
+ "version": "1.1"
+ }
+ try:
+ response = self.tester.post(
+ extension_url,
+ data=json.dumps(extension_data),
+ content_type='application/json')
+ except Exception as e:
+ print('Unable to create "pldbgapi" extension.')
+
+
+def init_debugger_function(self):
+ function_url = '/debugger/init/function/'
+ response = self.tester.get(
+ function_url + str(self.server_id) + '/' + str(self.db_id) +
+ '/' + str(self.schema_id) + '/' + str(self.func_id),
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+ return response
+
+
+def initialize_target(self, utils, close_debugger_instance=True):
+ target_url = '/debugger/initialize_target/{0}/'.format(self.type)
+ response = self.tester.get(
+ target_url + str(self.trans_id) + '/' + str(self.server_id) +
+ '/' + str(self.db_id) + '/' + str(self.schema_id) +
+ '/' + str(self.func_id),
+ content_type='application/json')
+
+ if response.status_code == 200:
+ return response
+ else:
+ if close_debugger_instance:
+ close_debugger(self)
+
+ delete_function(self, utils)
+ self.skipTest('The debugger plugin is not enabled. Please add the '
+ 'plugin to the shared_preload_libraries setting in the '
+ 'postgresql.conf file and restart the database server '
+ 'for indirect debugging.')
+
+
+def start_listener(self):
+ response = self.tester.get(
+ 'debugger/start_listener/' + str(self.trans_id),
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def create_trigger(self, utils):
+ response = self.tester.post(
+ "{0}{1}/{2}/{3}/{4}/{5}/".format('/browser/trigger/obj/',
+ utils.SERVER_GROUP,
+ self.server_id, self.db_id,
+ self.schema_id, self.table_id),
+ data=json.dumps(self.test_data),
+ content_type='html/json'
+ )
+
+ self.assertEqual(response.status_code, 200)
+ return json.loads(response.data)['node']['_id']
+
+
+def messages(self):
+ response = self.tester.get(
+ 'debugger/messages/' + str(self.trans_id) + '/',
+ content_type='application/json')
+
+ return json.loads(response.data)['data']['result']
+
+
+def start_execution(self):
+ response = self.tester.get(
+ 'debugger/start_execution/' + str(self.trans_id) + '/' + str(
+ self.port_no), content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+
+
+def set_breakpoint(self):
+ response = self.tester.get(
+ "debugger/set_breakpoint/" + str(self.trans_id) + '/3/1',
+ content_type='application/json')
+
+ self.assertEqual(response.status_code, 200)
+ return response
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
@ 2020-12-03 05:17 ` Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Akshay Joshi @ 2020-12-03 05:17 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
[email protected]> wrote:
> Hi Akshay,
>
> please find the updated patch, sorry for the inconvenience.
>
>
> Regards,
> Nikhil Mohite.
>
> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
> [email protected]> wrote:
>
>> Hi Nikhil
>>
>> The patch is not applied, please rebase and send the patch again.
>>
>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>>
>>> Please find the attached patch for RM-5343
>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage] Improve
>>> API test cases for Debugger.
>>> also updated implementation to remove dead code and unhandled exceptions.
>>>
>>>
>>> --
>>> *Thanks & Regards,*
>>> *Nikhil Mohite*
>>> *Software Engineer.*
>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>> *Mob.No: +91-7798364578.*
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>> *pgAdmin Hacker | Principal Software Architect*
>> *EDB Postgres <http://edbpostgres.com>*
>>
>> *Mobile: +91 976-788-8246*
>>
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
@ 2020-12-07 10:02 ` Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-12-07 10:02 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay/Team,
Please find the updated patch for debugger test cases.
1. Resolved the issues related to the database connection.
2. Updated the create "pldbgapi" extension for the debugger.
Regards,
Nikhil Mohite.
On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied.
>
> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
> [email protected]> wrote:
>
>> Hi Akshay,
>>
>> please find the updated patch, sorry for the inconvenience.
>>
>>
>> Regards,
>> Nikhil Mohite.
>>
>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Hi Nikhil
>>>
>>> The patch is not applied, please rebase and send the patch again.
>>>
>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>> [email protected]> wrote:
>>>
>>>> Hi Team,
>>>>
>>>> Please find the attached patch for RM-5343
>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage] Improve
>>>> API test cases for Debugger.
>>>> also updated implementation to remove dead code and unhandled
>>>> exceptions.
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards,*
>>>> *Nikhil Mohite*
>>>> *Software Engineer.*
>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>> *Mob.No: +91-7798364578.*
>>>>
>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>> *pgAdmin Hacker | Principal Software Architect*
>>> *EDB Postgres <http://edbpostgres.com>*
>>>
>>> *Mobile: +91 976-788-8246*
>>>
>>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Principal Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>
Attachments:
[application/octet-stream] RM_5343_V3.patch (2.5K, 3-RM_5343_V3.patch)
download | inline diff:
diff --git a/web/pgadmin/tools/debugger/tests/debugger_test_data.json b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
index bcd0613..c8991a5 100644
--- a/web/pgadmin/tools/debugger/tests/debugger_test_data.json
+++ b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
@@ -467,7 +467,7 @@
"url": "debugger/start_listener/",
"is_positive_test": true,
"mocking_required": false,
- "type": "direct",
+ "type": "indirect",
"invalid_name": false,
"add_extension": true,
"init_target": true,
diff --git a/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
index f4b079e..b99a888 100644
--- a/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
@@ -35,8 +35,8 @@ class DebuggerStartListener(BaseTestGenerator):
local_self = funcs_utils.set_up(self)
- if self.server['type'] == 'pg':
- self.skipTest('Skipping test case for pg')
+ # if self.server['type'] == 'pg':
+ # self.skipTest('Skipping test case for pg')
self.test_data['funcowner'] = self.server["username"]
diff --git a/web/pgadmin/tools/debugger/tests/utils.py b/web/pgadmin/tools/debugger/tests/utils.py
index 6f6082d..0d508c1 100644
--- a/web/pgadmin/tools/debugger/tests/utils.py
+++ b/web/pgadmin/tools/debugger/tests/utils.py
@@ -59,10 +59,20 @@ def add_extension(self, utils):
"version": "1.1"
}
try:
- response = self.tester.post(
- extension_url,
- data=json.dumps(extension_data),
- content_type='application/json')
+ connection = utils.get_db_connection(self.db_name,
+ self.server['username'],
+ self.server['db_password'],
+ self.server['host'],
+ self.server['port'],
+ self.server['sslmode'])
+ pg_cursor = connection.cursor()
+ # Create pldbgapi extension if not exist.
+ pg_cursor.execute('''CREATE EXTENSION IF NOT EXISTS
+ "%s" WITH SCHEMA "%s" VERSION
+ "%s" ''' % ('pldbgapi', self.schema_name, '1.1')
+ )
+
+ connection.commit()
except Exception as e:
print('Unable to create "pldbgapi" extension.')
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
@ 2020-12-09 07:54 ` Nikhil Mohite <[email protected]>
2020-12-09 08:07 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-12-09 07:54 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay/Team,
Please find the small patch for debugger test cases.
Added random function name generation for the debugger.
Regards,
Nikhil Mohite.
On Mon, Dec 7, 2020 at 3:32 PM Nikhil Mohite <[email protected]>
wrote:
> Hi Akshay/Team,
>
> Please find the updated patch for debugger test cases.
> 1. Resolved the issues related to the database connection.
> 2. Updated the create "pldbgapi" extension for the debugger.
>
>
> Regards,
> Nikhil Mohite.
>
> On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied.
>>
>> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
>> [email protected]> wrote:
>>
>>> Hi Akshay,
>>>
>>> please find the updated patch, sorry for the inconvenience.
>>>
>>>
>>> Regards,
>>> Nikhil Mohite.
>>>
>>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Hi Nikhil
>>>>
>>>> The patch is not applied, please rebase and send the patch again.
>>>>
>>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Team,
>>>>>
>>>>> Please find the attached patch for RM-5343
>>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage] Improve
>>>>> API test cases for Debugger.
>>>>> also updated implementation to remove dead code and unhandled
>>>>> exceptions.
>>>>>
>>>>>
>>>>> --
>>>>> *Thanks & Regards,*
>>>>> *Nikhil Mohite*
>>>>> *Software Engineer.*
>>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>>> *Mob.No: +91-7798364578.*
>>>>>
>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>> *pgAdmin Hacker | Principal Software Architect*
>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>> *pgAdmin Hacker | Principal Software Architect*
>> *EDB Postgres <http://edbpostgres.com>*
>>
>> *Mobile: +91 976-788-8246*
>>
>
Attachments:
[application/octet-stream] RM_5343_v4.patch (734B, 3-RM_5343_v4.patch)
download | inline diff:
diff --git a/web/pgadmin/tools/debugger/tests/utils.py b/web/pgadmin/tools/debugger/tests/utils.py
index 0d508c1..75280a3 100644
--- a/web/pgadmin/tools/debugger/tests/utils.py
+++ b/web/pgadmin/tools/debugger/tests/utils.py
@@ -1,5 +1,6 @@
import os
import json
+import uuid
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
@@ -21,6 +22,8 @@ def delete_function(self, utils):
def create_function(self, utils):
self.test_data['pronamespace'] = self.schema_id
+ self.test_data['name'] = self.test_data['name'] + str(uuid.uuid4())[1:8]
+
function_url = 'browser/function/obj/{0}/{1}/{2}/{3}/'.format(
str(utils.SERVER_GROUP), str(self.server_id), str(self.db_id),
str(self.schema_id))
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
@ 2020-12-09 08:07 ` Akshay Joshi <[email protected]>
2020-12-15 10:49 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Akshay Joshi @ 2020-12-09 08:07 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Wed, Dec 9, 2020 at 1:24 PM Nikhil Mohite <[email protected]>
wrote:
> Hi Akshay/Team,
>
> Please find the small patch for debugger test cases.
> Added random function name generation for the debugger.
>
>
> Regards,
> Nikhil Mohite.
>
>
> On Mon, Dec 7, 2020 at 3:32 PM Nikhil Mohite <
> [email protected]> wrote:
>
>> Hi Akshay/Team,
>>
>> Please find the updated patch for debugger test cases.
>> 1. Resolved the issues related to the database connection.
>> 2. Updated the create "pldbgapi" extension for the debugger.
>>
>>
>> Regards,
>> Nikhil Mohite.
>>
>> On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Thanks, patch applied.
>>>
>>> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
>>> [email protected]> wrote:
>>>
>>>> Hi Akshay,
>>>>
>>>> please find the updated patch, sorry for the inconvenience.
>>>>
>>>>
>>>> Regards,
>>>> Nikhil Mohite.
>>>>
>>>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Nikhil
>>>>>
>>>>> The patch is not applied, please rebase and send the patch again.
>>>>>
>>>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Team,
>>>>>>
>>>>>> Please find the attached patch for RM-5343
>>>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage]
>>>>>> Improve API test cases for Debugger.
>>>>>> also updated implementation to remove dead code and unhandled
>>>>>> exceptions.
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards,*
>>>>>> *Nikhil Mohite*
>>>>>> *Software Engineer.*
>>>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>>>> *Mob.No: +91-7798364578.*
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>> *pgAdmin Hacker | Principal Software Architect*
>>> *EDB Postgres <http://edbpostgres.com>*
>>>
>>> *Mobile: +91 976-788-8246*
>>>
>>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 08:07 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
@ 2020-12-15 10:49 ` Nikhil Mohite <[email protected]>
2020-12-16 06:42 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-12-15 10:49 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Team,
Please find the updated patch for debugger test cases.
1. Added check to skip debugger test case if the plugin is not installed.
2. Added code to delete the existing "pldbgapi" extension and create a new
extension.
3. Updated a few test cases that are falling on specific servers.
Regards,
Nikhil Mohite.
On Wed, Dec 9, 2020 at 1:37 PM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied.
>
> On Wed, Dec 9, 2020 at 1:24 PM Nikhil Mohite <
> [email protected]> wrote:
>
>> Hi Akshay/Team,
>>
>> Please find the small patch for debugger test cases.
>> Added random function name generation for the debugger.
>>
>>
>> Regards,
>> Nikhil Mohite.
>>
>>
>> On Mon, Dec 7, 2020 at 3:32 PM Nikhil Mohite <
>> [email protected]> wrote:
>>
>>> Hi Akshay/Team,
>>>
>>> Please find the updated patch for debugger test cases.
>>> 1. Resolved the issues related to the database connection.
>>> 2. Updated the create "pldbgapi" extension for the debugger.
>>>
>>>
>>> Regards,
>>> Nikhil Mohite.
>>>
>>> On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Thanks, patch applied.
>>>>
>>>> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Akshay,
>>>>>
>>>>> please find the updated patch, sorry for the inconvenience.
>>>>>
>>>>>
>>>>> Regards,
>>>>> Nikhil Mohite.
>>>>>
>>>>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Nikhil
>>>>>>
>>>>>> The patch is not applied, please rebase and send the patch again.
>>>>>>
>>>>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Team,
>>>>>>>
>>>>>>> Please find the attached patch for RM-5343
>>>>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage]
>>>>>>> Improve API test cases for Debugger.
>>>>>>> also updated implementation to remove dead code and unhandled
>>>>>>> exceptions.
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Thanks & Regards,*
>>>>>>> *Nikhil Mohite*
>>>>>>> *Software Engineer.*
>>>>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>>>>> *Mob.No: +91-7798364578.*
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards*
>>>>>> *Akshay Joshi*
>>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>>
>>>>>> *Mobile: +91 976-788-8246*
>>>>>>
>>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>> *pgAdmin Hacker | Principal Software Architect*
>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Principal Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>
Attachments:
[application/octet-stream] RM_5343_v5.patch (30.2K, 3-RM_5343_v5.patch)
download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py
index c30852c..564cd11 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/__init__.py
@@ -9,7 +9,7 @@
"""Implements the pgAgent Jobs Node"""
from functools import wraps
-import json
+import simplejson as json
from datetime import datetime, time
from flask import render_template, request, jsonify
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py
index cf92187..363d015 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/schedules/__init__.py
@@ -9,7 +9,7 @@
"""Implements pgAgent Job Schedule Node"""
-import json
+import simplejson as json
from functools import wraps
from flask import render_template, request, jsonify
diff --git a/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py b/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py
index 51d4a70..8b5d5fc 100644
--- a/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/pgagent/steps/__init__.py
@@ -9,7 +9,7 @@
"""Implements pgAgent Job Step Node"""
-import json
+import simplejson as json
from functools import wraps
from flask import render_template, request, jsonify
diff --git a/web/pgadmin/tools/debugger/tests/debugger_test_data.json b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
index c8991a5..6488f3d 100644
--- a/web/pgadmin/tools/debugger/tests/debugger_test_data.json
+++ b/web/pgadmin/tools/debugger/tests/debugger_test_data.json
@@ -21,7 +21,7 @@
"mocking_required": true,
"node_type": "function",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {
"function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
@@ -37,7 +37,7 @@
"is_positive_test": false,
"mocking_required": true,
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"node_type": "function",
"test_data": {},
"mock_data": {
@@ -54,7 +54,7 @@
"is_positive_test": false,
"mocking_required": true,
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"node_type": "function",
"test_data": {},
"mock_data": {
@@ -72,7 +72,7 @@
"mocking_required": true,
"mock_multiple_calls": true,
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"node_type": "function",
"test_data": {},
"mock_data": {
@@ -89,7 +89,7 @@
"is_positive_test": false,
"mocking_required": false,
"invalid_name": true,
- "add_extension": false,
+ "add_extension": true,
"node_type": "function",
"test_data": {},
"mock_data": {
@@ -105,7 +105,7 @@
"mocking_required": true,
"mock_multiple_calls": true,
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"node_type": "function",
"test_data": {},
"mock_data": {
@@ -138,14 +138,15 @@
"expected_data": {
"status_code": 200
}
- },{
+ },
+ {
"name": "Debugger initialization for trigger: fail",
"url": "/debugger/init/trigger/",
"is_positive_test": false,
"mocking_required": true,
"node_type": "trigger",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {
"name": "PLACE_HOLDER",
"is_row_trigger": true,
@@ -178,7 +179,8 @@
"expected_data": {
"status_code": 200
}
- },{
+ },
+ {
"name": "Debugger initialize target direct negative",
"url": "/debugger/initialize_target/direct/",
"is_positive_test": false,
@@ -186,7 +188,7 @@
"node_type": "trigger",
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {
"function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
@@ -204,7 +206,7 @@
"node_type": "trigger",
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {
"function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
@@ -222,7 +224,7 @@
"node_type": "trigger",
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {
"function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
@@ -240,7 +242,7 @@
"node_type": "trigger",
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {
"function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connect",
@@ -258,7 +260,7 @@
"node_type": "trigger",
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {},
"expected_data": {
@@ -274,7 +276,7 @@
"type": "direct",
"invalid_name": false,
"create_trigger_func": true,
- "add_extension": false,
+ "add_extension": true,
"test_data": {
"name": "PLACE_HOLDER",
"is_row_trigger": true,
@@ -296,7 +298,7 @@
"node_type": "trigger",
"invalid_name": false,
"create_trigger_func": true,
- "add_extension": false,
+ "add_extension": true,
"type": "direct",
"test_data": {
"name": "PLACE_HOLDER",
@@ -313,7 +315,8 @@
"expected_data": {
"status_code": 500
}
- },{
+ },
+ {
"name": "Debugger initialize target direct with trigger id fail",
"url": "/debugger/initialize_target/direct/",
"is_positive_test": false,
@@ -322,7 +325,7 @@
"type": "direct",
"invalid_name": false,
"create_trigger_func": true,
- "add_extension": false,
+ "add_extension": true,
"mock_multiple": true,
"test_data": {
"name": "PLACE_HOLDER",
@@ -349,7 +352,7 @@
"type": "direct",
"invalid_name": false,
"create_trigger_func": true,
- "add_extension": false,
+ "add_extension": true,
"mock_multiple": false,
"test_data": {
"name": "PLACE_HOLDER",
@@ -376,7 +379,7 @@
"type": "direct",
"invalid_name": false,
"create_trigger_func": true,
- "add_extension": false,
+ "add_extension": true,
"mock_multiple": true,
"test_data": {
"name": "PLACE_HOLDER",
@@ -435,7 +438,7 @@
"type": "trigger",
"invalid_name": false,
"init_target": true,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {},
"expected_data": {
@@ -450,7 +453,7 @@
"type": "trigger",
"invalid_name": false,
"init_target": true,
- "add_extension": false,
+ "add_extension": true,
"test_data": {},
"mock_data": {
"function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.connected",
@@ -498,7 +501,7 @@
"mocking_required": false,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": false,
"test_data": {
"acl": [],
@@ -527,7 +530,7 @@
"mocking_required": true,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -559,7 +562,7 @@
"mocking_required": false,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -589,7 +592,7 @@
"mocking_required": true,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -645,14 +648,15 @@
"expected_data": {
"status_code": 200
}
- },{
+ },
+ {
"name": "Debugger Messages: connection fail",
"url": "debugger/messages/",
"is_positive_test": false,
"mocking_required": true,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -676,14 +680,15 @@
"expected_data": {
"status_code": 500
}
- },{
+ },
+ {
"name": "Debugger Messages: debugger instace fail",
"url": "debugger/messages/",
"is_positive_test": false,
"mocking_required": false,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": false,
"test_data": {
"acl": [],
@@ -777,7 +782,7 @@
"is_positive_test": false,
"mocking_required": true,
"type": "direct",
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -808,7 +813,7 @@
"is_positive_test": false,
"mocking_required": true,
"type": "direct",
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -870,7 +875,7 @@
"is_positive_test": false,
"mocking_required": false,
"type": "direct",
- "add_extension": false,
+ "add_extension": true,
"invalid_trans": true,
"init_target": true,
"test_data": {
@@ -977,7 +982,7 @@
"type": "direct",
"query_type": "wait_for_breakpoint",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"abort_debugger": true,
"test_data": {
@@ -1011,7 +1016,7 @@
"type": "direct",
"query_type": "wait_for_breakpoint",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": false,
"abort_debugger": true,
"test_data": {
@@ -1043,7 +1048,7 @@
"type": "direct",
"query_type": "continue",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"abort_debugger": false,
"test_data": {
@@ -1075,7 +1080,7 @@
"type": "direct",
"query_type": "wait_for_breakpoint",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"abort_debugger": true,
"test_data": {
@@ -1109,7 +1114,7 @@
"type": "direct",
"query_type": "continue",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"abort_debugger": true,
"test_data": {
@@ -1166,14 +1171,15 @@
"expected_data": {
"status_code": 200
}
- },{
+ },
+ {
"name": "Debugger poll result: Disconnected",
"url": "debugger/poll_result/",
"is_positive_test": false,
"mocking_required": true,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -1197,14 +1203,15 @@
"expected_data": {
"status_code": 200
}
- },{
+ },
+ {
"name": "Debugger poll result: poll error",
"url": "debugger/poll_result/",
"is_positive_test": false,
"mocking_required": true,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -1228,14 +1235,15 @@
"expected_data": {
"status_code": 200
}
- },{
+ },
+ {
"name": "Debugger poll result: Debugger instance fail",
"url": "debugger/poll_result/",
"is_positive_test": false,
"mocking_required": true,
"type": "indirect",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": false,
"test_data": {
"acl": [],
@@ -1300,7 +1308,7 @@
"mocking_required": false,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": false,
"query_type": 1,
"test_data": {
@@ -1331,7 +1339,7 @@
"mocking_required": true,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"query_type": 1,
"test_data": {
@@ -1364,7 +1372,7 @@
"mocking_required": true,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"query_type": 1,
"test_data": {
@@ -1397,7 +1405,7 @@
"mocking_required": false,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"query_type": 2,
"test_data": {
@@ -1460,7 +1468,7 @@
"mocking_required": false,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": false,
"test_data": {
"acl": [],
@@ -1490,7 +1498,7 @@
"mocking_required": true,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -1522,7 +1530,7 @@
"mocking_required": true,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"test_data": {
"acl": [],
@@ -1554,7 +1562,7 @@
"mocking_required": false,
"type": "direct",
"invalid_name": false,
- "add_extension": false,
+ "add_extension": true,
"init_target": true,
"no_breakpoint": true,
"test_data": {
diff --git a/web/pgadmin/tools/debugger/tests/test_close_debugger.py b/web/pgadmin/tools/debugger/tests/test_close_debugger.py
index b1deddc..ef87137 100644
--- a/web/pgadmin/tools/debugger/tests/test_close_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_close_debugger.py
@@ -43,7 +43,7 @@ class CloseDebugger(BaseTestGenerator):
self.func_id = function_info[0]
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
index 8075782..56db948 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
@@ -42,7 +42,7 @@ class DebuggerClearAllBreakpoint(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
@@ -52,7 +52,7 @@ class DebuggerClearAllBreakpoint(BaseTestGenerator):
debugger_utils.initialize_target(self, utils)
debugger_utils.start_listener(self)
- self.port_no = debugger_utils.messages(self)
+ self.port_no = debugger_utils.messages(self, utils, db_utils)
debugger_utils.start_execution(self)
breakpoint = debugger_utils.set_breakpoint(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
index d2ed413..6f47b20 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_arguments.py
@@ -42,7 +42,7 @@ class DebuggerClearArguments(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_direct.py b/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
index d04b506..833859f 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_direct.py
@@ -42,7 +42,7 @@ class DebuggerDirect(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
index 3a64520..a6ff8ef 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
@@ -41,7 +41,7 @@ class DebuggerExecuteQuery(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
@@ -51,7 +51,7 @@ class DebuggerExecuteQuery(BaseTestGenerator):
debugger_utils.initialize_target(self, utils)
debugger_utils.start_listener(self)
- self.port_no = debugger_utils.messages(self)
+ self.port_no = debugger_utils.messages(self, utils, db_utils)
debugger_utils.start_execution(self)
def execute_query(self):
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
index 47e9f98..376d1e4 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
@@ -42,7 +42,7 @@ class DebuggerPollExecutionResult(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
@@ -52,7 +52,7 @@ class DebuggerPollExecutionResult(BaseTestGenerator):
debugger_utils.initialize_target(self, utils)
debugger_utils.start_listener(self)
- self.port_no = debugger_utils.messages(self)
+ self.port_no = debugger_utils.messages(self, utils, db_utils)
debugger_utils.start_execution(self)
def poll_execution_result(self):
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
index 3b894a4..d465d52 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
@@ -42,7 +42,7 @@ class DebuggerPollResult(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
index d4eef3f..9a2d602 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_arguments.py
@@ -42,7 +42,7 @@ class DebuggerSetArguments(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
index 45f7757..82b6b0a 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
@@ -42,7 +42,7 @@ class DebuggerSetBreakpoint(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
@@ -52,7 +52,7 @@ class DebuggerSetBreakpoint(BaseTestGenerator):
debugger_utils.initialize_target(self, utils)
debugger_utils.start_listener(self)
- self.port_no = debugger_utils.messages(self)
+ self.port_no = debugger_utils.messages(self, utils, db_utils)
debugger_utils.start_execution(self)
if self.query_type == 2:
diff --git a/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py b/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
index 82c27e1..5056616 100644
--- a/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
+++ b/web/pgadmin/tools/debugger/tests/test_init_debugger_function.py
@@ -72,7 +72,7 @@ class InitDebugger(BaseTestGenerator):
self.func_id = function_info[0]
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
def initialize_debugger(self):
if self.node_type == 'function':
diff --git a/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py b/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
index b45e948..07a8368 100644
--- a/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
+++ b/web/pgadmin/tools/debugger/tests/test_init_debugger_trigger.py
@@ -62,7 +62,7 @@ class InitDebugger(BaseTestGenerator):
self.trigger_id = debugger_utils.create_trigger(self, utils)
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, False, db_utils=db_utils)
def initialize_debugger(self):
if self.node_type == 'trigger':
diff --git a/web/pgadmin/tools/debugger/tests/test_init_target.py b/web/pgadmin/tools/debugger/tests/test_init_target.py
index 13470c8..bdf6bd2 100644
--- a/web/pgadmin/tools/debugger/tests/test_init_target.py
+++ b/web/pgadmin/tools/debugger/tests/test_init_target.py
@@ -53,7 +53,7 @@ class InitTargetDebugger(BaseTestGenerator):
self.func_id = function_info[0]
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
@@ -125,7 +125,6 @@ class InitTargetDebugger(BaseTestGenerator):
actual_response_code = response.status_code
expected_response_code = self.expected_data['status_code']
if response.json['errormsg'] == self.debugger_error:
- print(self.debugger_error)
self.assertEqual(actual_response_code, actual_response_code)
else:
self.assertEqual(actual_response_code, expected_response_code)
diff --git a/web/pgadmin/tools/debugger/tests/test_messages_debugger.py b/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
index 437cbfd..1cfe882 100644
--- a/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_messages_debugger.py
@@ -42,7 +42,7 @@ class DebuggerMessages(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
diff --git a/web/pgadmin/tools/debugger/tests/test_restart_debugger.py b/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
index ab75315..a45bc5e 100644
--- a/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_restart_debugger.py
@@ -43,7 +43,7 @@ class RestartDebugger(BaseTestGenerator):
self.func_id = function_info[0]
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
index 91f71f2..e35a031 100644
--- a/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
@@ -42,7 +42,7 @@ class DebuggerStartExecution(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
@@ -52,7 +52,7 @@ class DebuggerStartExecution(BaseTestGenerator):
debugger_utils.initialize_target(self, utils)
debugger_utils.start_listener(self)
- self.port_no = debugger_utils.messages(self)
+ self.port_no = debugger_utils.messages(self, utils, db_utils)
def start_execution(self):
return self.tester.get(
diff --git a/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
index b99a888..2e8fd2b 100644
--- a/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_start_listener_debugger.py
@@ -45,7 +45,7 @@ class DebuggerStartListener(BaseTestGenerator):
self.func_id = json.loads(function_info.data)['node']['_id']
if self.add_extension:
- debugger_utils.add_extension(self, utils)
+ debugger_utils.add_extension(self, utils, db_utils=db_utils)
init_debugger = debugger_utils.init_debugger_function(self)
self.trans_id = json.loads(init_debugger.data)['data']['trans_id']
diff --git a/web/pgadmin/tools/debugger/tests/utils.py b/web/pgadmin/tools/debugger/tests/utils.py
index 75280a3..e4acc65 100644
--- a/web/pgadmin/tools/debugger/tests/utils.py
+++ b/web/pgadmin/tools/debugger/tests/utils.py
@@ -1,6 +1,8 @@
import os
+import sys
import json
import uuid
+import traceback
CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
@@ -52,7 +54,7 @@ def abort_debugger(self):
self.assertEqual(response.status_code, 200)
-def add_extension(self, utils):
+def add_extension(self, utils, del_function=True, db_utils=None):
extension_url = '/browser/extension/obj/{0}/{1}/{2}/'.format(
str(utils.SERVER_GROUP), str(self.server_id), str(self.db_id))
extension_data = {
@@ -69,6 +71,9 @@ def add_extension(self, utils):
self.server['port'],
self.server['sslmode'])
pg_cursor = connection.cursor()
+ # Drop existing extension.
+ pg_cursor.execute('''DROP EXTENSION IF EXISTS "%s" ''' % 'pldbgapi')
+
# Create pldbgapi extension if not exist.
pg_cursor.execute('''CREATE EXTENSION IF NOT EXISTS
"%s" WITH SCHEMA "%s" VERSION
@@ -77,7 +82,16 @@ def add_extension(self, utils):
connection.commit()
except Exception as e:
- print('Unable to create "pldbgapi" extension.')
+ print(
+ "============================================================="
+ "=========\n",
+ file=sys.stderr
+ )
+ if del_function:
+ delete_function(self, utils)
+
+ db_utils.disconnect_database(self, self.server_id, self.db_id)
+ self.skipTest('The debugger plugin is not installed.')
def init_debugger_function(self):
@@ -134,12 +148,19 @@ def create_trigger(self, utils):
return json.loads(response.data)['node']['_id']
-def messages(self):
+def messages(self, utils, db_utils):
response = self.tester.get(
'debugger/messages/' + str(self.trans_id) + '/',
content_type='application/json')
-
- return json.loads(response.data)['data']['result']
+ port = json.loads(response.data)['data']['result']
+ if not port:
+ close_debugger(self)
+ delete_function(self, utils)
+ db_utils.disconnect_database(
+ self, self.server_id, self.db_id)
+ self.skipTest('Debugger is in Busy state.')
+ else:
+ return port
def start_execution(self):
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 08:07 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-15 10:49 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
@ 2020-12-16 06:42 ` Akshay Joshi <[email protected]>
2020-12-17 12:10 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Akshay Joshi @ 2020-12-16 06:42 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Tue, Dec 15, 2020 at 4:20 PM Nikhil Mohite <
[email protected]> wrote:
> Hi Team,
>
> Please find the updated patch for debugger test cases.
> 1. Added check to skip debugger test case if the plugin is not installed.
> 2. Added code to delete the existing "pldbgapi" extension and create a new
> extension.
> 3. Updated a few test cases that are falling on specific servers.
>
>
> Regards,
> Nikhil Mohite.
>
> On Wed, Dec 9, 2020 at 1:37 PM Akshay Joshi <[email protected]>
> wrote:
>
>> Thanks, patch applied.
>>
>> On Wed, Dec 9, 2020 at 1:24 PM Nikhil Mohite <
>> [email protected]> wrote:
>>
>>> Hi Akshay/Team,
>>>
>>> Please find the small patch for debugger test cases.
>>> Added random function name generation for the debugger.
>>>
>>>
>>> Regards,
>>> Nikhil Mohite.
>>>
>>>
>>> On Mon, Dec 7, 2020 at 3:32 PM Nikhil Mohite <
>>> [email protected]> wrote:
>>>
>>>> Hi Akshay/Team,
>>>>
>>>> Please find the updated patch for debugger test cases.
>>>> 1. Resolved the issues related to the database connection.
>>>> 2. Updated the create "pldbgapi" extension for the debugger.
>>>>
>>>>
>>>> Regards,
>>>> Nikhil Mohite.
>>>>
>>>> On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>> Thanks, patch applied.
>>>>>
>>>>> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Akshay,
>>>>>>
>>>>>> please find the updated patch, sorry for the inconvenience.
>>>>>>
>>>>>>
>>>>>> Regards,
>>>>>> Nikhil Mohite.
>>>>>>
>>>>>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Nikhil
>>>>>>>
>>>>>>> The patch is not applied, please rebase and send the patch again.
>>>>>>>
>>>>>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Team,
>>>>>>>>
>>>>>>>> Please find the attached patch for RM-5343
>>>>>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage]
>>>>>>>> Improve API test cases for Debugger.
>>>>>>>> also updated implementation to remove dead code and unhandled
>>>>>>>> exceptions.
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Thanks & Regards,*
>>>>>>>> *Nikhil Mohite*
>>>>>>>> *Software Engineer.*
>>>>>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>>>>>> *Mob.No: +91-7798364578.*
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Thanks & Regards*
>>>>>>> *Akshay Joshi*
>>>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>>>
>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> *Thanks & Regards*
>>>>> *Akshay Joshi*
>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>
>>>>> *Mobile: +91 976-788-8246*
>>>>>
>>>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>> *pgAdmin Hacker | Principal Software Architect*
>> *EDB Postgres <http://edbpostgres.com>*
>>
>> *Mobile: +91 976-788-8246*
>>
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 08:07 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-15 10:49 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-16 06:42 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
@ 2020-12-17 12:10 ` Nikhil Mohite <[email protected]>
2020-12-17 13:31 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
0 siblings, 1 reply; 15+ messages in thread
From: Nikhil Mohite @ 2020-12-17 12:10 UTC (permalink / raw)
To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers
Hi Akshay/ Team,
Please find attached an updated patch for debugger test cases.
Regards,
Nikhil Mohite.
On Wed, Dec 16, 2020 at 12:12 PM Akshay Joshi <[email protected]>
wrote:
> Thanks, patch applied.
>
> On Tue, Dec 15, 2020 at 4:20 PM Nikhil Mohite <
> [email protected]> wrote:
>
>> Hi Team,
>>
>> Please find the updated patch for debugger test cases.
>> 1. Added check to skip debugger test case if the plugin is not installed.
>> 2. Added code to delete the existing "pldbgapi" extension and create a
>> new extension.
>> 3. Updated a few test cases that are falling on specific servers.
>>
>>
>> Regards,
>> Nikhil Mohite.
>>
>> On Wed, Dec 9, 2020 at 1:37 PM Akshay Joshi <
>> [email protected]> wrote:
>>
>>> Thanks, patch applied.
>>>
>>> On Wed, Dec 9, 2020 at 1:24 PM Nikhil Mohite <
>>> [email protected]> wrote:
>>>
>>>> Hi Akshay/Team,
>>>>
>>>> Please find the small patch for debugger test cases.
>>>> Added random function name generation for the debugger.
>>>>
>>>>
>>>> Regards,
>>>> Nikhil Mohite.
>>>>
>>>>
>>>> On Mon, Dec 7, 2020 at 3:32 PM Nikhil Mohite <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Akshay/Team,
>>>>>
>>>>> Please find the updated patch for debugger test cases.
>>>>> 1. Resolved the issues related to the database connection.
>>>>> 2. Updated the create "pldbgapi" extension for the debugger.
>>>>>
>>>>>
>>>>> Regards,
>>>>> Nikhil Mohite.
>>>>>
>>>>> On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Thanks, patch applied.
>>>>>>
>>>>>> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Hi Akshay,
>>>>>>>
>>>>>>> please find the updated patch, sorry for the inconvenience.
>>>>>>>
>>>>>>>
>>>>>>> Regards,
>>>>>>> Nikhil Mohite.
>>>>>>>
>>>>>>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Nikhil
>>>>>>>>
>>>>>>>> The patch is not applied, please rebase and send the patch again.
>>>>>>>>
>>>>>>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> Hi Team,
>>>>>>>>>
>>>>>>>>> Please find the attached patch for RM-5343
>>>>>>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage]
>>>>>>>>> Improve API test cases for Debugger.
>>>>>>>>> also updated implementation to remove dead code and unhandled
>>>>>>>>> exceptions.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> *Thanks & Regards,*
>>>>>>>>> *Nikhil Mohite*
>>>>>>>>> *Software Engineer.*
>>>>>>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>>>>>>> *Mob.No: +91-7798364578.*
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> *Thanks & Regards*
>>>>>>>> *Akshay Joshi*
>>>>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>>>>
>>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Thanks & Regards*
>>>>>> *Akshay Joshi*
>>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>>
>>>>>> *Mobile: +91 976-788-8246*
>>>>>>
>>>>>
>>>
>>> --
>>> *Thanks & Regards*
>>> *Akshay Joshi*
>>> *pgAdmin Hacker | Principal Software Architect*
>>> *EDB Postgres <http://edbpostgres.com>*
>>>
>>> *Mobile: +91 976-788-8246*
>>>
>>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Principal Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>
Attachments:
[application/octet-stream] RM_5343_v6.patch (6.2K, 3-RM_5343_v6.patch)
download | inline diff:
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
index 56db948..4c8fcaf 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_clear_all_breakpoint.py
@@ -51,9 +51,9 @@ class DebuggerClearAllBreakpoint(BaseTestGenerator):
if self.init_target:
debugger_utils.initialize_target(self, utils)
- debugger_utils.start_listener(self)
+ debugger_utils.start_listener(self, utils, db_utils)
self.port_no = debugger_utils.messages(self, utils, db_utils)
- debugger_utils.start_execution(self)
+ debugger_utils.start_execution(self, utils, db_utils)
breakpoint = debugger_utils.set_breakpoint(self)
def clear_all_breakpoint(self):
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
index a6ff8ef..0259936 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_execute_query.py
@@ -49,10 +49,10 @@ class DebuggerExecuteQuery(BaseTestGenerator):
if self.init_target:
debugger_utils.initialize_target(self, utils)
- debugger_utils.start_listener(self)
+ debugger_utils.start_listener(self, utils, db_utils)
self.port_no = debugger_utils.messages(self, utils, db_utils)
- debugger_utils.start_execution(self)
+ debugger_utils.start_execution(self, utils, db_utils)
def execute_query(self):
return self.tester.get(
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
index 376d1e4..cf66fa4 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_execution_result.py
@@ -51,9 +51,9 @@ class DebuggerPollExecutionResult(BaseTestGenerator):
if self.init_target:
debugger_utils.initialize_target(self, utils)
- debugger_utils.start_listener(self)
+ debugger_utils.start_listener(self, utils, db_utils)
self.port_no = debugger_utils.messages(self, utils, db_utils)
- debugger_utils.start_execution(self)
+ debugger_utils.start_execution(self, utils, db_utils)
def poll_execution_result(self):
return self.tester.get(
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
index d465d52..e92e9b2 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_poll_result.py
@@ -51,7 +51,7 @@ class DebuggerPollResult(BaseTestGenerator):
if self.init_target:
debugger_utils.initialize_target(self, utils)
- debugger_utils.start_listener(self)
+ debugger_utils.start_listener(self, utils, db_utils)
def execute_query(self):
return self.tester.get(
diff --git a/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
index 82b6b0a..af4a6da 100644
--- a/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
+++ b/web/pgadmin/tools/debugger/tests/test_debugger_set_breakpoint.py
@@ -51,9 +51,9 @@ class DebuggerSetBreakpoint(BaseTestGenerator):
if self.init_target:
debugger_utils.initialize_target(self, utils)
- debugger_utils.start_listener(self)
+ debugger_utils.start_listener(self, utils, db_utils)
self.port_no = debugger_utils.messages(self, utils, db_utils)
- debugger_utils.start_execution(self)
+ debugger_utils.start_execution(self, utils, db_utils)
if self.query_type == 2:
debugger_utils.set_breakpoint(self)
diff --git a/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
index e35a031..f416c32 100644
--- a/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
+++ b/web/pgadmin/tools/debugger/tests/test_start_execution_debugger.py
@@ -51,7 +51,7 @@ class DebuggerStartExecution(BaseTestGenerator):
if self.init_target:
debugger_utils.initialize_target(self, utils)
- debugger_utils.start_listener(self)
+ debugger_utils.start_listener(self, utils, db_utils)
self.port_no = debugger_utils.messages(self, utils, db_utils)
def start_execution(self):
diff --git a/web/pgadmin/tools/debugger/tests/utils.py b/web/pgadmin/tools/debugger/tests/utils.py
index e4acc65..a56f366 100644
--- a/web/pgadmin/tools/debugger/tests/utils.py
+++ b/web/pgadmin/tools/debugger/tests/utils.py
@@ -126,11 +126,16 @@ def initialize_target(self, utils, close_debugger_instance=True):
'for indirect debugging.')
-def start_listener(self):
+def start_listener(self, utils, db_utils):
response = self.tester.get(
'debugger/start_listener/' + str(self.trans_id),
content_type='application/json')
-
+ if response.status_code != 200:
+ close_debugger(self)
+ delete_function(self, utils)
+ db_utils.disconnect_database(
+ self, self.server_id, self.db_id)
+ self.skipTest('Debugger is in Busy state.')
self.assertEqual(response.status_code, 200)
@@ -163,11 +168,18 @@ def messages(self, utils, db_utils):
return port
-def start_execution(self):
+def start_execution(self, utils, db_utils):
response = self.tester.get(
'debugger/start_execution/' + str(self.trans_id) + '/' + str(
self.port_no), content_type='application/json')
+ if response.status_code != 200:
+ close_debugger(self)
+ delete_function(self, utils)
+ db_utils.disconnect_database(
+ self, self.server_id, self.db_id)
+ self.skipTest('Debugger is in Busy state.')
+
self.assertEqual(response.status_code, 200)
^ permalink raw reply [nested|flat] 15+ messages in thread
* Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 08:07 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-15 10:49 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-16 06:42 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-17 12:10 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
@ 2020-12-17 13:31 ` Akshay Joshi <[email protected]>
0 siblings, 0 replies; 15+ messages in thread
From: Akshay Joshi @ 2020-12-17 13:31 UTC (permalink / raw)
To: Nikhil Mohite <[email protected]>; +Cc: pgadmin-hackers
Thanks, patch applied.
On Thu, Dec 17, 2020 at 5:40 PM Nikhil Mohite <
[email protected]> wrote:
> Hi Akshay/ Team,
>
> Please find attached an updated patch for debugger test cases.
>
> Regards,
> Nikhil Mohite.
>
> On Wed, Dec 16, 2020 at 12:12 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Thanks, patch applied.
>>
>> On Tue, Dec 15, 2020 at 4:20 PM Nikhil Mohite <
>> [email protected]> wrote:
>>
>>> Hi Team,
>>>
>>> Please find the updated patch for debugger test cases.
>>> 1. Added check to skip debugger test case if the plugin is not installed.
>>> 2. Added code to delete the existing "pldbgapi" extension and create a
>>> new extension.
>>> 3. Updated a few test cases that are falling on specific servers.
>>>
>>>
>>> Regards,
>>> Nikhil Mohite.
>>>
>>> On Wed, Dec 9, 2020 at 1:37 PM Akshay Joshi <
>>> [email protected]> wrote:
>>>
>>>> Thanks, patch applied.
>>>>
>>>> On Wed, Dec 9, 2020 at 1:24 PM Nikhil Mohite <
>>>> [email protected]> wrote:
>>>>
>>>>> Hi Akshay/Team,
>>>>>
>>>>> Please find the small patch for debugger test cases.
>>>>> Added random function name generation for the debugger.
>>>>>
>>>>>
>>>>> Regards,
>>>>> Nikhil Mohite.
>>>>>
>>>>>
>>>>> On Mon, Dec 7, 2020 at 3:32 PM Nikhil Mohite <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Akshay/Team,
>>>>>>
>>>>>> Please find the updated patch for debugger test cases.
>>>>>> 1. Resolved the issues related to the database connection.
>>>>>> 2. Updated the create "pldbgapi" extension for the debugger.
>>>>>>
>>>>>>
>>>>>> Regards,
>>>>>> Nikhil Mohite.
>>>>>>
>>>>>> On Thu, Dec 3, 2020 at 10:47 AM Akshay Joshi <
>>>>>> [email protected]> wrote:
>>>>>>
>>>>>>> Thanks, patch applied.
>>>>>>>
>>>>>>> On Wed, Dec 2, 2020 at 11:25 AM Nikhil Mohite <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> Hi Akshay,
>>>>>>>>
>>>>>>>> please find the updated patch, sorry for the inconvenience.
>>>>>>>>
>>>>>>>>
>>>>>>>> Regards,
>>>>>>>> Nikhil Mohite.
>>>>>>>>
>>>>>>>> On Wed, Dec 2, 2020 at 11:03 AM Akshay Joshi <
>>>>>>>> [email protected]> wrote:
>>>>>>>>
>>>>>>>>> Hi Nikhil
>>>>>>>>>
>>>>>>>>> The patch is not applied, please rebase and send the patch again.
>>>>>>>>>
>>>>>>>>> On Tue, Dec 1, 2020 at 2:48 PM Nikhil Mohite <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> Hi Team,
>>>>>>>>>>
>>>>>>>>>> Please find the attached patch for RM-5343
>>>>>>>>>> <https://redmine.postgresql.org/issues/5343;: [Code Coverage]
>>>>>>>>>> Improve API test cases for Debugger.
>>>>>>>>>> also updated implementation to remove dead code and unhandled
>>>>>>>>>> exceptions.
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> *Thanks & Regards,*
>>>>>>>>>> *Nikhil Mohite*
>>>>>>>>>> *Software Engineer.*
>>>>>>>>>> *EDB Postgres* <https://www.enterprisedb.com/;
>>>>>>>>>> *Mob.No: +91-7798364578.*
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> *Thanks & Regards*
>>>>>>>>> *Akshay Joshi*
>>>>>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>>>>>
>>>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> *Thanks & Regards*
>>>>>>> *Akshay Joshi*
>>>>>>> *pgAdmin Hacker | Principal Software Architect*
>>>>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>>>>
>>>>>>> *Mobile: +91 976-788-8246*
>>>>>>>
>>>>>>
>>>>
>>>> --
>>>> *Thanks & Regards*
>>>> *Akshay Joshi*
>>>> *pgAdmin Hacker | Principal Software Architect*
>>>> *EDB Postgres <http://edbpostgres.com>*
>>>>
>>>> *Mobile: +91 976-788-8246*
>>>>
>>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>> *pgAdmin Hacker | Principal Software Architect*
>> *EDB Postgres <http://edbpostgres.com>*
>>
>> *Mobile: +91 976-788-8246*
>>
>
--
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*
*Mobile: +91 976-788-8246*
^ permalink raw reply [nested|flat] 15+ messages in thread
end of thread, other threads:[~2020-12-17 13:31 UTC | newest]
Thread overview: 15+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2020-09-22 05:26 [pgAdmin][RM5330]: [Code Coverage] Improve API test cases for Functions Nikhil Mohite <[email protected]>
2020-09-22 06:11 ` Akshay Joshi <[email protected]>
2020-09-22 07:14 ` Nikhil Mohite <[email protected]>
2020-09-22 11:32 ` Akshay Joshi <[email protected]>
2020-12-01 09:18 [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-02 05:33 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-02 05:55 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-03 05:17 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-07 10:02 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 07:54 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-09 08:07 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-15 10:49 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-16 06:42 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
2020-12-17 12:10 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Nikhil Mohite <[email protected]>
2020-12-17 13:31 ` Re: [pgAdmin][RM-5343]: [Code Coverage] Improve API test cases for Debugger Akshay Joshi <[email protected]>
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox