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 <[email protected]> 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,
