public inbox for [email protected]
help / color / mirror / Atom feedFrom: Joao Pedro De Almeida Pereira <[email protected]>
To: Akshay Joshi <[email protected]>
Cc: pgadmin-hackers <[email protected]>
Cc: George Gelashvili <[email protected]>
Subject: Re: [patch] Dependents and Dependencies in GreenPlum
Date: Fri, 12 May 2017 13:53:03 -0400
Message-ID: <CAE+jja=i5QXtYY3qj_m4Zv-APP3qnY4rrK_tv6VBFHusetWOUA@mail.gmail.com> (raw)
In-Reply-To: <CAE+jjamEUWDGk+7cx298-HXp-fuqgoXmTaAnn1Z7kL-P=MwwZQ@mail.gmail.com>
References: <CAE+jjam5JoMt9+Ue-O_qpgEJO_wAGJfGoaLCJg-1VzVc+AqB_w@mail.gmail.com>
<CA+OCxoxOaYKi6j5dwgwEP7VtP-8XDiee101kjnO3e6SJc4Mp1g@mail.gmail.com>
<CAG7mmoyg2nbVHtYJVd1RA4e2orMv6nsaPoSbUeupy9akrz-z_w@mail.gmail.com>
<CAE+jja=8s-x82BVuBD4THq5V=07F_rJn0+Sa8vUGc=rOtxwWLA@mail.gmail.com>
<CAE+jja=dpFAAxavzJupBjcKQNZjox+grCiqd53AC2EO2G-FGdg@mail.gmail.com>
<CAGRPzo-pSDrQwXOHcy1aPbe==nNqRQpJeK6h2qr8_rsGiidRHg@mail.gmail.com>
<CAAtBm9V77+cbV5fbOkwrPg6JNDuVxQq5=ug7vdChAuTDY0Wj8Q@mail.gmail.com>
<CA+OCxozvcTmYOBrdXMi=b3w4f3LaBSYUMyJiTaUhz-uLuOAWiA@mail.gmail.com>
<CA+OCxozwGCNHJ1d58Huoc=zWGkvH3yWhrzRE9kE7oKm-LdQdYQ@mail.gmail.com>
<CANxoLDfcwCnw8ZRaVzT8TO4be1tmT1XSfOUrD=zMiud-cHLybA@mail.gmail.com>
<CANxoLDfGtTEyfwb=2snvRYN5qAr_CiC5s4J-_NMeSY8hUk8M7A@mail.gmail.com>
<CA+OCxoySRBh0YRRxOo-Osn3WOViPkcO-2Qt55iBjByzEb=bhtQ@mail.gmail.com>
<CAGRPzo9rkT+ehf-ShMvzU_TGyXT5eCek=jQDeSk5pnaMoQgzuQ@mail.gmail.com>
<CANxoLDc-j1rVx4Ke+Qjxpi82Nj4FfbhiYhriVY3ekNbtKBF2qQ@mail.gmail.com>
<CAGRPzo_ATD7Erwz=5Eay1GDfXnDq4DvEinYvfsSGQbVBmcxrNg@mail.gmail.com>
<CANxoLDfeJOiFKpsNa6aWU0Kui_3Pz6nswW=8uUE==8FUYJ3WoQ@mail.gmail.com>
<CAGRPzo95Yy4u-CQHFXXX=49Thci3mgdMvm3hxuJKNc0MhZU8tg@mail.gmail.com>
<CANxoLDcvq+eG482KkLzUY7sERM-y=KUeRUnuvskL600AvOkFdQ@mail.gmail.com>
<CAGRPzo8b8zfo2rX-ecL+8qdnS-2c1UJqv2nRzed-aTei_Pr5CA@mail.gmail.com>
<CANxoLDcS0+HMZx--k+xAwtRA0y9hqfMNvtgJgRxyWvFf3S7FqA@mail.gmail.com>
<[email protected]>
<CAFOhELcsS0KetQjDoWXeHiaFmCQmAEMJykqocaHG4n80NHqjgg@mail.gmail.com>
<CAE+jjamEUWDGk+7cx298-HXp-fuqgoXmTaAnn1Z7kL-P=MwwZQ@mail.gmail.com>
List-Unsubscribe: <mailto:[email protected]?body=unsub%20pgadmin-hackers>
Hello Akshay,
You can find attached a new version of the patch that changes the test in
question.
This new version instead of requiring a creation of a new Role now does the
following:
1 - Creates a new Role
2 - Creates a table with that Role
3 - Checks for dependencies
Thanks
Joao & George
On Thu, May 11, 2017 at 7:33 AM, Joao Pedro De Almeida Pereira <
[email protected]> wrote:
> Hello all,
> This test is trying to check if the sql to retrieve the role dependencies
> of a object in the database is correct. Using a different user to connect
> to the database and create tables there is no need for extra setup because
> the role depedencies table entry is added automatically. Also we talked
> with some internal users and they told us they always used a different user
> to connect to the database with pgadmin.
>
> After your comments we realize that the test need to have a different
> setup in order to become more readable and resilient. What do we need to do
> in the test setup to ensure an entry is added to the role dependency table?
>
> Also the test need to be a little bit more resilient to work independently
> of the user that is used on the test.
>
> Thanks
> Joao
>
> On Thu, May 11, 2017, 3:20 AM Khushboo Vashi <khushboo.vashi@enterprisedb.
> com> wrote:
>
>> On Thu, May 11, 2017 at 12:03 PM, Dave Page <[email protected]> wrote:
>>
>>>
>>>
>>> On 11 May 2017, at 07:11, Akshay Joshi <[email protected]>
>>> wrote:
>>>
>>> Hi Sarah
>>>
>>> On Thu, May 11, 2017 at 2:30 AM, Sarah McAlear <[email protected]>
>>> wrote:
>>>
>>>> Hi Ashkay!
>>>>
>>>> TestTablesNodeSql hasn't failed but TestRoleDependenciesSql failed with
>>>>> below error:
>>>>> .....\test_role_dependencies_sql.py\", line 41, in assertions\n
>>>>> self.assertEqual(1, len(fetch_result))\nAssertionError: 1 != 0
>>>>
>>>>
>>>> We experienced a similar problem when we started developing this patch.
>>>> We noticed that we were connecting to the database with the super user (the
>>>> db owner user), which did not create the role we are expecting when a table
>>>> is created. To ensure that this role is created, we had to create a new
>>>> user and use it to execute all the tests. After we made this change, the
>>>> tests passed.
>>>>
>>>> Can you try to create a new user and use it to execute your tests?
>>>>
>>>
>>> I did that and it works. I have created new user 'test' with
>>> superuser privileges and update parameter db_username="test" in
>>> test_config.json file. But still I am unable to understand why it doesn't
>>> work with 'postgres' (default) user?
>>>
>>>
>>> Agreed. That suggests something fishy is going on that should be
>>> understood.
>>>
>>>
>> We don't check role dependencies for every object. As per the code, the
>> role dependencies are executed for columns not for the table itself.
>> And in the test cases, the table object is trying to execute the role
>> dependencies, so I think this test case is not correct.
>>
>>>
>>>> Thanks,
>>>> João & Sarah
>>>>
>>>> On Wed, May 10, 2017 at 1:56 PM, Akshay Joshi <
>>>> [email protected]> wrote:
>>>>
>>>>>
>>>>>
>>>>> On May 10, 2017 19:07, "Sarah McAlear" <[email protected]> wrote:
>>>>>
>>>>> Hi Akshay!
>>>>>
>>>>> Does this error occur on 9.6 or 10.0? We tested it in 9.6 and all our
>>>>> tests pass.
>>>>>
>>>>>
>>>>> On both 9.6 and 10.0. Query returned 0 rows which is compared
>>>>> against 1 in assert statement.
>>>>>
>>>>>
>>>>> Thanks!
>>>>> João & Sarah
>>>>>
>>>>> On Wed, May 10, 2017 at 2:29 AM, Akshay Joshi <
>>>>> [email protected]> wrote:
>>>>>
>>>>>> Hi Sarah
>>>>>>
>>>>>> On Tue, May 9, 2017 at 9:03 PM, Sarah McAlear <[email protected]>
>>>>>> wrote:
>>>>>>
>>>>>>> Hi Akshay!
>>>>>>>
>>>>>>>
>>>>>>>> Some test file names ended with "*_sql_template.py*" do we need to
>>>>>>>> add that string ?
>>>>>>>
>>>>>>> we added this suffix after moving the tests up a level to
>>>>>>> tables/tests to clarify what subject they applied to. we changed the suffix
>>>>>>> to "_sql.py"
>>>>>>>
>>>>>>> - Files "test_column_acl_sql_template.py" and "
>>>>>>>> test_column_properties_sql_template.py" should be moved from
>>>>>>>> tables->tests to tables->column->tests. As it's related to column.
>>>>>>>> - Files "test_trigger_get_oid_sql_template.py" and "
>>>>>>>> test_trigger_nodes_sql_template.py" should be moved from
>>>>>>>> tables->tests to tables->triggers->tests. As its related to triggers.
>>>>>>>
>>>>>>> these tests are related to the sql files in tables/templates/column,
>>>>>>> not tables/column, so moving them into tables/column would be more
>>>>>>> confusing.
>>>>>>>
>>>>>>> Following test cases are failing
>>>>>>>
>>>>>>> Thank you, fixed, see new patch. Can you confirm that
>>>>>>> TestTablesNodeSql doesn't fail in your environment?
>>>>>>>
>>>>>>
>>>>>> TestTablesNodeSql hasn't failed but TestRoleDependenciesSql
>>>>>> failed with below error:
>>>>>> .....\test_role_dependencies_sql.py\", line 41, in assertions\n
>>>>>> self.assertEqual(1, len(fetch_result))\nAssertionError: 1 != 0
>>>>>>
>>>>>>
>>>>>>> Thanks,
>>>>>>> George & Sarah
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> *Akshay Joshi*
>>>>>> *Principal Software Engineer *
>>>>>>
>>>>>>
>>>>>>
>>>>>> *Phone: +91 20-3058-9517 <+91%2020%203058%209517>Mobile: +91
>>>>>> 976-788-8246 <+91%2097678%2088246>*
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>> --
>>> *Akshay Joshi*
>>> *Principal Software Engineer *
>>>
>>>
>>>
>>> *Phone: +91 20-3058-9517 <+91%2020%203058%209517>Mobile: +91
>>> 976-788-8246 <+91%2097678%2088246>*
>>>
>>>
--
Sent via pgadmin-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgadmin-hackers
Attachments:
[application/octet-stream] 0001-Fix-error-while-checking-Dependents-and-Dependencies.patch (71.9K, 3-0001-Fix-error-while-checking-Dependents-and-Dependencies.patch)
download | inline diff:
From 769168774eff95138b09cf52a3913c38949d65f1 Mon Sep 17 00:00:00 2001
From: George Gelashvili and Joao Pereira
<[email protected]>
Date: Fri, 12 May 2017 12:32:16 -0400
Subject: [PATCH] Fix error while checking Dependents and Dependencies of
object in GreenPlum:
- Make SQL template UT visible to runtest
- Add SQL to retrieve dependencies for GreenPlum
- Extract Role Dependencies from single dependents file
- Split template for dependents SQL
- Add 'SET LOCAL join_collapse_limit=8;' to dependency/dependents to make them faster. Only caveat is that this will remain unchanged for the session
- Add more expectations to role dependencies
- Specify order of query in copy_selected_query_results_feature_test to make tests pass
- GreenPlum and Postgres order these results differently by default without an order clause specified.
- Skip XSS test for GreenPlum
- Moved tests to the correct folders
---
.../databases/schemas/tables/templates/__init__.py | 0
.../schemas/tables/templates/column/__init__.py | 0
.../templates/column/sql/9.2_plus/__init__.py | 0
.../templates/column/sql/default/__init__.py | 0
.../templates/column/sql/tests/test_column_acl.py | 47 -------------
.../column/sql/tests/test_column_properties.py | 56 ----------------
.../schemas/tables/templates/table/__init__.py | 0
.../schemas/tables/templates/table/sql/__init__.py | 0
.../tables/templates/table/sql/tests/__init__.py | 0
.../templates/table/sql/tests/test_tables_acl.py | 66 -------------------
.../templates/table/sql/tests/test_tables_node.py | 74 ---------------------
.../table/sql/tests/test_tables_properties.py | 77 ----------------------
.../templates/trigger/sql/9.1_plus/__init__.py | 0
.../tables/templates/trigger/sql/__init__.py | 0
.../templates/trigger/sql/default/__init__.py | 0
.../tables/templates/trigger/sql/tests/__init__.py | 0
.../trigger/sql/tests/test_trigger_get_oid.py | 60 -----------------
.../schemas/tables/tests/test_column_acl_sql.py | 51 ++++++++++++++
.../tables/tests/test_column_properties_sql.py | 52 +++++++++++++++
.../schemas/tables/tests/test_tables_acl_sql.py | 54 +++++++++++++++
.../schemas/tables/tests/test_tables_node_sql.py | 55 ++++++++++++++++
.../tables/tests/test_tables_properties_sql.py | 72 ++++++++++++++++++++
.../tables/tests/test_trigger_get_oid_sql.py | 52 +++++++++++++++
.../schemas/tables/tests/test_trigger_nodes_sql.py | 43 ++++++++++++
.../depends/sql/9.1_plus/dependencies.sql | 45 +++++++++++++
.../templates/depends/sql/9.1_plus/dependents.sql | 44 +++++++++++++
.../templates/depends/sql/default/dependencies.sql | 42 ++++++++++++
.../templates/depends/sql/default/dependents.sql | 66 +------------------
.../depends/sql/default/role_dependencies.sql | 4 ++
.../servers/tests/test_dependencies_sql.py | 51 ++++++++++++++
.../servers/tests/test_dependents_sql.py | 51 ++++++++++++++
.../servers/tests/test_role_dependencies_sql.py | 76 +++++++++++++++++++++
web/pgadmin/browser/utils.py | 10 +--
.../copy_selected_query_results_feature_test.py | 11 +++-
.../xss_checks_pgadmin_debugger_test.py | 6 +-
.../python_test_utils/sql_template_test_base.py} | 52 ++++++++-------
36 files changed, 745 insertions(+), 472 deletions(-)
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/default/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_acl.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_properties.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_acl.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_properties.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/default/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/__init__.py
delete mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_get_oid.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependencies.sql
create mode 100644 web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependents.sql
create mode 100644 web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependencies.sql
create mode 100644 web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/role_dependencies.sql
create mode 100644 web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py
create mode 100644 web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py
rename web/{pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_nodes.py => regression/python_test_utils/sql_template_test_base.py} (59%)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/9.2_plus/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/default/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/default/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_acl.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_acl.py
deleted file mode 100644
index 7be945c7..00000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_acl.py
+++ /dev/null
@@ -1,47 +0,0 @@
-import os
-import sys
-
-from pgadmin.utils.driver import DriverRegistry
-from regression.python_test_utils.template_helper import file_as_template
-
-DriverRegistry.load_drivers()
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-
-if sys.version_info[0] >= 3:
- long = int
-
-
-class TestColumnAcl(BaseTestGenerator):
- def runTest(self):
- """ When there are no permissions on the column, it returns an empty result """
- with test_utils.Database(self.server) as (connection, database_name):
- test_utils.create_table(self.server, database_name, "test_table")
-
- cursor = connection.cursor()
- cursor.execute("SELECT pg_class.oid as table_id, "
- "pg_attribute.attnum as column_id "
- "FROM pg_class join pg_attribute on attrelid=pg_class.oid "
- "where pg_class.relname='test_table'"
- " and pg_attribute.attname = 'some_column'")
- table_id, column_id = cursor.fetchone()
-
- if connection.server_version < 90100:
- self.versions_to_test = ['default']
- else:
- self.versions_to_test = ['9.1_plus']
-
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "acl.sql")
- template = file_as_template(template_file)
-
- public_schema_id = 2200
- sql = template.render(scid=public_schema_id,
- tid=table_id,
- clid=column_id
- )
-
- cursor = connection.cursor()
- cursor.execute(sql)
- fetch_result = cursor.fetchall()
- self.assertEqual(0, len(fetch_result))
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_properties.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_properties.py
deleted file mode 100644
index b1984bda..00000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/column/sql/tests/test_column_properties.py
+++ /dev/null
@@ -1,56 +0,0 @@
-##########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2017, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-##########################################################################
-
-import os
-import sys
-
-from pgadmin.utils.driver import DriverRegistry
-from regression.python_test_utils.template_helper import file_as_template
-
-DriverRegistry.load_drivers()
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-
-if sys.version_info[0] >= 3:
- long = int
-
-
-class TestColumnProperties(BaseTestGenerator):
- def runTest(self):
- """ This tests that column properties are returned"""
- with test_utils.Database(self.server) as (connection, database_name):
- test_utils.create_table(self.server, database_name, "test_table")
-
- cursor = connection.cursor()
- cursor.execute("SELECT oid FROM pg_class where relname='test_table'")
- table_id = cursor.fetchone()[0]
-
- if connection.server_version < 90100:
- self.versions_to_test = ['default']
- else:
- self.versions_to_test = ['9.1_plus']
-
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "properties.sql")
- template = file_as_template(template_file)
- public_schema_id = 2200
- sql = template.render(scid=public_schema_id,
- tid=table_id
- )
-
- cursor = connection.cursor()
- cursor.execute(sql)
- fetch_result = cursor.fetchall()
- first_row = {}
- for index, description in enumerate(cursor.description):
- first_row[description.name] = fetch_result[0][index]
-
- self.assertEqual('some_column', first_row['name'])
- self.assertEqual('character varying', first_row['cltype'])
- self.assertEqual(2, len(fetch_result))
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_acl.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_acl.py
deleted file mode 100644
index a0f7f94e..00000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_acl.py
+++ /dev/null
@@ -1,66 +0,0 @@
-##########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2017, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-##########################################################################
-
-import os
-import sys
-
-from pgadmin.utils.driver import DriverRegistry
-from regression.python_test_utils.template_helper import file_as_template
-
-DriverRegistry.load_drivers()
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-
-if sys.version_info[0] >= 3:
- long = int
-
-
-class TestTablesAcl(BaseTestGenerator):
- scenarios = [
- ("Test query returns the permissions when there are permissions set up"
- " on the table", dict())
- ]
-
- def runTest(self):
- """ This tests that when there are permissions set up on the table, acl query returns the permissions"""
- with test_utils.Database(self.server) as (connection, database_name):
- test_utils.create_table(self.server, database_name, "test_table")
-
- cursor = connection.cursor()
- cursor.execute("GRANT SELECT ON test_table TO PUBLIC")
-
- cursor = connection.cursor()
- cursor.execute("SELECT oid FROM pg_class WHERE relname='test_table'")
- table_id = cursor.fetchone()[0]
-
- if connection.server_version < 90100:
- self.versions_to_test = ['default']
- else:
- self.versions_to_test = ['9.1_plus']
-
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "acl.sql")
- template = file_as_template(template_file)
- public_schema_id = 2200
- sql = template.render(scid=public_schema_id,
- tid=table_id)
-
- cursor = connection.cursor()
- cursor.execute(sql)
- fetch_result = cursor.fetchall()
- public_acls = list(filter(lambda acl: acl[1] == 'PUBLIC', fetch_result))
- self.assertEqual(len(public_acls), 1)
-
- new_acl_map = dict(zip(map(lambda column: column.name, cursor.description), public_acls[0]))
-
- self.assertEqual('PUBLIC', new_acl_map['grantee'])
- self.assertEqual(self.server['username'], new_acl_map['grantor'])
- self.assertEqual('relacl', new_acl_map['deftype'])
- self.assertEqual(['r'], new_acl_map['privileges'])
- self.assertEqual([False], new_acl_map['grantable'])
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py
deleted file mode 100644
index 21ec3275..00000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_node.py
+++ /dev/null
@@ -1,74 +0,0 @@
-##########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2017, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-##########################################################################
-
-import os
-import sys
-
-from jinja2 import BaseLoader
-from jinja2 import Environment
-
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-
-if sys.version_info[0] >= 3:
- long = int
-
-
-class TestTablesNode(BaseTestGenerator):
- scenarios = [
- ("This scenario tests that all applicable sql template versions can "
- "fetch table names", dict())
- ]
-
- def runTest(self):
- """ This tests that all applicable sql template versions can fetch table names """
- with test_utils.Database(self.server) as (connection, database_name):
- test_utils.create_table(self.server, database_name, "test_table")
-
- if connection.server_version < 91000:
- self.versions_to_test = ['default']
- else:
- self.versions_to_test = ['default', '9.1_plus']
-
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "nodes.sql")
- file_content = open(template_file, 'r').read()
-
- env = Environment(loader=SimpleTemplateLoader(file_content))
-
- template = env.get_template("")
- public_schema_id = 2200
- sql = template.render(scid=public_schema_id)
-
- cursor = connection.cursor()
- cursor.execute(sql)
- fetch_result = cursor.fetchall()
-
- first_row = {}
- for index, description in enumerate(cursor.description):
- first_row[description.name] = fetch_result[0][index]
-
- oid = first_row['oid']
- name = first_row['name']
- triggercount = first_row['triggercount']
- has_enable_triggers = first_row['has_enable_triggers']
-
- self.assertIsNotNone(long(oid))
- self.assertEqual('test_table', name)
- # triggercount is sometimes returned as a string for some reason
- self.assertEqual(0, long(triggercount))
- self.assertIsNotNone(long(has_enable_triggers))
-
-
-class SimpleTemplateLoader(BaseLoader):
- def __init__(self, file_content):
- self.file_content = file_content
-
- def get_source(self, *args):
- return self.file_content, "required-return-not-a-real-file.txt", True
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_properties.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_properties.py
deleted file mode 100644
index 5984bda5..00000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/table/sql/tests/test_tables_properties.py
+++ /dev/null
@@ -1,77 +0,0 @@
-##########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2017, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-##########################################################################
-
-import os
-import sys
-
-from pgadmin.utils.driver import DriverRegistry
-from regression.python_test_utils.template_helper import file_as_template
-
-DriverRegistry.load_drivers()
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-
-if sys.version_info[0] >= 3:
- long = int
-
-
-class TestTablesProperties(BaseTestGenerator):
- scenarios = [
- ("This scenario tests that all applicable sql template versions can "
- "fetch some ddl", dict())
- ]
-
- def runTest(self):
- """ This tests that all applicable sql template versions can fetch some ddl """
- with test_utils.Database(self.server) as (connection, database_name):
- test_utils.create_table(self.server, database_name, "test_table")
-
- cursor = connection.cursor()
- cursor.execute(u"""
- SELECT
- db.oid as did, datlastsysoid
- FROM
- pg_database db
- WHERE db.datname = '{0}'""".format(database_name)
- )
- database_id, last_system_oid = cursor.fetchone()
-
- cursor = connection.cursor()
- cursor.execute("SELECT oid FROM pg_class where relname='test_table'")
- table_id = cursor.fetchone()[0]
-
- if connection.server_version < 90100:
- self.versions_to_test = ['default']
- else:
- self.versions_to_test = ['9.1_plus']
-
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "properties.sql")
- template = file_as_template(template_file)
-
- public_schema_id = 2200
- sql = template.render(scid=public_schema_id,
- did=database_id,
- datlastsysoid=last_system_oid,
- tid=table_id
- )
-
- cursor = connection.cursor()
- cursor.execute(sql)
- fetch_result = cursor.fetchone()
-
- first_row = {}
- for index, description in enumerate(cursor.description):
- first_row[description.name] = fetch_result[index]
-
- self.assertEqual('test_table', first_row['name'])
- # triggercount is sometimes returned as a string for some reason
- self.assertEqual(0, long(first_row['triggercount']))
- self.assertEqual(None, first_row['typname'])
- self.assertEqual([], first_row['coll_inherits'])
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/9.1_plus/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/default/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/default/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/__init__.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/__init__.py
deleted file mode 100644
index e69de29b..00000000
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_get_oid.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_get_oid.py
deleted file mode 100644
index f2b637ee..00000000
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_get_oid.py
+++ /dev/null
@@ -1,60 +0,0 @@
-##########################################################################
-#
-# pgAdmin 4 - PostgreSQL Tools
-#
-# Copyright (C) 2013 - 2017, The pgAdmin Development Team
-# This software is released under the PostgreSQL Licence
-#
-##########################################################################
-
-import os
-import sys
-
-import jinja2
-
-from pgadmin.utils.driver import DriverRegistry
-from regression.python_test_utils.template_helper import file_as_template
-
-DriverRegistry.load_drivers()
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-
-if sys.version_info[0] >= 3:
- long = int
-
-
-class TestTriggerGetOid(BaseTestGenerator):
- def runTest(self):
- """ When there are no permissions on the column, it returns an empty result """
- with test_utils.Database(self.server) as (connection, database_name):
- test_utils.create_table(self.server, database_name, "test_table")
-
- cursor = connection.cursor()
- cursor.execute("SELECT pg_class.oid as table_id, "
- "pg_attribute.attnum as column_id "
- "FROM pg_class join pg_attribute on attrelid=pg_class.oid "
- "where pg_class.relname='test_table'"
- " and pg_attribute.attname = 'some_column'")
- table_id, column_id = cursor.fetchone()
-
- if connection.server_version < 90100:
- self.versions_to_test = ['default']
- else:
- self.versions_to_test = ['9.1_plus']
-
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "get_oid.sql")
-
- jinja2.filters.FILTERS['qtLiteral'] = lambda value: "NULL"
- template = file_as_template(template_file)
-
- sql = template.render(data={'name': None},
- tid=table_id
- )
-
- cursor = connection.cursor()
- cursor.execute(sql)
- fetch_result = cursor.fetchall()
- self.assertEqual(0, len(fetch_result))
-
-
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py
new file mode 100644
index 00000000..5ba560fd
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_acl_sql.py
@@ -0,0 +1,51 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+
+class TestColumnAclSql(SQLTemplateTestBase):
+ scenarios = [
+ # Fetching default URL for schema node.
+ ('Test Column ACL SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestColumnAclSql, self).__init__()
+ self.table_id = -1
+ self.column_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("SELECT pg_class.oid AS table_id, "
+ "pg_attribute.attnum AS column_id "
+ "FROM pg_class JOIN pg_attribute ON attrelid=pg_class.oid "
+ "WHERE pg_class.relname='test_table'"
+ " AND pg_attribute.attname = 'some_column'")
+ self.table_id, self.column_id = cursor.fetchone()
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "acl.sql")
+ template = file_as_template(template_file)
+ public_schema_id = 2200
+ sql = template.render(scid=public_schema_id,
+ tid=self.table_id,
+ clid=self.column_id
+ )
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ self.assertEqual(0, len(fetch_result))
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "column", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py
new file mode 100644
index 00000000..ce6fa972
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_column_properties_sql.py
@@ -0,0 +1,52 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+
+class TestColumnPropertiesSql(SQLTemplateTestBase):
+ scenarios = [
+ # Fetching default URL for schema node.
+ ('Test Column Properties SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestColumnPropertiesSql, self).__init__()
+ self.table_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("SELECT oid FROM pg_class where relname='test_table'")
+
+ self.table_id = cursor.fetchone()[0]
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "properties.sql")
+ template = file_as_template(template_file)
+ public_schema_id = 2200
+ sql = template.render(scid=public_schema_id,
+ tid=self.table_id
+ )
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ first_row = {}
+ for index, description in enumerate(descriptions):
+ first_row[description.name] = fetch_result[0][index]
+
+ self.assertEqual('some_column', first_row['name'])
+ self.assertEqual('character varying', first_row['cltype'])
+ self.assertEqual(2, len(fetch_result))
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "column", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py
new file mode 100644
index 00000000..de49852c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_acl_sql.py
@@ -0,0 +1,54 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+from regression.python_test_utils.template_helper import file_as_template
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+
+
+class TestTablesAclSql(SQLTemplateTestBase):
+ scenarios = [
+ ("Test query returns the permissions when there are permissions set up"
+ " on the table", dict())
+ ]
+
+ def __init__(self):
+ super(TestTablesAclSql, self).__init__()
+ self.table_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("GRANT SELECT ON test_table TO PUBLIC")
+ cursor = connection.cursor()
+ cursor.execute("SELECT oid FROM pg_class WHERE relname='test_table'")
+ self.table_id = cursor.fetchone()[0]
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "acl.sql")
+ template = file_as_template(template_file)
+ public_schema_id = 2200
+ sql = template.render(scid=public_schema_id,
+ tid=self.table_id)
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ public_acls = list(filter(lambda acl: acl[1] == 'PUBLIC', fetch_result))
+ self.assertEqual(len(public_acls), 1)
+
+ new_acl_map = dict(zip(map(lambda column: column.name, descriptions), public_acls[0]))
+
+ self.assertEqual('PUBLIC', new_acl_map['grantee'])
+ self.assertEqual(self.server['username'], new_acl_map['grantor'])
+ self.assertEqual('relacl', new_acl_map['deftype'])
+ self.assertEqual(['r'], new_acl_map['privileges'])
+ self.assertEqual([False], new_acl_map['grantable'])
+ return public_acls
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "table", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py
new file mode 100644
index 00000000..1f344da3
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_node_sql.py
@@ -0,0 +1,55 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+import sys
+
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+if sys.version_info[0] >= 3:
+ long = int
+
+
+class TestTablesNodeSql(SQLTemplateTestBase):
+ scenarios = [
+ ("This scenario tests that all applicable sql template versions can "
+ "fetch table names", dict())
+ ]
+
+ def test_setup(self, connection, cursor):
+ pass
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "nodes.sql")
+ template = file_as_template(template_file)
+ public_schema_id = 2200
+ sql = template.render(scid=public_schema_id)
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+
+ first_row = {}
+ for index, description in enumerate(descriptions):
+ first_row[description.name] = fetch_result[0][index]
+
+ oid = first_row['oid']
+ name = first_row['name']
+ triggercount = first_row['triggercount']
+ has_enable_triggers = first_row['has_enable_triggers']
+
+ self.assertIsNotNone(long(oid))
+ self.assertEqual('test_table', name)
+ # triggercount is sometimes returned as a string for some reason
+ self.assertEqual(0, long(triggercount))
+ self.assertIsNotNone(long(has_enable_triggers))
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "table", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py
new file mode 100644
index 00000000..861562b8
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_tables_properties_sql.py
@@ -0,0 +1,72 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+import sys
+
+from regression.python_test_utils.template_helper import file_as_template
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+
+
+if sys.version_info[0] >= 3:
+ long = int
+
+
+class TestTablesPropertiesSql(SQLTemplateTestBase):
+ scenarios = [
+ ("This scenario tests that all applicable sql template versions can "
+ "fetch some ddl", dict())
+ ]
+
+ def __init__(self):
+ super(TestTablesPropertiesSql, self).__init__()
+ self.database_id = -1
+ self.last_system_oid = -1
+ self.table_id = -1
+
+ def assertions(self, fetch_result, descriptions):
+
+ first_row = {}
+ for index, description in enumerate(descriptions):
+ first_row[description.name] = fetch_result[0][index]
+
+ self.assertEqual('test_table', first_row['name'])
+ # triggercount is sometimes returned as a string for some reason
+ self.assertEqual(0, long(first_row['triggercount']))
+ self.assertEqual(None, first_row['typname'])
+ self.assertEqual([], first_row['coll_inherits'])
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "properties.sql")
+ template = file_as_template(template_file)
+ public_schema_id = 2200
+ sql = template.render(scid=public_schema_id,
+ did=self.database_id,
+ datlastsysoid=self.last_system_oid,
+ tid=self.table_id
+ )
+ return sql
+
+ def test_setup(self, connection, cursor):
+ cursor.execute(u"""
+ SELECT
+ db.oid as did, datlastsysoid
+ FROM
+ pg_database db
+ WHERE db.datname = '{0}'""".format(self.database_name)
+ )
+ self.database_id, self.last_system_oid = cursor.fetchone()
+
+ cursor.execute("SELECT oid FROM pg_class where relname='test_table'")
+ self.table_id = cursor.fetchone()[0]
+
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "table", "sql", version, filename)
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py
new file mode 100644
index 00000000..3306fb7a
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_get_oid_sql.py
@@ -0,0 +1,52 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+
+import jinja2
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+
+class TestTriggerGetOidSql(SQLTemplateTestBase):
+ scenarios = [
+ ('Test Trigger to retrieve OID SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestTriggerGetOidSql, self).__init__()
+ self.table_id = -1
+ self.column_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("SELECT pg_class.oid AS table_id, "
+ "pg_attribute.attnum AS column_id "
+ "FROM pg_class JOIN pg_attribute ON attrelid=pg_class.oid "
+ "WHERE pg_class.relname='test_table'"
+ " AND pg_attribute.attname = 'some_column'")
+ self.table_id, self.column_id = cursor.fetchone()
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "get_oid.sql")
+ jinja2.filters.FILTERS['qtLiteral'] = lambda value: "NULL"
+ template = file_as_template(template_file)
+
+ sql = template.render(data={'name': None},
+ tid=self.table_id
+ )
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ self.assertEqual(0, len(fetch_result))
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "trigger", "sql", version, filename)
+
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py
new file mode 100644
index 00000000..8f328a60
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/tests/test_trigger_nodes_sql.py
@@ -0,0 +1,43 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+
+class TestTriggerNodesSql(SQLTemplateTestBase):
+ scenarios = [
+ ('Test Trigger Nodes SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestTriggerNodesSql, self).__init__()
+ self.table_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("SELECT pg_class.oid AS table_id "
+ "FROM pg_class "
+ "WHERE pg_class.relname='test_table'")
+ self.table_id = cursor.fetchone()[0]
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "nodes.sql")
+ template = file_as_template(template_file)
+ sql = template.render(tid=self.table_id)
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ self.assertEqual(0, len(fetch_result))
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "trigger", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependencies.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependencies.sql
new file mode 100644
index 00000000..e5bb8cb6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependencies.sql
@@ -0,0 +1,45 @@
+SELECT DISTINCT dep.deptype, dep.refclassid, cl.relkind, ad.adbin, ad.adsrc,
+ CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.refobjsubid::character varying, '')
+ WHEN tg.oid IS NOT NULL THEN 'T'::text
+ WHEN ty.oid IS NOT NULL AND ty.typbasetype = 0 THEN 'y'::text
+ WHEN ty.oid IS NOT NULL AND ty.typbasetype != 0 THEN 'd'::text
+ WHEN ns.oid IS NOT NULL THEN 'n'::text
+ WHEN pr.oid IS NOT NULL THEN 'p'::text
+ WHEN la.oid IS NOT NULL THEN 'l'::text
+ WHEN rw.oid IS NOT NULL THEN 'R'::text
+ WHEN co.oid IS NOT NULL THEN 'C'::text || contype
+ WHEN ad.oid IS NOT NULL THEN 'A'::text
+ WHEN fs.oid IS NOT NULL THEN 'F'::text
+ WHEN fdw.oid IS NOT NULL THEN 'f'::text
+ ELSE ''
+ END AS type,
+ COALESCE(coc.relname, clrw.relname) AS ownertable,
+ CASE WHEN cl.relname IS NOT NULL OR att.attname IS NOT NULL THEN cl.relname || '.' || att.attname
+ ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname, fs.srvname, fdw.fdwname)
+ END AS refname,
+ COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname
+FROM pg_depend dep
+LEFT JOIN pg_class cl ON dep.refobjid=cl.oid
+LEFT JOIN pg_attribute att ON dep.refobjid=att.attrelid AND dep.refobjsubid=att.attnum
+LEFT JOIN pg_namespace nsc ON cl.relnamespace=nsc.oid
+LEFT JOIN pg_proc pr ON dep.refobjid=pr.oid
+LEFT JOIN pg_namespace nsp ON pr.pronamespace=nsp.oid
+LEFT JOIN pg_trigger tg ON dep.refobjid=tg.oid
+LEFT JOIN pg_type ty ON dep.refobjid=ty.oid
+LEFT JOIN pg_namespace nst ON ty.typnamespace=nst.oid
+LEFT JOIN pg_constraint co ON dep.refobjid=co.oid
+LEFT JOIN pg_class coc ON co.conrelid=coc.oid
+LEFT JOIN pg_namespace nso ON co.connamespace=nso.oid
+LEFT JOIN pg_rewrite rw ON dep.refobjid=rw.oid
+LEFT JOIN pg_class clrw ON clrw.oid=rw.ev_class
+LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
+LEFT JOIN pg_language la ON dep.refobjid=la.oid
+LEFT JOIN pg_namespace ns ON dep.refobjid=ns.oid
+LEFT JOIN pg_attrdef ad ON ad.adrelid=att.attrelid AND ad.adnum=att.attnum
+LEFT JOIN pg_foreign_server fs ON fs.oid=dep.refobjid
+LEFT JOIN pg_foreign_data_wrapper fdw ON fdw.oid=dep.refobjid
+{{where_clause}} AND
+refclassid IN ( SELECT oid FROM pg_class WHERE relname IN
+ ('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
+ 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
+ORDER BY refclassid, cl.relkind
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependents.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependents.sql
new file mode 100644
index 00000000..1281672f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/9.1_plus/dependents.sql
@@ -0,0 +1,44 @@
+SELECT DISTINCT dep.deptype, dep.classid, cl.relkind, ad.adbin, ad.adsrc,
+ CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.objsubid::text, '')
+ WHEN tg.oid IS NOT NULL THEN 'T'::text
+ WHEN ty.oid IS NOT NULL THEN 'y'::text
+ WHEN ns.oid IS NOT NULL THEN 'n'::text
+ WHEN pr.oid IS NOT NULL THEN 'p'::text
+ WHEN la.oid IS NOT NULL THEN 'l'::text
+ WHEN rw.oid IS NOT NULL THEN 'R'::text
+ WHEN co.oid IS NOT NULL THEN 'C'::text || contype
+ WHEN ad.oid IS NOT NULL THEN 'A'::text
+ WHEN fs.oid IS NOT NULL THEN 'F'::text
+ WHEN fdw.oid IS NOT NULL THEN 'f'::text
+ ELSE ''
+ END AS type,
+ COALESCE(coc.relname, clrw.relname) AS ownertable,
+ CASE WHEN cl.relname IS NOT NULL AND att.attname IS NOT NULL THEN cl.relname || '.' || att.attname
+ ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname, fs.srvname, fdw.fdwname)
+ END AS refname,
+ COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname
+FROM pg_depend dep
+LEFT JOIN pg_class cl ON dep.objid=cl.oid
+LEFT JOIN pg_attribute att ON dep.objid=att.attrelid AND dep.objsubid=att.attnum
+LEFT JOIN pg_namespace nsc ON cl.relnamespace=nsc.oid
+LEFT JOIN pg_proc pr ON dep.objid=pr.oid
+LEFT JOIN pg_namespace nsp ON pr.pronamespace=nsp.oid
+LEFT JOIN pg_trigger tg ON dep.objid=tg.oid
+LEFT JOIN pg_type ty ON dep.objid=ty.oid
+LEFT JOIN pg_namespace nst ON ty.typnamespace=nst.oid
+LEFT JOIN pg_constraint co ON dep.objid=co.oid
+LEFT JOIN pg_class coc ON co.conrelid=coc.oid
+LEFT JOIN pg_namespace nso ON co.connamespace=nso.oid
+LEFT JOIN pg_rewrite rw ON dep.objid=rw.oid
+LEFT JOIN pg_class clrw ON clrw.oid=rw.ev_class
+LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
+LEFT JOIN pg_language la ON dep.objid=la.oid
+LEFT JOIN pg_namespace ns ON dep.objid=ns.oid
+LEFT JOIN pg_attrdef ad ON ad.oid=dep.objid
+LEFT JOIN pg_foreign_server fs ON fs.oid=dep.objid
+LEFT JOIN pg_foreign_data_wrapper fdw ON fdw.oid=dep.objid
+{{where_clause}} AND
+classid IN ( SELECT oid FROM pg_class WHERE relname IN
+ ('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
+ 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
+ORDER BY classid, cl.relkind
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependencies.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependencies.sql
new file mode 100644
index 00000000..aae5982e
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependencies.sql
@@ -0,0 +1,42 @@
+SET LOCAL join_collapse_limit=8;
+SELECT DISTINCT dep.deptype, dep.refclassid, cl.relkind, ad.adbin, ad.adsrc,
+ CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.refobjsubid::character varying, '')
+ WHEN tg.oid IS NOT NULL THEN 'T'::text
+ WHEN ty.oid IS NOT NULL AND ty.typbasetype = 0 THEN 'y'::text
+ WHEN ty.oid IS NOT NULL AND ty.typbasetype != 0 THEN 'd'::text
+ WHEN ns.oid IS NOT NULL THEN 'n'::text
+ WHEN pr.oid IS NOT NULL THEN 'p'::text
+ WHEN la.oid IS NOT NULL THEN 'l'::text
+ WHEN rw.oid IS NOT NULL THEN 'R'::text
+ WHEN co.oid IS NOT NULL THEN 'C'::text || contype
+ WHEN ad.oid IS NOT NULL THEN 'A'::text
+ ELSE ''
+ END AS type,
+ COALESCE(coc.relname, clrw.relname) AS ownertable,
+ CASE WHEN cl.relname IS NOT NULL OR att.attname IS NOT NULL THEN cl.relname || '.' || att.attname
+ ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname)
+ END AS refname,
+ COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname
+FROM pg_depend dep
+LEFT JOIN pg_class cl ON dep.refobjid=cl.oid
+LEFT JOIN pg_attribute att ON dep.refobjid=att.attrelid AND dep.refobjsubid=att.attnum
+LEFT JOIN pg_namespace nsc ON cl.relnamespace=nsc.oid
+LEFT JOIN pg_proc pr ON dep.refobjid=pr.oid
+LEFT JOIN pg_namespace nsp ON pr.pronamespace=nsp.oid
+LEFT JOIN pg_trigger tg ON dep.refobjid=tg.oid
+LEFT JOIN pg_type ty ON dep.refobjid=ty.oid
+LEFT JOIN pg_namespace nst ON ty.typnamespace=nst.oid
+LEFT JOIN pg_constraint co ON dep.refobjid=co.oid
+LEFT JOIN pg_class coc ON co.conrelid=coc.oid
+LEFT JOIN pg_namespace nso ON co.connamespace=nso.oid
+LEFT JOIN pg_rewrite rw ON dep.refobjid=rw.oid
+LEFT JOIN pg_class clrw ON clrw.oid=rw.ev_class
+LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
+LEFT JOIN pg_language la ON dep.refobjid=la.oid
+LEFT JOIN pg_namespace ns ON dep.refobjid=ns.oid
+LEFT JOIN pg_attrdef ad ON ad.adrelid=att.attrelid AND ad.adnum=att.attnum
+{{where_clause}} AND
+refclassid IN ( SELECT oid FROM pg_class WHERE relname IN
+ ('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
+ 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
+ORDER BY refclassid, cl.relkind
\ No newline at end of file
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependents.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependents.sql
index e2ba3d6b..2fe2ef3e 100644
--- a/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependents.sql
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/dependents.sql
@@ -1,59 +1,4 @@
-{% if fetch_dependencies %}
-SELECT DISTINCT dep.deptype, dep.refclassid, cl.relkind, ad.adbin, ad.adsrc,
- CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.refobjsubid::character varying, '')
- WHEN tg.oid IS NOT NULL THEN 'T'::text
- WHEN ty.oid IS NOT NULL AND ty.typbasetype = 0 THEN 'y'::text
- WHEN ty.oid IS NOT NULL AND ty.typbasetype != 0 THEN 'd'::text
- WHEN ns.oid IS NOT NULL THEN 'n'::text
- WHEN pr.oid IS NOT NULL THEN 'p'::text
- WHEN la.oid IS NOT NULL THEN 'l'::text
- WHEN rw.oid IS NOT NULL THEN 'R'::text
- WHEN co.oid IS NOT NULL THEN 'C'::text || contype
- WHEN ad.oid IS NOT NULL THEN 'A'::text
- WHEN fs.oid IS NOT NULL THEN 'F'::text
- WHEN fdw.oid IS NOT NULL THEN 'f'::text
- ELSE ''
- END AS type,
- COALESCE(coc.relname, clrw.relname) AS ownertable,
- CASE WHEN cl.relname IS NOT NULL OR att.attname IS NOT NULL THEN cl.relname || '.' || att.attname
- ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname, fs.srvname, fdw.fdwname)
- END AS refname,
- COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname
-FROM pg_depend dep
-LEFT JOIN pg_class cl ON dep.refobjid=cl.oid
-LEFT JOIN pg_attribute att ON dep.refobjid=att.attrelid AND dep.refobjsubid=att.attnum
-LEFT JOIN pg_namespace nsc ON cl.relnamespace=nsc.oid
-LEFT JOIN pg_proc pr ON dep.refobjid=pr.oid
-LEFT JOIN pg_namespace nsp ON pr.pronamespace=nsp.oid
-LEFT JOIN pg_trigger tg ON dep.refobjid=tg.oid
-LEFT JOIN pg_type ty ON dep.refobjid=ty.oid
-LEFT JOIN pg_namespace nst ON ty.typnamespace=nst.oid
-LEFT JOIN pg_constraint co ON dep.refobjid=co.oid
-LEFT JOIN pg_class coc ON co.conrelid=coc.oid
-LEFT JOIN pg_namespace nso ON co.connamespace=nso.oid
-LEFT JOIN pg_rewrite rw ON dep.refobjid=rw.oid
-LEFT JOIN pg_class clrw ON clrw.oid=rw.ev_class
-LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
-LEFT JOIN pg_language la ON dep.refobjid=la.oid
-LEFT JOIN pg_namespace ns ON dep.refobjid=ns.oid
-LEFT JOIN pg_attrdef ad ON ad.adrelid=att.attrelid AND ad.adnum=att.attnum
-LEFT JOIN pg_foreign_server fs ON fs.oid=dep.refobjid
-LEFT JOIN pg_foreign_data_wrapper fdw ON fdw.oid=dep.refobjid
-{{where_clause}} AND
-refclassid IN ( SELECT oid FROM pg_class WHERE relname IN
- ('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
- 'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
-ORDER BY refclassid, cl.relkind
-{% endif %}
-
-{% if fetch_role_dependencies %}
-SELECT rolname AS refname, refclassid, deptype
-FROM pg_shdepend dep
-LEFT JOIN pg_roles r ON refclassid=1260 AND refobjid=r.oid
-{{where_clause}} ORDER BY 1
-{% endif %}
-
-{% if fetch_dependents %}
+SET LOCAL join_collapse_limit=8;
SELECT DISTINCT dep.deptype, dep.classid, cl.relkind, ad.adbin, ad.adsrc,
CASE WHEN cl.relkind IS NOT NULL THEN cl.relkind || COALESCE(dep.objsubid::text, '')
WHEN tg.oid IS NOT NULL THEN 'T'::text
@@ -64,13 +9,11 @@ SELECT DISTINCT dep.deptype, dep.classid, cl.relkind, ad.adbin, ad.adsrc,
WHEN rw.oid IS NOT NULL THEN 'R'::text
WHEN co.oid IS NOT NULL THEN 'C'::text || contype
WHEN ad.oid IS NOT NULL THEN 'A'::text
- WHEN fs.oid IS NOT NULL THEN 'F'::text
- WHEN fdw.oid IS NOT NULL THEN 'f'::text
ELSE ''
END AS type,
COALESCE(coc.relname, clrw.relname) AS ownertable,
CASE WHEN cl.relname IS NOT NULL AND att.attname IS NOT NULL THEN cl.relname || '.' || att.attname
- ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname, fs.srvname, fdw.fdwname)
+ ELSE COALESCE(cl.relname, co.conname, pr.proname, tg.tgname, ty.typname, la.lanname, rw.rulename, ns.nspname)
END AS refname,
COALESCE(nsc.nspname, nso.nspname, nsp.nspname, nst.nspname, nsrw.nspname) AS nspname
FROM pg_depend dep
@@ -91,11 +34,8 @@ LEFT JOIN pg_namespace nsrw ON clrw.relnamespace=nsrw.oid
LEFT JOIN pg_language la ON dep.objid=la.oid
LEFT JOIN pg_namespace ns ON dep.objid=ns.oid
LEFT JOIN pg_attrdef ad ON ad.oid=dep.objid
-LEFT JOIN pg_foreign_server fs ON fs.oid=dep.objid
-LEFT JOIN pg_foreign_data_wrapper fdw ON fdw.oid=dep.objid
{{where_clause}} AND
classid IN ( SELECT oid FROM pg_class WHERE relname IN
('pg_class', 'pg_constraint', 'pg_conversion', 'pg_language', 'pg_proc', 'pg_rewrite', 'pg_namespace',
'pg_trigger', 'pg_type', 'pg_attrdef', 'pg_event_trigger', 'pg_foreign_server', 'pg_foreign_data_wrapper'))
-ORDER BY classid, cl.relkind
-{% endif %}
+ORDER BY classid, cl.relkind;
diff --git a/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/role_dependencies.sql b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/role_dependencies.sql
new file mode 100644
index 00000000..25fc3f85
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/templates/depends/sql/default/role_dependencies.sql
@@ -0,0 +1,4 @@
+SELECT rolname AS refname, refclassid, deptype
+FROM pg_shdepend dep
+LEFT JOIN pg_roles r ON refclassid=1260 AND refobjid=r.oid
+{{where_clause}} ORDER BY 1
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py b/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py
new file mode 100644
index 00000000..2a0235a2
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_dependencies_sql.py
@@ -0,0 +1,51 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+
+class TestDependenciesSql(SQLTemplateTestBase):
+ scenarios = [
+ # Fetching default URL for schema node.
+ ('Test dependencies SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestDependenciesSql, self).__init__()
+ self.table_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("SELECT pg_class.oid AS table_id "
+ "FROM pg_class "
+ "WHERE pg_class.relname='test_table'")
+ self.table_id = cursor.fetchone()[0]
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "dependencies.sql")
+ template = file_as_template(template_file)
+ sql = template.render(where_clause="WHERE dep.objid=%s::oid" % self.table_id)
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ self.assertEqual(1, len(fetch_result))
+
+ first_row = {}
+ for index, description in enumerate(descriptions):
+ first_row[description.name] = fetch_result[0][index]
+
+ self.assertEqual('n', first_row["deptype"])
+ self.assertEqual('public', first_row["refname"])
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "depends", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py b/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py
new file mode 100644
index 00000000..b82de6d9
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_dependents_sql.py
@@ -0,0 +1,51 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+import os
+
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+
+
+class TestDependentsSql(SQLTemplateTestBase):
+ scenarios = [
+ # Fetching default URL for schema node.
+ ('Test dependencies SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestDependentsSql, self).__init__()
+ self.table_id = -1
+
+ def test_setup(self, connection, cursor):
+ cursor.execute("SELECT pg_class.oid AS table_id "
+ "FROM pg_class "
+ "WHERE pg_class.relname='test_table'")
+ self.table_id = cursor.fetchone()[0]
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "dependents.sql")
+ template = file_as_template(template_file)
+ sql = template.render(where_clause="WHERE dep.objid=%s::oid" % self.table_id)
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ self.assertEqual(1, len(fetch_result))
+
+ first_row = {}
+ for index, description in enumerate(descriptions):
+ first_row[description.name] = fetch_result[0][index]
+
+ self.assertEqual('n', first_row["deptype"])
+ self.assertEqual('test_table', first_row["refname"])
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "depends", "sql", version, filename)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py b/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py
new file mode 100644
index 00000000..827e44e1
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_role_dependencies_sql.py
@@ -0,0 +1,76 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+from pgadmin.browser.server_groups.servers.roles.tests.utils import create_role, delete_role
+from pgadmin.utils.route import BaseTestGenerator
+import os
+
+from regression.python_test_utils import test_utils
+from regression.python_test_utils.sql_template_test_base import SQLTemplateTestBase
+from regression.python_test_utils.template_helper import file_as_template
+from regression.python_test_utils.test_utils import create_database
+
+
+class TestRoleDependenciesSql(BaseTestGenerator):
+ scenarios = [
+ # Fetching default URL for schema node.
+ ('Test Role Dependencies SQL file', dict())
+ ]
+
+ def __init__(self):
+ super(TestRoleDependenciesSql, self).__init__()
+ self.table_id = -1
+
+ def setUp(self):
+ create_role(self.server, "testpgadmin")
+ self.server_with_modified_user = self.server.copy()
+ self.server_with_modified_user['username'] = "testpgadmin"
+
+ def runTest(self):
+ if hasattr(self, "ignore_test"):
+ return
+
+ with test_utils.Database(self.server) as (connection, database_name):
+ test_utils.create_table(self.server_with_modified_user, database_name, "test_new_role_table")
+ cursor = connection.cursor()
+ cursor.execute("SELECT pg_class.oid AS table_id "
+ "FROM pg_class "
+ "WHERE pg_class.relname='test_new_role_table'")
+ self.table_id = cursor.fetchone()[0]
+
+ sql = self.generate_sql('default')
+ cursor.execute(sql)
+
+ fetch_result = cursor.fetchall()
+ self.assertions(fetch_result, cursor.description)
+
+ def tearDown(self):
+ with test_utils.Database(self.server) as (connection, database_name):
+ cursor = connection.cursor()
+ cursor.execute("DROP ROLE testpgadmin")
+ connection.commit()
+
+ def generate_sql(self, version):
+ template_file = self.get_template_file(version, "role_dependencies.sql")
+ template = file_as_template(template_file)
+ sql = template.render(where_clause="WHERE dep.objid=%s::oid" % self.table_id)
+
+ return sql
+
+ def assertions(self, fetch_result, descriptions):
+ self.assertEqual(1, len(fetch_result))
+
+ first_row = {}
+ for index, description in enumerate(descriptions):
+ first_row[description.name] = fetch_result[0][index]
+
+ self.assertEqual('o', first_row["deptype"])
+
+ @staticmethod
+ def get_template_file(version, filename):
+ return os.path.join(os.path.dirname(__file__), "..", "templates", "depends", "sql", version, filename)
diff --git a/web/pgadmin/browser/utils.py b/web/pgadmin/browser/utils.py
index d2899875..708bfdfb 100644
--- a/web/pgadmin/browser/utils.py
+++ b/web/pgadmin/browser/utils.py
@@ -353,15 +353,15 @@ class PGChildNodeView(NodeView):
else:
where_clause = where
- query = render_template("/".join([sql_path, 'dependents.sql']),
- fetch_dependencies=True, where_clause=where_clause)
+ query = render_template("/".join([sql_path, 'dependencies.sql']),
+ where_clause=where_clause)
# fetch the dependency for the selected object
dependencies = self.__fetch_dependency(conn, query)
# fetch role dependencies
if where_clause.find('subid') < 0:
- sql = render_template("/".join([sql_path, 'dependents.sql']),
- fetch_role_dependencies=True, where_clause=where_clause)
+ sql = render_template("/".join([sql_path, 'role_dependencies.sql']),
+ where_clause=where_clause)
status, result = conn.execute_dict(sql)
if not status:
@@ -402,7 +402,7 @@ class PGChildNodeView(NodeView):
where_clause = where
query = render_template("/".join([sql_path, 'dependents.sql']),
- fetch_dependents=True, where_clause=where_clause)
+ where_clause=where_clause)
# fetch the dependency for the selected object
dependents = self.__fetch_dependency(conn, query)
diff --git a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
index 223579ee..338e5f71 100644
--- a/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
+++ b/web/pgadmin/feature_tests/copy_selected_query_results_feature_test.py
@@ -1,3 +1,12 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2017, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
import pyperclip
import time
@@ -37,7 +46,7 @@ class CopySelectedQueryResultsFeatureTest(BaseFeatureTest):
self.page.find_by_partial_link_text("Query Tool").click()
self.page.click_tab('Query-1')
time.sleep(5)
- ActionChains(self.page.driver).send_keys("SELECT * FROM test_table").perform()
+ ActionChains(self.page.driver).send_keys("SELECT * FROM test_table ORDER BY some_column").perform()
self.page.driver.switch_to_frame(self.page.driver.find_element_by_tag_name("iframe"))
self.page.find_by_id("btn-flash").click()
diff --git a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
index 8b018fed..17bc7bf5 100644
--- a/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
+++ b/web/pgadmin/feature_tests/xss_checks_pgadmin_debugger_test.py
@@ -16,10 +16,14 @@ class CheckDebuggerForXssFeatureTest(BaseFeatureTest):
"""Tests to check if Debugger is vulnerable to XSS."""
scenarios = [
- ("Test table DDL generation", dict())
+ ("Tests to check if Debugger is vulnerable to XSS", dict())
]
def before(self):
+ with test_utils.Database(self.server) as (connection, _):
+ if connection.server_version < 90100:
+ self.skipTest("Functions tree node is not present in pgAdmin below PG v9.1")
+
# Some test function is needed for debugger
test_utils.create_debug_function(self.server, "postgres",
"test_function")
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_nodes.py b/web/regression/python_test_utils/sql_template_test_base.py
similarity index 59%
rename from web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_nodes.py
rename to web/regression/python_test_utils/sql_template_test_base.py
index b23bf60a..8009e31e 100644
--- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/tests/test_trigger_nodes.py
+++ b/web/regression/python_test_utils/sql_template_test_base.py
@@ -7,45 +7,53 @@
#
##########################################################################
-import os
-import sys
-
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils
from pgadmin.utils.driver import DriverRegistry
-from regression.python_test_utils.template_helper import file_as_template
DriverRegistry.load_drivers()
-from pgadmin.utils.route import BaseTestGenerator
-from regression.python_test_utils import test_utils
-if sys.version_info[0] >= 3:
- long = int
+class SQLTemplateTestBase(BaseTestGenerator):
+ scenarios = [
+ ("parent test class", dict(ignore_test=True))
+ ]
+
+ def __init__(self):
+ super(SQLTemplateTestBase, self).__init__()
+ self.database_name = -1
+ self.versions_to_test = -1
+
+ def test_setup(self, connection, cursor):
+ pass
+
+ def generate_sql(self, version):
+ pass
+
+ def assertions(self, fetch_result, descriptions):
+ pass
-class TestTriggerNodes(BaseTestGenerator):
def runTest(self):
- """ When there are no triggers, it returns an empty result """
+ if hasattr(self, "ignore_test"):
+ return
+
with test_utils.Database(self.server) as (connection, database_name):
test_utils.create_table(self.server, database_name, "test_table")
-
- cursor = connection.cursor()
- cursor.execute("SELECT pg_class.oid AS table_id "
- "FROM pg_class "
- "WHERE pg_class.relname='test_table'")
- table_id = cursor.fetchone()[0]
+ self.database_name = database_name
if connection.server_version < 90100:
self.versions_to_test = ['default']
else:
self.versions_to_test = ['9.1_plus']
- for version in self.versions_to_test:
- template_file = os.path.join(os.path.dirname(__file__), "..", version, "nodes.sql")
-
- template = file_as_template(template_file)
+ cursor = connection.cursor()
+ self.test_setup(connection, cursor)
- sql = template.render(tid=table_id)
+ for version in self.versions_to_test:
+ sql = self.generate_sql(version)
cursor = connection.cursor()
cursor.execute(sql)
fetch_result = cursor.fetchall()
- self.assertEqual(0, len(fetch_result))
+
+ self.assertions(fetch_result, cursor.description)
--
2.12.0
view thread (27+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected], [email protected], [email protected]
Subject: Re: [patch] Dependents and Dependencies in GreenPlum
In-Reply-To: <CAE+jja=i5QXtYY3qj_m4Zv-APP3qnY4rrK_tv6VBFHusetWOUA@mail.gmail.com>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox