You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by al...@apache.org on 2022/02/23 17:45:21 UTC

[fineract] 01/02: FINERACT-984-7: Extend GitHub Action pipeline for PostgreSQL

This is an automated email from the ASF dual-hosted git repository.

aleks pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git

commit 11b0a91aa7bfff814a6a59f0efe9a77fb5a88cfe
Author: Arnold Galovics <ga...@gmail.com>
AuthorDate: Tue Feb 22 20:40:01 2022 +0100

    FINERACT-984-7: Extend GitHub Action pipeline for PostgreSQL
---
 .github/workflows/build-docker-postgresql.yml      | 25 ++++++++
 .github/workflows/build-postgresql.yml             | 68 ++++++++++++++++++++++
 build.gradle                                       |  6 ++
 fineract-provider/build.gradle                     | 23 +++++++-
 .../data/ResultsetColumnHeaderData.java            |  8 ++-
 integration-tests/build.gradle                     |  8 ++-
 .../integrationtests/guarantor/GuarantorTest.java  |  6 +-
 7 files changed, 138 insertions(+), 6 deletions(-)

diff --git a/.github/workflows/build-docker-postgresql.yml b/.github/workflows/build-docker-postgresql.yml
new file mode 100644
index 0000000..1300bed
--- /dev/null
+++ b/.github/workflows/build-docker-postgresql.yml
@@ -0,0 +1,25 @@
+name: Fineract Docker build for PostgreSQL
+
+on: [push, pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-20.04
+
+    steps:
+      - uses: actions/checkout@v2
+      - name: Set up JDK 17
+        uses: actions/setup-java@v2
+        with:
+          java-version: '17'
+          distribution: 'zulu'
+      - name: Build the image
+        run: ./gradlew :fineract-provider:clean :fineract-provider:jibDockerBuild -x test
+      - name: Start the stack
+        run: docker-compose -f docker-compose-postgresql.yml up -d
+      - name: Wait for stack to come up
+        run: sleep 60
+      - name: Check health
+        run: curl -f -k --retry 5 --retry-connrefused --connect-timeout 30 --retry-delay 30 https://localhost:8443/fineract-provider/actuator/health
+      - name: Check info
+        run: (( $(curl -f -k --retry 5 --retry-connrefused --connect-timeout 30 --retry-delay 30 https://localhost:8443/fineract-provider/actuator/info | wc --chars) > 100 ))
diff --git a/.github/workflows/build-postgresql.yml b/.github/workflows/build-postgresql.yml
new file mode 100644
index 0000000..d22eb56
--- /dev/null
+++ b/.github/workflows/build-postgresql.yml
@@ -0,0 +1,68 @@
+name: Fineract Gradle build - basicauth - PostgreSQL
+on: [push, pull_request]
+
+jobs:
+  build:
+    runs-on: ubuntu-20.04
+
+    services:
+        postgresql:
+            image: postgres:13.4
+            ports:
+                - 5432:5432
+            env:
+              POSTGRES_USER: root
+              POSTGRES_PASSWORD: postgres
+            options: --health-cmd="pg_isready -q -d postgres -U root" --health-interval=5s --health-timeout=2s --health-retries=3
+
+        mock-oauth2-server:
+          image: ghcr.io/navikt/mock-oauth2-server:0.4.0
+          ports:
+            - 9000:9000
+          env:
+            SERVER_PORT: 9000
+            JSON_CONFIG: '{ "interactiveLogin": true, "httpServer": "NettyWrapper", "tokenCallbacks": [ { "issuerId": "auth/realms/fineract", "tokenExpiry": 120, "requestMappings": [{ "requestParam": "scope", "match": "fineract", "claims": { "sub": "mifos", "scope": [ "test" ] } } ] } ] }'
+
+    env:
+        TZ: Asia/Kolkata
+    steps:
+      - name: Set up cache
+        uses: actions/cache@v2
+        with:
+          path: |
+            ~/.gradle/caches
+            ~/.gradle/wrapper
+          key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
+          restore-keys: |
+            ${{ runner.os }}-gradle-
+      - name: Checkout
+        uses: actions/checkout@v2
+      - name: Set up JDK 17
+        uses: actions/setup-java@v2
+        with:
+          java-version: '17'
+          distribution: 'zulu'
+      - name: Validate Gradle wrapper
+        uses: gradle/wrapper-validation-action@e6e38bacfdf1a337459f332974bb2327a31aaf4b
+      - name: Verify MariaDB connection
+        run: |
+            while ! pg_isready -d postgres -U root -h 127.0.0.1 -p 5432 ; do
+                sleep 1
+            done
+      - name: Initialise databases
+        run: |
+            ./gradlew --no-daemon -q createPGDB -PdbName=fineract_tenants
+            ./gradlew --no-daemon -q createPGDB -PdbName=fineract_default
+      - name: Install additional software
+        run: |
+            sudo apt-get update
+            sudo apt-get install ghostscript -y
+
+      - name: Basic Auth Build & Test
+        run: ./gradlew --no-daemon -q --console=plain licenseMain licenseTest check build test --fail-fast doc -x :twofactor-tests:test -x :oauth2-test:test -PdbType=postgresql -PexcludeTests=org.apache.fineract.integrationtests.guarantor.GuarantorTest.testGuarantor_UNDO_DISBURSAL
+
+      - name: 2FA Build & Test
+        run: ./gradlew --no-daemon -q --console=plain :twofactor-tests:test --fail-fast -PdbType=postgresql
+
+      - name: OAuth2 Build & Test
+        run: ./gradlew --no-daemon -q --console=plain :oauth2-tests:test --fail-fast -PdbType=postgresql
diff --git a/build.gradle b/build.gradle
index 0ded477..332aa39 100644
--- a/build.gradle
+++ b/build.gradle
@@ -612,6 +612,12 @@ configure(project.fineractJavaProjects) {
 
     test {
         useJUnitPlatform()
+
+        if (project.hasProperty('excludeTests')) {
+            filter {
+                excludeTestsMatching project.property('excludeTests')
+            }
+        }
     }
 
     testlogger {
diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle
index 960de21..c397ff7 100644
--- a/fineract-provider/build.gradle
+++ b/fineract-provider/build.gradle
@@ -194,6 +194,8 @@ import groovy.sql.Sql
 
 project.ext.mysqlUser='root'
 project.ext.mysqlPassword='mysql'
+project.ext.pgUser='root'
+project.ext.pgPassword='postgres'
 
 configurations {
     driver
@@ -209,7 +211,7 @@ configurations.driver.each {File file ->
 }
 
 task createDB {
-    description= "Creates the Database. Needs database name to be passed (like: -PdbName=someDBname)"
+    description= "Creates the MySQL Database. Needs database name to be passed (like: -PdbName=someDBname)"
     doLast {
         def sql = Sql.newInstance( 'jdbc:mariadb://localhost:3306/', mysqlUser, mysqlPassword, 'org.mariadb.jdbc.Driver' )
         sql.execute( 'create database '+"`$dbName`" )
@@ -217,12 +219,29 @@ task createDB {
 }
 
 task dropDB {
-    description= "Drops the specified database. The database name has to be passed (like: -PdbName=someDBname)"
+    description= "Drops the specified MySQL database. The database name has to be passed (like: -PdbName=someDBname)"
     doLast {
         def sql = Sql.newInstance( 'jdbc:mariadb://localhost:3306/', mysqlUser, mysqlPassword, 'org.mariadb.jdbc.Driver' )
         sql.execute( 'DROP DATABASE '+"`$dbName`")
     }
 }
+
+task createPGDB {
+    description= "Creates the PostgreSQL Database. Needs database name to be passed (like: -PdbName=someDBname)"
+    doLast {
+        def sql = Sql.newInstance( 'jdbc:postgresql://localhost:5432/', pgUser, pgPassword, 'org.postgresql.Driver' )
+        sql.execute( 'create database '+"$dbName" )
+    }
+}
+
+task dropPGDB {
+    description= "Drops the specified PostgreSQL database. The database name has to be passed (like: -PdbName=someDBname)"
+    doLast {
+        def sql = Sql.newInstance( 'jdbc:postgresql://localhost:5432/', pgUser, pgPassword, 'org.postgresql.Driver' )
+        sql.execute( 'DROP DATABASE '+ "$dbName")
+    }
+}
+
 task setBlankPassword {
     doLast {
         def sql = Sql.newInstance( 'jdbc:mariadb://localhost:3306/', mysqlUser, mysqlPassword, 'org.mariadb.jdbc.Driver' )
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java
index 485d460..68cbc84 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/data/ResultsetColumnHeaderData.java
@@ -183,7 +183,13 @@ public final class ResultsetColumnHeaderData implements Serializable {
     }
 
     private boolean isAnyInteger() {
-        return isInt() || isInteger() || isSmallInt() || isTinyInt() || isMediumInt() || isBigInt() || isLong();
+        return isInt() || isInteger() || isSmallInt() || isTinyInt() || isMediumInt() || isBigInt() || isLong() || isSerial();
+    }
+
+    private boolean isSerial() {
+        return "SERIAL".equalsIgnoreCase(this.columnType) || "SERIAL4".equalsIgnoreCase(this.columnType)
+                || "SERIAL8".equalsIgnoreCase(this.columnType) || "SMALLSERIAL".equalsIgnoreCase(this.columnType)
+                || "BIGSERIAL".equalsIgnoreCase(this.columnType);
     }
 
     private boolean isInt() {
diff --git a/integration-tests/build.gradle b/integration-tests/build.gradle
index 4d4cfb8..f395cf9 100644
--- a/integration-tests/build.gradle
+++ b/integration-tests/build.gradle
@@ -46,7 +46,13 @@ cargo {
         }
         startStopTimeout = 240000
         containerProperties {
-            property 'cargo.start.jvmargs', '--add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Dspring.datasource.hikari.driverClassName=org.mariadb.j [...]
+            def jvmArgs = '--add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED '
+            if (project.hasProperty('dbType') && 'postgresql'.equalsIgnoreCase(dbType)) {
+                jvmArgs += '-Dspring.datasource.hikari.driverClassName=org.postgresql.Driver -Dspring.datasource.hikari.jdbcUrl=jdbc:postgresql://localhost:5432/fineract_tenants -Dspring.datasource.hikari.username=root -Dspring.datasource.hikari.password=postgres -Dfineract.tenant.host=localhost -Dfineract.tenant.port=5432 -Dfineract.tenant.username=root -Dfineract.tenant.password=postgres'
+            } else {
+                jvmArgs += '-Dspring.datasource.hikari.driverClassName=org.mariadb.jdbc.Driver -Dspring.datasource.hikari.jdbcUrl=jdbc:mariadb://localhost:3306/fineract_tenants -Dspring.datasource.hikari.username=root -Dspring.datasource.hikari.password=mysql -Dfineract.tenant.host=localhost -Dfineract.tenant.port=3306 -Dfineract.tenant.username=root -Dfineract.tenant.password=mysql'
+            }
+            property 'cargo.start.jvmargs', jvmArgs
             property 'cargo.tomcat.connector.keystoreFile', file("$rootDir/fineract-provider/src/main/resources/keystore.jks")
             property 'cargo.tomcat.connector.keystorePass', 'openmf'
             property 'cargo.tomcat.httpSecure', true
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java
index 3e7c70f..5dd74fa 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/guarantor/GuarantorTest.java
@@ -339,7 +339,8 @@ public class GuarantorTest {
         verifySavingsOnHoldBalance(externalSavigsId_1, external1_hold_funds);
         verifySavingsOnHoldBalance(externalSavigsId_2, external2_hold_funds);
         List<HashMap> guarantors = this.guarantorHelper.getAllGuarantor(loanID);
-        this.guarantorHelper.deleteGuarantor(externalGuarantor, loanID);
+        HashMap response = this.guarantorHelper.deleteGuarantor(externalGuarantor, loanID);
+        assertEquals(externalGuarantor, response.get("resourceId"));
         assertFalse((Boolean) this.guarantorHelper.getGuarantor(externalGuarantor, loanID, "status"));
         HashMap errorlog = this.guarantorHelper.deleteGuarantor(withoutGuaranteeAmount, loanID);
         ArrayList<HashMap> error = (ArrayList<HashMap>) errorlog.get(CommonConstants.RESPONSE_ERROR);
@@ -359,7 +360,8 @@ public class GuarantorTest {
         verifySavingsOnHoldBalance(externalSavigsId_3, EXTERNAL1_GURANTEE);
         Assertions.assertNotNull(externalGuarantee_3);
 
-        this.guarantorHelper.deleteGuarantor(externalGuarantee_1, fundDetailId, loanID);
+        response = this.guarantorHelper.deleteGuarantor(externalGuarantee_3, fundDetailId, loanID);
+        assertEquals(externalGuarantee_3, response.get("resourceId"));
         guarantors = this.guarantorHelper.getAllGuarantor(loanID);
         assertEquals(4, guarantors.size());
         externalGuarantee_1_details = (List<HashMap>) this.guarantorHelper.getGuarantor(externalGuarantee_1, loanID,