public inbox for [email protected]  
help / color / mirror / Atom feed
[pgAdmin] [patch] RM5319 [Code Coverage] Improve API test cases for Server module
4+ messages / 2 participants
[nested] [flat]

* [pgAdmin] [patch] RM5319 [Code Coverage] Improve API test cases for Server module
@ 2021-03-16 06:21  Rahul Shirsat <[email protected]>
  0 siblings, 1 reply; 4+ messages in thread

From: Rahul Shirsat @ 2021-03-16 06:21 UTC (permalink / raw)
  To: pgadmin-hackers

Hi Hackers,

Please find the patch for code coverage to improve test cases for server
modules.

Also a minor issue of server creation when created along with Advanced Tab
setting passfile keeping auto connect disable is fixed along with this
patch.

-- 
*Rahul Shirsat*
Senior Software Engineer | EnterpriseDB Corporation.


Attachments:

  [application/octet-stream] RM5319.patch (6.5K, 3-RM5319.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py
index 13a7e06b9..28f0c6f29 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -1069,7 +1069,8 @@ class ServerNode(PGChildNodeView):
                 tunnel_username=data.get('tunnel_username', None),
                 tunnel_authentication=data.get('tunnel_authentication', 0),
                 tunnel_identity_file=data.get('tunnel_identity_file', None),
-                shared=data.get('shared', None)
+                shared=data.get('shared', None),
+                passfile=data.get('passfile', None)
             )
             db.session.add(server)
             db.session.commit()
diff --git a/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json b/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json
index 855fba055..08174dc60 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json
+++ b/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json
@@ -186,6 +186,56 @@
       "expected_data": {
         "status_code": 200
       }
+    },
+    {
+      "name": "Add server with ssl",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "sslcert": "postgres.crt",
+        "sslkey": "postgres.key",
+        "sslrootcert": "root.crt",
+        "sslmode": "prefer",
+        "sslcompression": true,
+        "sslcrl": "postgres.crl"
+
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Add server with advanced properties",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "passfile": "test.pgpass",
+        "hostaddr": "127.0.0.1"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Add server with background/foreground color",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "fgcolor":"#FF9900",
+        "bgcolor": "#00FF00"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
     }
   ],
   "is_password_saved": [
@@ -687,6 +737,89 @@
       "expected_data": {
         "status_code": 200
       }
+    },
+    {
+      "name": "update ssl properties of server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "sslcert": "postgres_01.crt",
+        "sslkey": "postgres_01.key",
+        "sslrootcert": "root_01.crt",
+        "sslmode": "allow",
+        "sslcompression": false,
+        "sslcrl": "postgres.crl"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "update advanced properties of server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "passfile": "test_01.pgpass",
+        "hostaddr": "127.0.0.1"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "remove ssl properties from server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "sslcert": "",
+        "sslkey": "",
+        "sslrootcert": "",
+        "sslmode": "prefer",
+        "sslcompression": false,
+        "sslcrl": ""
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "remove advanced properties from server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "passfile": "",
+        "hostaddr": ""
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Update server with background/foreground color",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "fgcolor":"#B6D7A8",
+        "bgcolor": "#0C343D"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
     }
   ],
   "update_shared_server": [
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py b/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py
index ee6bf9f92..6f6165e37 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py
@@ -62,6 +62,30 @@ class AddServerTest(BaseTestGenerator):
             self.server['connect_now'] = self.test_data['connect_now']
             self.server['password'] = self.server['db_password']
 
+        # SSL properties
+        if 'sslcert' in self.test_data:
+            self.server['sslcert'] = self.test_data['sslcert']
+        if 'sslkey' in self.test_data:
+            self.server['sslkey'] = self.test_data['sslkey']
+        if 'sslrootcert' in self.test_data:
+            self.server['sslrootcert'] = self.test_data['sslrootcert']
+        if 'sslmode' in self.test_data:
+            self.server['sslmode'] = self.test_data['sslmode']
+        if 'sslcompression' in self.test_data:
+            self.server['sslcompression'] = self.test_data['sslcompression']
+
+        # Advanced tab properties
+        if 'passfile' in self.test_data:
+            self.server['passfile'] = self.test_data['passfile']
+        if 'hostaddr' in self.test_data:
+            self.server['hostaddr'] = self.test_data['hostaddr']
+
+        # Background/Foreground color
+        if 'fgcolor' in self.test_data:
+            self.server['fgcolor'] = self.test_data['fgcolor']
+        if 'bgcolor' in self.test_data:
+            self.server['bgcolor'] = self.test_data['bgcolor']
+
         if self.is_positive_test:
             if hasattr(self, 'with_save'):
                 self.server['save_password'] = self.with_save


^ permalink  raw  reply  [nested|flat] 4+ messages in thread

* Re: [pgAdmin] [patch] RM5319 [Code Coverage] Improve API test cases for Server module
@ 2021-03-17 07:26  Akshay Joshi <[email protected]>
  parent: Rahul Shirsat <[email protected]>
  0 siblings, 1 reply; 4+ messages in thread

From: Akshay Joshi @ 2021-03-17 07:26 UTC (permalink / raw)
  To: Rahul Shirsat <[email protected]>; +Cc: pgadmin-hackers

Hi Rahul

No improvement in the coverage after applying your patch. Attached is the
HTML file to show which function/code not covered.
Please try to cover those functions/codes if possible and then send the
patch.

On Tue, Mar 16, 2021 at 11:51 AM Rahul Shirsat <
[email protected]> wrote:

> Hi Hackers,
>
> Please find the patch for code coverage to improve test cases for server
> modules.
>
> Also a minor issue of server creation when created along with Advanced Tab
> setting passfile keeping auto connect disable is fixed along with this
> patch.
>
> --
> *Rahul Shirsat*
> Senior Software Engineer | EnterpriseDB Corporation.
>


-- 
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*

*Mobile: +91 976-788-8246*


Attachments:

  [text/html] _Users_akshayjoshi_Developement_pgAdmin4_web_pgadmin_browser_server_groups_servers___init___py.html (537.4K, 3-_Users_akshayjoshi_Developement_pgAdmin4_web_pgadmin_browser_server_groups_servers___init___py.html)
  download

^ permalink  raw  reply  [nested|flat] 4+ messages in thread

* Re: [pgAdmin] [patch] RM5319 [Code Coverage] Improve API test cases for Server module
@ 2021-03-24 09:43  Rahul Shirsat <[email protected]>
  parent: Akshay Joshi <[email protected]>
  0 siblings, 1 reply; 4+ messages in thread

From: Rahul Shirsat @ 2021-03-24 09:43 UTC (permalink / raw)
  To: Akshay Joshi <[email protected]>; +Cc: pgadmin-hackers

Hi Akshay,

Please find the updated patch which covers 75% of code coverage for Server
mode & 68% for Desktop mode.

On Wed, Mar 17, 2021 at 12:56 PM Akshay Joshi <[email protected]>
wrote:

> Hi Rahul
>
> No improvement in the coverage after applying your patch. Attached is the
> HTML file to show which function/code not covered.
> Please try to cover those functions/codes if possible and then send the
> patch.
>
> On Tue, Mar 16, 2021 at 11:51 AM Rahul Shirsat <
> [email protected]> wrote:
>
>> Hi Hackers,
>>
>> Please find the patch for code coverage to improve test cases for server
>> modules.
>>
>> Also a minor issue of server creation when created along with Advanced
>> Tab setting passfile keeping auto connect disable is fixed along with this
>> patch.
>>
>> --
>> *Rahul Shirsat*
>> Senior Software Engineer | EnterpriseDB Corporation.
>>
>
>
> --
> *Thanks & Regards*
> *Akshay Joshi*
> *pgAdmin Hacker | Principal Software Architect*
> *EDB Postgres <http://edbpostgres.com>*
>
> *Mobile: +91 976-788-8246*
>


-- 
*Rahul Shirsat*
Senior Software Engineer | EnterpriseDB Corporation.


Attachments:

  [application/octet-stream] RM5319_v2.patch (38.4K, 3-RM5319_v2.patch)
  download | inline diff:
diff --git a/web/pgadmin/browser/server_groups/servers/__init__.py b/web/pgadmin/browser/server_groups/servers/__init__.py
index 13a7e06b9..bc0bd4611 100644
--- a/web/pgadmin/browser/server_groups/servers/__init__.py
+++ b/web/pgadmin/browser/server_groups/servers/__init__.py
@@ -1069,7 +1069,8 @@ class ServerNode(PGChildNodeView):
                 tunnel_username=data.get('tunnel_username', None),
                 tunnel_authentication=data.get('tunnel_authentication', 0),
                 tunnel_identity_file=data.get('tunnel_identity_file', None),
-                shared=data.get('shared', None)
+                shared=data.get('shared', None),
+                passfile=data.get('passfile', None)
             )
             db.session.add(server)
             db.session.commit()
@@ -1572,7 +1573,11 @@ class ServerNode(PGChildNodeView):
             sid: Server id
         """
         try:
-            data = json.loads(request.form['data'], encoding='utf-8')
+            if request.form and request.form['data']:
+                data = json.loads(request.form['data'], encoding='utf-8')
+            else:
+                data = json.loads(request.data, encoding='utf-8')
+
             crypt_key = get_crypt_key()[1]
 
             # Fetch Server Details
diff --git a/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json b/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json
index 855fba055..9a1262d34 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json
+++ b/web/pgadmin/browser/server_groups/servers/tests/servers_test_data.json
@@ -186,6 +186,56 @@
       "expected_data": {
         "status_code": 200
       }
+    },
+    {
+      "name": "Add server with ssl",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "sslcert": "postgres.crt",
+        "sslkey": "postgres.key",
+        "sslrootcert": "root.crt",
+        "sslmode": "prefer",
+        "sslcompression": true,
+        "sslcrl": "postgres.crl"
+
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Add server with advanced properties",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "passfile": "test.pgpass",
+        "hostaddr": "127.0.0.1"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Add server with background/foreground color",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "fgcolor":"#FF9900",
+        "bgcolor": "#00FF00"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
     }
   ],
   "is_password_saved": [
@@ -422,6 +472,56 @@
         "status_code": 200
       }
     },
+    {
+      "name": "connect to a server using password (invalid user)",
+      "url": "/browser/server/connect/",
+      "is_positive_test": true,
+      "connect": true,
+      "invalid_user": true,
+      "mocking_required": true,
+      "mock_data": {
+        "function_name": "pgadmin.browser.server_groups.servers.User",
+        "return_value": "None"
+      },
+      "expected_data": {
+        "status_code": 401
+      }
+    },
+    {
+      "name": "connect to a server using password (invalid server username)",
+      "url": "/browser/server/connect/",
+      "is_positive_test": true,
+      "connect": true,
+      "invalid_server_username": true,
+      "mocking_required": true,
+      "mock_data": {
+        "id": 1,
+        "name": "test_mock_server",
+        "username": "None",
+        "shared": true,
+        "service": false,
+        "user_id": "",
+        "function_name": "pgadmin.browser.server_groups.servers.Server",
+        "return_value": "None"
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Fail check recovery state on connected server",
+      "url": "/browser/server/connect/",
+      "is_positive_test": true,
+      "mocking_required": false,
+      "recovery_state": true,
+      "mock_data": {
+        "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_dict",
+        "return_value": "(False, 'Mocked Internal Server Error while get recovery_state for server.')"
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    },
     {
       "name": "Disconnect server test",
       "url": "/browser/server/connect/",
@@ -470,6 +570,152 @@
       }
     }
   ],
+  "connect_ssh_mock": [
+    {
+      "name": "Try to connect server using ssh tunnel password",
+      "url": "/browser/server/connect/",
+      "is_positive_test": true,
+      "connect": true,
+      "ssh_tunnel_connect": true,
+      "mocking_required": false,
+      "mock_data": {
+        "id": 1,
+        "name": "test_mock_server",
+        "username": "postgre1",
+        "use_ssh_tunnel": 1,
+        "tunnel_host": "127.0.0.1",
+        "tunnel_port": 22,
+        "tunnel_username": "user",
+        "tunnel_authentication": 1,
+        "tunnel_password": "user123",
+        "tunnel_identity_file": "pkey_rsa",
+        "service": null,
+        "server_info": {
+          "id": 1,
+          "name": "test_mock_server",
+          "username": "postgres",
+          "passfile": false
+        },
+        "user_info": {
+          "id": 1,
+          "username": "postgres",
+          "password": "1234"
+        },
+        "manager": {
+          "server_type": "pg",
+          "password": "my_postgres",
+          "sversion": 100000,
+          "connection_connect_return_value": "psycopg2.OperationalError()"
+        }
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Try to connect server without ssh tunnel password",
+      "url": "/browser/server/connect/",
+      "is_positive_test": true,
+      "connect": true,
+      "ssh_tunnel_connect": true,
+      "mocking_required": false,
+      "mock_data": {
+        "id": 1,
+        "name": "test_mock_server",
+        "username": "postgre1",
+        "use_ssh_tunnel": 1,
+        "tunnel_host": "127.0.0.1",
+        "tunnel_port": 22,
+        "tunnel_username": "user",
+        "tunnel_authentication": 1,
+        "tunnel_password": "",
+        "tunnel_identity_file": "pkey_rsa",
+        "service": null,
+        "server_info": {
+          "id": 1,
+          "name": "test_mock_server",
+          "username": "postgres",
+          "passfile": false
+        },
+        "user_info": {
+          "id": 1,
+          "username": "postgres",
+          "password": "1234"
+        },
+        "manager": {
+          "server_type": "pg",
+          "password": "my_postgres",
+          "sversion": 100000,
+          "connection_connect_return_value": "OperationalError()"
+        }
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    }
+  ],
+  "wal_replay_server": [
+    {
+      "name": "Pause the wal replay recovery control",
+      "url": "/browser/server/wal_replay/",
+      "is_positive_test": true,
+      "mocking_required": true,
+      "pause": true,
+      "mock_data": {
+        "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+        "return_value": "(True, {'rows': []})"
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Resume the wal replay recovery control",
+      "url": "/browser/server/wal_replay/",
+      "is_positive_test": true,
+      "mocking_required": true,
+      "pause": false,
+      "mock_data": {
+        "function_name": "pgadmin.utils.driver.psycopg2.connection.Connection.execute_scalar",
+        "return_value": "(True, {'rows': []})"
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Error while wal replay pause",
+      "url": "/browser/server/wal_replay/",
+      "is_positive_test": false,
+      "pause": true,
+      "test_data": {
+        "comment": "PLACE_HOLDER",
+        "id": "PLACE_HOLDER",
+        "is_password_saved": false
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 500
+      }
+    },
+    {
+      "name": "Error while wal replay resume",
+      "url": "/browser/server/wal_replay/",
+      "is_positive_test": false,
+      "pause": false,
+      "test_data": {
+        "comment": "PLACE_HOLDER",
+        "id": "PLACE_HOLDER",
+        "is_password_saved": false
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 500
+      }
+    }
+  ],
   "delete_server": [
     {
       "name": "Delete a server URL",
@@ -624,21 +870,6 @@
         "status_code": 200
       }
     },
-    {
-      "name": "wal replay",
-      "url": "/browser/server/wal_replay/",
-      "is_positive_test": true,
-      "test_data": {
-        "comment": "PLACE_HOLDER",
-        "id": "PLACE_HOLDER",
-        "is_password_saved": false
-      },
-      "mocking_required": false,
-      "mock_data": {},
-      "expected_data": {
-        "status_code": 410
-      }
-    },
     {
       "name": "Clear ssh tunnel password",
       "url": "/browser/server/clear_sshtunnel_password/",
@@ -687,6 +918,89 @@
       "expected_data": {
         "status_code": 200
       }
+    },
+    {
+      "name": "update ssl properties of server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "sslcert": "postgres_01.crt",
+        "sslkey": "postgres_01.key",
+        "sslrootcert": "root_01.crt",
+        "sslmode": "allow",
+        "sslcompression": false,
+        "sslcrl": "postgres.crl"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "update advanced properties of server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "passfile": "test_01.pgpass",
+        "hostaddr": "127.0.0.1"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "remove ssl properties from server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "sslcert": "",
+        "sslkey": "",
+        "sslrootcert": "",
+        "sslmode": "prefer",
+        "sslcompression": false,
+        "sslcrl": ""
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "remove advanced properties from server",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "passfile": "",
+        "hostaddr": ""
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
+    },
+    {
+      "name": "Update server with background/foreground color",
+      "url": "/browser/server/obj/",
+      "is_positive_test": true,
+      "owner_server": true,
+      "test_data": {
+        "fgcolor":"#B6D7A8",
+        "bgcolor": "#0C343D"
+      },
+      "mocking_required": false,
+      "mock_data": {},
+      "expected_data": {
+        "status_code": 200
+      }
     }
   ],
   "update_shared_server": [
@@ -858,5 +1172,45 @@
         "status_code": 200
       }
     }
+  ],
+  "change_password": [
+    {
+      "name": "Change password",
+      "url": "/browser/server/change_password/",
+      "is_positive_test": true,
+      "mocking_required": true,
+      "mock_data": {
+        "server_info": {
+          "sid": 1,
+          "name": "test_mock_server",
+          "username": "postgres",
+          "password": "post123",
+          "passfile": false
+        },
+        "user_info": {
+          "id": 1,
+          "username": "postgres",
+          "password": "1234"
+        },
+        "manager": {
+          "server_type": "pg",
+          "password": "my_postgres",
+          "sversion": 100000,
+          "connection_execute_scalar_return_value": "(True, {'rows': []})"
+        }
+      },
+      "test_data": {
+        "form_data" : {
+          "user_name": "my_postgres",
+          "password": "my_postgres",
+          "newPassword": "my_postgres1",
+          "confirmPassword": "my_postgres1"
+        }
+      },
+      "expected_data": {
+        "status_code": 200,
+        "update_session": true
+      }
+    }
   ]
 }
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py b/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py
index ee6bf9f92..6f6165e37 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_add_server.py
@@ -62,6 +62,30 @@ class AddServerTest(BaseTestGenerator):
             self.server['connect_now'] = self.test_data['connect_now']
             self.server['password'] = self.server['db_password']
 
+        # SSL properties
+        if 'sslcert' in self.test_data:
+            self.server['sslcert'] = self.test_data['sslcert']
+        if 'sslkey' in self.test_data:
+            self.server['sslkey'] = self.test_data['sslkey']
+        if 'sslrootcert' in self.test_data:
+            self.server['sslrootcert'] = self.test_data['sslrootcert']
+        if 'sslmode' in self.test_data:
+            self.server['sslmode'] = self.test_data['sslmode']
+        if 'sslcompression' in self.test_data:
+            self.server['sslcompression'] = self.test_data['sslcompression']
+
+        # Advanced tab properties
+        if 'passfile' in self.test_data:
+            self.server['passfile'] = self.test_data['passfile']
+        if 'hostaddr' in self.test_data:
+            self.server['hostaddr'] = self.test_data['hostaddr']
+
+        # Background/Foreground color
+        if 'fgcolor' in self.test_data:
+            self.server['fgcolor'] = self.test_data['fgcolor']
+        if 'bgcolor' in self.test_data:
+            self.server['bgcolor'] = self.test_data['bgcolor']
+
         if self.is_positive_test:
             if hasattr(self, 'with_save'):
                 self.server['save_password'] = self.with_save
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py b/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py
index d1e2ddf66..86485c0c7 100644
--- a/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_check_connect.py
@@ -12,6 +12,7 @@ from regression import parent_node_dict
 from regression.python_test_utils import test_utils as utils
 from . import utils as servers_utils
 import json
+from unittest.mock import patch, MagicMock
 
 
 class ServersConnectTestCase(BaseTestGenerator):
@@ -25,18 +26,18 @@ class ServersConnectTestCase(BaseTestGenerator):
 
     def get_ssh_tunnel(self):
         print("in_get_ssh")
-        self.server['use_ssh_tunnel'] = 1
-        self.server['tunnel_host'] = '127.0.0.1'
-        self.server['tunnel_port'] = 22
-        self.server['tunnel_username'] = 'user'
-        if self.with_password:
-            self.server['tunnel_authentication'] = 0
+        self.server.use_ssh_tunnel = 1
+        self.server.tunnel_host = '127.0.0.1'
+        self.server.tunnel_port = 22
+        self.server.tunnel_username = 'user'
+        if hasattr(self, 'with_password') and self.with_password:
+            self.server.tunnel_authentication = 0
         else:
-            self.server['tunnel_authentication'] = 1
-            self.server['tunnel_identity_file'] = 'pkey_rsa'
+            self.server.tunnel_authentication = 1
+            self.server.tunnel_identity_file = 'pkey_rsa'
 
-        if self.save_password:
-            self.server['tunnel_password'] = '123456'
+        if hasattr(self, 'save_password') and self.save_password:
+            self.server.tunnel_password = '123456'
 
     def setUp(self):
         """This function add the server to test the GET API"""
@@ -84,7 +85,49 @@ class ServersConnectTestCase(BaseTestGenerator):
                     utils.SERVER_GROUP,
                     self.server_id)
                 self.server['password'] = self.server['db_password']
-                response = self.connect_to_server(url)
+
+                if self.mocking_required:
+                    if hasattr(self, "invalid_user"):
+                        with patch(self.mock_data['function_name'],
+                                   side_effect=[eval(self.mock_data[
+                                       "return_value"])]) as user_mock:
+
+                            user_mock_result = user_mock.query.filter_by.\
+                                return_value
+                            user_mock_result.first.return_value = None
+                            response = self.connect_to_server(url)
+
+                    elif hasattr(self, "invalid_server_username"):
+                        with patch(self.mock_data['function_name'],
+                                   side_effect=[eval(self.mock_data[
+                                       "return_value"])]) as server_mock:
+
+                            class TestMockServer():
+                                def __init__(self, name, id, username, shared,
+                                             service):
+                                    self.name = name
+                                    self.id = id
+                                    self.username = username
+                                    self.shared = shared
+                                    self.service = service
+                                    self.user_id = id
+
+                            mock_server_obj = TestMockServer(
+                                self.mock_data['name'],
+                                self.mock_data['id'],
+                                eval(self.mock_data['username']),
+                                self.mock_data['shared'],
+                                self.mock_data['service']
+                            )
+
+                            server_mock_result = server_mock.query.filter_by.\
+                                return_value
+                            server_mock_result.first.return_value = \
+                                mock_server_obj
+
+                            response = self.connect_to_server(url)
+                else:
+                    response = self.connect_to_server(url)
             elif hasattr(self, 'restore_point') or hasattr(self,
                                                            'change_password'):
                 connect_url = '/browser/server/connect/{0}/{1}'.format(
@@ -96,6 +139,29 @@ class ServersConnectTestCase(BaseTestGenerator):
 
                 self.connect_to_server(connect_url)
                 response = self.add_server_details(url)
+            elif hasattr(self, "recovery_state") and self.recovery_state:
+                with patch('pgadmin.browser.server_groups.'
+                           'servers.get_driver') as get_driver_mock:
+
+                    self.manager = MagicMock()
+                    get_driver_mock.return_value = MagicMock(
+                        connection_manager=MagicMock(
+                            execute_dict=MagicMock(
+                                return_value=self.manager.connection),
+                            return_value=self.manager)
+                    )
+                    self.manager.version = 10
+
+                    connection_mock_result = \
+                        self.manager.connection.return_value
+                    self.manager.connection.connected.side_effect = True
+
+                    connection_mock_result.execute_dict.side_effect = \
+                        [eval(self.mock_data["return_value"])]
+
+                    response = self.get_server_connection(server_id)
+                    self.assertEquals(response.status_code,
+                                      self.expected_data["status_code"])
             else:
                 response = self.get_server_connection(server_id)
 
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_check_recovery_code.py b/web/pgadmin/browser/server_groups/servers/tests/test_check_recovery_code.py
new file mode 100644
index 000000000..1583ca15f
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_check_recovery_code.py
@@ -0,0 +1,63 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2021, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as servers_utils
+from regression import parent_node_dict
+from unittest.mock import patch
+import json
+
+
+class CheckRecoveryCodeTestCase(BaseTestGenerator):
+    """
+    This class will try to test cover the wal_reply code.
+    """
+
+    scenarios = utils.generate_scenarios('wal_replay_server',
+                                         servers_utils.test_cases)
+
+    def resume_wal_replay(self):
+        return self.tester.put(
+            self.url + str(utils.SERVER_GROUP) + '/' + str(self.server_id))
+
+    def pause_wal_replay(self):
+        return self.tester.delete(
+            self.url + str(utils.SERVER_GROUP) + '/' + str(self.server_id))
+
+    def runTest(self):
+
+        server_id = parent_node_dict["server"][-1]["server_id"]
+        if not server_id:
+            raise Exception("Server not found to test GET API")
+
+        if self.mocking_required:
+
+            with patch(self.mock_data['function_name'],
+                       side_effect=[eval(self.mock_data['return_value'])]):
+                response = self.run_test_cases()
+
+                res = json.loads(response.data.decode('utf-8'))
+                self.assertEqual(res['data']['in_recovery'], True)
+                self.assertEqual(res['data']['wal_pause'], self.pause)
+                self.assertEquals(response.status_code,
+                                  self.expected_data["status_code"])
+        else:
+            response = self.run_test_cases()
+            self.assertEquals(response.status_code,
+                              self.expected_data["status_code"])
+
+    def run_test_cases(self):
+
+        if hasattr(self, 'pause') and self.pause:
+            response = self.pause_wal_replay()
+        else:
+            response = self.resume_wal_replay()
+
+        return response
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_check_ssh_mock_connect.py b/web/pgadmin/browser/server_groups/servers/tests/test_check_ssh_mock_connect.py
new file mode 100644
index 000000000..4bed4d357
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_check_ssh_mock_connect.py
@@ -0,0 +1,99 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2021, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as servers_utils
+from unittest.mock import patch, MagicMock
+import json
+from psycopg2 import OperationalError
+
+
+class ServersSSHConnectTestCase(BaseTestGenerator):
+    """
+    This class will try to mock connect server with ssh credentials.
+    """
+
+    scenarios = utils.generate_scenarios('connect_ssh_mock',
+                                         servers_utils.test_cases)
+
+    def connect_to_server(self, url, server):
+        return self.tester.post(
+            url,
+            data=json.dumps(server),
+            content_type='html/json'
+        )
+
+    @patch('pgadmin.browser.server_groups.servers.get_driver')
+    @patch('pgadmin.browser.server_groups.servers.Server')
+    def runTest(self, server_mock, get_driver_mock):
+
+        if self.mock_data is not None and \
+                self.mock_data['use_ssh_tunnel'] == 1:
+
+            self.manager = MagicMock()
+            get_driver_mock.return_value = MagicMock(
+                connection_manager=MagicMock(
+                    execute_scalar=MagicMock(
+                        return_value=self.manager.connection),
+                    return_value=self.manager)
+            )
+            self.manager.password = self.mock_data['manager']['password']
+            self.manager.server_type = self.mock_data['manager']['server_type']
+            self.manager.sversion = self.mock_data['manager']['sversion']
+
+            self.manager.connection().connect.side_effect = \
+                MagicMock(side_effect=OperationalError())
+
+            url = self.url + '{0}/{1}'.format(utils.SERVER_GROUP, 1)
+
+            class TestMockServer():
+                def __init__(self, name, id, username, use_ssh_tunnel,
+                             tunnel_host, tunnel_port,
+                             tunnel_username, tunnel_authentication,
+                             tunnel_identity_file, tunnel_password, service):
+                    self.name = name
+                    self.id = id
+                    self.username = username
+
+                    self.use_ssh_tunnel = use_ssh_tunnel
+                    self.tunnel_host = tunnel_host
+                    self.tunnel_port = tunnel_port
+                    self.tunnel_username = tunnel_username
+                    self.tunnel_authentication = \
+                        tunnel_authentication
+                    self.tunnel_identity_file = \
+                        tunnel_identity_file
+                    self.tunnel_password = tunnel_password
+                    self.service = service
+                    self.shared = None
+
+            mock_server_obj = TestMockServer(
+                self.mock_data['name'],
+                self.mock_data['id'],
+                self.mock_data['username'],
+                self.mock_data['use_ssh_tunnel'],
+                self.mock_data['tunnel_host'],
+                self.mock_data['tunnel_port'],
+                self.mock_data['tunnel_username'],
+                self.mock_data['tunnel_authentication'],
+                self.mock_data['tunnel_identity_file'],
+                self.mock_data['tunnel_password'],
+                self.mock_data['service'],
+            )
+
+            server_mock_result = server_mock.query.filter_by.return_value
+            server_mock_result.first.return_value = mock_server_obj
+
+            if self.mock_data['tunnel_password'] == '':
+                del self.server['tunnel_password']
+
+            response = self.connect_to_server(url, self.server)
+
+            self.assertEqual(response.status_code, 500)
diff --git a/web/pgadmin/browser/server_groups/servers/tests/test_password_change.py b/web/pgadmin/browser/server_groups/servers/tests/test_password_change.py
new file mode 100644
index 000000000..f5ff7d14d
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/servers/tests/test_password_change.py
@@ -0,0 +1,104 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2021, 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 servers_utils
+from unittest.mock import patch, MagicMock
+
+
+class DBPasswordChange(BaseTestGenerator):
+    """ This class will test the change password functionality. """
+
+    scenarios = utils.generate_scenarios('change_password',
+                                         servers_utils.test_cases)
+
+    def setUp(self):
+        self.server_id = utils.create_server(self.server)
+        server_dict = {"server_id": self.server_id}
+        utils.write_node_info("sid", server_dict)
+
+    @patch('pgadmin.browser.server_groups.servers.render_template')
+    @patch('pgadmin.browser.server_groups.servers.pqencryptpassword')
+    @patch('pgadmin.browser.server_groups.servers.decrypt')
+    @patch('pgadmin.browser.server_groups.servers.get_driver')
+    @patch('pgadmin.browser.server_groups.servers.db')
+    @patch('pgadmin.browser.server_groups.servers.Server')
+    @patch('pgadmin.browser.server_groups.servers.User')
+    @patch('pgadmin.browser.server_groups.servers.current_user')
+    def runTest(self, current_user_mock, user_mock, server_mock, db_mock,
+                get_driver_mock, decrypt_mock, pqencryptpassword_mock,
+                render_template_mock):
+
+        current_user_mock.id = 1
+
+        self.manager = MagicMock()
+        get_driver_mock.return_value = MagicMock(
+            connection_manager=MagicMock(execute_scalar=MagicMock(
+                return_value=self.manager.connection),
+                return_value=self.manager)
+        )
+        self.manager.password = self.mock_data['manager']['password']
+        self.manager.server_type = self.mock_data['manager']['server_type']
+        self.manager.sversion = self.mock_data['manager']['sversion']
+        self.manager.connection().execute_scalar.return_value = \
+            eval(self.mock_data['manager']
+                 ['connection_execute_scalar_return_value'])
+
+        decrypt_mock.return_value = self.manager.password
+        pqencryptpassword_mock.return_value = self.manager.password
+
+        class TestMockServer():
+            def __init__(self, name, sid, password, passfile):
+                self.name = name
+                self.sid = sid
+                self.password = password
+                self.passfile = passfile
+
+        class TestUser():
+            def __init__(self, id, username, password):
+                self.id = id
+                self.username = username
+                self.password = password
+
+        db_mock.session.commit = MagicMock(return_value=True)
+
+        mock_server_obj = TestMockServer(
+            self.mock_data['server_info']['username'],
+            self.mock_data['server_info']['sid'],
+            self.mock_data['server_info']['password'],
+            self.mock_data['server_info']['passfile']
+        )
+        server_mock_result = server_mock.query.filter_by.return_value
+        server_mock_result.first.return_value = mock_server_obj
+
+        mock_user_obj = TestUser(self.mock_data['user_info']['id'],
+                                 self.mock_data['user_info']['username'],
+                                 self.mock_data['user_info']['password'])
+
+        user_mock_result = user_mock.query.filter_by.return_value
+        user_mock_result.first.return_value = mock_user_obj
+
+        """This function will execute the connect server APIs"""
+        response = self.tester.post(
+            self.url + str(1) + '/' + str(mock_server_obj.sid),
+            data=json.dumps(self.test_data['form_data']),
+            follow_redirects=True
+        )
+
+        self.assertEqual(response.status_code,
+                         self.expected_data['status_code'])
+
+        self.assertEquals(render_template_mock.called, True)
+        self.assertEquals(self.manager.update_session.called,
+                          self.expected_data['update_session'])
+        self.assertEqual(
+            self.manager.connection().pq_encrypt_password_conn.called, True)
diff --git a/web/pgadmin/browser/server_groups/tests/servers_group_test_data.json b/web/pgadmin/browser/server_groups/tests/servers_group_test_data.json
new file mode 100644
index 000000000..f0c35b7fb
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/servers_group_test_data.json
@@ -0,0 +1,45 @@
+{
+  "get_server_group_children": [
+    {
+      "name": "Get the all children of server group",
+      "url": "/browser/server_group/children/",
+      "is_positive_test": true,
+      "children": true,
+      "mocking_required": true,
+      "mock_data": {
+        "id": 1,
+        "name": "test_mock_server",
+        "username": "postgre1",
+        "use_ssh_tunnel": 1,
+        "tunnel_host": "127.0.0.1",
+        "tunnel_port": 22,
+        "tunnel_username": "user",
+        "tunnel_authentication": 1,
+        "tunnel_password": "user123",
+        "tunnel_identity_file": "pkey_rsa",
+        "service": null,
+        "fgcolor":"#B6D7A8",
+        "bgcolor": "#0C343D",
+        "servergroup_id": 5,
+        "server_owner": "admin"
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    }
+  ],
+  "get_server_group": [
+    {
+      "name": "Check Server Group Node",
+      "url": "/browser/server_group/obj/",
+      "is_positive_test": true,
+      "children": true,
+      "mocking_required": false,
+      "mock_data": {
+      },
+      "expected_data": {
+        "status_code": 200
+      }
+    }
+  ]
+}
diff --git a/web/pgadmin/browser/server_groups/tests/test_servers_groups_childrens.py b/web/pgadmin/browser/server_groups/tests/test_servers_groups_childrens.py
new file mode 100644
index 000000000..4f4d439c6
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/test_servers_groups_childrens.py
@@ -0,0 +1,84 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2021, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+from pgadmin.utils.route import BaseTestGenerator
+from regression.python_test_utils import test_utils as utils
+from . import utils as cast_utils
+from regression.test_setup import config_data
+import json
+import config
+from unittest.mock import patch
+from regression.python_test_utils.test_utils import \
+    create_user_wise_test_client
+
+test_user_details = None
+if config.SERVER_MODE:
+    test_user_details = config_data['pgAdmin4_test_non_admin_credentials']
+
+
+class ServerGroupsChildren(BaseTestGenerator):
+    """
+    This class will fetch all children of server group by response code.
+    """
+
+    scenarios = utils.generate_scenarios('get_server_group_children',
+                                         cast_utils.test_cases)
+
+    def get_server(self, server_id):
+        return self.tester.get(self.url + str(utils.SERVER_GROUP) + '/' +
+                               str(server_id),
+                               follow_redirects=True)
+
+    def setUp(self):
+
+        if config.SERVER_MODE is True:
+            self.server['shared'] = True
+            url = "/browser/server/obj/{0}/".format(utils.SERVER_GROUP)
+            response = self.tester.post(
+                url,
+                data=json.dumps(self.server),
+                content_type='html/json'
+            )
+            response_data = json.loads(response.data.decode('utf-8'))
+            self.server_id = response_data['node']['_id']
+
+            server_dict = {"server_id": response_data['node']['_id']}
+            utils.write_node_info("sid", server_dict)
+
+    def runTest(self):
+
+        if config.SERVER_MODE is True:
+            self.testServerGroupsForServerMode()
+        else:
+            self.testServerGroupsForDesktopMode()
+
+    @patch('pgadmin.browser.server_groups.servers.current_user')
+    @create_user_wise_test_client(test_user_details)
+    def testServerGroupsForServerMode(self, current_user_mock):
+
+        current_user_mock.id = 103040
+        self.server_group_id = config_data['server_group']
+
+        response = self.tester.get(self.url + str(self.server_group_id),
+                                   content_type='html/json')
+        self.assertTrue(response.status_code, 200)
+        response_data = json.loads(response.data.decode('utf8'))
+        self.assertTrue(response_data['success'], 1)
+
+    @patch('pgadmin.browser.server_groups.servers.current_user')
+    def testServerGroupsForDesktopMode(self, current_user_mock):
+
+        current_user_mock.id = 1
+        self.server_group_id = config_data['server_group']
+
+        response = self.tester.get(self.url + str(self.server_group_id),
+                                   content_type='html/json')
+        self.assertTrue(response.status_code, 200)
+        response_data = json.loads(response.data.decode('utf8'))
+        self.assertTrue(response_data['success'], 1)
diff --git a/web/pgadmin/browser/server_groups/tests/test_sg_get.py b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
index cdfd3d76e..e5c680133 100644
--- a/web/pgadmin/browser/server_groups/tests/test_sg_get.py
+++ b/web/pgadmin/browser/server_groups/tests/test_sg_get.py
@@ -11,6 +11,8 @@ import json
 
 from pgadmin.utils.route import BaseTestGenerator
 from regression.test_setup import config_data
+from regression.python_test_utils import test_utils as utils
+from . import utils as cast_utils
 
 
 class SgNodeTestCase(BaseTestGenerator):
@@ -18,10 +20,8 @@ class SgNodeTestCase(BaseTestGenerator):
      This class will check available server groups in pgAdmin.
     """
 
-    scenarios = [
-        # Fetching the default url for server group node
-        ('Check Server Group Node', dict(url='/browser/server_group/obj/'))
-    ]
+    scenarios = utils.generate_scenarios('get_server_group',
+                                         cast_utils.test_cases)
 
     def runTest(self):
         """This function will check available server groups."""
diff --git a/web/pgadmin/browser/server_groups/tests/utils.py b/web/pgadmin/browser/server_groups/tests/utils.py
new file mode 100644
index 000000000..1a59cca4c
--- /dev/null
+++ b/web/pgadmin/browser/server_groups/tests/utils.py
@@ -0,0 +1,16 @@
+##########################################################################
+#
+# pgAdmin 4 - PostgreSQL Tools
+#
+# Copyright (C) 2013 - 2021, The pgAdmin Development Team
+# This software is released under the PostgreSQL Licence
+#
+##########################################################################
+
+"""Server Group helper utilities"""
+import os
+import json
+
+CURRENT_PATH = os.path.dirname(os.path.realpath(__file__))
+with open(CURRENT_PATH + "/servers_group_test_data.json") as data_file:
+    test_cases = json.load(data_file)


^ permalink  raw  reply  [nested|flat] 4+ messages in thread

* Re: [pgAdmin] [patch] RM5319 [Code Coverage] Improve API test cases for Server module
@ 2021-03-30 05:46  Akshay Joshi <[email protected]>
  parent: Rahul Shirsat <[email protected]>
  0 siblings, 0 replies; 4+ messages in thread

From: Akshay Joshi @ 2021-03-30 05:46 UTC (permalink / raw)
  To: Rahul Shirsat <[email protected]>; +Cc: pgadmin-hackers

Thanks, patch applied.

On Wed, Mar 24, 2021 at 3:13 PM Rahul Shirsat <
[email protected]> wrote:

> Hi Akshay,
>
> Please find the updated patch which covers 75% of code coverage for Server
> mode & 68% for Desktop mode.
>
> On Wed, Mar 17, 2021 at 12:56 PM Akshay Joshi <
> [email protected]> wrote:
>
>> Hi Rahul
>>
>> No improvement in the coverage after applying your patch. Attached is the
>> HTML file to show which function/code not covered.
>> Please try to cover those functions/codes if possible and then send the
>> patch.
>>
>> On Tue, Mar 16, 2021 at 11:51 AM Rahul Shirsat <
>> [email protected]> wrote:
>>
>>> Hi Hackers,
>>>
>>> Please find the patch for code coverage to improve test cases for server
>>> modules.
>>>
>>> Also a minor issue of server creation when created along with Advanced
>>> Tab setting passfile keeping auto connect disable is fixed along with this
>>> patch.
>>>
>>> --
>>> *Rahul Shirsat*
>>> Senior Software Engineer | EnterpriseDB Corporation.
>>>
>>
>>
>> --
>> *Thanks & Regards*
>> *Akshay Joshi*
>> *pgAdmin Hacker | Principal Software Architect*
>> *EDB Postgres <http://edbpostgres.com>*
>>
>> *Mobile: +91 976-788-8246*
>>
>
>
> --
> *Rahul Shirsat*
> Senior Software Engineer | EnterpriseDB Corporation.
>


-- 
*Thanks & Regards*
*Akshay Joshi*
*pgAdmin Hacker | Principal Software Architect*
*EDB Postgres <http://edbpostgres.com>*

*Mobile: +91 976-788-8246*


^ permalink  raw  reply  [nested|flat] 4+ messages in thread


end of thread, other threads:[~2021-03-30 05:46 UTC | newest]

Thread overview: 4+ messages (download: mbox mbox.gz follow: Atom feed)
-- links below jump to the message on this page --
2021-03-16 06:21 [pgAdmin] [patch] RM5319 [Code Coverage] Improve API test cases for Server module Rahul Shirsat <[email protected]>
2021-03-17 07:26 ` Akshay Joshi <[email protected]>
2021-03-24 09:43   ` Rahul Shirsat <[email protected]>
2021-03-30 05:46     ` 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