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 2020/11/07 21:30:55 UTC

[fineract] 01/02: Move all SDK client tests into integrationtests (FINERACT-1209)

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 73e330a58e1f1697ee8915bc25e5beb25ad913d8
Author: Michael Vorburger <mi...@vorburger.ch>
AuthorDate: Fri Nov 6 23:47:05 2020 +0100

    Move all SDK client tests into integrationtests (FINERACT-1209)
    
    And run the against localhost instead of https://fineract.dev
---
 fineract-client/build.gradle                       |   6 +-
 .../fineract/client/util/FineractClient.java       |   3 +-
 ...tTest.java => FineractClientTechnicalTest.java} |  34 +------
 .../organisation/staff/api/StaffApiResource.java   |  21 ++---
 .../staff/api/StaffApiResourceSwagger.java         |  14 +--
 integration-tests/dependencies.gradle              |   1 +
 .../integrationtests/StaffImageApiTest.java        | 102 ---------------------
 .../fineract/integrationtests/StaffTest.java       |   2 +-
 .../integrationtests/client}/CallSubject.java      |   2 +-
 .../integrationtests/client}/ClientTest.java       |  14 +--
 .../integrationtests/client}/DocumentTest.java     |   7 +-
 .../integrationtests/client}/ImageTest.java        |  34 +++----
 .../integrationtests/client}/IntegrationTest.java  |   9 +-
 .../integrationtests/client}/OfficeTest.java       |  15 ++-
 .../integrationtests/client/StaffTest.java         |  67 ++++++++++++++
 .../integrationtests/common/ImageHelper.java       |  81 ----------------
 .../test/resources/michael.vorburger-crepes.jpg    | Bin
 17 files changed, 134 insertions(+), 278 deletions(-)

diff --git a/fineract-client/build.gradle b/fineract-client/build.gradle
index b11b028..4bcbe9e 100644
--- a/fineract-client/build.gradle
+++ b/fineract-client/build.gradle
@@ -103,7 +103,11 @@ compileJava {
 }
 
 tasks.withType(JavaCompile) {
-    // the generated code contains some warnings in build/generated/java/src/main/java/org/apache/fineract/client/auth/OAuthOkHttpClient.java#L71 that won't pass
+    // the generated code in build/generated/java/src/main/java/org/apache/fineract/client/auth/OAuthOkHttpClient.java#L71 currently uses deprecated RequestBody.create(MediaType,String)
+    // TODO FINERACT-1247 why does this not work:
+    //   options.compilerArgs -= ["-Xlint:deprecation"]
+    //   options.compilerArgs += ["-Xlint:-deprecation"]
+    // So we just have to use:
     options.compilerArgs -= ["-Werror"]
 }
 
diff --git a/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java b/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
index ab12819..e6a4a64 100644
--- a/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
+++ b/fineract-client/src/main/java/org/apache/fineract/client/util/FineractClient.java
@@ -453,7 +453,8 @@ public final class FineractClient {
                         }
                     };
 
-                    SSLContext sslContext = SSLContext.getInstance("SSL"); // TODO "SSL" or "TLS" as in hooks.processor.ProcessorHelper?
+                    // TODO "SSL" or "TLS" as in hooks.processor.ProcessorHelper?
+                    SSLContext sslContext = SSLContext.getInstance("SSL");
                     sslContext.init(null, new TrustManager[] { insecureX509TrustManager }, new SecureRandom());
                     SSLSocketFactory insecureSslSocketFactory = sslContext.getSocketFactory();
 
diff --git a/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTest.java b/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java
similarity index 54%
rename from fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTest.java
rename to fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java
index 9afb89a..63bb567 100644
--- a/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTest.java
+++ b/fineract-client/src/test/java/org/apache/fineract/client/test/FineractClientTechnicalTest.java
@@ -18,48 +18,18 @@
  */
 package org.apache.fineract.client.test;
 
-import static com.google.common.truth.Truth.assertThat;
-import static org.apache.fineract.client.util.Calls.ok;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import okhttp3.logging.HttpLoggingInterceptor.Level;
 import org.apache.fineract.client.util.FineractClient;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 /**
- * Illustrates use of Fineract SDK REST Client.
+ * Tests a few technical aspect of the Fineract SDK REST Client.
  *
  * @author Michael Vorburger.ch
  */
-public class FineractClientTest {
-
-    void checkClients(FineractClient fineract) {
-        assertThat(ok(fineract.clients.retrieveAll20(null, null, null, null, null, null, null, null, 0, 100, null, null, null))
-                .getTotalFilteredRecords()).isAtLeast(3);
-    }
-
-    @Test
-    void testRetrieveAllClientsFromFineractDev() {
-        FineractClient fineract = FineractClient.builder().baseURL("https://demo.fineract.dev/fineract-provider/api/v1/").tenant("default")
-                .basicAuth("mifos", "password").logging(Level.BODY).build();
-        checkClients(fineract);
-    }
-
-    @Test
-    @Disabled // TODO remove Disabled once https://issues.apache.org/jira/browse/FINERACT-1209 is fixed
-    void testRetrieveAllClientsFromLocalhostWithInsecureSelfSignedCert() {
-        FineractClient fineract = FineractClient.builder().baseURL("https://localhost:8443/fineract-provider/api/v1/").tenant("default")
-                .basicAuth("mifos", "password").insecure(true).build();
-        checkClients(fineract);
-    }
-
-    @Test // FINERACT-1220
-    void testOfficesDateFormat() {
-        FineractClient fineract = FineractClient.builder().baseURL("https://demo.fineract.dev/fineract-provider/api/v1/").tenant("default")
-                .basicAuth("mifos", "password").insecure(true).logging(Level.BODY).build();
-        ok(fineract.offices.retrieveOffices(true, null, null));
-    }
+public class FineractClientTechnicalTest {
 
     @Test
     @Disabled // TODO remove Ignore once https://issues.apache.org/jira/browse/FINERACT-1221 is fixed
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
index 6a0f0ea..81e653f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
@@ -115,9 +115,8 @@ public class StaffApiResource {
             + "and for status=ALL, it Returns both ACTIVE and INACTIVE Staff.\n" + "\n" + "Example Requests:\n" + "\n"
             + "staff?status=active")
     @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = StaffApiResourceSwagger.GetStaffResponse.class)))),
-            @ApiResponse(responseCode = "200", description = "GET https://DomainName/api/v1/staff?status={ACTIVE|INACTIVE|ALL}", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.GetStaffResponse.class))) })
-    public String retrieveStaff(@Context final UriInfo uriInfo,
+            @ApiResponse(responseCode = "200", description = "OK", content = @Content(array = @ArraySchema(schema = @Schema(implementation = StaffApiResourceSwagger.RetrieveOneResponse.class)))) })
+    public String retrieveAll(@Context final UriInfo uriInfo,
             @QueryParam("officeId") @Parameter(description = "officeId") final Long officeId,
             @DefaultValue("false") @QueryParam("staffInOfficeHierarchy") @Parameter(description = "staffInOfficeHierarchy") final boolean staffInOfficeHierarchy,
             @DefaultValue("false") @QueryParam("loanOfficersOnly") @Parameter(description = "loanOfficersOnly") final boolean loanOfficersOnly,
@@ -143,8 +142,8 @@ public class StaffApiResource {
             + "officeId, firstname, lastname\n" + "\n" + "Optional Fields: \n" + "isLoanOfficer, isActive")
     @RequestBody(required = true, content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.PostStaffRequest.class)))
     @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.PostStaffResponse.class))) })
-    public String createStaff(@Parameter(hidden = true) final String apiRequestBodyAsJson) {
+            @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.CreateStaffResponse.class))) })
+    public String create(@Parameter(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createStaff().withJson(apiRequestBodyAsJson).build();
 
@@ -160,8 +159,8 @@ public class StaffApiResource {
     @Operation(summary = "Retrieve a Staff Member", description = "Returns the details of a Staff Member.\n" + "\n" + "Example Requests:\n"
             + "\n" + "staff/1")
     @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.GetStaffResponse.class))) })
-    public String retreiveStaff(@PathParam("staffId") @Parameter(description = "staffId") final Long staffId,
+            @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.RetrieveOneResponse.class))) })
+    public String retrieveOne(@PathParam("staffId") @Parameter(description = "staffId") final Long staffId,
             @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -183,8 +182,8 @@ public class StaffApiResource {
     @Operation(summary = "Update a Staff Member", description = "Updates the details of a staff member.")
     @RequestBody(required = true, content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.PutStaffRequest.class)))
     @ApiResponses({
-            @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.PutStaffResponse.class))) })
-    public String updateStaff(@PathParam("staffId") @Parameter(description = "staffId") final Long staffId,
+            @ApiResponse(responseCode = "200", description = "OK", content = @Content(schema = @Schema(implementation = StaffApiResourceSwagger.UpdateStaffResponse.class))) })
+    public String update(@PathParam("staffId") @Parameter(description = "staffId") final Long staffId,
             @Parameter(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateStaff(staffId).withJson(apiRequestBodyAsJson).build();
@@ -197,14 +196,14 @@ public class StaffApiResource {
     @GET
     @Path("downloadtemplate")
     @Produces("application/vnd.ms-excel")
-    public Response getStaffTemplate(@QueryParam("officeId") final Long officeId, @QueryParam("dateFormat") final String dateFormat) {
+    public Response getTemplate(@QueryParam("officeId") final Long officeId, @QueryParam("dateFormat") final String dateFormat) {
         return bulkImportWorkbookPopulatorService.getTemplate(GlobalEntityType.STAFF.toString(), officeId, null, dateFormat);
     }
 
     @POST
     @Path("uploadtemplate")
     @Consumes(MediaType.MULTIPART_FORM_DATA)
-    public String postStaffTemplate(@FormDataParam("file") InputStream uploadedInputStream,
+    public String postTemplate(@FormDataParam("file") InputStream uploadedInputStream,
             @FormDataParam("file") FormDataContentDisposition fileDetail, @FormDataParam("locale") final String locale,
             @FormDataParam("dateFormat") final String dateFormat) {
         final Long importDocumentId = this.bulkImportWorkbookService.importWorkbook(GlobalEntityType.STAFF.toString(), uploadedInputStream,
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java
index 289a968..95e5e55 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java
@@ -39,7 +39,7 @@ final class StaffApiResourceSwagger {
         }
 
         @Schema(example = "1")
-        public Long id;
+        public Long officeId;
         @Schema(example = "John")
         public String firstname;
         @Schema(example = "Doe")
@@ -62,9 +62,9 @@ final class StaffApiResourceSwagger {
     }
 
     @Schema(description = "PostStaffResponse")
-    public static final class PostStaffResponse {
+    public static final class CreateStaffResponse {
 
-        private PostStaffResponse() {
+        private CreateStaffResponse() {
 
         }
 
@@ -75,9 +75,9 @@ final class StaffApiResourceSwagger {
     }
 
     @Schema(description = "GetStaffResponse")
-    public static final class GetStaffResponse {
+    public static final class RetrieveOneResponse {
 
-        private GetStaffResponse() {
+        private RetrieveOneResponse() {
 
         }
 
@@ -119,9 +119,9 @@ final class StaffApiResourceSwagger {
     }
 
     @Schema(description = "PutStaffResponse")
-    public static final class PutStaffResponse {
+    public static final class UpdateStaffResponse {
 
-        private PutStaffResponse() {
+        private UpdateStaffResponse() {
 
         }
 
diff --git a/integration-tests/dependencies.gradle b/integration-tests/dependencies.gradle
index be1b2b8..ec47d59 100644
--- a/integration-tests/dependencies.gradle
+++ b/integration-tests/dependencies.gradle
@@ -23,6 +23,7 @@ dependencies {
     tomcat 'org.apache.tomcat:tomcat:9.0.39@zip'
     testImplementation( files("$rootDir/fineract-provider/build/classes/java/main/"),
             project(path: ':fineract-provider', configuration: 'runtimeElements'),
+            project(path: ':fineract-client', configuration: 'runtimeElements'),
             'org.junit.jupiter:junit-jupiter-api:5.7.0',
             'com.google.truth:truth:1.0.1',
             'com.google.truth.extensions:truth-java8-extension:1.0.1',
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffImageApiTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffImageApiTest.java
deleted file mode 100644
index 54f7d59..0000000
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffImageApiTest.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.fineract.integrationtests;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-import io.restassured.builder.RequestSpecBuilder;
-import io.restassured.builder.ResponseSpecBuilder;
-import io.restassured.http.ContentType;
-import io.restassured.specification.RequestSpecification;
-import io.restassured.specification.ResponseSpecification;
-import org.apache.fineract.integrationtests.common.ImageHelper;
-import org.apache.fineract.integrationtests.common.Utils;
-import org.apache.fineract.integrationtests.common.organisation.StaffHelper;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-@Deprecated // replaced by new ImageTest, can be deleted as FINERACT-1209 is fully implemented
-public class StaffImageApiTest {
-
-    private RequestSpecification requestSpec;
-    private ResponseSpecification responseSpec;
-    private ResponseSpecification responseSpec404;
-
-    @BeforeEach
-    public void setup() {
-        Utils.initializeRESTAssured();
-        this.requestSpec = new RequestSpecBuilder().setContentType(ContentType.JSON).build();
-        this.requestSpec.header("Authorization", "Basic " + Utils.loginIntoServerAndGetBase64EncodedAuthenticationKey());
-        this.responseSpec = new ResponseSpecBuilder().expectStatusCode(200).build();
-        this.responseSpec404 = new ResponseSpecBuilder().expectStatusCode(404).build();
-    }
-
-    @Test
-    public void createStaffImage() {
-        Integer staffId = StaffHelper.createStaff(this.requestSpec, this.responseSpec);
-        Integer imageId = ImageHelper.createImageForStaff(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-    }
-
-    @Test
-    public void getStaffImage() {
-        Integer staffId = StaffHelper.createStaff(this.requestSpec, this.responseSpec);
-        Integer imageId = ImageHelper.createImageForStaff(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-
-        String imageAsText = ImageHelper.getStaffImageAsText(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull("Image id should not be null", imageAsText);
-        assertEquals(ImageHelper.generateImageAsText(), imageAsText);
-    }
-
-    @Test
-    public void getStaffImageAsBinary() {
-        Integer staffId = StaffHelper.createStaff(this.requestSpec, this.responseSpec);
-        Integer imageId = ImageHelper.createImageForStaff(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-
-        byte[] imageAsBytes = ImageHelper.getStaffImageAsBinary(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageAsBytes, "Image content should not be null");
-        assertEquals(251, imageAsBytes.length);
-    }
-
-    @Test
-    public void updateImage() {
-        Integer staffId = StaffHelper.createStaff(this.requestSpec, this.responseSpec);
-        Integer imageId = ImageHelper.createImageForStaff(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-
-        imageId = ImageHelper.updateImageForStaff(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-    }
-
-    @Test
-    public void deleteStaffImage() {
-        Integer staffId = StaffHelper.createStaff(this.requestSpec, this.responseSpec);
-        Integer imageId = ImageHelper.createImageForStaff(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-
-        imageId = ImageHelper.deleteStaffImage(this.requestSpec, this.responseSpec, staffId);
-        assertNotNull(imageId, "Image id should not be null");
-
-        ImageHelper.getStaffImageAsBinary(this.requestSpec, this.responseSpec404, staffId);
-        // No additional Assertion required, the point is the responseSpec404
-    }
-}
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java
index c18ee3f..016f758 100644
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/StaffTest.java
@@ -33,6 +33,7 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
+@Deprecated // TODO move this into new org.apache.fineract.integrationtests.client.StaffTest
 public class StaffTest {
 
     private RequestSpecification requestSpec;
@@ -61,7 +62,6 @@ public class StaffTest {
 
     @Test
     public void testStaffCreateValidationError() {
-
         final String noOfficeJson = StaffHelper.createStaffWithJSONFields("firstname", "lastname");
         final String noFirstnameJson = StaffHelper.createStaffWithJSONFields("officeId", "lastname");
         final String noLastnameJson = StaffHelper.createStaffWithJSONFields("officeId", "firstname");
diff --git a/fineract-client/src/test/java/org/apache/fineract/client/testutil/CallSubject.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/CallSubject.java
similarity index 97%
rename from fineract-client/src/test/java/org/apache/fineract/client/testutil/CallSubject.java
rename to integration-tests/src/test/java/org/apache/fineract/integrationtests/client/CallSubject.java
index f2e6c7b..38e26c6 100644
--- a/fineract-client/src/test/java/org/apache/fineract/client/testutil/CallSubject.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/CallSubject.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.client.testutil;
+package org.apache.fineract.integrationtests.client;
 
 import com.google.common.truth.FailureMetadata;
 import com.google.common.truth.Subject;
diff --git a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/ClientTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientTest.java
similarity index 86%
rename from fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/ClientTest.java
rename to integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientTest.java
index af6b66c..5d44ff0 100644
--- a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/ClientTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ClientTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.integrationtests.newstyle;
+package org.apache.fineract.integrationtests.client;
 
 import java.util.Optional;
 import org.apache.fineract.client.models.GetClientsResponse;
@@ -39,14 +39,14 @@ public class ClientTest extends IntegrationTest {
 
     @Test
     @Order(2)
-    void retrieveOneExisting() {
-        assertThat(retrieveOne()).isPresent();
+    void retrieveAnyExisting() {
+        assertThat(retrieveFirst()).isPresent();
     }
 
     // The following are not tests, but helpful utilities for other tests
 
     public Long getClientId() {
-        return retrieveOne().orElseGet(this::create);
+        return retrieveFirst().orElseGet(this::create);
     }
 
     Long create() {
@@ -56,13 +56,13 @@ public class ClientTest extends IntegrationTest {
         // TODO why dateFormat and locale required even when no activationDate?!
         // https://issues.apache.org/jira/browse/FINERACT-1233
         return (long) ok(fineract().clients
-                .create5(new PostClientsRequest().officeId(1).fullname("TestClient").dateFormat(dateFormat()).locale("en_US")))
+                .create6(new PostClientsRequest().officeId(1).fullname("TestClient").dateFormat(dateFormat()).locale("en_US")))
                         .getClientId();
     }
 
-    Optional<Long> retrieveOne() {
+    Optional<Long> retrieveFirst() {
         GetClientsResponse clients = ok(
-                fineract().clients.retrieveAll20(null, null, null, null, null, null, null, null, 0, 1, null, null, false));
+                fineract().clients.retrieveAll21(null, null, null, null, null, null, null, null, 0, 1, null, null, false));
         if (clients.getTotalFilteredRecords() > 0) {
             // TODO rm long cast, see https://issues.apache.org/jira/browse/FINERACT-1230
             return Optional.of((long) clients.getPageItems().get(0).getId());
diff --git a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/DocumentTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java
similarity index 91%
rename from fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/DocumentTest.java
rename to integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java
index fed52b8..1d7d49b 100644
--- a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/DocumentTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/DocumentTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.integrationtests.newstyle;
+package org.apache.fineract.integrationtests.client;
 
 import java.io.File;
 import java.io.IOException;
@@ -24,7 +24,6 @@ import okhttp3.MediaType;
 import okhttp3.MultipartBody.Part;
 import okhttp3.ResponseBody;
 import org.apache.fineract.client.models.GetEntityTypeEntityIdDocumentsResponse;
-import org.apache.fineract.client.models.PostEntityTypeEntityIdDocumentsResponse;
 import org.apache.fineract.client.util.Parts;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
@@ -54,9 +53,7 @@ public class DocumentTest extends IntegrationTest {
         String name = "Test";
         Part part = Parts.fromFile(testFile);
         String description = null;
-        // TODO used var in tests when moved from fineract-client (Java 8 only) to new module
-        PostEntityTypeEntityIdDocumentsResponse response = ok(
-                fineract().documents.createDocument("clients", clientId, part, name, description));
+        var response = ok(fineract().documents.createDocument("clients", clientId, part, name, description));
         assertThat(response.getResourceId()).isNotNull();
         assertThat(response.getResourceIdentifier()).isNotEmpty();
         documentId = response.getResourceId();
diff --git a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/ImageTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java
similarity index 80%
rename from fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/ImageTest.java
rename to integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java
index 56b951e..8bf466b 100644
--- a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/ImageTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/ImageTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.integrationtests.newstyle;
+package org.apache.fineract.integrationtests.client;
 
 import java.io.File;
 import java.io.IOException;
@@ -24,7 +24,6 @@ import okhttp3.MediaType;
 import okhttp3.ResponseBody;
 import org.apache.fineract.client.services.ImagesApi;
 import org.apache.fineract.client.util.Parts;
-import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
 import retrofit2.Call;
@@ -37,28 +36,24 @@ import retrofit2.http.Headers;
  *
  * @author Michael Vorburger.ch
  */
-@Disabled // TODO FINERACT-1247
 public class ImageTest extends IntegrationTest {
 
-    // TODO This "new style" test is equivalent to the old StaffImageApiTest, so we could delete that (after
-    // FINERACT-1209)
-
     final File testImage = new File(getClass().getResource("/michael.vorburger-crepes.jpg").getFile());
 
     Long clientId = new ClientTest().getClientId();
-    // staffId is hard-coded to 1L below, because that always exists
+    Long staffId = new StaffTest().getStaffId();
 
     @Test
     @Order(1)
     void create() {
-        ok(fineract().images.create("staff", 1L, Parts.fromFile(testImage)));
+        ok(fineract().images.create("staff", staffId, Parts.fromFile(testImage)));
         ok(fineract().images.create("clients", clientId, Parts.fromFile(testImage)));
     }
 
     @Test
     @Order(2)
     void getOriginalSize() throws IOException {
-        ResponseBody r = ok(fineract().images.get("staff", 1L, 3505, 1972, null));
+        ResponseBody r = ok(fineract().images.get("staff", staffId, 3505, 1972, null));
         assertThat(r.contentType()).isEqualTo(MediaType.get("text/plain"));
         String encodedImage = r.string();
         assertThat(encodedImage).startsWith("data:image/jpeg;base64,");
@@ -69,14 +64,14 @@ public class ImageTest extends IntegrationTest {
     @Test
     @Order(3)
     void getSmallerSize() throws IOException {
-        ResponseBody r = ok(fineract().images.get("staff", 1L, 128, 128, null));
+        ResponseBody r = ok(fineract().images.get("staff", staffId, 128, 128, null));
         assertThat(r.string()).hasLength(6591);
     }
 
     @Test
     @Order(4)
     void getBiggerSize() throws IOException {
-        ResponseBody r = ok(fineract().images.get("staff", 1L, 9000, 6000, null));
+        ResponseBody r = ok(fineract().images.get("staff", staffId, 9000, 6000, null));
         assertThat(r.string()).hasLength(2846549);
     }
 
@@ -84,21 +79,22 @@ public class ImageTest extends IntegrationTest {
     @Order(5)
     void getInlineOctetOutput() throws IOException {
         // 3505x1972 is the exact original size of testFile
-        Response<ResponseBody> r = okR(fineract().images.get("staff", 1L, 3505, 1972, "inline_octet"));
+        Response<ResponseBody> r = okR(fineract().images.get("staff", staffId, 3505, 1972, "inline_octet"));
         try (ResponseBody body = r.body()) {
             assertThat(body.contentType()).isEqualTo(MediaType.get("image/jpeg"));
             assertThat(body.bytes().length).isEqualTo(testImage.length());
             assertThat(body.contentLength()).isEqualTo(testImage.length());
         }
 
-        String expectedFileName = "test, testJPEG"; // without dot!
+        var staff = ok(fineract().staff.retrieveOne8(staffId));
+        String expectedFileName = staff.getDisplayName() + "JPEG"; // without dot!
         assertThat(Parts.fileName(r)).hasValue(expectedFileName);
     }
 
     @Test
     @Order(6)
     void getOctetOutput() throws IOException {
-        ResponseBody r = ok(fineract().images.get("staff", 1L, 3505, 1972, "octet"));
+        ResponseBody r = ok(fineract().images.get("staff", staffId, 3505, 1972, "octet"));
         assertThat(r.contentType()).isEqualTo(MediaType.get("image/jpeg"));
         assertThat(r.bytes().length).isEqualTo(testImage.length());
         assertThat(r.contentLength()).isEqualTo(testImage.length());
@@ -107,7 +103,7 @@ public class ImageTest extends IntegrationTest {
     @Test
     @Order(7)
     void getAnotherOutput() throws IOException {
-        ResponseBody r = ok(fineract().images.get("staff", 1L, 3505, 1972, "abcd"));
+        ResponseBody r = ok(fineract().images.get("staff", staffId, 3505, 1972, "abcd"));
         assertThat(r.contentType()).isEqualTo(MediaType.get("text/plain"));
         assertThat(r.string()).startsWith("data:image/jpeg;base64,");
     }
@@ -115,7 +111,7 @@ public class ImageTest extends IntegrationTest {
     @Test
     @Order(8)
     void getText() throws IOException {
-        ResponseBody r = ok(fineract().createService(ImagesApiWithHeadersForTest.class).getText("staff", 1L, 3505, 1972, null));
+        ResponseBody r = ok(fineract().createService(ImagesApiWithHeadersForTest.class).getText("staff", staffId, 3505, 1972, null));
         assertThat(r.contentType()).isEqualTo(MediaType.get("text/plain"));
         assertThat(r.string()).startsWith("data:image/jpeg;base64,");
     }
@@ -123,7 +119,7 @@ public class ImageTest extends IntegrationTest {
     @Test
     @Order(9)
     void getBytes() throws IOException {
-        ResponseBody r = ok(fineract().createService(ImagesApiWithHeadersForTest.class).getBytes("staff", 1L, 3505, 1972, null));
+        ResponseBody r = ok(fineract().createService(ImagesApiWithHeadersForTest.class).getBytes("staff", staffId, 3505, 1972, null));
         assertThat(r.contentType()).isEqualTo(MediaType.get("image/jpeg"));
         assertThat(r.bytes().length).isEqualTo(testImage.length());
     }
@@ -131,13 +127,13 @@ public class ImageTest extends IntegrationTest {
     @Test
     @Order(50)
     void update() {
-        ok(fineract().images.update("staff", 1L, Parts.fromFile(testImage)));
+        ok(fineract().images.update("staff", staffId, Parts.fromFile(testImage)));
     }
 
     @Test
     @Order(99)
     void delete() {
-        ok(fineract().images.delete("staff", 1L));
+        ok(fineract().images.delete("staff", staffId));
         ok(fineract().images.delete("clients", clientId));
     }
 
diff --git a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/IntegrationTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/IntegrationTest.java
similarity index 91%
rename from fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/IntegrationTest.java
rename to integration-tests/src/test/java/org/apache/fineract/integrationtests/client/IntegrationTest.java
index 523d409..1319326 100644
--- a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/IntegrationTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/IntegrationTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.integrationtests.newstyle;
+package org.apache.fineract.integrationtests.client;
 
 import com.google.common.truth.BigDecimalSubject;
 import com.google.common.truth.BooleanSubject;
@@ -35,7 +35,6 @@ import java.math.BigDecimal;
 import java.util.Optional;
 import java.util.Random;
 import okhttp3.logging.HttpLoggingInterceptor.Level;
-import org.apache.fineract.client.testutil.CallSubject;
 import org.apache.fineract.client.util.Calls;
 import org.apache.fineract.client.util.FineractClient;
 import org.junit.jupiter.api.MethodOrderer;
@@ -62,9 +61,9 @@ public abstract class IntegrationTest {
 
     protected FineractClient fineract() {
         if (fineract == null) {
-            // TODO change from Fineract.dev to https://localhost:8443/fineract-provider/api/v1/ after FINERACT-1209
-            String url = System.getProperty("fineract.it.url", "https://demo.fineract.dev/fineract-provider/api/v1/");
-            fineract = FineractClient.builder().baseURL(url).tenant("default").basicAuth("mifos", "password").insecure(true)
+            String url = System.getProperty("fineract.it.url", "https://localhost:8443/fineract-provider/api/v1/");
+            // insecure(true) should *ONLY* ever be used for https://localhost:8443, NOT in real clients!!
+            fineract = FineractClient.builder().insecure(true).baseURL(url).tenant("default").basicAuth("mifos", "password")
                     .logging(Level.NONE).build();
         }
         return fineract;
diff --git a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/OfficeTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/OfficeTest.java
similarity index 68%
rename from fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/OfficeTest.java
rename to integration-tests/src/test/java/org/apache/fineract/integrationtests/client/OfficeTest.java
index ddfe5db..13ecb93 100644
--- a/fineract-client/src/test/java/org/apache/fineract/integrationtests/newstyle/OfficeTest.java
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/OfficeTest.java
@@ -16,9 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.integrationtests.newstyle;
+package org.apache.fineract.integrationtests.client;
 
 import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.List;
+import org.apache.fineract.client.models.GetOfficesResponse;
 import org.apache.fineract.client.models.PostOfficesRequest;
 import org.junit.jupiter.api.Order;
 import org.junit.jupiter.api.Test;
@@ -36,13 +39,15 @@ public class OfficeTest extends IntegrationTest {
         // NB parentId(1) always exists (Head Office)
         // NB name random() because Office Names have to be unique
         // TODO requiring dateFormat(..).locale(..) is dumb :( see https://issues.apache.org/jira/browse/FINERACT-1233
-        assertThat(ok(fineract().offices.createOffice(new PostOfficesRequest().name("TestOffice-" + random()).parentId(1L)
-                .openingDate(LocalDate.now()).dateFormat(dateFormat()).locale("en_US"))).getOfficeId()).isGreaterThan(0);
+        assertThat(ok(fineract().offices.createOffice(new PostOfficesRequest().name("TestOffice_" + random()).parentId(1L)
+                .openingDate(LocalDate.now(ZoneId.of("UTC"))).dateFormat(dateFormat()).locale("en_US"))).getOfficeId()).isGreaterThan(0);
     }
 
     @Test
     @Order(2)
-    void retrieveOneExisting() {
-        assertThat(ok(fineract().offices.retrieveOffices(true, null, null)).size()).isAtLeast(2);
+    void retrieveOneExistingInclDateFormat() { // see FINERACT-1220 re. what this tests re. Date Format
+        List<GetOfficesResponse> response = ok(fineract().offices.retrieveOffices(true, null, null));
+        assertThat(response.size()).isAtLeast(1);
+        assertThat(response.get(0).getOpeningDate()).isNotNull();
     }
 }
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/StaffTest.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/StaffTest.java
new file mode 100644
index 0000000..29a0f8b
--- /dev/null
+++ b/integration-tests/src/test/java/org/apache/fineract/integrationtests/client/StaffTest.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.integrationtests.client;
+
+import java.time.LocalDate;
+import java.time.ZoneId;
+import java.util.Optional;
+import org.apache.fineract.client.models.PostStaffRequest;
+import org.junit.jupiter.api.Order;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Integration Test for /staff API.
+ *
+ * @author Michael Vorburger.ch
+ */
+public class StaffTest extends IntegrationTest {
+
+    @Test
+    @Order(1)
+    void createOne() {
+        assertThat(create()).isGreaterThan(0);
+    }
+
+    @Test
+    @Order(2)
+    void retrieveAnyExisting() {
+        assertThat(retrieveFirst()).isPresent();
+    }
+
+    // The following are not tests, but helpful utilities for other tests
+
+    public Long getStaffId() {
+        return retrieveFirst().orElseGet(this::create);
+    }
+
+    Long create() {
+        return ok(fineract().staff
+                .create3(new PostStaffRequest().officeId(1L).firstname("StaffTest " + random()).lastname("Staffer " + random())
+                        .externalId(random()).joiningDate(LocalDate.now(ZoneId.of("UTC"))).dateFormat(dateFormat()).locale("en_US")))
+                                .getResourceId();
+    }
+
+    Optional<Long> retrieveFirst() {
+        var staff = ok(fineract().staff.retrieveAll16(1L, true, false, "ACTIVE"));
+        if (staff.size() > 0) {
+            return Optional.of((long) staff.get(0).getId());
+        }
+        return Optional.empty();
+    }
+}
diff --git a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ImageHelper.java b/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ImageHelper.java
deleted file mode 100644
index 4a2f0b9..0000000
--- a/integration-tests/src/test/java/org/apache/fineract/integrationtests/common/ImageHelper.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.fineract.integrationtests.common;
-
-import io.restassured.specification.RequestSpecification;
-import io.restassured.specification.ResponseSpecification;
-import org.apache.http.HttpHeaders;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Deprecated // replaced by new ImageTest, can be deleted as FINERACT-1209 is fully implemented
-public final class ImageHelper {
-
-    private ImageHelper() {
-
-    }
-
-    private static final Logger LOG = LoggerFactory.getLogger(ImageHelper.class);
-    private static final String STAFF_IMAGE_URL = "/fineract-provider/api/v1/staff/";
-    private static final String IMAGES_URI = "/images";
-
-    public static Integer createImageForStaff(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
-            Integer staffId) {
-        LOG.info("---------------------------------CREATING AN IMAGE FOR STAFF---------------------------------------------");
-        final String URL = STAFF_IMAGE_URL + staffId + IMAGES_URI + "?" + Utils.TENANT_IDENTIFIER;
-        return Utils.performServerPost(requestSpec, responseSpec, URL, generateImageAsText(), "resourceId");
-    }
-
-    public static Integer updateImageForStaff(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
-            Integer staffId) {
-        LOG.info("---------------------------------UPDATING AN IMAGE FOR STAFF---------------------------------------------");
-        final String URL = STAFF_IMAGE_URL + staffId + IMAGES_URI + "?" + Utils.TENANT_IDENTIFIER;
-        return Utils.performServerPut(requestSpec, responseSpec, URL, generateImageAsText(), "resourceId");
-    }
-
-    public static String getStaffImageAsText(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
-            Integer staffId) {
-        LOG.info("---------------------------------RETRIEVING STAFF IMAGE---------------------------------------------");
-        final String URL = STAFF_IMAGE_URL + staffId + IMAGES_URI + "?" + Utils.TENANT_IDENTIFIER;
-        requestSpec.header(HttpHeaders.ACCEPT, "text/plain");
-        return Utils.performGetTextResponse(requestSpec, responseSpec, URL);
-    }
-
-    public static byte[] getStaffImageAsBinary(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
-            Integer staffId) {
-        LOG.info("---------------------------------RETRIEVING STAFF IMAGE---------------------------------------------");
-        final String URL = STAFF_IMAGE_URL + staffId + IMAGES_URI + "?" + Utils.TENANT_IDENTIFIER;
-        requestSpec.header(HttpHeaders.ACCEPT, "application/octet-stream");
-        return Utils.performGetBinaryResponse(requestSpec, responseSpec, URL);
-    }
-
-    public static Integer deleteStaffImage(final RequestSpecification requestSpec, final ResponseSpecification responseSpec,
-            Integer staffId) {
-        LOG.info("---------------------------------RETRIEVING STAFF IMAGE---------------------------------------------");
-        final String URL = STAFF_IMAGE_URL + staffId + IMAGES_URI + "?" + Utils.TENANT_IDENTIFIER;
-        return Utils.performServerDelete(requestSpec, responseSpec, URL, "resourceId");
-    }
-
-    public static String generateImageAsText() {
-        return "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ\r\n"
-                + "bWFnZVJlYWR5ccllPAAAAJ1JREFUeNpi+P//PwMIA4E9EG8E4idQDGLbw+WhiiqA+D8OXAFVAzbp\r\n"
-                + "DxBvB2JLIGaGYkuoGEjOhhFIHAbij0BdPgxYACMj42ogJQpifwBiXSDeC8JIbt4LxSC5DyxQjTeB\r\n"
-                + "+BeaYb+Q5EBOAVutCzMJHUNNPADzzDokiYdAfAmJvwLkGeTgWQfyKZICS6hYBTwc0QL8ORSjBDhA\r\n" + "gAEAOg13B6R/SAgAAAAASUVORK5CYII=";
-    }
-}
diff --git a/fineract-client/src/test/resources/michael.vorburger-crepes.jpg b/integration-tests/src/test/resources/michael.vorburger-crepes.jpg
similarity index 100%
rename from fineract-client/src/test/resources/michael.vorburger-crepes.jpg
rename to integration-tests/src/test/resources/michael.vorburger-crepes.jpg