From f4f8c739d80b521604ed32546f30820b806efbe6 Mon Sep 17 00:00:00 2001
From: George Gelashvili and Tira Odhner <pair+ggelashvili+aodhner@pivotal.io>
Date: Wed, 8 Feb 2017 13:55:36 -0500
Subject: [PATCH 2/3] [PATCH] Add --exclude parameter for tests

- it can take multiple packages as comma-separated list
---
 web/pgadmin/utils/route.py | 30 +++++++++++++-----------------
 web/regression/README      |  8 ++++++++
 web/regression/runtests.py | 14 ++++++++++++--
 3 files changed, 33 insertions(+), 19 deletions(-)

diff --git a/web/pgadmin/utils/route.py b/web/pgadmin/utils/route.py
index f18d2c18..996892a6 100644
--- a/web/pgadmin/utils/route.py
+++ b/web/pgadmin/utils/route.py
@@ -54,27 +54,23 @@ class TestsGeneratorRegistry(ABCMeta):
         ABCMeta.__init__(cls, name, bases, d)
 
     @classmethod
-    def load_generators(cls, pkg):
+    def load_generators(cls, pkg_root, exclude_pkgs):
 
         cls.registry = dict()
 
+        all_modules = []
+
+        all_modules += find_modules(pkg_root, False, True)
+
         # Check for SERVER mode
-        if config.SERVER_MODE:
-            for module_name in find_modules(pkg, False, True):
-                try:
-                    if "tests." in str(module_name):
-                        import_module(module_name)
-                except ImportError:
-                    traceback.print_exc(file=sys.stderr)
-        else:
-            for module_name in find_modules(pkg, False, True):
-                try:
-                    # Exclude the test cases in browser node if SERVER_MODE
-                    # is False
-                    if "pgadmin.browser.tests" not in module_name:
-                        import_module(module_name)
-                except ImportError:
-                    traceback.print_exc(file=sys.stderr)
+        for module_name in all_modules:
+            try:
+                if "tests." in str(module_name) and not any(
+                        str(module_name).startswith('pgadmin.' + str(exclude_pkg)) for exclude_pkg in exclude_pkgs
+                ):
+                    import_module(module_name)
+            except ImportError:
+                traceback.print_exc(file=sys.stderr)
 
 
 import six
diff --git a/web/regression/README b/web/regression/README
index 278bc9cd..7101eb75 100644
--- a/web/regression/README
+++ b/web/regression/README
@@ -134,3 +134,11 @@ Execution:
 
      Example 2) Run test framework for 'database' node
      run 'python runtests.py --pkg browser.server_groups.servers.databases.tests'
+
+- Exclude a package and its subpackages when running tests:
+
+    Example: exclude acceptance tests but run all others:
+    run 'python runtests.py --exclude acceptance'
+
+    Example: exclude multiple packages:
+    run 'python runtests.py --exclude browser.server_groups.servers.databases,browser.server_groups.servers.tablespaces'
diff --git a/web/regression/runtests.py b/web/regression/runtests.py
index a64c738b..f387b9c2 100644
--- a/web/regression/runtests.py
+++ b/web/regression/runtests.py
@@ -138,12 +138,20 @@ def get_test_modules(arguments):
 
     from pgadmin.utils.route import TestsGeneratorRegistry
 
+    exclude_pkgs = []
+
+    if not config.SERVER_MODE:
+        exclude_pkgs.append("browser.tests")
+    if arguments['exclude'] is not None:
+        exclude_pkgs += arguments['exclude'].split(',')
+
     # Load the test modules which are in given package(i.e. in arguments.pkg)
     if arguments['pkg'] is None or arguments['pkg'] == "all":
-        TestsGeneratorRegistry.load_generators('pgadmin')
+        TestsGeneratorRegistry.load_generators('pgadmin', exclude_pkgs)
     else:
         TestsGeneratorRegistry.load_generators('pgadmin.%s' %
-                                               arguments['pkg'])
+                                               arguments['pkg'],
+                                               exclude_pkgs)
 
     # Sort module list so that test suite executes the test cases sequentially
     module_list = TestsGeneratorRegistry.registry.items()
@@ -164,6 +172,8 @@ def add_arguments():
     parser = argparse.ArgumentParser(description='Test suite for pgAdmin4')
     parser.add_argument('--pkg', help='Executes the test cases of particular'
                                       ' package and subpackages')
+    parser.add_argument('--exclude', help='Skips execution of the test '
+                                          'cases of particular package and sub-packages')
     arg = parser.parse_args()
 
     return arg
-- 
2.11.0

