Skip to content

Commit 47c3cc1

Browse files
Merge pull request #5 from abhinavminhas/dev
PostgreSQL Database
2 parents edee07d + b6f2e44 commit 47c3cc1

File tree

18 files changed

+474
-27
lines changed

18 files changed

+474
-27
lines changed

.github/workflows/build.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
uses: abhinavminhas/replace-tokens@main
3636
with:
3737
files: '${{ github.workspace }}/QueryDB.Core.Tests/App.config'
38-
replacements: '__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }}'
38+
replacements: '__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }}'
3939

4040
- name: Build
4141
run: dotnet build QueryDB.Core.Tests/QueryDB.Core.Tests.csproj --configuration Release
@@ -90,7 +90,7 @@ jobs:
9090
uses: abhinavminhas/replace-tokens@main
9191
with:
9292
files: '${{ github.workspace }}/QueryDB.Core.Tests/App.config'
93-
replacements: '__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }}'
93+
replacements: '__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }}'
9494

9595
- name: Build
9696
run: dotnet build QueryDB.Core.Tests/QueryDB.Core.Tests.csproj --configuration Release

.github/workflows/coverage.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ jobs:
2626
uses: abhinavminhas/replace-tokens@main
2727
with:
2828
files: '${{ github.workspace }}/QueryDB.Core.Tests/App.config'
29-
replacements: '__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }}'
29+
replacements: '__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }},__DB_PASSWORD__=${{ secrets.DB_PASSWORD }}'
3030

3131
- name: Build
3232
run: dotnet build QueryDB.Core.Tests/QueryDB.Core.Tests.csproj --configuration Release

.github/workflows/docker-compose-start-dbs/action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ runs:
1313
uses: abhinavminhas/replace-tokens@main
1414
with:
1515
files: '${{ github.workspace }}/docker-compose.yml'
16-
replacements: '__DB_PASSWORD__=${{ inputs.dbPassword }},__DB_PASSWORD__=${{ inputs.dbPassword }},__DB_PASSWORD__=${{ inputs.dbPassword }}'
16+
replacements: '__DB_PASSWORD__=${{ inputs.dbPassword }},__DB_PASSWORD__=${{ inputs.dbPassword }},__DB_PASSWORD__=${{ inputs.dbPassword }},__DB_PASSWORD__=${{ inputs.dbPassword }}'
1717

1818
- name: Docker Compose (Pull)
1919
shell: bash

.github/workflows/docker-execute-seed-data/action.yml

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,6 @@ runs:
99
using: 'composite'
1010

1111
steps:
12-
- name: Docker Execute (ORACLE - Seed Data)
13-
shell: bash
14-
run: |
15-
docker exec oracle-db bash -c "sqlplus -s sys/$ORACLE_PWD@localhost:1521/XE as sysdba @/home/oracle.sql"
16-
env:
17-
ORACLE_PWD: ${{ inputs.dbPassword }}
18-
1912
- name: Docker Execute (MSSQL - Seed Data)
2013
shell: bash
2114
run: |
@@ -29,3 +22,17 @@ runs:
2922
docker exec mysql-db mysql -uroot -p$MYSQL_PWD -e "source /home/mysql.sql"
3023
env:
3124
MYSQL_PWD: ${{ inputs.dbPassword }}
25+
26+
- name: Docker Execute (ORACLE - Seed Data)
27+
shell: bash
28+
run: |
29+
docker exec oracle-db bash -c "sqlplus -s sys/$ORACLE_PWD@localhost:1521/XE as sysdba @/home/oracle.sql"
30+
env:
31+
ORACLE_PWD: ${{ inputs.dbPassword }}
32+
33+
- name: Docker Execute (POSTGRESQL - Seed Data)
34+
shell: bash
35+
run: |
36+
docker exec postgres-db bash -c "PGPASSWORD=$POSTGRESQL_PWD psql -d postgres -U sys -f /home/postgresql.sql"
37+
env:
38+
POSTGRESQL_PWD: ${{ inputs.dbPassword }}

.github/workflows/docker-inspect-health-check/action.yml

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,30 @@ runs:
1313
shell: pwsh
1414
run: |
1515
# Script (Wait Status -> Healthy)
16-
$oracleHealth=""
1716
$msSQLHealth=""
1817
$mySQLHealth=""
18+
$oracleHealth=""
19+
$postgreSQLHealth=""
1920
$status="healthy"
2021
$allHealthy=$false
2122
$retry=1
2223
do {
23-
$oracleHealth = (docker inspect --format="{{json .State.Health.Status}}" oracle-db).Replace('"', '')
24-
$msSQLHealth = (docker inspect --format="{{json .State.Health.Status}}" mssql-db).Replace('"', '')
25-
$mySQLHealth = (docker inspect --format="{{json .State.Health.Status}}" mysql-db).Replace('"', '')
26-
if (($oracleHealth -ne $status) -or ($msSQLHealth -ne $status) -or ($mySQLHealth -ne $status)) {
27-
Start-Sleep -Seconds 10
28-
$retry ++
29-
} else {
30-
$allHealthy=$true
31-
break
32-
}
24+
$msSQLHealth = (docker inspect --format="{{json .State.Health.Status}}" mssql-db).Replace('"', '')
25+
$mySQLHealth = (docker inspect --format="{{json .State.Health.Status}}" mysql-db).Replace('"', '')
26+
$oracleHealth = (docker inspect --format="{{json .State.Health.Status}}" oracle-db).Replace('"', '')
27+
$postgreSQLHealth = (docker inspect --format="{{json .State.Health.Status}}" postgres-db).Replace('"', '')
28+
if (($msSQLHealth -ne $status) -or ($mySQLHealth -ne $status) -or ($oracleHealth -ne $status) -or ($postgreSQLHealth -ne $status)) {
29+
Start-Sleep -Seconds 10
30+
$retry ++
31+
} else {
32+
$allHealthy=$true
33+
break
34+
}
3335
} while ($retry -le 6)
3436
if ($allHealthy -eq $true) {
35-
Write-Host "All DB Containers Healthy ==> [ oracle-db (Status) -> '$oracleHealth' ] | [ mssql-db (Status) -> '$msSQLHealth' ] | [ mysql-db (Status) -> '$mySQLHealth' ]"
37+
Write-Host "All DB Containers Healthy ==> [ mssql-db (Status) -> '$msSQLHealth' ] | [ mysql-db (Status) -> '$mySQLHealth' ] | [ oracle-db (Status) -> '$oracleHealth' ] | [ postgres-db (Status) -> '$postgreSQLHealth' ]"
3638
} else {
37-
Write-Host "DB Container/s Not Healthy ==> [ oracle-db (Status) -> '$oracleHealth' ] | [ mssql-db (Status) -> '$msSQLHealth' ] | [ mysql-db (Status) -> '$mySQLHealth' ]"
39+
Write-Host "DB Container/s Not Healthy ==> [ mssql-db (Status) -> '$msSQLHealth' ] | [ mysql-db (Status) -> '$mySQLHealth' ] | [ oracle-db (Status) -> '$oracleHealth' ] | [ postgres-db (Status) -> '$postgreSQLHealth' ]"
3840
exit 1
3941
}
4042

QueryDB.Core.Tests/App.config

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@
55
<add key="MSSQLConnection" value="Data Source=(local);Initial Catalog=master;User Id=SA;Password=__DB_PASSWORD__;Encrypt=False;" />
66
<add key="MySQLConnection" value="server=localhost;database=mysql;uid=root;pwd=__DB_PASSWORD__;" />
77
<add key="OracleConnection" value="Data Source = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA = (SERVER = DEDICATED)(SID = XE))); User Id = sys;Password=__DB_PASSWORD__;DBA Privilege=SYSDBA" />
8+
<add key="PostgreSQLConnection" value="Host=localhost;Port=5432;Database=postgres;Username=sys;Password=__DB_PASSWORD__;" />
89
</appSettings>
910
</configuration>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
services:
2+
postgres-db:
3+
image: postgres:16.4
4+
container_name: postgres-db
5+
environment:
6+
POSTGRES_USER: "sys"
7+
POSTGRES_PASSWORD: ""
8+
POSTGRES_DB: postgres
9+
ports:
10+
- "5432:5432"
11+
volumes:
12+
- ./QueryDB.Core.Tests/SeedData:/home
13+
healthcheck:
14+
test: ["CMD-SHELL", "pg_isready -U sys"]
15+
interval: 5s
16+
timeout: 5s
17+
retries: 5
18+
start_period: 0s
Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
using Microsoft.VisualStudio.TestTools.UnitTesting;
2+
using System.Linq;
3+
4+
namespace QueryDB.Core.Tests
5+
{
6+
[TestClass]
7+
public class PostgreSQLTests : TestBase
8+
{
9+
10+
#region PostgreSQL DB Tests
11+
12+
#region Smoke Tests
13+
14+
[TestMethod]
15+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS), TestCategory(SMOKE_TESTS)]
16+
public void Test_PostgreSQL_FetchData()
17+
{
18+
var selectSql = Queries.PostgreSQLQueries.Smoke.SelectSql;
19+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql);
20+
Assert.IsTrue(data.Count > 0);
21+
Assert.AreEqual("postgres", data[0].ReferenceData["current_database"]);
22+
23+
var dbContext = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString);
24+
data = dbContext.FetchData(selectSql);
25+
Assert.IsTrue(data.Count > 0);
26+
Assert.AreEqual("postgres", data[0].ReferenceData["current_database"]);
27+
}
28+
29+
#endregion
30+
31+
#region Fetch Data Tests
32+
33+
[TestMethod]
34+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS)]
35+
public void Test_PostgreSQL_FetchData_SelectQuery()
36+
{
37+
var selectSql = Queries.PostgreSQLQueries.SalesDB.SelectSql;
38+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql);
39+
Assert.IsTrue(data.Count == 12);
40+
var agent = data.FirstOrDefault(X => X.ReferenceData["agent_name"] == "Benjamin");
41+
Assert.AreEqual("A009", agent.ReferenceData["agent_code"]);
42+
Assert.AreEqual("Benjamin", agent.ReferenceData["agent_name"]);
43+
Assert.AreEqual("Hampshair", agent.ReferenceData["working_area"]);
44+
Assert.AreEqual("0.11", agent.ReferenceData["commission"]);
45+
Assert.AreEqual("008-22536178", agent.ReferenceData["phone_no"]);
46+
Assert.AreEqual("", agent.ReferenceData["country"]);
47+
}
48+
49+
[TestMethod]
50+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS)]
51+
public void Test_PostgreSQL_FetchData_SelectQuery_UpperCaseKeys()
52+
{
53+
var selectSql = Queries.PostgreSQLQueries.SalesDB.SelectSql;
54+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql, upperCaseKeys: true);
55+
Assert.IsTrue(data.Count == 12);
56+
var agent = data.FirstOrDefault(X => X.ReferenceData["AGENT_NAME"] == "Benjamin");
57+
Assert.AreEqual("A009", agent.ReferenceData["AGENT_CODE"]);
58+
Assert.AreEqual("Benjamin", agent.ReferenceData["AGENT_NAME"]);
59+
Assert.AreEqual("Hampshair", agent.ReferenceData["WORKING_AREA"]);
60+
Assert.AreEqual("0.11", agent.ReferenceData["COMMISSION"]);
61+
Assert.AreEqual("008-22536178", agent.ReferenceData["PHONE_NO"]);
62+
Assert.AreEqual("", agent.ReferenceData["COUNTRY"]);
63+
}
64+
65+
[TestMethod]
66+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS)]
67+
public void Test_PostgreSQL_FetchData_SelectQuery_Joins()
68+
{
69+
var selectSql = Queries.PostgreSQLQueries.SalesDB.SelectSql_Join;
70+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql);
71+
Assert.IsTrue(data.Count == 34);
72+
var agent = data.FirstOrDefault(X => X.ReferenceData["agent_code"] == "A004" && X.ReferenceData["cust_code"] == "C00006");
73+
Assert.AreEqual("A004", agent.ReferenceData["agent_code"]);
74+
Assert.AreEqual("Ivan", agent.ReferenceData["agent_name"]);
75+
Assert.AreEqual("C00006", agent.ReferenceData["cust_code"]);
76+
Assert.AreEqual("Shilton", agent.ReferenceData["cust_name"]);
77+
Assert.AreEqual("200104", agent.ReferenceData["ord_num"]);
78+
Assert.AreEqual("1500.00", agent.ReferenceData["ord_amount"]);
79+
Assert.AreEqual("500.00", agent.ReferenceData["advance_amount"]);
80+
Assert.AreEqual("SOD", agent.ReferenceData["ord_description"]);
81+
}
82+
83+
[TestMethod]
84+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS)]
85+
public void Test_PostgreSQL_FetchData_SelectQuery_Joins_UpperCaseKeys()
86+
{
87+
var selectSql = Queries.PostgreSQLQueries.SalesDB.SelectSql_Join;
88+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql, upperCaseKeys: true);
89+
Assert.IsTrue(data.Count == 34);
90+
var agent = data.FirstOrDefault(X => X.ReferenceData["AGENT_CODE"] == "A004" && X.ReferenceData["CUST_CODE"] == "C00006");
91+
Assert.AreEqual("A004", agent.ReferenceData["AGENT_CODE"]);
92+
Assert.AreEqual("Ivan", agent.ReferenceData["AGENT_NAME"]);
93+
Assert.AreEqual("C00006", agent.ReferenceData["CUST_CODE"]);
94+
Assert.AreEqual("Shilton", agent.ReferenceData["CUST_NAME"]);
95+
Assert.AreEqual("200104", agent.ReferenceData["ORD_NUM"]);
96+
Assert.AreEqual("1500.00", agent.ReferenceData["ORD_AMOUNT"]);
97+
Assert.AreEqual("500.00", agent.ReferenceData["ADVANCE_AMOUNT"]);
98+
Assert.AreEqual("SOD", agent.ReferenceData["ORD_DESCRIPTION"]);
99+
}
100+
101+
[TestMethod]
102+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS)]
103+
public void Test_PostgreSQL_FetchData_SelectQuery_Aliases()
104+
{
105+
var selectSql = Queries.PostgreSQLQueries.SalesDB.SelectSql_Alias;
106+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql);
107+
Assert.IsTrue(data.Count == 34);
108+
var agent = data.FirstOrDefault(X => X.ReferenceData["agent_code"] == "A004" && X.ReferenceData["cust_code"] == "C00006");
109+
Assert.AreEqual("A004", agent.ReferenceData["agent_code"]);
110+
Assert.AreEqual("Ivan", agent.ReferenceData["agent"]);
111+
Assert.AreEqual("Torento", agent.ReferenceData["agent_location"]);
112+
Assert.AreEqual("C00006", agent.ReferenceData["cust_code"]);
113+
Assert.AreEqual("Shilton", agent.ReferenceData["customer"]);
114+
Assert.AreEqual("Torento", agent.ReferenceData["customer_location"]);
115+
}
116+
117+
[TestMethod]
118+
[TestCategory(DB_TESTS), TestCategory(POSTGRESQL_TESTS)]
119+
public void Test_PostgreSQL_FetchData_SelectQuery_Aliases_UpperCaseKeys()
120+
{
121+
var selectSql = Queries.PostgreSQLQueries.SalesDB.SelectSql_Alias;
122+
var data = new DBContext(DB.PostgreSQL, PostgreSQLConnectionString).FetchData(selectSql, upperCaseKeys: true);
123+
Assert.IsTrue(data.Count == 34);
124+
var agent = data.FirstOrDefault(X => X.ReferenceData["AGENT_CODE"] == "A004" && X.ReferenceData["CUST_CODE"] == "C00006");
125+
Assert.AreEqual("A004", agent.ReferenceData["AGENT_CODE"]);
126+
Assert.AreEqual("Ivan", agent.ReferenceData["AGENT"]);
127+
Assert.AreEqual("Torento", agent.ReferenceData["AGENT_LOCATION"]);
128+
Assert.AreEqual("C00006", agent.ReferenceData["CUST_CODE"]);
129+
Assert.AreEqual("Shilton", agent.ReferenceData["CUSTOMER"]);
130+
Assert.AreEqual("Torento", agent.ReferenceData["CUSTOMER_LOCATION"]);
131+
}
132+
133+
#endregion
134+
135+
#endregion
136+
137+
}
138+
}

QueryDB.Core.Tests/Queries.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,5 +55,23 @@ internal static class SalesDB
5555
Orders O ON O.Cust_Code = C.Cust_Code AND O.Agent_Code = A.Agent_Code";
5656
}
5757
}
58+
59+
internal static class PostgreSQLQueries
60+
{
61+
internal static class Smoke
62+
{
63+
public static string SelectSql = @"SELECT 'postgres' AS current_database";
64+
}
65+
internal static class SalesDB
66+
{
67+
public static string SelectSql = @"SELECT * FROM Agents";
68+
public static string SelectSql_Join = @"SELECT A.Agent_Code, A.Agent_Name, C.Cust_Code, C.Cust_Name, O.Ord_Num, O.Ord_Amount, O.Advance_Amount, O.Ord_Date, O.Ord_Description FROM Agents A INNER JOIN
69+
Customer C ON C.Agent_Code = A.Agent_Code INNER JOIN
70+
Orders O ON O.Cust_Code = C.Cust_Code AND O.Agent_Code = A.Agent_Code";
71+
public static string SelectSql_Alias = @"SELECT A.Agent_Name AS Agent, A.WORKING_AREA AS Agent_Location, C.Cust_Name AS Customer, C.WORKING_AREA AS Customer_Location, O.Agent_Code, O.Cust_Code FROM Agents A INNER JOIN
72+
Customer C ON C.Agent_Code = A.Agent_Code INNER JOIN
73+
Orders O ON O.Cust_Code = C.Cust_Code AND O.Agent_Code = A.Agent_Code";
74+
}
75+
}
5876
}
5977
}

0 commit comments

Comments
 (0)