convert build.gradle to build.gradle.kts (#171)
Co-authored-by: Michael Hoennig <michael@hoennig.de> Reviewed-on: https://dev.hostsharing.net/hostsharing/hs.hsadmin.ng/pulls/171 Reviewed-by: Marc Sandlus <marc.sandlus@hostsharing.net>
This commit is contained in:
		
							
								
								
									
										20
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								README.md
									
									
									
									
									
								
							| @@ -315,7 +315,7 @@ If you have figured out how it works, please add instructions above this section | |||||||
| ##### Build Settings | ##### Build Settings | ||||||
|  |  | ||||||
| Go to [Gradle Settings}(jetbrains://idea/settings?name=Build%2C+Execution%2C+Deployment--Build+Tools--Gradle) and select "Build and run using" and "Run tests using" both to "gradle". | Go to [Gradle Settings}(jetbrains://idea/settings?name=Build%2C+Execution%2C+Deployment--Build+Tools--Gradle) and select "Build and run using" and "Run tests using" both to "gradle". | ||||||
| Otherwise, settings from `build.gradle`, like compiler arguments, are not applied when compiling through *IntelliJ IDEA*. | Otherwise, settings from `build.gradle.kts`, like compiler arguments, are not applied when compiling through *IntelliJ IDEA*. | ||||||
|  |  | ||||||
| ##### Annotation Processor | ##### Annotation Processor | ||||||
|  |  | ||||||
| @@ -368,8 +368,8 @@ You can explore the prototype as follows: | |||||||
| `build/` | `build/` | ||||||
|     Output directory for gradle build results. Ignored by git. |     Output directory for gradle build results. Ignored by git. | ||||||
|  |  | ||||||
| `build.gradle` | `build.gradle.kts` | ||||||
|     Gradle build-file. Contains dependencies and build configurations. |     Gradle build-file (Kotlin-Script). Contains dependencies and build configurations. | ||||||
|  |  | ||||||
| `doc/` | `doc/` | ||||||
|     Contains project documentation. |     Contains project documentation. | ||||||
| @@ -503,7 +503,7 @@ gw jacocoTestReport | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| This task is also automatically run after `gw test`. | This task is also automatically run after `gw test`. | ||||||
| It is configured in [build.gradle](build.gradle). | It is configured in [build.gradle.kts](build.gradle.kts). | ||||||
|  |  | ||||||
| A report is generated under [build/reports/jacoco/tests/test/index.html](./build/reports/jacoco/test/html/index.html). | A report is generated under [build/reports/jacoco/tests/test/index.html](./build/reports/jacoco/test/html/index.html). | ||||||
|  |  | ||||||
| @@ -525,7 +525,7 @@ It can be executed with: | |||||||
| gw pitest | gw pitest | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| Classes to be scanned, tests to be executed and thresholds are configured in [build.gradle](build.gradle). | Classes to be scanned, tests to be executed and thresholds are configured in [build.gradle.kts](build.gradle.kts). | ||||||
|  |  | ||||||
| A report is generated under [build/reports/pitest/index.html](./build/reports/pitest/index.html). | A report is generated under [build/reports/pitest/index.html](./build/reports/pitest/index.html). | ||||||
| A link to the report is also printed after the `pitest` run. | A link to the report is also printed after the `pitest` run. | ||||||
| @@ -561,7 +561,7 @@ gw dependencyCheckAnalyze | |||||||
| ``` | ``` | ||||||
|  |  | ||||||
| This task is also included in `gw build` and `gw check`. | This task is also included in `gw build` and `gw check`. | ||||||
| It is configured in [build.gradle](build.gradle). | It is configured in [build.gradle.kts](build.gradle.kts). | ||||||
|  |  | ||||||
| Often vulnerability reports don't apply to our use cases. | Often vulnerability reports don't apply to our use cases. | ||||||
| Therefore, reports can be [suppressed](./etc/owasp-dependency-check-suppression.xml). | Therefore, reports can be [suppressed](./etc/owasp-dependency-check-suppression.xml). | ||||||
| @@ -663,7 +663,7 @@ howto | |||||||
| Add `--args='--spring.profiles.active=...` with the wanted profile selector: | Add `--args='--spring.profiles.active=...` with the wanted profile selector: | ||||||
|  |  | ||||||
| ```sh | ```sh | ||||||
| gw bootRun --args='--spring.profiles.active=external-db,only-office,without-test-data' | gw bootRun --args='--spring.profiles.active=fakeCasAuthenticator,external-db,only-office,without-test-data' | ||||||
| ``` | ``` | ||||||
|  |  | ||||||
| These profiles mean: | These profiles mean: | ||||||
| @@ -837,6 +837,12 @@ By default, `gw bootRun` starts the application on port 8080. | |||||||
| This port can be changed in | This port can be changed in | ||||||
| [src/main/resources/application.yml](src/main/resources/application.yml) through the property `server.port`. | [src/main/resources/application.yml](src/main/resources/application.yml) through the property `server.port`. | ||||||
|  |  | ||||||
|  | Or on the command line, add ` --server.port=...` to the `--args` parameter of the `bootRun` task, e.g.: | ||||||
|  |  | ||||||
|  | ```sh | ||||||
|  | gw bootRun --args='--spring.profiles.active=dev,fakeCasAuthenticator,complete,test-data --server.port=8888' | ||||||
|  | ``` | ||||||
|  |  | ||||||
| ### How to Use a Persistent Database for Integration Tests? | ### How to Use a Persistent Database for Integration Tests? | ||||||
|  |  | ||||||
| Usually, the `DataJpaTest` integration tests run against a database in a temporary docker container. | Usually, the `DataJpaTest` integration tests run against a database in a temporary docker container. | ||||||
|   | |||||||
							
								
								
									
										514
									
								
								build.gradle
									
									
									
									
									
								
							
							
						
						
									
										514
									
								
								build.gradle
									
									
									
									
									
								
							| @@ -1,514 +0,0 @@ | |||||||
| plugins { |  | ||||||
|     id 'java' |  | ||||||
|     id 'org.springframework.boot' version '3.4.2' |  | ||||||
|     id 'io.spring.dependency-management' version '1.1.7'        // manages implicit dependencies |  | ||||||
|     id 'io.openapiprocessor.openapi-processor' version '2023.2' // generates Controller-interface and resources from API-spec |  | ||||||
|     id 'com.github.jk1.dependency-license-report' version '2.9' // checks dependency-license compatibility |  | ||||||
|     id "org.owasp.dependencycheck" version "12.0.1"             // checks dependencies for known vulnerabilities |  | ||||||
|     id "com.diffplug.spotless" version "7.0.2"                  // formats + checks formatting for source-code |  | ||||||
|     id 'jacoco'                                                 // determines code-coverage of tests |  | ||||||
|     id 'info.solidsoft.pitest' version '1.15.0'                 // performs mutation testing |  | ||||||
|     id 'se.patrikerdes.use-latest-versions' version '0.2.18'    // updates module and plugin versions |  | ||||||
|     id 'com.github.ben-manes.versions' version '0.52.0'         // determines which dependencies have updates |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HOWTO: find out which dependency versions are managed by Spring Boot: |  | ||||||
| //  https://docs.spring.io/spring-boot/appendix/dependency-versions/coordinates.html |  | ||||||
|  |  | ||||||
| group = 'net.hostsharing' |  | ||||||
| version = '0.0.1-SNAPSHOT' |  | ||||||
|  |  | ||||||
| wrapper { |  | ||||||
|     distributionType = Wrapper.DistributionType.BIN |  | ||||||
|     gradleVersion = '8.5' |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // TODO.impl: self-attaching is deprecated, see: |  | ||||||
| //  https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3 |  | ||||||
|  |  | ||||||
| configurations { |  | ||||||
|     compileOnly { |  | ||||||
|         extendsFrom annotationProcessor |  | ||||||
|     } |  | ||||||
|     testCompile { |  | ||||||
|         extendsFrom testAnnotationProcessor |  | ||||||
|  |  | ||||||
|         // Only JUNit 5 (Jupiter) should be used at compile time. |  | ||||||
|         // For runtime it's still needed by testcontainers, though. |  | ||||||
|         exclude group: 'junit', module: 'junit' |  | ||||||
|         exclude group: 'org.junit.vintage', module: 'junit-vintage-engine' |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| repositories { |  | ||||||
|     mavenCentral() |  | ||||||
|     maven { url 'https://repo.spring.io/milestone' } |  | ||||||
|     maven { url 'https://repo.spring.io/snapshot' } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| java { |  | ||||||
|     toolchain { |  | ||||||
|         languageVersion = JavaLanguageVersion.of(21) |  | ||||||
|         vendor = JvmVendorSpec.ADOPTIUM |  | ||||||
|         implementation = JvmImplementation.VENDOR_SPECIFIC |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| ext { |  | ||||||
|     set('testcontainersVersion', "1.17.3") |  | ||||||
| } |  | ||||||
|  |  | ||||||
| dependencies { |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-data-jpa' |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-data-rest' |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-jdbc' |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-web' |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-validation' |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-actuator' |  | ||||||
|     implementation 'org.springframework.boot:spring-boot-starter-security' |  | ||||||
|     implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.5' |  | ||||||
|     implementation 'com.github.gavlyukovskiy:datasource-proxy-spring-boot-starter:1.10.0' |  | ||||||
|     implementation 'org.postgresql:postgresql' |  | ||||||
|     implementation 'org.liquibase:liquibase-core' |  | ||||||
|     implementation 'io.hypersistence:hypersistence-utils-hibernate-63:3.9.0' |  | ||||||
|     implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310' |  | ||||||
|     implementation 'org.openapitools:jackson-databind-nullable:0.2.6' |  | ||||||
|     implementation 'org.apache.commons:commons-text:1.13.0' |  | ||||||
|     implementation 'net.java.dev.jna:jna:5.16.0' |  | ||||||
|     implementation 'org.modelmapper:modelmapper:3.2.2' |  | ||||||
|     implementation 'org.iban4j:iban4j:3.2.10-RELEASE' |  | ||||||
|     implementation 'org.reflections:reflections:0.10.2' |  | ||||||
|  |  | ||||||
|     compileOnly 'org.projectlombok:lombok' |  | ||||||
|     testCompileOnly 'org.projectlombok:lombok' |  | ||||||
|  |  | ||||||
|     // TODO.impl: version conflict with SpringDoc, check later and re-enable if fixed |  | ||||||
|     // developmentOnly 'org.springframework.boot:spring-boot-devtools' |  | ||||||
|  |  | ||||||
|     annotationProcessor 'org.projectlombok:lombok' |  | ||||||
|     testAnnotationProcessor 'org.projectlombok:lombok' |  | ||||||
|  |  | ||||||
|     testImplementation 'org.springframework.boot:spring-boot-starter-test' |  | ||||||
|     testImplementation 'org.testcontainers:testcontainers' |  | ||||||
|     testImplementation 'org.testcontainers:junit-jupiter' |  | ||||||
|     testImplementation 'org.junit.jupiter:junit-jupiter' |  | ||||||
|     testImplementation 'org.testcontainers:postgresql' |  | ||||||
|     testImplementation 'com.tngtech.archunit:archunit-junit5:1.3.0' |  | ||||||
|     testImplementation 'io.rest-assured:spring-mock-mvc' |  | ||||||
|     testImplementation 'org.hamcrest:hamcrest-core' |  | ||||||
|     testImplementation 'org.pitest:pitest-junit5-plugin:1.2.1' |  | ||||||
|     testImplementation 'org.junit.jupiter:junit-jupiter-api' |  | ||||||
|     testImplementation 'org.wiremock:wiremock-standalone:3.10.0' |  | ||||||
| } |  | ||||||
|  |  | ||||||
| dependencyManagement { |  | ||||||
|     imports { |  | ||||||
|         mavenBom "org.testcontainers:testcontainers-bom:${testcontainersVersion}" |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Java Compiler Options |  | ||||||
| tasks.withType(JavaCompile) { |  | ||||||
|     options.compilerArgs += [ |  | ||||||
|             "-parameters" // keep parameter names => no need for @Param for SpringData |  | ||||||
|     ] |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // Configure tests |  | ||||||
| tasks.named('test') { |  | ||||||
|     useJUnitPlatform() |  | ||||||
|     jvmArgs '-Duser.language=en' |  | ||||||
|     jvmArgs '-Duser.country=US' |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // OpenAPI Source Code Generation |  | ||||||
| openapiProcessor { |  | ||||||
|     springRoot { |  | ||||||
|         processorName 'spring' |  | ||||||
|         processor 'io.openapiprocessor:openapi-processor-spring:2022.5' |  | ||||||
|         apiPath "$projectDir/src/main/resources/api-definition/api-definition.yaml" |  | ||||||
|         mapping "$projectDir/src/main/resources/api-definition/api-mappings.yaml" |  | ||||||
|         targetDir "$buildDir/generated/sources/openapi-javax" |  | ||||||
|         showWarnings true |  | ||||||
|         openApiNullable true |  | ||||||
|     } |  | ||||||
|     springRbac { |  | ||||||
|         processorName 'spring' |  | ||||||
|         processor 'io.openapiprocessor:openapi-processor-spring:2022.5' |  | ||||||
|         apiPath "$projectDir/src/main/resources/api-definition/rbac/rbac.yaml" |  | ||||||
|         mapping "$projectDir/src/main/resources/api-definition/rbac/api-mappings.yaml" |  | ||||||
|         targetDir "$buildDir/generated/sources/openapi-javax" |  | ||||||
|         showWarnings true |  | ||||||
|         openApiNullable true |  | ||||||
|     } |  | ||||||
|     springTest { |  | ||||||
|         processorName 'spring' |  | ||||||
|         processor 'io.openapiprocessor:openapi-processor-spring:2022.5' |  | ||||||
|         apiPath "$projectDir/src/main/resources/api-definition/test/test.yaml" |  | ||||||
|         mapping "$projectDir/src/main/resources/api-definition/test/api-mappings.yaml" |  | ||||||
|         targetDir "$buildDir/generated/sources/openapi-javax" |  | ||||||
|         showWarnings true |  | ||||||
|         openApiNullable true |  | ||||||
|     } |  | ||||||
|     springHsOffice { |  | ||||||
|         processorName 'spring' |  | ||||||
|         processor 'io.openapiprocessor:openapi-processor-spring:2022.5' |  | ||||||
|         apiPath "$projectDir/src/main/resources/api-definition/hs-office/hs-office.yaml" |  | ||||||
|         mapping "$projectDir/src/main/resources/api-definition/hs-office/api-mappings.yaml" |  | ||||||
|         targetDir "$buildDir/generated/sources/openapi-javax" |  | ||||||
|         showWarnings true |  | ||||||
|         openApiNullable true |  | ||||||
|     } |  | ||||||
|     springHsBooking { |  | ||||||
|         processorName 'spring' |  | ||||||
|         processor 'io.openapiprocessor:openapi-processor-spring:2022.5' |  | ||||||
|         apiPath "$projectDir/src/main/resources/api-definition/hs-booking/hs-booking.yaml" |  | ||||||
|         mapping "$projectDir/src/main/resources/api-definition/hs-booking/api-mappings.yaml" |  | ||||||
|         targetDir "$buildDir/generated/sources/openapi-javax" |  | ||||||
|         showWarnings true |  | ||||||
|         openApiNullable true |  | ||||||
|     } |  | ||||||
|     springHsHosting { |  | ||||||
|         processorName 'spring' |  | ||||||
|         processor 'io.openapiprocessor:openapi-processor-spring:2022.5' |  | ||||||
|         apiPath "$projectDir/src/main/resources/api-definition/hs-hosting/hs-hosting.yaml" |  | ||||||
|         mapping "$projectDir/src/main/resources/api-definition/hs-hosting/api-mappings.yaml" |  | ||||||
|         targetDir "$buildDir/generated/sources/openapi-javax" |  | ||||||
|         showWarnings true |  | ||||||
|         openApiNullable true |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| sourceSets.main.java.srcDir 'build/generated/sources/openapi' |  | ||||||
|  |  | ||||||
| abstract class ProcessSpring extends DefaultTask {} |  | ||||||
|  |  | ||||||
| tasks.register('processSpring', ProcessSpring) |  | ||||||
| ['processSpringRoot', |  | ||||||
|  'processSpringRbac', |  | ||||||
|  'processSpringTest', |  | ||||||
|  'processSpringHsOffice', |  | ||||||
|  'processSpringHsBooking', |  | ||||||
|  'processSpringHsHosting' |  | ||||||
| ].each { |  | ||||||
|     project.tasks.processSpring.dependsOn it |  | ||||||
| } |  | ||||||
| project.tasks.processResources.dependsOn processSpring |  | ||||||
| project.tasks.compileJava.dependsOn processSpring |  | ||||||
|  |  | ||||||
| // Rename javax to jakarta in OpenApi generated java files because |  | ||||||
| // io.openapiprocessor.openapi-processor 2022.5 does not yet support the openapiprocessor useSpringBoot3 config option. |  | ||||||
| // TODO.impl: Upgrade to io.openapiprocessor.openapi-processor >= 2024.2 |  | ||||||
| //  and use either `bean-validation: true` in api-mapping.yaml or `useSpringBoot3 true` (not sure where exactly). |  | ||||||
| task openApiGenerate(type: Copy) { |  | ||||||
|     from "$buildDir/generated/sources/openapi-javax" |  | ||||||
|     into "$buildDir/generated/sources/openapi" |  | ||||||
|     filter { line -> line.replaceAll('javax', 'jakarta') } |  | ||||||
| } |  | ||||||
| compileJava.source "$buildDir/generated/sources/openapi" |  | ||||||
| compileJava.dependsOn openApiGenerate |  | ||||||
| openApiGenerate.dependsOn processSpring |  | ||||||
|  |  | ||||||
| // Spotless Code Formatting |  | ||||||
| spotless { |  | ||||||
|     java { |  | ||||||
|         removeUnusedImports() |  | ||||||
|         leadingTabsToSpaces(4) |  | ||||||
|         endWithNewline() |  | ||||||
|         toggleOffOn() |  | ||||||
|  |  | ||||||
|         target fileTree(rootDir) { |  | ||||||
|             include '**/*.java' |  | ||||||
|             exclude '**/generated/**/*.java' |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| project.tasks.check.dependsOn(spotlessCheck) |  | ||||||
| // HACK: no idea why spotless uses the output of these tasks, but we get warnings without those |  | ||||||
| project.tasks.spotlessJava.dependsOn( |  | ||||||
|         tasks.generateLicenseReport, |  | ||||||
|         // tasks.pitest, TODO.test: PiTest currently does not work, needs to be fixed |  | ||||||
|         tasks.jacocoTestReport, |  | ||||||
|         tasks.processResources, |  | ||||||
|         tasks.processTestResources) |  | ||||||
|  |  | ||||||
| // OWASP Dependency Security Test |  | ||||||
| dependencyCheck { |  | ||||||
|     nvd { |  | ||||||
|         apiKey = project.properties['OWASP_API_KEY'] // set it in ~/.gradle/gradle.properties |  | ||||||
|         delay = 16000 |  | ||||||
|     } |  | ||||||
|     format = 'ALL' |  | ||||||
|     suppressionFile = 'etc/owasp-dependency-check-suppression.xml' |  | ||||||
|     failOnError = true |  | ||||||
|     failBuildOnCVSS = 5 |  | ||||||
| } |  | ||||||
| project.tasks.check.dependsOn(dependencyCheckAnalyze) |  | ||||||
| project.tasks.dependencyCheckAnalyze.doFirst { // Why not doLast? See README.md! |  | ||||||
|     println "OWASP Dependency Security Report: file:///${project.rootDir}/build/reports/dependency-check-report.html" |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // License Check |  | ||||||
| licenseReport { |  | ||||||
|     excludeBoms = true |  | ||||||
|     allowedLicensesFile = new File("$projectDir/etc/allowed-licenses.json") |  | ||||||
| } |  | ||||||
| project.tasks.check.dependsOn(checkLicense) |  | ||||||
|  |  | ||||||
| // HOWTO: run all tests except import- and scenario-tests: gw test |  | ||||||
| test { |  | ||||||
|     finalizedBy jacocoTestReport // generate report after tests |  | ||||||
|     excludes = [ |  | ||||||
|             'net.hostsharing.hsadminng.**.generated.**', |  | ||||||
|     ] |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         excludeTags 'importHostingAssets', 'scenarioTest' |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // JaCoCo Test Code Coverage for unit-tests |  | ||||||
| jacoco { |  | ||||||
|     toolVersion = "0.8.10" |  | ||||||
| } |  | ||||||
| jacocoTestReport { |  | ||||||
|     dependsOn test |  | ||||||
|     afterEvaluate { |  | ||||||
|         classDirectories.setFrom(files(classDirectories.files.collect { |  | ||||||
|             fileTree(dir: it, exclude: [ |  | ||||||
|                     "net/hostsharing/hsadminng/**/generated/**/*.class", |  | ||||||
|                     "net/hostsharing/hsadminng/hs/HsadminNgApplication.class" |  | ||||||
|             ]) |  | ||||||
|         })) |  | ||||||
|     } |  | ||||||
|     doFirst { // Why not doLast? See README.md! |  | ||||||
|         println "HTML Jacoco Test Code Coverage Report: file://${reports.html.outputLocation.get()}/index.html" |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| project.tasks.check.dependsOn(jacocoTestCoverageVerification) |  | ||||||
| jacocoTestCoverageVerification { |  | ||||||
|     violationRules { |  | ||||||
|         rule { |  | ||||||
|             limit { |  | ||||||
|                 minimum = 0.80 // TODO.test: improve instruction coverage |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // element: PACKAGE, BUNDLE, CLASS, SOURCEFILE or METHOD |  | ||||||
|         // counter:  INSTRUCTION, BRANCH, LINE, COMPLEXITY, METHOD, or CLASS |  | ||||||
|         // value: TOTALCOUNT, COVEREDCOUNT, MISSEDCOUNT, COVEREDRATIO or MISSEDRATIO |  | ||||||
|  |  | ||||||
|         rule { |  | ||||||
|             element = 'CLASS' |  | ||||||
|             excludes = [ |  | ||||||
|                     'net.hostsharing.hsadminng.**.generated.**', |  | ||||||
|                     'net.hostsharing.hsadminng.rbac.test.dom.TestDomainEntity', |  | ||||||
|                     'net.hostsharing.hsadminng.HsadminNgApplication', |  | ||||||
|                     'net.hostsharing.hsadminng.ping.PingController', |  | ||||||
|                     'net.hostsharing.hsadminng.rbac.generator.*', |  | ||||||
|                     'net.hostsharing.hsadminng.rbac.grant.RbacGrantsDiagramService', |  | ||||||
|                     'net.hostsharing.hsadminng.rbac.grant.RbacGrantsDiagramService.Node', |  | ||||||
|                     'net.hostsharing.hsadminng.**.*Repository', |  | ||||||
|                     'net.hostsharing.hsadminng.mapper.Mapper' |  | ||||||
|             ] |  | ||||||
|  |  | ||||||
|             limit { |  | ||||||
|                 counter = 'LINE' |  | ||||||
|                 value = 'COVEREDRATIO' |  | ||||||
|                 minimum = 0.75 // TODO.test: improve line coverage |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         rule { |  | ||||||
|             element = 'METHOD' |  | ||||||
|             excludes = [ |  | ||||||
|                     'net.hostsharing.hsadminng.**.generated.**', |  | ||||||
|                     'net.hostsharing.hsadminng.HsadminNgApplication.main', |  | ||||||
|                     'net.hostsharing.hsadminng.ping.PingController.*' |  | ||||||
|             ] |  | ||||||
|  |  | ||||||
|             limit { |  | ||||||
|                 counter = 'BRANCH' |  | ||||||
|                 value = 'COVEREDRATIO' |  | ||||||
|                 minimum = 0.00 // TODO.test: improve branch coverage |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HOWTO: run all unit-tests which don't need a database: gw-test unitTest |  | ||||||
| tasks.register('unitTest', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         excludeTags 'importHostingAssets', 'scenarioTest', 'generalIntegrationTest', |  | ||||||
|                 'officeIntegrationTest', 'bookingIntegrationTest', 'hostingIntegrationTest' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'runs all unit-tests which do not need a database' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HOWTO: run all integration tests which are not specific to a module, like base, rbac, config etc. |  | ||||||
| tasks.register('generalIntegrationTest', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         includeTags 'generalIntegrationTest' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'runs integration tests which are not specific to a module, like base, rbac, config etc.' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HOWTO: run all integration tests of the office module: gw-test officeIntegrationTest |  | ||||||
| tasks.register('officeIntegrationTest', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         includeTags 'officeIntegrationTest' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'runs integration tests of the office module' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HOWTO: run all integration tests of the booking module: gw-test bookingIntegrationTest |  | ||||||
| tasks.register('bookingIntegrationTest', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         includeTags 'bookingIntegrationTest' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'runs integration tests of the booking module' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // HOWTO: run all integration tests of the hosting module: gw-test hostingIntegrationTest |  | ||||||
| tasks.register('hostingIntegrationTest', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         includeTags 'hostingIntegrationTest' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'runs integration tests of the hosting module' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| tasks.register('importHostingAssets', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         includeTags 'importHostingAssets' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'run the import jobs as tests' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| tasks.register('scenarioTest', Test) { |  | ||||||
|     useJUnitPlatform { |  | ||||||
|         includeTags 'scenarioTest' |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     group 'verification' |  | ||||||
|     description 'run the import jobs as tests' |  | ||||||
|  |  | ||||||
|     mustRunAfter spotlessJava |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // pitest mutation testing |  | ||||||
| pitest { |  | ||||||
|     targetClasses = ['net.hostsharing.hsadminng.**'] |  | ||||||
|     excludedClasses = [ |  | ||||||
|             'net.hostsharing.hsadminng.config.**', |  | ||||||
|             // 'net.hostsharing.hsadminng.**.*Controller', |  | ||||||
|             'net.hostsharing.hsadminng.**.generated.**' |  | ||||||
|     ] |  | ||||||
|  |  | ||||||
|     targetTests = ['net.hostsharing.hsadminng.**.*UnitTest', 'net.hostsharing.hsadminng.**.*RestTest'] |  | ||||||
|     excludedTestClasses = ['**AcceptanceTest*', '**IntegrationTest*', '**ImportHostingAssets'] |  | ||||||
|  |  | ||||||
|     pitestVersion = '1.17.0' |  | ||||||
|     junit5PluginVersion = '1.1.0' |  | ||||||
|  |  | ||||||
|     threads = 4 |  | ||||||
|  |  | ||||||
|     // As Java unit tests are pretty pointless in our case, this maybe makes not much sense. |  | ||||||
|     mutationThreshold = 71 |  | ||||||
|     coverageThreshold = 57 |  | ||||||
|     testStrengthThreshold = 87 |  | ||||||
|  |  | ||||||
|     outputFormats = ['XML', 'HTML'] |  | ||||||
|     timestampedReports = false |  | ||||||
| } |  | ||||||
| // project.tasks.check.dependsOn(project.tasks.pitest) TODO.test: PiTest currently does not work, needs to be fixed |  | ||||||
| project.tasks.pitest.doFirst { // Why not doLast? See README.md! |  | ||||||
|     println "PiTest Mutation Report: file:///${project.rootDir}/build/reports/pitest/index.html" |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // Dependency Versions Upgrade |  | ||||||
| useLatestVersions { |  | ||||||
|     finalizedBy check |  | ||||||
| } |  | ||||||
|  |  | ||||||
| def isNonStable = { String version -> |  | ||||||
|     def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { it -> version.toUpperCase().contains(it) } |  | ||||||
|     def regex = /^[0-9,.v-]+(-r)?$/ |  | ||||||
|     return !stableKeyword && !(version ==~ regex) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| tasks.named("dependencyUpdates").configure { |  | ||||||
|     rejectVersionIf { |  | ||||||
|         isNonStable(it.candidate.version) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
|  |  | ||||||
|  |  | ||||||
| // Generate HTML from Markdown scenario-test-reports using Pandoc: |  | ||||||
| tasks.register('convertMarkdownToHtml') { |  | ||||||
|     description = 'Generates HTML from Markdown scenario-test-reports using Pandoc.' |  | ||||||
|     group = 'Conversion' |  | ||||||
|  |  | ||||||
|     // Define the template file and input directory |  | ||||||
|     def templateFile = file('doc/scenarios/.template.html') |  | ||||||
|  |  | ||||||
|     // Task configuration and execution |  | ||||||
|     doFirst { |  | ||||||
|         // Check if pandoc is installed |  | ||||||
|         try { |  | ||||||
|             exec { |  | ||||||
|                 commandLine 'pandoc', '--version' |  | ||||||
|             } |  | ||||||
|         } catch (Exception) { |  | ||||||
|             throw new GradleException("Pandoc is not installed or not found in the system path.") |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         // Check if the template file exists |  | ||||||
|         if (!templateFile.exists()) { |  | ||||||
|             throw new GradleException("Template file 'doc/scenarios/.template.html' not found.") |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     doLast { |  | ||||||
|         // Gather all Markdown files in the current directory |  | ||||||
|         fileTree(dir: '.', include: 'build/doc/scenarios/*.md').each { file -> |  | ||||||
|             // Corrected way to create the output file path |  | ||||||
|             def outputFile = new File(file.parent, file.name.replaceAll(/\.md$/, '.html')) |  | ||||||
|  |  | ||||||
|             // Execute pandoc for each markdown file |  | ||||||
|             exec { |  | ||||||
|                 commandLine 'pandoc', file.absolutePath, '--template', templateFile.absolutePath, '-o', outputFile.absolutePath |  | ||||||
|             } |  | ||||||
|  |  | ||||||
|             println "Converted ${file.name} to ${outputFile.name}" |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| convertMarkdownToHtml.dependsOn scenarioTest |  | ||||||
|  |  | ||||||
| // shortcut for compiling all files |  | ||||||
| tasks.register('compile') { |  | ||||||
|     dependsOn 'compileJava', 'compileTestJava' |  | ||||||
| } |  | ||||||
							
								
								
									
										632
									
								
								build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										632
									
								
								build.gradle.kts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,632 @@ | |||||||
|  | import com.github.jk1.license.render.ReportRenderer | ||||||
|  | import com.github.jk1.license.render.InventoryHtmlReportRenderer | ||||||
|  | import com.github.jk1.license.filter.DependencyFilter | ||||||
|  | import com.github.jk1.license.filter.LicenseBundleNormalizer | ||||||
|  | import org.gradle.kotlin.dsl.* | ||||||
|  | import com.diffplug.gradle.spotless.SpotlessExtension | ||||||
|  | import info.solidsoft.gradle.pitest.PitestPluginExtension | ||||||
|  | import org.gradle.api.tasks.testing.Test | ||||||
|  | import org.gradle.api.tasks.Copy | ||||||
|  | import org.owasp.dependencycheck.gradle.extension.DependencyCheckExtension | ||||||
|  | import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask | ||||||
|  | import java.io.File | ||||||
|  | import org.gradle.api.GradleException | ||||||
|  | import org.gradle.api.tasks.compile.JavaCompile | ||||||
|  | import org.gradle.jvm.toolchain.JavaLanguageVersion | ||||||
|  | import org.gradle.jvm.toolchain.JvmVendorSpec | ||||||
|  | import org.gradle.jvm.toolchain.JvmImplementation | ||||||
|  | import io.spring.gradle.dependencymanagement.dsl.DependencyManagementExtension | ||||||
|  | import org.gradle.testing.jacoco.tasks.JacocoReport | ||||||
|  | import org.gradle.testing.jacoco.tasks.JacocoCoverageVerification | ||||||
|  | import org.gradle.api.tasks.wrapper.Wrapper | ||||||
|  | import java.io.FileOutputStream | ||||||
|  |  | ||||||
|  | // Import specific license report task/extension if needed (adjust class name if necessary) | ||||||
|  | // import com.github.jk1.gradle.license.LicenseReportExtension | ||||||
|  | // import com.github.jk1.gradle.license.LicenseReportTask | ||||||
|  |  | ||||||
|  | plugins { | ||||||
|  |     java | ||||||
|  |     id("org.springframework.boot") version "3.4.4" | ||||||
|  |     id("io.spring.dependency-management") version "1.1.7"        // manages implicit dependencies | ||||||
|  |     id("io.openapiprocessor.openapi-processor") version "2023.2" // generates Controller-interface and resources from API-spec | ||||||
|  |     id("com.github.jk1.dependency-license-report") version "2.9" // checks dependency-license compatibility | ||||||
|  |     id("org.owasp.dependencycheck") version "12.1.1"             // checks dependencies for known vulnerabilities | ||||||
|  |     id("com.diffplug.spotless") version "7.0.2"                  // formats + checks formatting for source-code | ||||||
|  |     jacoco                                                       // determines code-coverage of tests | ||||||
|  |     id("info.solidsoft.pitest") version "1.15.0"                 // performs mutation testing | ||||||
|  |     id("se.patrikerdes.use-latest-versions") version "0.2.18"    // updates module and plugin versions | ||||||
|  |     id("com.github.ben-manes.versions") version "0.52.0"         // determines which dependencies have updates | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HOWTO: find out which dependency versions are managed by Spring Boot: | ||||||
|  | //  https://docs.spring.io/spring-boot/appendix/dependency-versions/coordinates.html | ||||||
|  |  | ||||||
|  | group = "net.hostsharing" | ||||||
|  | version = "0.0.1-SNAPSHOT" | ||||||
|  |  | ||||||
|  | tasks.named<Wrapper>("wrapper") { | ||||||
|  |     distributionType = Wrapper.DistributionType.BIN | ||||||
|  |     gradleVersion = "8.5" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // TODO.impl: self-attaching is deprecated, see: | ||||||
|  | //  https://javadoc.io/doc/org.mockito/mockito-core/latest/org/mockito/Mockito.html#0.3 | ||||||
|  |  | ||||||
|  | configurations { | ||||||
|  |     compileOnly { | ||||||
|  |         extendsFrom(configurations.annotationProcessor.get()) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     // Only JUnit 5 (Jupiter) should be used at compile time. | ||||||
|  |     // TODO.test: For runtime, JUnit 4 is still needed by testcontainers < v2, which is not released yet. | ||||||
|  |     // testCompileOnly { | ||||||
|  |     //     exclude(group = "junit", module = "junit") | ||||||
|  |     //     exclude(group = "org.junit.vintage", module = "junit-vintage-engine") | ||||||
|  |     // } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | repositories { | ||||||
|  |     mavenCentral() | ||||||
|  |     maven { url = uri("https://repo.spring.io/milestone") } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | java { | ||||||
|  |     toolchain { | ||||||
|  |         languageVersion.set(JavaLanguageVersion.of(21)) | ||||||
|  |         vendor.set(JvmVendorSpec.ADOPTIUM) | ||||||
|  |         implementation.set(JvmImplementation.VENDOR_SPECIFIC) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Use extra properties delegate for type safety | ||||||
|  | val testcontainersVersion by extra("1.20.6") | ||||||
|  |  | ||||||
|  | dependencies { | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-data-jpa") | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-data-rest") | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-jdbc") | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-web") | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-validation") | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-actuator") | ||||||
|  |     implementation("org.springframework.boot:spring-boot-starter-security") | ||||||
|  |     implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6") | ||||||
|  |     implementation("com.github.gavlyukovskiy:datasource-proxy-spring-boot-starter:1.11.0") | ||||||
|  |     implementation("org.postgresql:postgresql") | ||||||
|  |     implementation("org.liquibase:liquibase-core") | ||||||
|  |     implementation("io.hypersistence:hypersistence-utils-hibernate-63:3.9.9") | ||||||
|  |     implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310") | ||||||
|  |     implementation("org.openapitools:jackson-databind-nullable:0.2.6") | ||||||
|  |     implementation("org.apache.commons:commons-text:1.13.0") | ||||||
|  |     implementation("net.java.dev.jna:jna:5.17.0") | ||||||
|  |     implementation("org.modelmapper:modelmapper:3.2.2") | ||||||
|  |     implementation("org.iban4j:iban4j:3.2.11-RELEASE") | ||||||
|  |     implementation("org.reflections:reflections:0.10.2") | ||||||
|  |  | ||||||
|  |     compileOnly("org.projectlombok:lombok") | ||||||
|  |     testCompileOnly("org.projectlombok:lombok") | ||||||
|  |  | ||||||
|  |     developmentOnly("org.springframework.boot:spring-boot-devtools") | ||||||
|  |  | ||||||
|  |     annotationProcessor("org.projectlombok:lombok") | ||||||
|  |     testAnnotationProcessor("org.projectlombok:lombok") | ||||||
|  |  | ||||||
|  |     testImplementation("org.springframework.boot:spring-boot-starter-test") | ||||||
|  |     testImplementation("org.testcontainers:testcontainers") | ||||||
|  |     testImplementation("org.testcontainers:junit-jupiter") | ||||||
|  |     testImplementation("org.junit.jupiter:junit-jupiter") | ||||||
|  |     testImplementation("org.testcontainers:postgresql") | ||||||
|  |     testImplementation("com.tngtech.archunit:archunit-junit5:1.4.0") | ||||||
|  |     testImplementation("io.rest-assured:spring-mock-mvc") | ||||||
|  |     testImplementation("org.hamcrest:hamcrest-core") | ||||||
|  |     testImplementation("org.pitest:pitest-junit5-plugin:1.2.2") | ||||||
|  |     testImplementation("org.junit.jupiter:junit-jupiter-api") | ||||||
|  |     testImplementation("org.wiremock:wiremock-standalone:3.12.1") | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Configure dependency management using the extension | ||||||
|  | configure<DependencyManagementExtension> { | ||||||
|  |     imports { | ||||||
|  |         mavenBom("org.testcontainers:testcontainers-bom:$testcontainersVersion") | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Java Compiler Options | ||||||
|  | tasks.withType<JavaCompile> { | ||||||
|  |     options.compilerArgs.add("-parameters") // keep parameter names => no need for @Param for SpringData | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Configure tests | ||||||
|  | tasks.named<Test>("test") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         excludeTags("importHostingAssets", "scenarioTest") | ||||||
|  |     } | ||||||
|  |     jvmArgs("-Duser.language=en", "-Duser.country=US") | ||||||
|  |     // The 'excludes' property seems deprecated/less common in Kotlin DSL for Test tasks. | ||||||
|  |     // Use filtering or other mechanisms if needed, or keep if it works. | ||||||
|  |     // For filtering based on package/class name patterns: | ||||||
|  |     filter { | ||||||
|  |         excludeTestsMatching("net.hostsharing.hsadminng.**.generated.**") | ||||||
|  |         // Add more exclude patterns if needed | ||||||
|  |     } | ||||||
|  |     finalizedBy(tasks.named("jacocoTestReport")) // generate report after tests | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // OpenAPI Source Code Generation | ||||||
|  | openapiProcessor { | ||||||
|  |     process("springRoot") { | ||||||
|  |         processorName("spring") | ||||||
|  |         processor("io.openapiprocessor:openapi-processor-spring:2022.5") | ||||||
|  |         apiPath(project.file("src/main/resources/api-definition/api-definition.yaml").path) | ||||||
|  |         prop("mapping", project.file("src/main/resources/api-definition/api-mappings.yaml").path) | ||||||
|  |         prop("showWarnings", true) | ||||||
|  |         prop("openApiNullable", true) | ||||||
|  |         targetDir(layout.buildDirectory.dir("generated/sources/openapi-javax").get().asFile.path) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     process("springRbac") { | ||||||
|  |         processorName("spring") | ||||||
|  |         processor("io.openapiprocessor:openapi-processor-spring:2022.5") | ||||||
|  |         apiPath(project.file("src/main/resources/api-definition/rbac/rbac.yaml").path) | ||||||
|  |         prop("mapping", project.file("src/main/resources/api-definition/rbac/api-mappings.yaml").path) | ||||||
|  |         prop("showWarnings", true) | ||||||
|  |         prop("openApiNullable", true) | ||||||
|  |         targetDir(layout.buildDirectory.dir("generated/sources/openapi-javax").get().asFile.path) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     process("springTest") { | ||||||
|  |         processorName("spring") | ||||||
|  |         processor("io.openapiprocessor:openapi-processor-spring:2022.5") | ||||||
|  |         apiPath(project.file("src/main/resources/api-definition/test/test.yaml").path) | ||||||
|  |         prop("mapping", project.file("src/main/resources/api-definition/test/api-mappings.yaml").path) | ||||||
|  |         prop("showWarnings", true) | ||||||
|  |         prop("openApiNullable", true) | ||||||
|  |         targetDir(layout.buildDirectory.dir("generated/sources/openapi-javax").get().asFile.path) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     process("springHsOffice") { | ||||||
|  |         processorName("spring") | ||||||
|  |         processor("io.openapiprocessor:openapi-processor-spring:2022.5") | ||||||
|  |         apiPath(project.file("src/main/resources/api-definition/hs-office/hs-office.yaml").path) | ||||||
|  |         prop("mapping", project.file("src/main/resources/api-definition/hs-office/api-mappings.yaml").path) | ||||||
|  |         prop("showWarnings", true) | ||||||
|  |         prop("openApiNullable", true) | ||||||
|  |         targetDir(layout.buildDirectory.dir("generated/sources/openapi-javax").get().asFile.path) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     process("springHsBooking") { | ||||||
|  |         processorName("spring") | ||||||
|  |         processor("io.openapiprocessor:openapi-processor-spring:2022.5") | ||||||
|  |         apiPath(project.file("src/main/resources/api-definition/hs-booking/hs-booking.yaml").path) | ||||||
|  |         prop("mapping", project.file("src/main/resources/api-definition/hs-booking/api-mappings.yaml").path) | ||||||
|  |         prop("showWarnings", true) | ||||||
|  |         prop("openApiNullable", true) | ||||||
|  |         targetDir(layout.buildDirectory.dir("generated/sources/openapi-javax").get().asFile.path) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     process("springHsHosting") { | ||||||
|  |         processorName("spring") | ||||||
|  |         processor("io.openapiprocessor:openapi-processor-spring:2022.5") | ||||||
|  |         apiPath(project.file("src/main/resources/api-definition/hs-hosting//hs-hosting.yaml").path) | ||||||
|  |         prop("mapping", project.file("src/main/resources/api-definition/hs-hosting/api-mappings.yaml").path) | ||||||
|  |         prop("showWarnings", true) | ||||||
|  |         prop("openApiNullable", true) | ||||||
|  |         targetDir(layout.buildDirectory.dir("generated/sources/openapi-javax").get().asFile.path) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Add generated sources to the main source set | ||||||
|  | sourceSets.main.get().java.srcDir(layout.buildDirectory.dir("generated/sources/openapi")) | ||||||
|  |  | ||||||
|  | // Define an abstract task class (if needed for type safety, otherwise can be skipped) | ||||||
|  | // abstract class ProcessSpring : DefaultTask() | ||||||
|  |  | ||||||
|  | // Register an aggregate task for all OpenAPI generation tasks | ||||||
|  | val processSpring = tasks.register("processSpring") { | ||||||
|  |     group = "openapi" | ||||||
|  |     description = "Runs all OpenAPI generation tasks" | ||||||
|  |     // Depend on individual processor tasks (names are derived from the configuration block names) | ||||||
|  |     dependsOn( | ||||||
|  |         "processSpringRoot", | ||||||
|  |         "processSpringRbac", | ||||||
|  |         "processSpringTest", | ||||||
|  |         "processSpringHsOffice", | ||||||
|  |         "processSpringHsBooking", | ||||||
|  |         "processSpringHsHosting" | ||||||
|  |     ) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Ensure resources and compilation depend on the aggregate task | ||||||
|  | tasks.processResources { | ||||||
|  |     dependsOn(processSpring) | ||||||
|  | } | ||||||
|  | tasks.compileJava { | ||||||
|  |     dependsOn(processSpring) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Rename javax to jakarta in OpenApi generated java files | ||||||
|  | // TODO.impl: Upgrade to io.openapiprocessor.openapi-processor >= 2024.2 | ||||||
|  | //  and use either `bean-validation: true` in api-mapping.yaml or `useSpringBoot3 true` | ||||||
|  | val openApiGenerate = tasks.register<Copy>("openApiGenerate") { | ||||||
|  |     from(layout.buildDirectory.dir("generated/sources/openapi-javax")) | ||||||
|  |     into(layout.buildDirectory.dir("generated/sources/openapi")) | ||||||
|  |     filter { line: String -> line.replace("javax", "jakarta") } | ||||||
|  |     dependsOn(processSpring) // Ensure generation happens first | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Ensure compileJava uses the renamed sources and depends on the renaming task | ||||||
|  | tasks.compileJava { | ||||||
|  |     source(layout.buildDirectory.dir("generated/sources/openapi")) | ||||||
|  |     dependsOn(openApiGenerate) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Spotless Code Formatting | ||||||
|  | configure<SpotlessExtension> { | ||||||
|  |     java { | ||||||
|  |         // Configure formatting steps | ||||||
|  |         removeUnusedImports() | ||||||
|  |         leadingTabsToSpaces(4) | ||||||
|  |         endWithNewline() | ||||||
|  |         toggleOffOn() | ||||||
|  |  | ||||||
|  |         // Target files | ||||||
|  |         target(fileTree(rootDir) { | ||||||
|  |             include("**/*.java") | ||||||
|  |             exclude("**/generated/**/*.java", "build/**", ".gradle/**") // Add build/.gradle excludes | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | tasks.check { | ||||||
|  |     dependsOn(tasks.named("spotlessCheck")) | ||||||
|  | } | ||||||
|  | // HACK: no idea why spotless uses the output of these tasks, but we get warnings without those | ||||||
|  | tasks.named("spotlessJava") { | ||||||
|  |     dependsOn( | ||||||
|  |         tasks.named("generateLicenseReport"), | ||||||
|  |         // tasks.named("pitest"), // TODO.test: PiTest currently does not work, needs to be fixed | ||||||
|  |         tasks.named("jacocoTestReport"), | ||||||
|  |         tasks.named("processResources"), | ||||||
|  |         tasks.named("processTestResources") | ||||||
|  |     ) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // OWASP Dependency Security Test | ||||||
|  | configure<DependencyCheckExtension> { | ||||||
|  |     nvd { | ||||||
|  |         apiKey = project.findProperty("OWASP_API_KEY")?.toString() // set it in ~/.gradle/gradle.properties | ||||||
|  |         delay = 16000 // Milliseconds | ||||||
|  |     } | ||||||
|  |     format = org.owasp.dependencycheck.reporting.ReportGenerator.Format.ALL.name | ||||||
|  |     suppressionFiles.add("etc/owasp-dependency-check-suppression.xml") // Use suppressionFiles collection | ||||||
|  |     failOnError = true | ||||||
|  |     failBuildOnCVSS = 5.0f // Use float value | ||||||
|  | } | ||||||
|  | tasks.check { | ||||||
|  |     dependsOn(tasks.named("dependencyCheckAnalyze")) | ||||||
|  | } | ||||||
|  | tasks.named("dependencyCheckAnalyze") { | ||||||
|  |     doFirst { // Why not doLast? See README.md! | ||||||
|  |         println("OWASP Dependency Security Report: file://${project.rootDir}/build/reports/dependency-check-report.html") | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | licenseReport { | ||||||
|  |     renderers = arrayOf<ReportRenderer>(InventoryHtmlReportRenderer("report.html", "Backend")) | ||||||
|  |     filters = arrayOf<DependencyFilter>(LicenseBundleNormalizer()) | ||||||
|  |     excludeBoms = true | ||||||
|  |     allowedLicensesFile = project.file("etc/allowed-licenses.json") | ||||||
|  | } | ||||||
|  | tasks.check { | ||||||
|  |     // Ensure the task name 'checkLicense' is correct for the plugin | ||||||
|  |     dependsOn(tasks.named("checkLicense")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // JaCoCo Test Code Coverage for unit-tests | ||||||
|  | configure<JacocoPluginExtension> { | ||||||
|  |     toolVersion = "0.8.10" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | tasks.named<JacocoReport>("jacocoTestReport") { | ||||||
|  |     dependsOn(tasks.named("test")) // Depends on the main test task | ||||||
|  |     reports { | ||||||
|  |         xml.required.set(true) // Common requirement for CI/CD | ||||||
|  |         csv.required.set(false) | ||||||
|  |         html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco/test/html")) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     classDirectories.setFrom(files(sourceSets.main.get().output.classesDirs.map { dir -> | ||||||
|  |         fileTree(dir) { | ||||||
|  |             exclude( | ||||||
|  |                 "net/hostsharing/hsadminng/**/generated/**/*.class", | ||||||
|  |                 "net/hostsharing/hsadminng/hs/HsadminNgApplication.class" | ||||||
|  |             ) | ||||||
|  |         } | ||||||
|  |     })) | ||||||
|  |  | ||||||
|  |     doFirst { // Why not doLast? See README.md! | ||||||
|  |         println("HTML Jacoco Test Code Coverage Report: file://${reports.html.outputLocation.get().asFile}/index.html") | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | tasks.check { | ||||||
|  |     dependsOn(tasks.named("jacocoTestCoverageVerification")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | tasks.named<JacocoCoverageVerification>("jacocoTestCoverageVerification") { | ||||||
|  |     dependsOn(tasks.named("jacocoTestReport")) // Ensure report is generated first | ||||||
|  |     violationRules { | ||||||
|  |         rule { | ||||||
|  |             limit { | ||||||
|  |                 minimum = "0.80".toBigDecimal() // TODO.test: improve instruction coverage | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // element: PACKAGE, BUNDLE, CLASS, SOURCEFILE or METHOD | ||||||
|  |         // counter:  INSTRUCTION, BRANCH, LINE, COMPLEXITY, METHOD, or CLASS | ||||||
|  |         // value: TOTALCOUNT, COVEREDCOUNT, MISSEDCOUNT, COVEREDRATIO or MISSEDRATIO | ||||||
|  |  | ||||||
|  |         rule { | ||||||
|  |             element = "CLASS" | ||||||
|  |             excludes = listOf( | ||||||
|  |                 "net.hostsharing.hsadminng.**.generated.**", | ||||||
|  |                 "net.hostsharing.hsadminng.rbac.test.dom.TestDomainEntity", | ||||||
|  |                 "net.hostsharing.hsadminng.HsadminNgApplication", | ||||||
|  |                 "net.hostsharing.hsadminng.ping.PingController", | ||||||
|  |                 "net.hostsharing.hsadminng.rbac.generator.*", | ||||||
|  |                 "net.hostsharing.hsadminng.rbac.grant.RbacGrantsDiagramService", | ||||||
|  |                 "net.hostsharing.hsadminng.rbac.grant.RbacGrantsDiagramService\$Node", // Use $ for inner class | ||||||
|  |                 "net.hostsharing.hsadminng.**.*Repository", | ||||||
|  |                 "net.hostsharing.hsadminng.mapper.Mapper" | ||||||
|  |             ) | ||||||
|  |  | ||||||
|  |             limit { | ||||||
|  |                 counter = "LINE" | ||||||
|  |                 value = "COVEREDRATIO" | ||||||
|  |                 minimum = "0.75".toBigDecimal() // TODO.test: improve line coverage | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         rule { | ||||||
|  |             element = "METHOD" | ||||||
|  |             excludes = listOf( | ||||||
|  |                 "net.hostsharing.hsadminng.**.generated.**", | ||||||
|  |                 "net.hostsharing.hsadminng.HsadminNgApplication.main", | ||||||
|  |                 "net.hostsharing.hsadminng.ping.PingController.*" | ||||||
|  |             ) | ||||||
|  |  | ||||||
|  |             limit { | ||||||
|  |                 counter = "BRANCH" | ||||||
|  |                 value = "COVEREDRATIO" | ||||||
|  |                 minimum = "0.00".toBigDecimal() // TODO.test: improve branch coverage | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // HOWTO: run all unit-tests which don't need a database: gw-test unitTest | ||||||
|  | tasks.register<Test>("unitTest") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         excludeTags( | ||||||
|  |             "importHostingAssets", "scenarioTest", "generalIntegrationTest", | ||||||
|  |             "officeIntegrationTest", "bookingIntegrationTest", "hostingIntegrationTest" | ||||||
|  |         ) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "runs all unit-tests which do not need a database" | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HOWTO: run all integration tests which are not specific to a module, like base, rbac, config etc. | ||||||
|  | tasks.register<Test>("generalIntegrationTest") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         includeTags("generalIntegrationTest") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "runs integration tests which are not specific to a module, like base, rbac, config etc." | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HOWTO: run all integration tests of the office module: gw-test officeIntegrationTest | ||||||
|  | tasks.register<Test>("officeIntegrationTest") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         includeTags("officeIntegrationTest") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "runs integration tests of the office module" | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HOWTO: run all integration tests of the booking module: gw-test bookingIntegrationTest | ||||||
|  | tasks.register<Test>("bookingIntegrationTest") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         includeTags("bookingIntegrationTest") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "runs integration tests of the booking module" | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // HOWTO: run all integration tests of the hosting module: gw-test hostingIntegrationTest | ||||||
|  | tasks.register<Test>("hostingIntegrationTest") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         includeTags("hostingIntegrationTest") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "runs integration tests of the hosting module" | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | tasks.register<Test>("importHostingAssets") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         includeTags("importHostingAssets") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "run the import jobs as tests" | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | tasks.register<Test>("scenarioTest") { | ||||||
|  |     useJUnitPlatform { | ||||||
|  |         includeTags("scenarioTest") | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     group = "verification" | ||||||
|  |     description = "run the import jobs as tests" // Description seems copied, adjust if needed | ||||||
|  |  | ||||||
|  |     mustRunAfter(tasks.named("spotlessJava")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // pitest mutation testing | ||||||
|  | configure<PitestPluginExtension> { | ||||||
|  |     targetClasses.set(listOf("net.hostsharing.hsadminng.**")) // Use .set() for Property<List<String>> | ||||||
|  |     excludedClasses.set( | ||||||
|  |         listOf( | ||||||
|  |             "net.hostsharing.hsadminng.config.**", | ||||||
|  |             // "net.hostsharing.hsadminng.**.*Controller", | ||||||
|  |             "net.hostsharing.hsadminng.**.generated.**" | ||||||
|  |         ) | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     targetTests.set(listOf("net.hostsharing.hsadminng.**.*UnitTest", "net.hostsharing.hsadminng.**.*RestTest")) | ||||||
|  |     excludedTestClasses.set(listOf("**AcceptanceTest*", "**IntegrationTest*", "**ImportHostingAssets")) | ||||||
|  |  | ||||||
|  |     // Check if these are Property<String> or direct assignment | ||||||
|  |     // pitestVersion.set("1.17.0") // If Property<String> | ||||||
|  |     // junit5PluginVersion.set("1.1.0") // If Property<String> | ||||||
|  |     // Otherwise, direct assignment might work if the extension allows it, or check plugin docs. | ||||||
|  |     pitestVersion = "1.17.0" // Assuming direct assignment works | ||||||
|  |     junit5PluginVersion = "1.1.0" // Assuming direct assignment works | ||||||
|  |  | ||||||
|  |     threads.set(4) | ||||||
|  |  | ||||||
|  |     // As Java unit tests are pretty pointless in our case, this maybe makes not much sense. | ||||||
|  |     mutationThreshold.set(71) | ||||||
|  |     coverageThreshold.set(57) | ||||||
|  |     testStrengthThreshold.set(87) | ||||||
|  |  | ||||||
|  |     outputFormats.set(listOf("XML", "HTML")) | ||||||
|  |     timestampedReports.set(false) | ||||||
|  | } | ||||||
|  | // tasks.check { dependsOn(tasks.named("pitest")) } // TODO.test: PiTest currently does not work, needs to be fixed | ||||||
|  | tasks.named("pitest") { | ||||||
|  |     doFirst { // Why not doLast? See README.md! | ||||||
|  |         println("PiTest Mutation Report: file://${project.rootDir}/build/reports/pitest/index.html") | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Dependency Versions Upgrade | ||||||
|  | // Ensure the task name 'useLatestVersions' is correct | ||||||
|  | tasks.named("useLatestVersions") { | ||||||
|  |     finalizedBy(tasks.check) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Define the stability check function at the top level or within an object | ||||||
|  | val isNonStable = { version: String -> | ||||||
|  |     val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.uppercase().contains(it) } | ||||||
|  |     val regex = """^[0-9,.v-]+(-r)?$""".toRegex() // Use Kotlin Regex syntax | ||||||
|  |     !stableKeyword && !version.matches(regex) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | tasks.named<DependencyUpdatesTask>("dependencyUpdates") { | ||||||
|  |     // rejectVersionIf expects a closure that returns true if the version should be rejected | ||||||
|  |     rejectVersionIf { | ||||||
|  |         isNonStable(candidate.version) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Generate HTML from Markdown scenario-test-reports using Pandoc: | ||||||
|  | tasks.register("convertMarkdownToHtml") { | ||||||
|  |     description = "Generates HTML from Markdown scenario-test-reports using Pandoc." | ||||||
|  |     group = "Conversion" | ||||||
|  |  | ||||||
|  |     // Define the template file using project.file | ||||||
|  |     val templateFile = project.file("doc/scenarios/.template.html") | ||||||
|  |     // Define input directory using layout property | ||||||
|  |     val inputDir = layout.buildDirectory.dir("doc/scenarios") | ||||||
|  |  | ||||||
|  |     // Use inputs and outputs for better up-to-date checks | ||||||
|  |     inputs.file(templateFile).withPathSensitivity(PathSensitivity.NONE) | ||||||
|  |     inputs.dir(inputDir).withPathSensitivity(PathSensitivity.RELATIVE) | ||||||
|  |     outputs.dir(inputDir) // Output HTMLs will be in the same directory | ||||||
|  |  | ||||||
|  |     doFirst { | ||||||
|  |         // Check if pandoc is installed using exec and capturing output/errors | ||||||
|  |         val result = project.exec { | ||||||
|  |             commandLine("pandoc", "--version") | ||||||
|  |             isIgnoreExitValue = true // Don't fail the build immediately | ||||||
|  |             standardOutput = FileOutputStream(File.createTempFile("pandoc_check", ".out")) // Redirect output | ||||||
|  |             errorOutput = FileOutputStream(File.createTempFile("pandoc_check", ".err")) // Redirect error | ||||||
|  |         } | ||||||
|  |         if (result.exitValue != 0) { | ||||||
|  |             throw GradleException("Pandoc is not installed or not found in the system path. Please install Pandoc.") | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Check if the template file exists | ||||||
|  |         if (!templateFile.exists()) { | ||||||
|  |             throw GradleException("Template file '$templateFile' not found.") | ||||||
|  |         } | ||||||
|  |         // Ensure input directory exists (Gradle handles this implicitly usually, but explicit check is fine) | ||||||
|  |         if (!inputDir.get().asFile.exists()) { | ||||||
|  |             logger.warn("Input directory ${inputDir.get().asFile} does not exist, skipping Pandoc conversion.") | ||||||
|  |             // Potentially disable the task or skip doLast if input dir missing | ||||||
|  |             enabled = false // Example: disable task if input dir doesn't exist yet | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     doLast { | ||||||
|  |         // Check if input dir exists again, in case it was created between doFirst and doLast | ||||||
|  |         if (!inputDir.get().asFile.exists()) { | ||||||
|  |             logger.warn("Input directory ${inputDir.get().asFile} still does not exist, skipping Pandoc conversion.") | ||||||
|  |             return@doLast // Skip execution | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Gather all Markdown files in the input directory | ||||||
|  |         project.fileTree(inputDir) { | ||||||
|  |             include("*.md") | ||||||
|  |         }.forEach { file -> | ||||||
|  |             // Create the output file path in the same directory | ||||||
|  |             val outputFile = File(file.parentFile, file.name.replace(".md", ".html")) | ||||||
|  |  | ||||||
|  |             // Execute pandoc for each markdown file | ||||||
|  |             project.exec { | ||||||
|  |                 commandLine( | ||||||
|  |                     "pandoc", | ||||||
|  |                     file.absolutePath, | ||||||
|  |                     "--template", templateFile.absolutePath, | ||||||
|  |                     "-o", outputFile.absolutePath | ||||||
|  |                 ) | ||||||
|  |             } | ||||||
|  |             println("Converted ${file.name} to ${outputFile.name}") | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     // Ensure this task runs after scenario tests have potentially generated the markdown files | ||||||
|  |     dependsOn(tasks.named("scenarioTest")) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // shortcut for compiling all files | ||||||
|  | tasks.register("compile") { | ||||||
|  |     group = "build" | ||||||
|  |     description = "Compiles main and test Java sources." | ||||||
|  |     dependsOn("compileJava", "compileTestJava") | ||||||
|  | } | ||||||
| @@ -7,14 +7,4 @@ | |||||||
|         <packageUrl regex="true">^pkg:maven/org\.pitest/pitest\-command\-line@.*$</packageUrl> |         <packageUrl regex="true">^pkg:maven/org\.pitest/pitest\-command\-line@.*$</packageUrl> | ||||||
|         <cpe>cpe:/a:line:line</cpe> |         <cpe>cpe:/a:line:line</cpe> | ||||||
|     </suppress> |     </suppress> | ||||||
|     <suppress> |  | ||||||
|         <notes><![CDATA[ |  | ||||||
|           file name: logback-core-1.5.12.jar |  | ||||||
|           A successful attack requires the user to have write access to a configuration file or environment vars. |  | ||||||
|         ]]></notes> |  | ||||||
|         <packageUrl regex="true">^pkg:maven/ch\.qos\.logback/logback-core@.*$</packageUrl> |  | ||||||
|         <cpe>cpe:/a:qos:logback</cpe> |  | ||||||
|         <cve>CVE-2024-12798</cve> |  | ||||||
|     </suppress> |  | ||||||
|  |  | ||||||
| </suppressions> | </suppressions> | ||||||
|   | |||||||
| @@ -14,7 +14,6 @@ import net.hostsharing.hsadminng.config.DisableSecurityConfig; | |||||||
| import org.junit.jupiter.api.BeforeEach; | import org.junit.jupiter.api.BeforeEach; | ||||||
| import org.junit.jupiter.api.Nested; | import org.junit.jupiter.api.Nested; | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | ||||||
| import org.springframework.boot.test.context.TestConfiguration; | import org.springframework.boot.test.context.TestConfiguration; | ||||||
| @@ -23,7 +22,6 @@ import org.springframework.context.annotation.Bean; | |||||||
| import org.springframework.context.annotation.Import; | import org.springframework.context.annotation.Import; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.context.ActiveProfiles; | import org.springframework.test.context.ActiveProfiles; | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | ||||||
|  |  | ||||||
| @@ -47,7 +45,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | |||||||
|  |  | ||||||
| @WebMvcTest(HsBookingItemController.class) | @WebMvcTest(HsBookingItemController.class) | ||||||
| @Import({StrictMapper.class, JsonObjectMapperConfiguration.class, DisableSecurityConfig.class, MessageTranslator.class}) | @Import({StrictMapper.class, JsonObjectMapperConfiguration.class, DisableSecurityConfig.class, MessageTranslator.class}) | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| @ActiveProfiles("test") | @ActiveProfiles("test") | ||||||
| class HsBookingItemControllerRestTest { | class HsBookingItemControllerRestTest { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -17,7 +17,6 @@ import org.junit.jupiter.api.BeforeEach; | |||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.junit.jupiter.params.ParameterizedTest; | import org.junit.jupiter.params.ParameterizedTest; | ||||||
| import org.junit.jupiter.params.provider.EnumSource; | import org.junit.jupiter.params.provider.EnumSource; | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | ||||||
| import org.springframework.boot.test.context.TestConfiguration; | import org.springframework.boot.test.context.TestConfiguration; | ||||||
| @@ -26,7 +25,6 @@ import org.springframework.context.annotation.Import; | |||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.context.ActiveProfiles; | import org.springframework.test.context.ActiveProfiles; | ||||||
| import org.springframework.test.context.bean.override.mockito.MockitoBean; | import org.springframework.test.context.bean.override.mockito.MockitoBean; | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | ||||||
|  |  | ||||||
| @@ -57,7 +55,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | |||||||
|  |  | ||||||
| @WebMvcTest(HsHostingAssetController.class) | @WebMvcTest(HsHostingAssetController.class) | ||||||
| @Import({ StrictMapper.class, JsonObjectMapperConfiguration.class, DisableSecurityConfig.class, MessageTranslator.class }) | @Import({ StrictMapper.class, JsonObjectMapperConfiguration.class, DisableSecurityConfig.class, MessageTranslator.class }) | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| @ActiveProfiles("test") | @ActiveProfiles("test") | ||||||
| public class HsHostingAssetControllerRestTest { | public class HsHostingAssetControllerRestTest { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -16,14 +16,12 @@ import org.junit.jupiter.api.BeforeEach; | |||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.junit.jupiter.params.ParameterizedTest; | import org.junit.jupiter.params.ParameterizedTest; | ||||||
| import org.junit.jupiter.params.provider.EnumSource; | import org.junit.jupiter.params.provider.EnumSource; | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | ||||||
| import org.springframework.context.annotation.Import; | import org.springframework.context.annotation.Import; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.context.ActiveProfiles; | import org.springframework.test.context.ActiveProfiles; | ||||||
| import org.springframework.test.context.bean.override.mockito.MockitoBean; | import org.springframework.test.context.bean.override.mockito.MockitoBean; | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | ||||||
|  |  | ||||||
| @@ -58,7 +56,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | |||||||
|           JsonObjectMapperConfiguration.class, |           JsonObjectMapperConfiguration.class, | ||||||
|           DisableSecurityConfig.class }) |           DisableSecurityConfig.class }) | ||||||
| @ActiveProfiles("test") | @ActiveProfiles("test") | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| class HsOfficeCoopAssetsTransactionControllerRestTest { | class HsOfficeCoopAssetsTransactionControllerRestTest { | ||||||
|  |  | ||||||
|     // If you need to run just a single test-case in this data-driven test-method, set SINGLE_TEST_CASE_EXECUTION to true! |     // If you need to run just a single test-case in this data-driven test-method, set SINGLE_TEST_CASE_EXECUTION to true! | ||||||
|   | |||||||
| @@ -8,14 +8,12 @@ import net.hostsharing.hsadminng.config.MessagesResourceConfig; | |||||||
| import net.hostsharing.hsadminng.context.Context; | import net.hostsharing.hsadminng.context.Context; | ||||||
| import org.junit.jupiter.params.ParameterizedTest; | import org.junit.jupiter.params.ParameterizedTest; | ||||||
| import org.junit.jupiter.params.provider.EnumSource; | import org.junit.jupiter.params.provider.EnumSource; | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | ||||||
| import org.springframework.context.annotation.Import; | import org.springframework.context.annotation.Import; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.context.ActiveProfiles; | import org.springframework.test.context.ActiveProfiles; | ||||||
| import org.springframework.test.context.bean.override.mockito.MockitoBean; | import org.springframework.test.context.bean.override.mockito.MockitoBean; | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | ||||||
|  |  | ||||||
| @@ -29,7 +27,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | |||||||
|           MessageTranslator.class, |           MessageTranslator.class, | ||||||
|           JsonObjectMapperConfiguration.class, |           JsonObjectMapperConfiguration.class, | ||||||
|           DisableSecurityConfig.class }) |           DisableSecurityConfig.class }) | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| @ActiveProfiles("test") | @ActiveProfiles("test") | ||||||
| class PingControllerRestTest { | class PingControllerRestTest { | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,14 +7,12 @@ import net.hostsharing.hsadminng.persistence.EntityManagerWrapper; | |||||||
| import net.hostsharing.hsadminng.config.DisableSecurityConfig; | import net.hostsharing.hsadminng.config.DisableSecurityConfig; | ||||||
| import org.junit.jupiter.api.BeforeEach; | import org.junit.jupiter.api.BeforeEach; | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | ||||||
| import org.springframework.test.context.bean.override.mockito.MockitoBean; | import org.springframework.test.context.bean.override.mockito.MockitoBean; | ||||||
| import org.springframework.context.annotation.Import; | import org.springframework.context.annotation.Import; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.context.ActiveProfiles; | import org.springframework.test.context.ActiveProfiles; | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | ||||||
|  |  | ||||||
| @@ -34,7 +32,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | |||||||
| @WebMvcTest(RbacRoleController.class) | @WebMvcTest(RbacRoleController.class) | ||||||
| @Import({StrictMapper.class, DisableSecurityConfig.class, MessageTranslator.class}) | @Import({StrictMapper.class, DisableSecurityConfig.class, MessageTranslator.class}) | ||||||
| @ActiveProfiles("test") | @ActiveProfiles("test") | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| class RbacRoleControllerRestTest { | class RbacRoleControllerRestTest { | ||||||
|  |  | ||||||
|     @Autowired |     @Autowired | ||||||
|   | |||||||
| @@ -6,14 +6,12 @@ import net.hostsharing.hsadminng.mapper.StrictMapper; | |||||||
| import net.hostsharing.hsadminng.persistence.EntityManagerWrapper; | import net.hostsharing.hsadminng.persistence.EntityManagerWrapper; | ||||||
| import net.hostsharing.hsadminng.config.DisableSecurityConfig; | import net.hostsharing.hsadminng.config.DisableSecurityConfig; | ||||||
| import org.junit.jupiter.api.Test; | import org.junit.jupiter.api.Test; | ||||||
| import org.junit.runner.RunWith; |  | ||||||
| import org.springframework.beans.factory.annotation.Autowired; | import org.springframework.beans.factory.annotation.Autowired; | ||||||
| import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; | ||||||
| import org.springframework.test.context.bean.override.mockito.MockitoBean; | import org.springframework.test.context.bean.override.mockito.MockitoBean; | ||||||
| import org.springframework.context.annotation.Import; | import org.springframework.context.annotation.Import; | ||||||
| import org.springframework.http.MediaType; | import org.springframework.http.MediaType; | ||||||
| import org.springframework.test.context.ActiveProfiles; | import org.springframework.test.context.ActiveProfiles; | ||||||
| import org.springframework.test.context.junit4.SpringRunner; |  | ||||||
| import org.springframework.test.web.servlet.MockMvc; | import org.springframework.test.web.servlet.MockMvc; | ||||||
| import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; | ||||||
|  |  | ||||||
| @@ -30,7 +28,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. | |||||||
| @WebMvcTest(RbacSubjectController.class) | @WebMvcTest(RbacSubjectController.class) | ||||||
| @Import({StrictMapper.class, DisableSecurityConfig.class, MessageTranslator.class}) | @Import({StrictMapper.class, DisableSecurityConfig.class, MessageTranslator.class}) | ||||||
| @ActiveProfiles("test") | @ActiveProfiles("test") | ||||||
| @RunWith(SpringRunner.class) |  | ||||||
| class RbacSubjectControllerRestTest { | class RbacSubjectControllerRestTest { | ||||||
|  |  | ||||||
|     @Autowired |     @Autowired | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user