diff --git a/README.md b/README.md index 70263b2550f704d4fee99d637c9f3647161d2825..b8b53f76b72b0ac713b117b68241ddc0af3dd6ef 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,11 @@ If this is your first contact with the eDelivery SMP, it is highly recommended t ## Build -In order to build eDelivery SMP : +In order to build eDelivery SMP, you need to have the following installed: +* Java JDK 8 or JDK 11 +* Maven 3.6+ + +To build eDelivery SMP, run the following command in the root directory of the project: mvn clean install @@ -64,4 +68,4 @@ Have questions? Consult our [Q&A section](https://ec.europa.eu/digital-building- Still have questions? Contact [eDelivery support](https://ec.europa.eu/digital-building-blocks/tracker/plugins/servlet/desk/portal/6). -[Top](#top) \ No newline at end of file +[Top](#top) diff --git a/owasp-false-positive-warnings.xml b/owasp-false-positive-warnings.xml index e11f9b093729105cde65cbcdd33eb1d5fe6e78a9..cc7b1528c2cd0f1a589460b9b64526f1be3a2013 100644 --- a/owasp-false-positive-warnings.xml +++ b/owasp-false-positive-warnings.xml @@ -18,8 +18,9 @@ </suppress> <suppress> <notes><![CDATA[ - file name: smp.war: spring-core-5.3.*.jar + file name: smp.war: spring-core-5.3.29.jar ]]></notes> + <sha1>528eafe4cef7bccf3df290dd99ac5833a9756183</sha1> <cve>CVE-2016-1000027</cve> </suppress> <suppress> @@ -30,27 +31,6 @@ </suppress> <suppress> <notes><![CDATA[ - file name: spring-aop-5.3.25.jar spring-expression-5.3.25.jar - ]]></notes> - <packageUrl regex="true">^pkg:maven/org\.springframework/spring\-(aop|expression)@.*$</packageUrl> - <cve>CVE-2023-20861</cve> - </suppress> - <suppress> - <notes><![CDATA[ - file name: cxf-xjc-runtime-3.3.2.jar - ]]></notes> - <packageUrl regex="true">^pkg:maven/org\.apache\.cxf\.xjc\-utils/cxf\-xjc\-runtime@.*$</packageUrl> - <cve>CVE-2021-4277</cve> - </suppress> - <suppress> - <notes><![CDATA[ - file name: cxf-rt-bindings-soap-3.5.5.jar - ]]></notes> - <packageUrl regex="true">^pkg:maven/org\.apache\.cxf/cxf\-rt\-bindings\-soap@.*$</packageUrl> - <cve>CVE-2022-40705</cve> - </suppress> - <suppress> - <notes><![CDATA[ file name: guava-30.1-jre.jar ]]></notes> <packageUrl regex="true">^pkg:maven/com\.google\.guava/guava@.*$</packageUrl> @@ -72,13 +52,6 @@ </suppress> <suppress> <notes><![CDATA[ - file name: bcprov-jdk15on-1.70.jar - ]]></notes> - <packageUrl regex="true">^pkg:maven/org\.bouncycastle/bcprov\-jdk15on@.*$</packageUrl> - <vulnerabilityName>CVE-2023-33201</vulnerabilityName> - </suppress> - <suppress> - <notes><![CDATA[ file name: jackson-databind-2.15.2.jar ]]></notes> <packageUrl regex="true">^pkg:maven/com\.fasterxml\.jackson\.core/jackson\-databind@.*$</packageUrl> diff --git a/pom.xml b/pom.xml index fc3a1f360ca1045cfc40837bf5da9dfaddbf6914..cd4629a8a4d1c60b757ac3b5a821a05f22b37049 100644 --- a/pom.xml +++ b/pom.xml @@ -12,7 +12,8 @@ ~ See the Licence for the specific language governing permissions and limitations under the Licence. --> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>eu.europa.ec.edelivery</groupId> <artifactId>smp-modules</artifactId> @@ -37,12 +38,13 @@ <maven.compiler.source>1.8</maven.compiler.source> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <edelivery.ssl-auth.version>1.14-SNAPSHOT</edelivery.ssl-auth.version> - <edelivery.dynamic-discovery-client.version>2.0</edelivery.dynamic-discovery-client.version> + <edelivery.dynamic-discovery-client.version>2.1-SNAPSHOT</edelivery.dynamic-discovery-client.version> + <bdmsl-api.version>4.3-SNAPSHOT</bdmsl-api.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <ant-commons-net.version>1.6.5</ant-commons-net.version> <aspectj.version>1.9.9.1</aspectj.version> - <bdmsl.api.version>4.1.1</bdmsl.api.version> + <build.helper.maven.version>1.9.1</build.helper.maven.version> <commons-beanutils.version>1.9.4</commons-beanutils.version> <commons-collections.version>3.2.2</commons-collections.version> @@ -55,7 +57,7 @@ <cxf.version>3.5.6</cxf.version> <ehcache.version>2.10.9.2</ehcache.version> <freemarker.version>2.3.32</freemarker.version> - <h2.version>2.1.214</h2.version> + <h2.version>2.2.220</h2.version> <hamcrest-junit.version>2.0.0.0</hamcrest-junit.version> <hamcrest.version>2.2</hamcrest.version> <hibernate-jpa.version>1.0.2.Final</hibernate-jpa.version> @@ -72,40 +74,43 @@ <jakarta.xml.bind-api.version>2.3.3</jakarta.xml.bind-api.version> <jstl.version>1.2</jstl.version> <junit.version>4.13.2</junit.version> - <junit-jupiter.version>5.10.0-RC1</junit-jupiter.version> + <junit-jupiter.version>5.10.0</junit-jupiter.version> <junit-platform-surefire-provider.version>1.3.2</junit-platform-surefire-provider.version> <junitparams.version>1.1.1</junitparams.version> - <logback.version>1.2.11</logback.version> - <mysql.jdbc.version>8.0.33</mysql.jdbc.version> + <logback.version>1.3.8</logback.version> + <mysql.jdbc.version>8.1.0</mysql.jdbc.version> <metro.version>2.2.1-1</metro.version> - <mockito.version>4.10.0</mockito.version> + <mockito.version>4.11.0</mockito.version> <org.apache.santuario.xmlsec.version>2.3.3</org.apache.santuario.xmlsec.version> <orika.version>1.5.4</orika.version> <servlet-api.version>3.0.1</servlet-api.version> - <slf4j.version>1.7.36</slf4j.version> + <slf4j.version>2.0.7</slf4j.version> <spring-modules-jakarta-commons.version>0.8</spring-modules-jakarta-commons.version> - <spring-boot.version>2.7.12</spring-boot.version> - <spring-boot.tomcat.version>9.0.75</spring-boot.tomcat.version> - <spring.security.version>5.8.4</spring.security.version> - <spring.version>5.3.28</spring.version> - <xmlunit.version>2.9.0</xmlunit.version> + <spring-boot.version>2.7.14</spring-boot.version> + <spring-boot.tomcat.version>9.0.78</spring-boot.tomcat.version> + <spring.security.version>5.8.5</spring.security.version> + <spring.version>5.3.29</spring.version> + <xmlunit.version>2.9.1</xmlunit.version> <!-- plugins --> <frontend-maven-plugin.version>1.9.1</frontend-maven-plugin.version> <exec-maven-plugin.version>1.6.0</exec-maven-plugin.version> + <surefire.jvm.args></surefire.jvm.args> + <failsafe.jvm.args></failsafe.jvm.args> <sonar.jacoco.remotePort>${jacocoRemotePort}</sonar.jacoco.remotePort> <sonar.jacoco.remoteAddress>${jacocoRemoteAddress}</sonar.jacoco.remoteAddress> <sonar.host.url>http://localhost:9000/sonar/</sonar.host.url> <sonar.language>java</sonar.language> - + <jacoco.append>true</jacoco.append> <sonar.binaries>target/classes</sonar.binaries> - <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco/jacoco.xml - </sonar.coverage.jacoco.xmlReportPaths> - <jacoco.maven.plugin.version>0.8.6</jacoco.maven.plugin.version> + <sonar.coverage.jacoco.xmlReportPaths>${project.basedir}/target/site/jacoco/jacoco.xml</sonar.coverage.jacoco.xmlReportPaths> + <sonar.jacoco.itReportPath>${project.basedir}/../target/jacoco-it.exec</sonar.jacoco.itReportPath> + + <jacoco.maven.plugin.version>0.8.9</jacoco.maven.plugin.version> <maven-surefire-plugin.version>3.1.2</maven-surefire-plugin.version> - <maven-failsafe-plugin.version>2.19.1</maven-failsafe-plugin.version> + <maven-failsafe-plugin.version>3.1.2</maven-failsafe-plugin.version> <sonar.exclusions> **/target/**, **/smp-angular/node_modules/**, @@ -122,7 +127,8 @@ </sonar.coverage.exclusions> <!-- latest version compatible with SonarQube 5.6 is: 3.3.0.603--> <sonar.maven.plugin.version>3.5.0.1254</sonar.maven.plugin.version> - <release.arguments>-Dmaven.javadoc.skip=true -Dmaven.test.skipTests=true -Dmaven.test.skip=true</release.arguments> + <release.arguments>-Dmaven.javadoc.skip=true -Dmaven.test.skipTests=true -Dmaven.test.skip=true + </release.arguments> <project.scm.id>edelivery-scm</project.scm.id> </properties> @@ -186,7 +192,7 @@ <dependency> <groupId>eu.europa.ec.bdmsl</groupId> <artifactId>bdmsl-api</artifactId> - <version>${bdmsl.api.version}</version> + <version>${bdmsl-api.version}</version> </dependency> <dependency> <groupId>org.apache.cxf</groupId> @@ -337,6 +343,14 @@ <groupId>org.springframework.security</groupId> <artifactId>spring-security-cas</artifactId> <version>${spring.security.version}</version> + <exclusions> + <!-- exclude old org.bouncycastle:bcprov-jdk15on:jar:1.64 to use bcprov-jdk18on + Check if this is needed when upgrading the library! --> + <exclusion> + <groupId>org.bouncycastle</groupId> + <artifactId>bcprov-jdk15on</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> @@ -743,9 +757,36 @@ <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <configuration> + <!-- make sure methods are always run in same order --> <runOrder>alphabetical</runOrder> + <argLine>-ea ${argLine}</argLine> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> + <configuration> + <!-- ... fool Sonar to show test success for both unit and integration tests together by + instructing Failsafe to store its test reports to the same directory as Surefire instead of + the default failsafe-reports. + + See https://jira.sonarsource.com/browse/SONAR-7526 --> + + <reportsDirectory>${project.build.directory}/surefire-reports</reportsDirectory> + <includes> + <include>**/*IT.java</include> + </includes> + <runOrder>alphabetical</runOrder> + </configuration> + <executions> + <execution> + <goals> + <goal>integration-test</goal> + <goal>verify</goal> + </goals> + </execution> + </executions> + </plugin> <!-- jacoco start --> <plugin> <groupId>org.jacoco</groupId> @@ -764,6 +805,16 @@ <goal>report</goal> </goals> </execution> + <execution> + <id>jacoco-agent-it</id> + <goals> + <goal>prepare-agent-integration</goal> + </goals> + <configuration> + <destFile>${jacoco.report.it}</destFile> + <propertyName>failsafeArgLine</propertyName> + </configuration> + </execution> </executions> </plugin> <plugin> @@ -795,7 +846,7 @@ <plugin> <groupId>org.owasp</groupId> <artifactId>dependency-check-maven</artifactId> - <version>8.2.1</version> + <version>8.3.1</version> <inherited>false</inherited> <configuration> <skipProvidedScope>true</skipProvidedScope> diff --git a/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html b/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html index 89389b8dad06e910edfd95aae8b7b16cdd11cdce..abfac08be1f1afa53b28d472a9a48a135ad573f8 100644 --- a/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html +++ b/smp-angular/src/app/common/dialogs/member-dialog/member-dialog.component.html @@ -18,16 +18,16 @@ <mat-form-field style="width:100%"> <mat-label>Select role for the user</mat-label> - <mat-select placeholder="Role for the member" + <select matNativeControl placeholder="Role for the member" formControlName="member-roleType" name="Role type" matTooltip="Role type for the member." id="member-user_id" required> - <mat-option *ngFor="let role of memberRoles" + <option *ngFor="let role of memberRoles" [value]="role.value"> {{role.key}} - </mat-option> - </mat-select> + </option> + </select> <mat-hint> Choose member role</mat-hint> </mat-form-field> </form> diff --git a/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html b/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html index f80dcdb03338432afe21362ed8aa5bc749a568ee..8b0a8551776ece4c66d50284d307f50c445807e2 100644 --- a/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html +++ b/smp-angular/src/app/common/panels/user-settings-panel/user-profile-panel.component.html @@ -13,14 +13,14 @@ <div style="display:flex; flex-direction: row;align-items: center"> <mat-form-field style="width:100%" class="user-profile-pane-field"> <mat-label>Application role</mat-label> - <mat-select formControlName="role" + <select matNativeControl formControlName="role" matTooltip="application role for the user." id="role_id" required> - <mat-option *ngFor="let role of applicationRoles" + <option *ngFor="let role of applicationRoles" [value]="role.value"> {{role.key}} - </mat-option> - </mat-select> + </option> + </select> <mat-hint *ngIf="!isUserDataLoggedInUserData"> Choose member role</mat-hint> </mat-form-field> @@ -51,7 +51,7 @@ <mat-form-field class="user-profile-pane-field"> <mat-label>Theme</mat-label> - <select id="smpTheme_id" matNativeControl + <select matNativeControl id="smpTheme_id" (change)="onThemeSelect($event.target.value)" formControlName="smpTheme"> <option *ngFor="let item of themeItems" [value]="item.className">{{item.name}}</option> @@ -60,7 +60,7 @@ <div class="user-profile-pane-field" style="display:flex;flex-direction: row"> <mat-form-field style="flex-grow: 1"> <mat-label>Locale (Date/time formatting)</mat-label> - <select id="smpLocale_id" matNativeControl id="moment-locale" + <select matNativeControl id="smpLocale_id" (change)="onLocaleSelect($event.target.value)" formControlName="smpLocale" > diff --git a/smp-angular/src/app/common/row-limiter/row-limiter.component.html b/smp-angular/src/app/common/row-limiter/row-limiter.component.html index 2374ef2dcfad2f4815a128f681236b8d9fe45309..2c1311f820592ee5b557b30b5ef17a04090f52db 100644 --- a/smp-angular/src/app/common/row-limiter/row-limiter.component.html +++ b/smp-angular/src/app/common/row-limiter/row-limiter.component.html @@ -1,10 +1,10 @@ <div class="search-table-row-limiter"> - - <mat-select placeholder="Rows" [(ngModel)]="pageSize" name="pageSize" (selectionChange)="changePageSize($event)" + <select matNativeControl placeholder="Rows" [(ngModel)]="pageSize" name="pageSize" + (change)="changePageSize($event.target)" id="pagesize_id"> - <mat-option class="row-limiter-item" *ngFor="let rowLimit of pageSizes" [value]="rowLimit.value"> - {{rowLimit.key}} - </mat-option> - </mat-select> + <option class="row-limiter-item" *ngFor="let rowLimit of pageSizes" [value]="rowLimit.value"> + {{rowLimit.value}} + </option> + </select> </div> diff --git a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html index 30bbba10d5650eaa7123cc7e09b56534c8570656..b165b600d0eff4f60505b697f061bb51fc67781d 100644 --- a/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html +++ b/smp-angular/src/app/edit/edit-domain/domain-group-panel/group-dialog/group-dialog.component.html @@ -19,15 +19,15 @@ <mat-form-field style="width:100%"> <mat-label>Group visibility</mat-label> - <mat-select placeholder="Group visibility" + <select matNativeControl placeholder="Group visibility" formControlName="visibility" matTooltip="Group visibility." id="group_id" required> - <mat-option *ngFor="let visibility of groupVisibilityOptions" + <option *ngFor="let visibility of groupVisibilityOptions" [value]="visibility.value"> {{visibility.key}} - </mat-option> - </mat-select> + </option> + </select> <mat-hint>Choose group visibility</mat-hint> </mat-form-field> </form> diff --git a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html index eccb64d2615036ef2e927c667e3d2db4bb08e390..0d03841c53b65d52de768ed10e7bcbce96e8c517 100644 --- a/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html +++ b/smp-angular/src/app/edit/edit-group/group-resource-panel/resource-dialog/resource-dialog.component.html @@ -4,17 +4,16 @@ <b *ngIf="newMode">To create a new resource enter unique identifier and scheme and click save.</b> <mat-form-field style="width:100%"> <mat-label>Selected resource type</mat-label> - <mat-select placeholder="Select resource type for the resource" + <select matNativeControl placeholder="Select resource type for the resource" matTooltip="Select type for the resource." id="resourceTypeIdentifier" formControlName="resourceTypeIdentifier" required> - <mat-option *ngFor="let resDef of domainResourceDefs" + <option *ngFor="let resDef of domainResourceDefs" [value]="resDef.identifier"> {{resDef.name}} ({{resDef.identifier}}) - </mat-option> - - </mat-select> + </option> + </select> </mat-form-field> <mat-form-field style="width: 100%"> <mat-label>Resource identifier</mat-label> @@ -56,15 +55,15 @@ <mat-form-field style="width:100%"> <mat-label>Resource visibility</mat-label> - <mat-select placeholder="Resource visibility" + <select matNativeControl placeholder="Resource visibility" formControlName="visibility" matTooltip="Resource visibility." id="visibility_id" required> - <mat-option *ngFor="let visibility of groupVisibilityOptions" + <option *ngFor="let visibility of groupVisibilityOptions" [value]="visibility.value"> {{visibility.key}} - </mat-option> - </mat-select> + </option> + </select> </mat-form-field> </form> </mat-dialog-content> diff --git a/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html b/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html index a1e73e281708448d8ee5caafec4906adbd797ecd..b6101555685908dc6482b6974a5b96a97ccb2e34 100644 --- a/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html +++ b/smp-angular/src/app/edit/edit-resources/resource-details-panel/resource-details-panel.component.html @@ -16,16 +16,16 @@ <form [formGroup]="resourceForm"> <mat-form-field style="width:100%"> <mat-label>Resource type</mat-label> - <mat-select placeholder="Resource type for the resource" + <select matNativeControl placeholder="Resource type for the resource" matTooltip="Select type for the resource." id="resourceTypeIdentifier" formControlName="resourceTypeIdentifier" required> - <mat-option *ngFor="let resDef of domainResourceDefs" + <option *ngFor="let resDef of domainResourceDefs" [value]="resDef.identifier"> {{resDef.name}} ({{resDef.identifier}}) - </mat-option> - </mat-select> + </option> + </select> </mat-form-field> <mat-form-field style="width: 100%"> <mat-label>Resource identifier</mat-label> @@ -42,14 +42,14 @@ </mat-form-field> <mat-form-field style="width:100%"> <mat-label>Resource visibility</mat-label> - <mat-select formControlName="visibility" + <select matNativeControl formControlName="visibility" matTooltip="Resource visibility." id="visibility_id" required> - <mat-option *ngFor="let visibility of groupVisibilityOptions" + <option *ngFor="let visibility of groupVisibilityOptions" [value]="visibility.value"> {{visibility.key}} - </mat-option> - </mat-select> + </option> + </select> </mat-form-field> <smp-warning-panel diff --git a/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html b/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html index ee73c632a612d3677e863b6d0fef638af909311f..5f6392935919d1d0857ecd85d0db287b29f92635 100644 --- a/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html +++ b/smp-angular/src/app/edit/edit-resources/resource-document-panel/resource-document-panel.component.html @@ -35,20 +35,20 @@ <div [formGroup]="documentForm" style="float: right; vertical-align:middle;display: flex;align-items: center;justify-content: center; gap:0.4em;padding-right: 10px"> <span style="font-size: 0.8em">Show version:</span> - <mat-select style="width: 100px; border-bottom: gray solid 1px" + <select matNativeControl style="width: 100px; border-bottom: gray solid 1px" placeholder="All document version" matTooltip="Select version to display." formControlName="payloadVersion" id="document version_id" - (selectionChange)="onSelectionDocumentVersionChanged()" + (change)="onSelectionDocumentVersionChanged()" > - <mat-option *ngFor="let version of getDocumentVersions" + <option *ngFor="let version of getDocumentVersions" [value]="version" > {{version}} - </mat-option> + </option> - </mat-select> + </select> </div> </mat-toolbar-row> </mat-toolbar> diff --git a/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html b/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html index 47d0638fdb776cebbf18f2fc90e0096042673889..58b1b31df7897c741fe4991843e6c8c03fd64d9b 100644 --- a/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html +++ b/smp-angular/src/app/edit/edit-resources/subresource-document-panel/subresource-document-panel.component.html @@ -33,20 +33,20 @@ <div [formGroup]="documentForm" style="float: right; vertical-align:middle;display: flex;align-items: center;justify-content: center; gap:0.4em;padding-right: 10px"> <span style="font-size: 0.8em">Show version:</span> - <mat-select style="width: 100px; border-bottom: gray solid 1px" + <select matNativeControl style="width: 100px; border-bottom: gray solid 1px" placeholder="All document version" matTooltip="Select version to display." formControlName="payloadVersion" id="document version_id" - (selectionChange)="onSelectionDocumentVersionChanged()" + (change)="onSelectionDocumentVersionChanged()" > - <mat-option *ngFor="let version of getDocumentVersions" + <option *ngFor="let version of getDocumentVersions" [value]="version" > {{version}} - </mat-option> + </option> - </mat-select> + </select> </div> </mat-toolbar-row> </mat-toolbar> diff --git a/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html b/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html index 455ed360eb31de00b8701768b4181663e8543f85..549e92b9b9d0939262eab12c56e27fa8713ffcc0 100644 --- a/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html +++ b/smp-angular/src/app/edit/edit-resources/subresource-panel/resource-dialog/subresource-dialog.component.html @@ -4,17 +4,17 @@ <b *ngIf="newMode">To create a new subresource enter unique identifier and scheme and click save.</b> <mat-form-field style="width:100%"> <mat-label>Selected resource type</mat-label> - <mat-select placeholder="Select type for the subresource" + <select matNativeControl placeholder="Select type for the subresource" matTooltip="Select type for the subresource." id="subresourceTypeIdentifier" formControlName="subresourceTypeIdentifier" required> - <mat-option *ngFor="let resDef of subresourceDefs" + <option *ngFor="let resDef of subresourceDefs" [value]="resDef.identifier"> {{resDef.name}} ({{resDef.identifier}}) - </mat-option> + </option> - </mat-select> + </select> </mat-form-field> <mat-form-field style="width: 100%"> <mat-label>Subresource identifier</mat-label> diff --git a/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html b/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html index a8c3e301d0020f20b58719aed23a0f5e398cbee8..a3ef8b7c4573a196bd5646f74a119ff1bd34ab58 100644 --- a/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html +++ b/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html @@ -34,29 +34,29 @@ </mat-form-field> <mat-form-field style="width:100%"> <mat-label>Response signature Certificate (Signature CertAlias)</mat-label> - <mat-select formControlName="signatureKeyAlias" + <select matNativeControl matInput formControlName="signatureKeyAlias" matTooltip="Certificate is used for signing REST responses for the domain." id="signatureKeyAlias_id"> - <mat-option [value]="''" ></mat-option> - <mat-option *ngFor="let cert of keystoreCertificates" [value]="cert.alias"> + <option [value]="''" ></option> + <option *ngFor="let cert of keystoreCertificates" [value]="cert.alias"> {{cert.alias}} ({{cert.certificateId}}) - </mat-option> - </mat-select> + </option> + </select> <mat-hint align="end">Empty value will cause that Resource responses will not be signed by SMP! </mat-hint> </mat-form-field> <mat-form-field style="width:100%"> <mat-label>Visibility of the domain</mat-label> - <mat-select formControlName="visibility" + <select matNativeControl formControlName="visibility" name="visibility" matTooltip="Visibility of the domain." id="domainVisibility_id"> - <mat-option *ngFor="let visibility of domainVisibilityOptions" + <option *ngFor="let visibility of domainVisibilityOptions" [value]="visibility.value"> {{visibility.key}} - </mat-option> - </mat-select> + </option> + </select> <mat-hint align="end">Domain visibility. In case of Internal user must be authenticated to get read the domain resources </mat-hint> @@ -64,15 +64,15 @@ <mat-form-field *ngIf="domainResourceTypes?.length" style="width:100%"> <mat-label>Default resource type for the domain</mat-label> - <mat-select formControlName="defaultResourceTypeIdentifier" + <select matNativeControl formControlName="defaultResourceTypeIdentifier" matTooltip="Default resource type for the domain." id="domainDefaultResourceType_id"> - <mat-option [value]="''" disabled></mat-option> - <mat-option *ngFor="let resDef of domainResourceTypes" + <option [value]="''" disabled></option> + <option *ngFor="let resDef of domainResourceTypes" [value]="resDef.identifier"> {{resDef.name}} ({{resDef.identifier}}) - </mat-option> - </mat-select> + </option> + </select> <mat-hint align="end">Domain visibility. In case of Internal user must be authenticated to get read the domain resources </mat-hint> diff --git a/smp-resource-extensions/oasis-cppa3-spi/src/test/java/eu/europa/ec/smp/spi/utils/DatatypeConverterTest.java b/smp-resource-extensions/oasis-cppa3-spi/src/test/java/eu/europa/ec/smp/spi/utils/DatatypeConverterTest.java new file mode 100644 index 0000000000000000000000000000000000000000..476d3f9c9e35b26bfddeb3b4f1930ccf35f968d5 --- /dev/null +++ b/smp-resource-extensions/oasis-cppa3-spi/src/test/java/eu/europa/ec/smp/spi/utils/DatatypeConverterTest.java @@ -0,0 +1,47 @@ +package eu.europa.ec.smp.spi.utils; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import java.time.OffsetDateTime; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +class DatatypeConverterTest { + + @ParameterizedTest + @CsvSource({"2020,1,1,10,0,1, 2020-01-01T10:00:00.000+01:00", + "2020,1,1,10,0,-1, 2020-01-01T10:00:00.000-01:00", + "2020,2,1,10,0,1, 2020-02-01T10:00:00.000+01:00", + "2020,1,2,10,0,1, 2020-01-02T10:00:00.000+01:00", + "2020,1,1,12,0,1, 2020-01-01T12:00:00.000+01:00", + "2020,1,1,10,1,1, 2020-01-01T10:01:00.000+01:00", + "2020,1,1,10,1,1, 2020-01-01T10:01:00+01:00", + "2020,1,1,10,1,1, 2020-01-01T10:01+01:00", + "2020,1,1,10,0,0, 2020-01-01T10:00:00Z"}) + void parseDateTime(int year, int mont, int day, int hour, int minutes, int offset, String value) { + OffsetDateTime dateTime = DatatypeConverter.parseDateTime(value); + assertNotNull(dateTime); + assertEquals(year, dateTime.getYear()); + assertEquals(mont, dateTime.getMonthValue()); + assertEquals(day, dateTime.getDayOfMonth()); + assertEquals(hour, dateTime.getHour()); + assertEquals(minutes, dateTime.getMinute()); + assertEquals(offset, dateTime.getOffset().getTotalSeconds() / 3600); + } + + @Test + void printDateTime() { + + String value = DatatypeConverter.printDateTime(OffsetDateTime.now()); + assertNotNull(value); + } + + @Test + void printDate() { + String value = DatatypeConverter.printDate(OffsetDateTime.now()); + assertNotNull(value); + } +} diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java index fbf31f7af0d7fc4fb1509751bae0a6a99a81d8c6..43ce5a29d5a63ce5e6409243cb832cc75b6fcb60 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/auth/UILoginAuthenticationToken.java @@ -1,6 +1,5 @@ package eu.europa.ec.edelivery.smp.auth; -import eu.europa.ec.edelivery.security.utils.SecurityUtils; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import org.springframework.security.authentication.AbstractAuthenticationToken; @@ -17,7 +16,6 @@ import java.util.Objects; * @since 4.2 */ public class UILoginAuthenticationToken extends UsernamePasswordAuthenticationToken { - private static final SMPLogger LOG = SMPLoggerFactory.getLogger(UILoginAuthenticationToken.class); SMPUserDetails userDetails; public UILoginAuthenticationToken(Object principal, Object credentials, SMPUserDetails userDetails) { @@ -26,15 +24,6 @@ public class UILoginAuthenticationToken extends UsernamePasswordAuthenticationTo this.userDetails = userDetails; } - public SecurityUtils.Secret getSecret() { - - if (userDetails == null) { - LOG.warn("Can not retrieve security token for session. User details is null!"); - return null; - } - return userDetails.getSessionSecret(); - } - public SMPUserDetails getUserDetails() { return userDetails; } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java index 90dbf3ee8811968457013074221767e55f5a237c..d47627c51d59f2c70b928effc6876d42ca15590d 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializer.java @@ -102,10 +102,10 @@ public class SMPExtensionInitializer implements InitializingBean { Optional<DBResourceDef> resourceDef = resourceDefDao.getResourceDefByIdentifier(resourceDefinitionSpi.identifier()); if (resourceDef.isPresent()) { DBResourceDef dbResourceDef = resourceDef.get(); - if (StringUtils.equals(extension.getIdentifier(),dbResourceDef.getExtension().getIdentifier() )) { + if (dbResourceDef.getExtension()!=null && StringUtils.equals(extension.getIdentifier(),dbResourceDef.getExtension().getIdentifier() )) { updateResourceSPI(resourceDefinitionSpi, dbResourceDef); } else { - LOG.error("Skip resource definition update due to extension missmatch! ResourceDefinition [{}] is already registered for extension [{}]. The current resource extension identifier is [{}]!", + LOG.error("Skip resource definition update due to extension mismatch! ResourceDefinition [{}] is already registered for extension [{}]. The current resource extension identifier is [{}]!", resourceDefinitionSpi, extension, dbResourceDef.getExtension()); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java index 2774ac1d8c8e62c80625c73c0c33e831152651df..a9cf0e51dde8aed25bbaefd3e78730a83c913c95 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/CredentialROToDBCredentialConverter.java @@ -22,6 +22,7 @@ public class CredentialROToDBCredentialConverter implements Converter<Credential target.setId(SessionSecurityUtils.decryptEntityId(source.getCredentialId())); } target.setName(source.getName()); + target.setCredentialType(source.getCredentialType()); target.setActive(source.isActive()); target.setDescription(source.getDescription()); target.setSequentialLoginFailureCount(source.getSequentialLoginFailureCount()); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java index 2786afad971f887bfff77857e8893d1331066fb0..aab6577eb020ce9206653b91ce563ad9fa4b9243 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/conversion/DBCredentialToCredentialROConverter.java @@ -31,6 +31,7 @@ public class DBCredentialToCredentialROConverter implements Converter<DBCredenti target.setCredentialId(SessionSecurityUtils.encryptedEntityId(source.getId())); target.setName(source.getName()); target.setActive(source.isActive()); + target.setCredentialType(source.getCredentialType()); target.setDescription(source.getDescription()); target.setSequentialLoginFailureCount(source.getSequentialLoginFailureCount()); target.setLastFailedLoginAttempt(source.getLastFailedLoginAttempt()); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java index 6294be956a4fc57d1f98dc5555d51c8e162ac030..2d78534424af3f65476356ccde2b7e50e9a3a3b3 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/GroupDao.java @@ -16,13 +16,12 @@ package eu.europa.ec.edelivery.smp.data.dao; import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; import eu.europa.ec.edelivery.smp.data.model.DBDomain; import eu.europa.ec.edelivery.smp.data.model.DBGroup; -import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.TypedQuery; -import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; import java.util.Optional; @@ -30,8 +29,8 @@ import java.util.Optional; import static eu.europa.ec.edelivery.smp.data.dao.QueryNames.*; import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY; import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY; -import static org.apache.commons.lang3.StringUtils.*; import static org.apache.commons.lang3.StringUtils.lowerCase; +import static org.apache.commons.lang3.StringUtils.trim; /** * The group of resources with shared resource management rights. The user with group admin has rights to create/delete @@ -74,9 +73,8 @@ public class GroupDao extends BaseDao<DBGroup> { /** * Returns the group or Optional.empty() if there is no group for name and domain. * - * @param name is the group name + * @param name is the group name * @param domain where the group is registered - * * @return the only single record for name from smp_group table or empty value * @throws IllegalStateException if no group is not configured */ @@ -87,9 +85,8 @@ public class GroupDao extends BaseDao<DBGroup> { /** * Returns the group or Optional.empty() if there is no group for name and domain. * - * @param name is the group name + * @param name is the group name * @param domainId where the group is registered - * * @return the only single record for name from smp_group table or empty value * @throws IllegalStateException if no group is not configured */ @@ -102,7 +99,7 @@ public class GroupDao extends BaseDao<DBGroup> { } catch (NoResultException e) { return Optional.empty(); } catch (NonUniqueResultException e) { - throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY.getMessage(name,domainId)); + throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_GROUP_MULTIPLE_ENTRY.getMessage(name, domainId)); } } @@ -110,9 +107,8 @@ public class GroupDao extends BaseDao<DBGroup> { /** * Returns the group or Optional.empty() if there is no group for name and domain code * - * @param name is the group name + * @param name is the group name * @param domainCode where the group is registered - * * @return the only single record for name from smp_group table or empty value * @throws IllegalStateException if no group is not configured */ @@ -125,7 +121,7 @@ public class GroupDao extends BaseDao<DBGroup> { } catch (NoResultException e) { return Optional.empty(); } catch (NonUniqueResultException e) { - throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY.getMessage(name,domainCode)); + throw new IllegalStateException(ILLEGAL_STATE_DOMAIN_MULTIPLE_ENTRY.getMessage(name, domainCode)); } } @@ -178,8 +174,8 @@ public class GroupDao extends BaseDao<DBGroup> { return false; } - public List<MembershipRoleType> toList(MembershipRoleType ... roleTypes){ - return Arrays.asList(roleTypes ==null || roleTypes.length==0 ?MembershipRoleType.values(): roleTypes); + public List<MembershipRoleType> toList(MembershipRoleType... roleTypes) { + return Arrays.asList(roleTypes == null || roleTypes.length == 0 || roleTypes[0] == null ? MembershipRoleType.values() : roleTypes); } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java index fb01b3807a150a33f458b1f4164a2d2646aa4d41..bb508d13412924f8d43c56f08460ef8a262b532e 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/dao/ResourceDao.java @@ -180,88 +180,4 @@ public class ResourceDao extends BaseDao<DBResource> { public void remove(DBResource resource) { removeById(resource.getId()); } - - - public long getServiceGroupCount(ResourceFilter filters) { - - CriteriaQuery<Long> cqCount = createSearchCriteria(filters, true, - null, - null); - return memEManager.createQuery(cqCount).getSingleResult(); - } - - public List<DBResource> getServiceGroupList(int startingAt, int maxResultCnt, - String sortField, - String sortOrder, ResourceFilter filters) { - - List<DBResource> lstResult; - try { - CriteriaQuery<DBResource> cq = createSearchCriteria(filters, - false, sortField, - sortOrder); - TypedQuery<DBResource> q = memEManager.createQuery(cq); - if (maxResultCnt > 0) { - q.setMaxResults(maxResultCnt); - } - if (startingAt > 0) { - q.setFirstResult(startingAt); - } - lstResult = q.getResultList(); - } catch (NoResultException ex) { - lstResult = new ArrayList<>(); - } - return lstResult; - } - - protected CriteriaQuery createSearchCriteria(ResourceFilter searchParams, - boolean forCount, String sortField, String sortOrder) { - CriteriaBuilder cb = memEManager.getCriteriaBuilder(); - CriteriaQuery cq = forCount ? cb.createQuery(Long.class) : cb.createQuery(DBResource.class); - Root<DBResource> serviceGroup = cq.from(DBResource.class); - if (forCount) { - cq.select(cb.count(serviceGroup)); - } else if (sortField != null) { - if (sortOrder != null && sortOrder.equalsIgnoreCase("desc")) { - cq.orderBy(cb.asc(serviceGroup.get(sortField))); - } else { - cq.orderBy(cb.desc(serviceGroup.get(sortField))); - } - } else { - if (!StringUtils.isBlank(defaultSortMethod)) { - cq.orderBy(cb.desc(serviceGroup.get(defaultSortMethod))); - } - } - - Join<DBResource, DBDomainResourceDef> serviceGroupJoinServiceGroupDomain = null; - Predicate ownerPredicate = null; - if (searchParams != null) { - - if (searchParams.getDomain() != null) { - serviceGroupJoinServiceGroupDomain = serviceGroup.join("serviceGroupDomains", JoinType.INNER); - serviceGroupJoinServiceGroupDomain = serviceGroupJoinServiceGroupDomain.on(cb.equal(serviceGroupJoinServiceGroupDomain.get("domain"), searchParams.getDomain())); - } - // limit for owner - if (searchParams.getOwner() != null) { - ownerPredicate = cb.equal(serviceGroup.join("users"), searchParams.getOwner()); - } - } - - // set order by - if (searchParams != null) { - List<Predicate> lstPredicate = createPredicates(searchParams, serviceGroup, cb); - - if (serviceGroupJoinServiceGroupDomain != null) { - lstPredicate.add(serviceGroupJoinServiceGroupDomain.getOn()); - } - if (ownerPredicate != null) { - lstPredicate.add(ownerPredicate); - } - - if (!lstPredicate.isEmpty()) { - Predicate[] tblPredicate = lstPredicate.stream().toArray(Predicate[]::new); - cq.where(cb.and(tblPredicate)); - } - } - return cq; - } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ErrorRO.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ErrorRO.java deleted file mode 100644 index 52c96ce9d501a153b5bf8a34560e05873a0274ea..0000000000000000000000000000000000000000 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/data/ui/ErrorRO.java +++ /dev/null @@ -1,39 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.ui; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.json.JsonMapper; - -import java.io.Serializable; - -/** - * @author Sebastian-Ion TINCU - * @since 4.0.1 - */ -public class ErrorRO implements Serializable { - - protected String message; - - public ErrorRO(String message) { - this.message = message; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - @JsonIgnore - public int getContentLength() { - try { - return JsonMapper.builder() - .findAndAddModules() - .build().writeValueAsString(this).length(); - } catch (JsonProcessingException e) { - return -1; - } - } -} diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java index 08eff34c92e50ca8f2631973abc2ce7ccf8eed73..2e903b54c161f15ef425e7ee79913216489d708e 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/DomainGuard.java @@ -58,13 +58,16 @@ public class DomainGuard { * Purpose of the method is to guard domain resources. It validates if users has any "rights to" execute the action * on the domain resources and subresources * - * @param user - * @param action - * @param domain - * @return + * @param user user to be authorized + * @param action action to be executed + * @param domain domain to be authorized + * @return true if user is authorized to execute the action on the domain */ public boolean isUserIsAuthorizedForDomainResourceAction(DBDomain domain, SMPUserDetails user, ResourceAction action) { LOG.debug("Authorize check for user [{}], domain [{}] and action [{}]", user, domain, action); + if (action == null) { + throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Null http action", "Action cannot be null!"); + } switch (action) { case READ: return canRead(user, domain); @@ -109,10 +112,9 @@ public class DomainGuard { * Method validates of the user can delete resources on the domain! Only users with group admin role can delete * domain resources * - * - * @param user - * @param domain - * @return + * @param user user to be authorized + * @param domain domain to be authorized + * @return true if user is authorized to execute the action on the domain */ public boolean canDelete(SMPUserDetails user, DBDomain domain) { LOG.info(SMPLogger.SECURITY_MARKER, "User: [{}] is trying to delete resource from domain: [{}]", user, domain); @@ -131,9 +133,9 @@ public class DomainGuard { * Method validates of the user can create/update resources on the domain! Only users with group admin role can create and users with admin resource role * can update * - * @param user - * @param domain - * @return + * @param user user to be authorized + * @param domain domain to be authorized + * @return true if user is authorized to execute the action on the domain */ public boolean canCreateUpdate(SMPUserDetails user, DBDomain domain) { LOG.info(SMPLogger.SECURITY_MARKER, "User: [{}] is trying to create/update resource from domain: [{}]", user, domain); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java index d2380cebac02249cf4b3919b611e40e8f00c0d6b..ec76779bf0db9252cd136eee26275f4f67264f53 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/security/ResourceGuard.java @@ -14,7 +14,6 @@ import eu.europa.ec.edelivery.smp.data.model.doc.DBSubresource; import eu.europa.ec.edelivery.smp.data.model.user.DBUser; import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; -import eu.europa.ec.edelivery.smp.identifiers.Identifier; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import eu.europa.ec.edelivery.smp.servlet.ResourceAction; @@ -41,7 +40,6 @@ public class ResourceGuard { this.identifierService = identifierService; } - /** * Method validates if the user is authorized for action on the resource * @@ -118,16 +116,6 @@ public class ResourceGuard { LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read private resource [{}]", user, isResourceMember, resource); return isResourceMember; } - /* - // if resource is internal the domain, group members and resource member can see it - if (resource.getVisibility() == VisibilityType.INTERNAL) { - - boolean isAuthorized = domainMemberDao.isUserDomainMember(dbuser, resource.getDomainResourceDef().getDomain()) - || groupMemberDao.isUserGroupMember(dbuser, Collections.singletonList(resource.getGroup())); - LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] authorized: [{}] to read internal resource [{}]", user, isAuthorized, resource); - return isAuthorized; - } -*/ LOG.debug(SMPLogger.SECURITY_MARKER, "User [{}] is not authorized to read resource [{}]", user, resource); return false; } @@ -192,19 +180,4 @@ public class ResourceGuard { // Subresource can be created by the resource admin, the same as for update return canUpdate(user, subresource); } - - /** - * Method validates if any of the service group users contains userID - * - * @param userId - * @param dbServiceGroup - * @return - */ - public boolean isResourceAdmin(Long userId, DBResource dbServiceGroup) { - /* return dbServiceGroup != null && - dbServiceGroup.getUsers().stream().filter(user -> user.getId().equals(userId)).findAny().isPresent(); - - */ - return false; - } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java index 0aec603989ff87b1d94ba897510ca51323dba40d..0fcdc3558951529d82eade5bb82245bbf2c5ee1e 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/CRLVerifierService.java @@ -39,7 +39,6 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.security.auth.x500.X500Principal; @@ -66,9 +65,12 @@ public class CRLVerifierService implements ICRLVerifierService { private static final X500Principal NULL_ISSUER = new X500Principal(""); private static final CRLReason NULL_CRL_REASON = CRLReason.UNSPECIFIED; - @Autowired - ConfigurationService configurationService; + protected final ConfigurationService configurationService; + + public CRLVerifierService(ConfigurationService configurationService) { + this.configurationService = configurationService; + } @Override public void verifyCertificateCRLs(X509Certificate cert) throws CertificateRevokedException, CertificateParsingException { @@ -156,13 +158,13 @@ public class CRLVerifierService implements ICRLVerifierService { crl = (X509CRL) cf.generateCRL(crlStream); } } catch (IOException e) { - exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL+"'" + exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL + "'" , ExceptionUtils.getRootCauseMessage(e), e); } catch (CertificateException e) { - exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL list is not supported '" + crlURL+"'" + exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL list is not supported '" + crlURL + "'" , ExceptionUtils.getRootCauseMessage(e), e); } catch (CRLException e) { - exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL can not be read: '" + crlURL+"'" + exception = new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "CRL can not be read: '" + crlURL + "'" , ExceptionUtils.getRootCauseMessage(e), e); } catch (SMPRuntimeException exc) { exception = exc; @@ -201,7 +203,7 @@ public class CRLVerifierService implements ICRLVerifierService { } return inputStream; } catch (Exception exc) { - throw new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Error occurred while downloading CRL:'" + crlURL+"'", ExceptionUtils.getRootCauseMessage(exc) ); + throw new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Error occurred while downloading CRL:'" + crlURL + "'", ExceptionUtils.getRootCauseMessage(exc)); } } @@ -235,7 +237,7 @@ public class CRLVerifierService implements ICRLVerifierService { return execute(HttpClients.createDefault(), new HttpGet(url)); } - private InputStream execute(CloseableHttpClient httpclient, HttpGet httpget) throws IOException { + protected InputStream execute(CloseableHttpClient httpclient, HttpGet httpget) throws IOException { try (CloseableHttpResponse response = httpclient.execute(httpget)) { return IOUtils.loadIntoBAIS(response.getEntity().getContent()); } @@ -250,14 +252,14 @@ public class CRLVerifierService implements ICRLVerifierService { return true; } - private boolean isValidParameter(String... parameters) { + protected boolean isValidParameter(String... parameters) { if (parameters == null || parameters.length == 0) { return false; } for (String parameter : Arrays.asList(parameters)) { - if (StringUtils.isEmpty(parameter)) { + if (StringUtils.isBlank(parameter)) { return false; } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java index 37147ec79a9fce9706173e4e102a56865cb8e57d..88b802f49108dd9f4dec0c9964ad6a655f50b3a4 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceHandlerService.java @@ -134,7 +134,7 @@ public class ResourceHandlerService extends AbstractResourceHandler { } } // set headers to response - responseData.getHttpHeaders().entrySet().stream() + responseData.getHttpHeaders().entrySet() .forEach(entry -> resourceResponse.setHttpHeader(entry.getKey(), entry.getValue())); // determinate status before resource is stored to database! resourceResponse.setHttpStatus(getHttpStatusForCreateUpdate(isNewResource, responseData)); @@ -232,7 +232,7 @@ public class ResourceHandlerService extends AbstractResourceHandler { // locate the resource handler ResolvedData resolvedData = resourceRequest.getResolvedData(); DBResource resource = resolvedData.getResource(); - integrationService.unregisterParticipant(resource, resolvedData.domain); + integrationService.unregisterParticipant(resource, resolvedData.getDomain()); resourceStorage.deleteResource(resource); } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java index 9a01a2a4de7cc51fd84fba071fc8ee84e17bf178..6e1f671dbfd889216d01b26b16468b2e4fe39109 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/resource/ResourceService.java @@ -23,6 +23,7 @@ import static eu.europa.ec.edelivery.smp.exceptions.ErrorCode.INVALID_OWNER; import static org.apache.commons.lang3.StringUtils.isNotBlank; /** + * * @author Joze Rihtarsic * @since 5.0 */ diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java index 4c065b953ce214dd5b74772c525d9277bee450b4..6cac6bc4792ff4d925bd8a71c6aaaade81de1c1b 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentService.java @@ -134,28 +134,19 @@ public class UIDocumentService { } DBDocument document = resource.getDocument(); - int version = document.getDocumentVersions().stream().mapToInt(dv -> dv.getVersion()) - .max().orElse(0); - - DBDocumentVersion documentVersion = new DBDocumentVersion(); - documentVersion.setVersion(version + 1); - documentVersion.setDocument(document); - documentVersion.setContent(bos.toByteArray()); - document.getDocumentVersions().add(documentVersion); - document.setCurrentVersion(documentVersion.getVersion()); - return convert(document, documentVersion); + return createNewVersionAndConvert(document, bos); } @Transactional public DocumentRo saveSubresourceDocumentForResource(Long subresource, Long resourceId, DocumentRo documentRo) { DBResource parentResource = resourceDao.find(resourceId); - DBSubresource enitity = subresourceDao.find(subresource); - DBSubresourceDef subresourceDef = enitity.getSubresourceDef(); + DBSubresource entity = subresourceDao.find(subresource); + DBSubresourceDef subresourceDef = entity.getSubresourceDef(); ResourceHandlerSpi resourceHandler = resourceHandlerService.getSubresourceHandler(subresourceDef, subresourceDef.getResourceDef()); RequestData data = resourceHandlerService.buildRequestDataForSubResource( parentResource.getDomainResourceDef().getDomain(), parentResource, - enitity, new ByteArrayInputStream(documentRo.getPayload().getBytes())); + entity, new ByteArrayInputStream(documentRo.getPayload().getBytes())); ByteArrayOutputStream bos = new ByteArrayOutputStream(); ResponseData responseData = new SpiResponseData(bos); try { @@ -164,18 +155,8 @@ public class UIDocumentService { throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "StoreSubresourceValidation", ExceptionUtils.getRootCauseMessage(e)); } - DBDocument document = enitity.getDocument(); - ; - int version = document.getDocumentVersions().stream().mapToInt(dv -> dv.getVersion()) - .max().orElse(0); - - DBDocumentVersion documentVersion = new DBDocumentVersion(); - documentVersion.setVersion(version + 1); - documentVersion.setDocument(document); - documentVersion.setContent(bos.toByteArray()); - document.getDocumentVersions().add(documentVersion); - document.setCurrentVersion(documentVersion.getVersion()); - return convert(document, documentVersion); + DBDocument document = entity.getDocument(); + return createNewVersionAndConvert(document, bos); } /** @@ -190,33 +171,41 @@ public class UIDocumentService { public DocumentRo getDocumentForResource(Long resourceId, int version) { DBResource resource = resourceDao.find(resourceId); DBDocument document = resource.getDocument(); - DBDocumentVersion documentVersion = null; - DBDocumentVersion currentVersion = null; - - - for (DBDocumentVersion dv : document.getDocumentVersions()) { - if (dv.getVersion() == version) { - documentVersion = dv; - } - if (dv.getVersion() == document.getCurrentVersion()) { - currentVersion = dv; - } - } - documentVersion = documentVersion == null ? currentVersion : documentVersion; - if (documentVersion == null && !document.getDocumentVersions().isEmpty()) { - documentVersion = document.getDocumentVersions().get(document.getDocumentVersions().size() - 1); - } - return convert(document, documentVersion); + return convertWithVersion(document, version); } @Transactional public DocumentRo getDocumentForSubResource(Long subresourceId, Long resourceId, int version) { DBSubresource subresource = subresourceDao.find(subresourceId); DBDocument document = subresource.getDocument(); - DBDocumentVersion documentVersion = null; - DBDocumentVersion currentVersion = null; + return convertWithVersion(document, version); + } + /** + * return Create new Document version and convert DBDocument to DocumentRo + * + * @param document to convert to DocumentRo + * @param baos to write document content + * @return DocumentRo + */ + private DocumentRo createNewVersionAndConvert(DBDocument document, ByteArrayOutputStream baos) { + // get max version + int version = document.getDocumentVersions().stream().mapToInt(dv -> dv.getVersion()) + .max().orElse(0); + + DBDocumentVersion documentVersion = new DBDocumentVersion(); + documentVersion.setVersion(version + 1); + documentVersion.setDocument(document); + documentVersion.setContent(baos.toByteArray()); + document.getDocumentVersions().add(documentVersion); + document.setCurrentVersion(documentVersion.getVersion()); + return convert(document, documentVersion); + } + + public DocumentRo convertWithVersion(DBDocument document, int version) { + DBDocumentVersion currentVersion = null; + DBDocumentVersion documentVersion = null; for (DBDocumentVersion dv : document.getDocumentVersions()) { if (dv.getVersion() == version) { documentVersion = dv; @@ -234,6 +223,7 @@ public class UIDocumentService { public DocumentRo convert(DBDocument document, DBDocumentVersion version) { DocumentRo documentRo = new DocumentRo(); + // set list of versions document.getDocumentVersions().forEach(dv -> documentRo.getAllVersions().add(dv.getVersion())); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java index ad78a9ac6498de4891aa38f38bd820454b5f4715..2141a2025881b57840c29e41f19757408b8c0ef4 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicService.java @@ -41,7 +41,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR private final ConversionService conversionService; - public UIDomainPublicService(DomainDao domainDao, DomainMemberDao domainMemberDao,ConversionService conversionService, UserDao userDao) { + public UIDomainPublicService(DomainDao domainDao, DomainMemberDao domainMemberDao, ConversionService conversionService, UserDao userDao) { this.domainDao = domainDao; this.domainMemberDao = domainMemberDao; this.conversionService = conversionService; @@ -56,12 +56,12 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR /** * Method returns Domain resource object list for page. * - * @param page - * @param pageSize - * @param sortField - * @param sortOrder - * @param filter - * @return + * @param page - page number + * @param pageSize - page size + * @param sortField - sort field + * @param sortOrder - sort order + * @param filter - filter + * @return ServiceResult<DomainPublicRO> - list of domain resource objects */ @Override public ServiceResult<DomainPublicRO> getTableList(int page, int pageSize, @@ -94,18 +94,18 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR @Transactional public ServiceResult<MemberRO> getDomainMembers(Long domainId, int page, int pageSize, - String filter) { + String filter) { Long count = domainMemberDao.getDomainMemberCount(domainId, filter); - ServiceResult<MemberRO> result = new ServiceResult<>(); + ServiceResult<MemberRO> result = new ServiceResult<>(); result.setPage(page); result.setPageSize(pageSize); - if (count<1) { + if (count < 1) { result.setCount(0L); return result; } result.setCount(count); List<DBDomainMember> memberROS = domainMemberDao.getDomainMembers(domainId, page, pageSize, filter); - List<MemberRO> memberList = memberROS.stream().map(member-> conversionService.convert(member, MemberRO.class)).collect(Collectors.toList()); + List<MemberRO> memberList = memberROS.stream().map(member -> conversionService.convert(member, MemberRO.class)).collect(Collectors.toList()); result.getServiceEntities().addAll(memberList); return result; @@ -115,18 +115,18 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR public MemberRO addMemberToDomain(Long domainId, MemberRO memberRO, Long memberId) { LOG.info("Add member [{}] to domain [{}]", memberRO.getUsername(), domainId); DBUser user = userDao.findUserByUsername(memberRO.getUsername()) - .orElseThrow(() -> new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add/edit membership", "User ["+memberRO.getUsername()+"] does not exists!")); + .orElseThrow(() -> new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add/edit membership", "User [" + memberRO.getUsername() + "] does not exists!")); DBDomainMember domainMember; - if (memberId !=null) { + if (memberId != null) { domainMember = domainMemberDao.find(memberId); domainMember.setRole(memberRO.getRoleType()); } else { DBDomain domain = domainDao.find(domainId); if (domainMemberDao.isUserDomainMember(user, domain)) { - throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add membership", "User ["+memberRO.getUsername()+"] is already a member!"); + throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Add membership", "User [" + memberRO.getUsername() + "] is already a member!"); } - domainMember = domainMemberDao.addMemberToDomain(domain, user,memberRO.getRoleType() ); + domainMember = domainMemberDao.addMemberToDomain(domain, user, memberRO.getRoleType()); } return conversionService.convert(domainMember, MemberRO.class); } @@ -138,7 +138,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR if (domainMember == null) { throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Membership", "Membership does not exists!"); } - if (!Objects.equals(domainMember.getDomain().getId(),domainId )){ + if (!Objects.equals(domainMember.getDomain().getId(), domainId)) { throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "Membership", "Membership does not belong to domain!"); } @@ -156,7 +156,7 @@ public class UIDomainPublicService extends UIServiceBase<DBDomain, DomainPublicR //filter and validate resources to be removed List<DBDomainResourceDef> domainResourceDefs = domain.getDomainResourceDefs(); - return domainResourceDefs.stream().map(domRef -> domRef.getResourceDef()).map(resourceDef -> + return domainResourceDefs.stream().map(DBDomainResourceDef::getResourceDef).map(resourceDef -> conversionService.convert(resourceDef, ResourceDefinitionRO.class)).collect(Collectors.toList()); } } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java index 1ffceef42929acde004e4714f735a533b2ef82e7..a64af55725d027271146489f2fb2ded8de5a6235 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java @@ -100,6 +100,9 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> { @Transactional public void createDomainData(DomainRO data) { + if (StringUtils.isBlank(data.getDomainCode())){ + throw new SMPRuntimeException(ErrorCode.INVALID_DOMAIN_DATA, "Domain code must not be empty!"); + }; if (domainDao.getDomainByCode(data.getDomainCode()).isPresent()){ throw new SMPRuntimeException(ErrorCode.INVALID_DOMAIN_DATA, "Domain with code ["+data.getDomainCode()+"] already exists!"); diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java index 5f2a03cf70781b053a3e0bfba733a3717ce783f4..b2c4e3e1ddb6ba501ecb234da308e04c78b29d3a 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceService.java @@ -191,7 +191,7 @@ public class UIResourceService { Optional<DBResource> existResource = resourceDao.getResource(resourceIdentifier.getValue(),resourceIdentifier.getScheme(), optRedef.get(), group.getDomain()); if (existResource.isPresent()) { - throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_RESOURCE_CREATE, "Resource definition [val:" + resourceRO.getIdentifierValue() + " scheme:" + resourceRO.getIdentifierScheme() + "] already exists for domain!"); + throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, ACTION_RESOURCE_CREATE, "Resource [val:" + resourceRO.getIdentifierValue() + " scheme:" + resourceRO.getIdentifierScheme() + "] already exists for domain!"); } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java index 4aaa108528a9be229d2a5511934ab00aaaae3171..5e6844e99e4ce7da522cf75a4fef188697abdd41 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceService.java @@ -75,14 +75,11 @@ public class UISubresourceService { } resource.getSubresources().remove(subresource); subresourceDao.remove(subresource); - - - return conversionService.convert(subresource, SubresourceRO.class); } @Transactional - public SubresourceRO createResourceForGroup(SubresourceRO subResourceRO, Long resourceId) { + public SubresourceRO createSubresourceForResource(SubresourceRO subResourceRO, Long resourceId) { DBResource resParent= resourceDao.find(resourceId); if (resParent == null) { @@ -112,7 +109,6 @@ public class UISubresourceService { return conversionService.convert(subresource, SubresourceRO.class); } - public DBDocument createDocumentForSubresourceDef(DBSubresourceDef subresourceDef) { DBDocument document = new DBDocument(); document.setCurrentVersion(1); @@ -120,5 +116,4 @@ public class UISubresourceService { document.setName(subresourceDef.getName()); return document; } - } diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java index 480ad87e82906406c724bbba0cda930982abc50b..0ce0c73c7bd53c0ee9029a6105bdf8b099ed644a 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreService.java @@ -189,6 +189,14 @@ public class UITruststoreService extends BasicKeystoreService { public CertificateRO getCertificateData(byte[] buff, boolean validate, boolean validateDuplicate) { X509Certificate cert; CertificateRO cro; + + if (buff ==null || buff.length ==0){ + cro = new CertificateRO(); + cro.setError(true); + cro.setInvalid(true); + cro.setInvalidReason("Can not read [null/empty] certificate!"); + return cro; + } try { cert = X509CertificateUtils.getX509Certificate(buff); } catch (CertificateException e) { @@ -345,7 +353,7 @@ public class UITruststoreService extends BasicKeystoreService { * * @param cert * @throws CertificateException - */ + * public void checkFullCertificateValidityLegacy(CertificateRO cert) throws CertificateException { // trust data in database if (cert.getValidFrom() != null && OffsetDateTime.now().isBefore(cert.getValidFrom())) { @@ -383,7 +391,7 @@ public class UITruststoreService extends BasicKeystoreService { } } } - +*/ boolean isTruststoreChanged() { File file = getTruststoreFile(); return !Objects.equals(lastUpdateTrustStoreFile, file) || diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java index 9eff4c771001f60e6cd06bfd1350939288a92a61..2ec17d2b745cb7d66fc575d8c1c09c475b92b622 100644 --- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java +++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIUserService.java @@ -368,7 +368,6 @@ public class UIUserService extends UIServiceBase<DBUser, UserRO> { UserRO result = convertToRo(user); return result; - } public List<CredentialRO> getUserCredentials(Long userId, diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/auth/SMPCertificateAuthenticationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/auth/SMPCertificateAuthenticationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ec4bd1f72b47497a9dbbf854fb895a8bbea3671d --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/auth/SMPCertificateAuthenticationTest.java @@ -0,0 +1,92 @@ +package eu.europa.ec.edelivery.smp.auth; + +import eu.europa.ec.edelivery.security.PreAuthenticatedCertificatePrincipal; +import eu.europa.ec.edelivery.smp.data.model.user.DBUser; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.security.core.GrantedAuthority; + +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class SMPCertificateAuthenticationTest { + + PreAuthenticatedCertificatePrincipal mockPrincipal = Mockito.mock(PreAuthenticatedCertificatePrincipal.class); + List<GrantedAuthority> mockListAuthorities = Collections.singletonList(Mockito.mock(GrantedAuthority.class)); + DBUser mockUser = Mockito.mock(DBUser.class); + SMPCertificateAuthentication testInstance = new SMPCertificateAuthentication(mockPrincipal, mockListAuthorities, mockUser); + @Test + void testGetAuthorities() { + + Collection<? extends GrantedAuthority> result = testInstance.getAuthorities(); + + assertNotNull(result); + assertEquals(mockListAuthorities, result); + + } + + @Test + void testGetCredentials() { + String credential = "mockCredentials"; + Mockito.when(mockPrincipal.getCredentials()).thenReturn(credential); + Object result = testInstance.getCredentials(); + + assertNotNull(result); + assertEquals(credential, result); + } + + @Test + void testGetDetails() { + Object result = testInstance.getDetails(); + + assertNotNull(result); + assertEquals(mockPrincipal, result); + } + + @Test + void testGetPrincipal() { + Object result = testInstance.getPrincipal(); + + assertNotNull(result); + assertEquals(mockPrincipal, result); + } + + @Test + void isAuthenticated() { + boolean result = testInstance.isAuthenticated(); + + assertFalse(result); + } + + @Test + void testSetAuthenticated() { + boolean b = true; + testInstance.setAuthenticated(b); + + assertTrue(testInstance.isAuthenticated()); + } + + @Test + void testGetName() { + String mockname = "mockName"; + Mockito.when(mockPrincipal.getName(Mockito.anyInt())).thenReturn(mockname); + + String result = testInstance.getName(); + + assertNotNull(result); + assertEquals(mockname, result); + } + + @Test + void testToString() { + String mockname = "mockName"; + Mockito.when(mockPrincipal.getName(Mockito.anyInt())).thenReturn(mockname); + String result = testInstance.toString(); + + assertNotNull(result); + assertEquals(mockname, result); + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializerTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0223d2052351249cb825e4531c72f4af5e54ff20 --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPExtensionInitializerTest.java @@ -0,0 +1,42 @@ +package eu.europa.ec.edelivery.smp.config.init; + +import eu.europa.ec.edelivery.smp.config.SMPDatabaseConfig; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.dao.ExtensionDao; +import eu.europa.ec.edelivery.smp.services.AbstractServiceTest; +import eu.europa.ec.smp.spi.OasisSMPExtension; +import eu.europa.ec.smp.spi.def.OasisSMPServiceGroup10; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.transaction.annotation.Transactional; + +import static org.junit.jupiter.api.Assertions.*; + + +@ContextConfiguration( classes = {SMPExtensionInitializerTest.OasisSMPExtensionConfig.class} +) +public class SMPExtensionInitializerTest extends AbstractJunit5BaseDao { + @Configuration + @ComponentScan({"eu.europa.ec.smp.spi"}) + public static class OasisSMPExtensionConfig { + + } + + @Autowired + SMPExtensionInitializer testInstance; + + @Autowired + ExtensionDao extensionDao; + + @Test + @Transactional + public void testValidateExtensionData() { + int extensionCount = extensionDao.getAllExtensions().size(); + testInstance.validateExtensionData(); + // added OasisSMP extension + assertEquals(extensionCount + 1, extensionDao.getAllExtensions().size()); + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPKeystoreConfBuilderTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPKeystoreConfBuilderTest.java new file mode 100644 index 0000000000000000000000000000000000000000..60fe605941c37d6fd327bad3a7d69ac6e4bbb54c --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/config/init/SMPKeystoreConfBuilderTest.java @@ -0,0 +1,40 @@ +package eu.europa.ec.edelivery.smp.config.init; + + + +import eu.europa.ec.edelivery.security.utils.SecurityUtils; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.KeyStore; + +import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*; +import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.TRUSTSTORE_FILENAME; +import static org.junit.jupiter.api.Assertions.*; + +public class SMPKeystoreConfBuilderTest { + + @Test + public void testBuild(){ + File outputFolder = Paths.get("target").toFile(); + + SecurityUtils.Secret secret = SecurityUtils.generatePrivateSymmetricKey(true); + SMPConfigurationInitializer initPropertyService = Mockito.mock(SMPConfigurationInitializer.class); + + KeyStore keystore = SMPKeystoreConfBuilder.create() + .propertySecurityToken(TRUSTSTORE_PASSWORD) + .propertyTruststoreDecToken(TRUSTSTORE_PASSWORD_DECRYPTED) + .propertyType(TRUSTSTORE_TYPE) + .propertyFilename(TRUSTSTORE_FILENAME) + .outputFolder(outputFolder) + .testMode(true) + .secret(secret) + .initPropertyService(initPropertyService) + .build(); + + assertNotNull(keystore); + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java deleted file mode 100644 index 9e94e4c1ab65de74c96e8ad8814f798e7e961555..0000000000000000000000000000000000000000 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceGroupDaoMetadataIntegrationTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.dao; - -import org.junit.Ignore; - - -/** - * Purpose of class is to test all resource methods with database. - * - * @author Joze Rihtarsic - * @since 4.1 - */ -@Ignore -public class ServiceGroupDaoMetadataIntegrationTest extends AbstractResourceDaoTest { - -/* - @Test - @Transactional - - public void persistNewServiceGroupWithMetadata() { - // given - DBDomain d= domainDao.getDomainByCode(TEST_DOMAIN_CODE_1).get(); - - DBResource sg = new DBResource(); - sg.setIdentifierValue(TEST_SG_ID_1); - sg.setIdentifierScheme(TEST_SG_SCHEMA_1); - sg.addDomain(d); - - DBSubresource md = TestDBUtils.createDBSubresource(TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); - sg.getResourceDomains().get(0).addServiceMetadata(md); - - // when - testInstance.persistFlushDetach(sg); - - - // then - DBResource res = testInstance.findServiceGroup(TEST_SG_ID_1, TEST_SG_SCHEMA_1 ).get(); - assertTrue(sg!=res); // test different object instance - assertNotNull(res.getId()); - assertEquals(TEST_SG_ID_1, res.getIdentifierValue()); // test equal method - same entity - assertEquals(TEST_SG_SCHEMA_1, res.getIdentifierScheme()); // test equal method - same entity - assertEquals(1, res.getResourceDomains().size()); // domain must be loaded - assertEquals(d.getDomainCode(), res.getResourceDomains().get(0).getDomain().getDomainCode()); // test loaded Domain - - } - - @Test - @Transactional - public void addMetadataToServiceGroup() { - // given - DBResource sg = createAndSaveNewServiceGroup(); - DBResource res = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get(); - DBSubresource md = TestDBUtils.createDBSubresource(TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); - //when - res.getResourceDomains().get(0).addServiceMetadata(md); - assertNotNull(md.getXmlContent()); - update(res); - testInstance.clearPersistenceContext(); - // then - DBResource res2 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get(); - assertNotNull(res2); - assertEquals(1, res2.getResourceDomains().get(0).getSubresourcesList().size()); - assertTrue(Arrays.equals(md.getXmlContent(), res2.getResourceDomains().get(0).getSubresourcesList().get(0).getXmlContent())); - } - - @Test - @Transactional - public void updateServiceMetadataXML() { - // given - DBResource sg = createAndSaveNewServiceGroupWithMetadata(); - DBResource res = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get(); - DBSubresource md = res.getResourceDomains().get(0).getSubresource(0); - - byte[] str = TestDBUtils.generateDocumentSample(sg.getIdentifierValue(),sg.getIdentifierScheme(), - md.getDocumentIdentifier(),md.getDocumentIdentifierScheme(),UUID.randomUUID().toString()); - assertNotEquals (str, md.getXmlContent()); - //when - res.getResourceDomains().get(0).getSubresource(0).setXmlContent(str); - update(res); - - testInstance.clearPersistenceContext(); - // then - DBResource res2 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get(); - assertNotNull(res2); - assertEquals(1, res2.getResourceDomains().get(0).getSubresourcesList().size()); - assertTrue(Arrays.equals(str, res2.getResourceDomains().get(0).getSubresourcesList().get(0).getXmlContent())); - - } - - @Test - @Transactional - public void removeServiceMetadata() { - // given - DBResource sg = createAndSaveNewServiceGroupWithMetadata(); - DBResource res = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get(); - - assertEquals(1, res.getResourceDomains().get(0).getSubresourcesList().size()); - DBSubresource dsmd = res.getResourceDomains().get(0).getSubresourcesList().get(0); - - // when - res.getResourceDomains().get(0).removeServiceMetadata(dsmd); - testInstance.update(res); - testInstance.clearPersistenceContext(); - DBResource res2 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()).get(); - - // then - assertEquals(0, res.getResourceDomains().get(0).getSubresourcesList().size()); - } - - @Test - public void removeDBServiceGroupWithServiceMetadata() { - // given - DBResource sg = createAndSaveNewServiceGroupWithMetadata(); - Optional<DBResource> resOpt1 = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()); - assertTrue(resOpt1.isPresent()); - - // when - testInstance.removeServiceGroup(resOpt1.get()); - testInstance.clearPersistenceContext(); - - // then - Optional<DBResource> resOptDS = testInstance.findServiceGroup(sg.getIdentifierValue(), sg.getIdentifierScheme()); - assertFalse(resOptDS.isPresent()); - } - - */ -} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDaoIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDaoIntegrationTest.java deleted file mode 100644 index bc18cdf32a178dab35c5fbd220b3b746cbf3db35..0000000000000000000000000000000000000000 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/dao/ServiceMetadataDaoIntegrationTest.java +++ /dev/null @@ -1,107 +0,0 @@ -package eu.europa.ec.edelivery.smp.data.dao; - -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.springframework.beans.factory.annotation.Autowired; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -/** - * Purpose of class is to test all resource methods with database. - * - * @author Joze Rihtarsic - * @since 4.1 - */ -@Ignore -public class ServiceMetadataDaoIntegrationTest extends AbstractBaseDao { - - @Autowired - SubresourceDao testInstance; - - @Autowired - DomainDao domainDao; - - @Autowired - UserDao userDao; - - @Autowired - ResourceDao serviceGroupDao; - - @Rule - public ExpectedException expectedEx = ExpectedException.none(); - @Test - public void mockTest(){ - - } -/* - @Before - @Transactional - public void prepareDatabase() { - DBDomain testDomain01 =TestDBUtils.createDBDomain(TestConstants.TEST_DOMAIN_CODE_1); - DBDomain testDomain02 =TestDBUtils.createDBDomain(TestConstants.TEST_DOMAIN_CODE_2); - domainDao.persistFlushDetach(testDomain01); - domainDao.persistFlushDetach(testDomain02); - - DBUser u1 = TestDBUtils.createDBUserByUsername(TestConstants.USERNAME_1); - DBUser u2 = TestDBUtils.createDBUserByCertificate(TestConstants.USER_CERT_2); - userDao.persistFlushDetach(u1); - userDao.persistFlushDetach(u2); - - // create service group with two documents in one domains - DBResource sg1d1 = TestDBUtils.createDBServiceGroup(TEST_SG_ID_1, TEST_SG_SCHEMA_1); - DBSubresource sg1md1 = TestDBUtils.createDBSubresource(TEST_SG_ID_1, TEST_SG_SCHEMA_1, - TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); - DBSubresource sg1md2 = TestDBUtils.createDBSubresource(TEST_SG_ID_1, TEST_SG_SCHEMA_1, - TEST_DOC_ID_2, TEST_DOC_SCHEMA_2); - sg1d1.addDomain(testDomain01); - sg1d1.getServiceGroupDomains().get(0).addServiceMetadata(sg1md1); - sg1d1.getServiceGroupDomains().get(0).addServiceMetadata(sg1md2); - sg1d1.getUsers().add(u1); - sg1d1.getUsers().add(u2); - serviceGroupDao.update(sg1d1); - // create service group one document in two domains - DBResource sg2 = TestDBUtils.createDBServiceGroup(TEST_SG_ID_2, TEST_SG_SCHEMA_2); - DBSubresource sg2md1 = TestDBUtils.createDBSubresource(TEST_SG_ID_2, TEST_SG_SCHEMA_2, - TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); - DBSubresource sg2md2 = TestDBUtils.createDBSubresource(TEST_SG_ID_2, TEST_SG_SCHEMA_2, - TEST_DOC_ID_2, TEST_DOC_SCHEMA_2); - sg2.addDomain(testDomain01); - sg2.addDomain(testDomain02); - sg2.getServiceGroupDomains().get(0).addServiceMetadata(sg2md1); - sg2.getServiceGroupDomains().get(1).addServiceMetadata(sg2md2); - sg2.getUsers().add(u1); - sg2.getUsers().add(u2); - serviceGroupDao.update(sg2); - } - - @Test - @Transactional - public void testFindServiceMetadata() { - // given - // when - Optional<DBSubresource> osmd1 = testInstance.findServiceMetadata(TEST_SG_ID_1, TEST_SG_SCHEMA_1, - TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); - Optional<DBSubresource> osmd2 = testInstance.findServiceMetadata(TEST_SG_ID_2, TEST_SG_SCHEMA_2, - TEST_DOC_ID_1, TEST_DOC_SCHEMA_1); - - // test - assertTrue(osmd1.isPresent()); - assertTrue(osmd2.isPresent()); - } - - @Test - @Transactional - public void testFindServiceMetadataList() { - // given - // when - List<DBSubresource> lst1 = testInstance.getAllMetadataForServiceGroup(TEST_SG_ID_1, TEST_SG_SCHEMA_1); - List<DBSubresource> lst2 = testInstance.getAllMetadataForServiceGroup(TEST_SG_ID_2, TEST_SG_SCHEMA_2); - // test - assertEquals(2, lst1.size()); - assertEquals(2, lst2.size()); - }*/ - -} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java index d9232752cc2a86f76fa345417eb93ce662ae60d7..70f337365e29adc663459518fff7c1327b134fc5 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/data/ui/databind/SMPAuthorityDeserializerTest.java @@ -21,9 +21,8 @@ import static org.junit.Assert.assertNotNull; public class SMPAuthorityDeserializerTest { @Test - @Ignore public void deserialize() throws IOException { - String value = "{\"username\":\"smp\",\"password\":null,\"emailAddress\":null,\"authorities\":[\"ROLE_USER\"],\"active\":true,\"role\":\"ROLE_USER\",\"certificate\":null,\"statusPassword\":0,\"passwordExpired\":true}"; + String value = "{\"status\":0,\"index\":0,\"actionMessage\":null,\"userId\":\"hsAkhiqJp1o89VZ4iBtmLnEM2vkb5FJTt0vWEUIxOw\",\"username\":\"user\",\"active\":true,\"role\":\"USER\",\"emailAddress\":\"user@mail-example.local\",\"fullName\":null,\"smpTheme\":null,\"smpLocale\":null,\"casAuthenticated\":false,\"casUserDataUrl\":null,\"passwordExpireOn\":null,\"sequentialLoginFailureCount\":0,\"lastFailedLoginAttempt\":null,\"suspendedUtil\":null,\"passwordUpdatedOn\":null,\"authorities\":[\"ROLE_USER\"],\"statusPassword\":0,\"passwordExpired\":true,\"showPasswordExpirationWarning\":false,\"forceChangeExpiredPassword\":false}"; ObjectMapper mapper = new ObjectMapper(); UserRO userRO = mapper.readValue(value, UserRO.class); @@ -31,6 +30,5 @@ public class SMPAuthorityDeserializerTest { assertNotNull(userRO.getAuthorities()); assertEquals(1, userRO.getAuthorities().size()); assertEquals(SMPAuthority.S_AUTHORITY_USER.getAuthority(), userRO.getAuthorities().toArray(new SMPAuthority[]{})[0].getAuthority()); - } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java new file mode 100644 index 0000000000000000000000000000000000000000..13ea2e83cf4064e78b4adea6da2fa9f3f39949bb --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/security/DomainGuardTest.java @@ -0,0 +1,114 @@ +package eu.europa.ec.edelivery.smp.security; + +import eu.europa.ec.edelivery.smp.auth.SMPUserDetails; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.model.DBDomain; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; +import eu.europa.ec.edelivery.smp.servlet.ResourceAction; +import eu.europa.ec.edelivery.smp.servlet.ResourceRequest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationServiceException; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; + +class DomainGuardTest extends AbstractJunit5BaseDao { + + @Autowired + DomainGuard testInstance; + + ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class); + SMPUserDetails user = Mockito.mock(SMPUserDetails.class); + + @BeforeEach + public void prepareDatabase() { + testUtilsDao.clearData(); + testUtilsDao.creatDomainMemberships(); + testUtilsDao.createGroupMemberships(); + testUtilsDao.createResourceMemberships(); + } + + @Test + void testResolveAndAuthorizeForDomainInvalidRequestMissingAction() { + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + + assertThat(result.getMessage(), containsString("Invalid request")); + } + + @Test + void testResolveAndAuthorizeForDomainDeleteInvalidRequestNotUser() { + when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); + AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + + assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); + } + + @Test + void testResolveAndAuthorizeForDomainDeleteInvalidRequestUserNotAuthorized() { + when(user.getUser()).thenReturn(testUtilsDao.getUser3()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); + AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + + assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); + } + + @Test + void testResolveAndAuthorizeForDomainCreateInvalidRequestUserNotAuthorized() { + when(user.getUser()).thenReturn(testUtilsDao.getUser3()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); + AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + + assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); + } + + @Test + void testResolveAndAuthorizeForDomainDeleteUserAuthorized() { + when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + assertNotNull(domain); + } + + @Test + void testResolveAndAuthorizeForDomainDeleteCreateAuthorized() { + when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + assertNotNull(domain); + } + + @Test + void testResolveAndAuthorizeForDomainCreateInvalidRequestNotUser() { + when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); + AuthenticationServiceException result = assertThrows(AuthenticationServiceException.class, + () -> testInstance.resolveAndAuthorizeForDomain(resourceRequest, user)); + + assertThat(result.getMessage(), containsString("User is not authorized for the domain!")); + } + + @Test + void testResolveAndAuthorizeForDomainNoUserOK() { + when(resourceRequest.getAction()).thenReturn(ResourceAction.READ); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + assertNotNull(domain); + } + + @Test + void testResolveAndAuthorizeForDomain() { + when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.READ); + DBDomain domain = testInstance.resolveAndAuthorizeForDomain(resourceRequest, user); + assertNotNull(domain); + } + +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java index c4df3e45dc75fcd86ee48e04d3df99187c3f63e7..b9d4cd886adfac062d282bbb6326905bd314e5a5 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/CRLVerifierServiceTest.java @@ -2,46 +2,36 @@ package eu.europa.ec.edelivery.smp.services; import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; -import org.junit.*; -import org.junit.rules.ExpectedException; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.mockito.Mockito; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.util.ReflectionTestUtils; import java.io.IOException; -import java.security.Security; +import java.io.InputStream; import java.security.cert.*; -import static org.hamcrest.CoreMatchers.startsWith; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThrows; +import static org.hamcrest.Matchers.startsWith; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; -public class CRLVerifierServiceTest extends AbstractServiceIntegrationTest { +public class CRLVerifierServiceTest { - @Rule - public ExpectedException expectedEx = ExpectedException.none(); + ConfigurationService mockConfigurationService = Mockito.mock(ConfigurationService.class); - @Autowired - private CRLVerifierService crlVerifierServiceInstance; + private CRLVerifierService testInstance = new CRLVerifierService(mockConfigurationService); - @Autowired - private ConfigurationService configurationService; - - - @BeforeClass - public static void beforeClass() throws Exception { - Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); - } - - @Before + @BeforeEach public void beforeMethods() { - crlVerifierServiceInstance = Mockito.spy(crlVerifierServiceInstance); - configurationService = Mockito.spy(configurationService); - ReflectionTestUtils.setField(crlVerifierServiceInstance, "configurationService", configurationService); + doReturn(true).when(mockConfigurationService).forceCRLValidation(); // force verification - Mockito.doReturn(true).when(configurationService).forceCRLValidation(); + testInstance = Mockito.spy(testInstance); } @@ -53,25 +43,25 @@ public class CRLVerifierServiceTest extends AbstractServiceIntegrationTest { CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509CRL crl = (X509CRL) cf.generateCRL(getClass().getResourceAsStream("/certificates/smp-crl-test.crl")); - Mockito.doReturn(crl).when(crlVerifierServiceInstance).getCRLByURL("https://localhost/clr"); + doReturn(crl).when(testInstance).getCRLByURL("https://localhost/clr"); // when-then - crlVerifierServiceInstance.verifyCertificateCRLs(certificate); + testInstance.verifyCertificateCRLs(certificate); // must not throw exception } @Test - public void verifyCertificateCRLRevokedTest() throws CertificateException, CRLException, IOException { + public void verifyCertificateCRLRevokedTest() throws CertificateException, CRLException { // given X509Certificate certificate = loadCertificate("smp-crl-revoked.pem"); - CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509CRL crl = (X509CRL) cf.generateCRL(getClass().getResourceAsStream("/certificates/smp-crl-test.crl")); - Mockito.doReturn(crl).when(crlVerifierServiceInstance).getCRLByURL("https://localhost/crl"); + doReturn(crl).when(testInstance).getCRLByURL("https://localhost/crl"); - CertificateRevokedException result = assertThrows(CertificateRevokedException.class, () -> crlVerifierServiceInstance.verifyCertificateCRLs(certificate)); + CertificateRevokedException result = assertThrows(CertificateRevokedException.class, + () -> testInstance.verifyCertificateCRLs(certificate)); assertThat(result.getMessage(), startsWith("Certificate has been revoked, reason: UNSPECIFIED")); } @@ -79,59 +69,91 @@ public class CRLVerifierServiceTest extends AbstractServiceIntegrationTest { public void verifyCertificateCRLsX509FailsToConnectTest() throws CertificateException { // given X509Certificate certificate = loadCertificate("smp-crl-test-all.pem"); - - expectedEx.expect(SMPRuntimeException.class); - expectedEx.expectMessage("Certificate error [Error occurred while downloading CRL:'https://localhost/clr']. Error: ConnectException: Connection refused (Connection refused)!"); - - // when-then - crlVerifierServiceInstance.verifyCertificateCRLs(certificate); + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () -> + testInstance.verifyCertificateCRLs(certificate)); + // then + assertThat(result.getMessage(), + startsWith("Certificate error [Error occurred while downloading CRL:'https://localhost/clr']. Error: ConnectException: Connection refused (Connection refused)!")); } @Test - public void downloadCRLWrongUrlSchemeTest() throws CertificateException, CRLException, IOException { + public void downloadCRLWrongUrlSchemeTest() { - X509CRL crl = crlVerifierServiceInstance.downloadCRL("wrong://localhost/crl", true); + X509CRL crl = testInstance.downloadCRL("wrong://localhost/crl", true); assertNull(crl); } @Test - public void downloadCRLUrlSchemeLdapTest() throws CertificateException, CRLException, IOException { + public void downloadCRLUrlSchemeLdapTest() { - X509CRL crl = crlVerifierServiceInstance.downloadCRL("ldap://localhost/crl", true); + X509CRL crl = testInstance.downloadCRL("ldap://localhost/crl", true); assertNull(crl); } @Test - public void verifyCertificateCRLsRevokedSerialTest() throws CertificateException, CRLException, IOException { + public void verifyCertificateCRLsRevokedSerialTest() throws CertificateException, CRLException { CertificateFactory cf = CertificateFactory.getInstance("X.509"); X509CRL crl = (X509CRL) cf.generateCRL(getClass().getResourceAsStream("/certificates/smp-crl-test.crl")); - Mockito.doReturn(crl).when(crlVerifierServiceInstance).downloadCRL("https://localhost/crl", true); + doReturn(crl).when(testInstance).getCRLByURL("https://localhost/crl"); - CertificateRevokedException result = assertThrows(CertificateRevokedException.class, () ->crlVerifierServiceInstance.verifyCertificateCRLs("11", "https://localhost/crl")); + CertificateRevokedException result = assertThrows(CertificateRevokedException.class, () -> testInstance.verifyCertificateCRLs("11", "https://localhost/crl")); assertThat(result.getMessage(), startsWith("Certificate has been revoked, reason: UNSPECIFIED")); } @Test - public void verifyCertificateCRLsRevokedSerialTestThrowIOExceptionHttps() throws CertificateException, IOException, CRLException { + public void verifyCertificateCRLsRevokedSerialTestThrowIOExceptionHttps() { String crlURL = "https://localhost/crl"; - Mockito.doThrow(new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL + "'", "IOException: Can not access URL")).when(crlVerifierServiceInstance).downloadCRL("https://localhost/crl", true); + doThrow(new SMPRuntimeException(ErrorCode.CERTIFICATE_ERROR, "Can not download CRL '" + crlURL + "'", "IOException: Can not access URL")) + .when(testInstance).getCRLByURL("https://localhost/crl"); + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () -> testInstance.verifyCertificateCRLs("11", "https://localhost/crl")); + // then + assertThat(result.getMessage(), startsWith("Certificate error [Can not download CRL 'https://localhost/crl']. Error: IOException: Can not access URL")); + } - expectedEx.expect(SMPRuntimeException.class); - expectedEx.expectMessage("Certificate error [Can not download CRL 'https://localhost/crl']. Error: IOException: Can not access URL!"); + @ParameterizedTest + @CsvSource({ + "param1, true", + "param1|param2, true", + ", false", + "'', false", + "' |test', false", + "test| |test, false", + }) + public void testIsValidParameter(String values, boolean expectedResult) { + //given + String[] parameters = StringUtils.split(values, '|'); + //when + boolean result = testInstance.isValidParameter(parameters); + //then + assertEquals(expectedResult, result); + } - // when-then - crlVerifierServiceInstance.verifyCertificateCRLs("11", "https://localhost/crl"); + @Test + public void testDownloadURLViaProxy() throws IOException { + //given + String url = "https://localhost/crl"; + String proxy = "localhost"; + int proxyPort = 8080; + String proxyUser = "user"; + String proxyPassword = "password"; + InputStream inputStream = Mockito.mock(InputStream.class); + doReturn(inputStream).when(testInstance).execute(any(), any()); + //when + InputStream result = testInstance.downloadURLViaProxy(url, proxy, proxyPort, proxyUser, proxyPassword); + //then + assertEquals(inputStream, result); } private X509Certificate loadCertificate(String filename) throws CertificateException { CertificateFactory fact = CertificateFactory.getInstance("X.509"); - X509Certificate cer = (X509Certificate) + return (X509Certificate) fact.generateCertificate(getClass().getResourceAsStream("/certificates/" + filename)); - return cer; } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java index 69e363642d310d8c902cfe3377c06e45ed2e4733..fd918d2874e3885ec1e9d3ac9b8d37010378afba 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ConfigurationServiceAllGetMethodsTest.java @@ -2,6 +2,7 @@ package eu.europa.ec.edelivery.smp.services; import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum; +import eu.europa.ec.edelivery.smp.data.ui.enums.AlertLevelEnum; import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.reflect.MethodUtils; import org.junit.Test; @@ -20,15 +21,16 @@ import static org.mockito.Mockito.*; @RunWith(Parameterized.class) public class ConfigurationServiceAllGetMethodsTest { - private static String TEST_STRING = "TestString"; - private static List<String> TEST_STRING_LIST = Arrays.asList("TestString1","TestString2","TestString3"); - private static Map<String, String> TEST_MAP = new HashMap<>(); - private static Pattern TEST_REXEXP= Pattern.compile(".*"); - private static File TEST_FILE= new File("/tmp/file"); + private static final String TEST_STRING = "TestString"; + private static final List<String> TEST_STRING_LIST = Arrays.asList("TestString1", "TestString2", "TestString3"); + private static final Map<String, String> TEST_MAP = new HashMap<>(); + private static final Pattern TEST_REXEXP = Pattern.compile(".*"); + private static final File TEST_FILE = new File("/tmp/file"); private static URL TEST_URL; + static { try { - TEST_URL= new URL("http://test:123/path"); + TEST_URL = new URL("http://test:123/path"); } catch (Exception e) { fail("Fail to generated test data" + ExceptionUtils.getRootCauseMessage(e)); } @@ -40,19 +42,19 @@ public class ConfigurationServiceAllGetMethodsTest { @Parameterized.Parameters(name = "{index}: {0}") public static Collection<Object[]> data() { // set property values for property, set value, method name, value or property, value (true) or property (false) - return Arrays.asList(new Object[][] { + return Arrays.asList(new Object[][]{ {EXTERNAL_TLS_AUTHENTICATION_CLIENT_CERT_HEADER_ENABLED, Boolean.TRUE, "isExternalTLSAuthenticationWithClientCertHeaderEnabled", true}, {EXTERNAL_TLS_AUTHENTICATION_CERTIFICATE_HEADER_ENABLED, Boolean.TRUE, "isExternalTLSAuthenticationWithSSLClientCertHeaderEnabled", true}, {OUTPUT_CONTEXT_PATH, Boolean.FALSE, "isUrlContextEnabled", true}, //{HTTP_FORWARDED_HEADERS_ENABLED, Boolean.TRUE, "", true}, {HTTP_HSTS_MAX_AGE, 1234, "getHttpHeaderHstsMaxAge", true}, {HTTP_HEADER_SEC_POLICY, TEST_STRING, "getHttpHeaderContentSecurityPolicy", true}, - {HTTP_NO_PROXY_HOSTS,TEST_STRING, "getHttpNoProxyHosts", false}, + {HTTP_NO_PROXY_HOSTS, TEST_STRING, "getHttpNoProxyHosts", false}, {HTTP_PROXY_HOST, TEST_STRING, "getHttpProxyHost", false}, {HTTP_PROXY_PASSWORD, TEST_STRING, "getProxyCredentialToken", true}, {HTTP_PROXY_PORT, 8800, "getHttpProxyPort", true}, {HTTP_PROXY_USER, TEST_STRING, "getProxyUsername", true}, - {PARTC_SCH_VALIDATION_REGEXP, TEST_REXEXP,"getParticipantIdentifierSchemeRexExp", true}, + {PARTC_SCH_VALIDATION_REGEXP, TEST_REXEXP, "getParticipantIdentifierSchemeRexExp", true}, {PARTC_SCH_VALIDATION_REGEXP, TEST_STRING, "getParticipantIdentifierSchemeRexExpPattern", false}, {PARTC_SCH_REGEXP_MSG, TEST_STRING, "getParticipantIdentifierSchemeRexExpMessage", true}, //{PARTC_EBCOREPARTYID_CONCATENATE, Boolean.FALSE, "getForceConcatenateEBCorePartyId", true}, @@ -60,10 +62,10 @@ public class ConfigurationServiceAllGetMethodsTest { {CS_PARTICIPANTS, TEST_STRING_LIST, "getCaseSensitiveParticipantScheme", true}, {CS_DOCUMENTS, TEST_STRING_LIST, "getCaseSensitiveDocumentScheme", true}, {SML_ENABLED, Boolean.FALSE, "isSMLIntegrationEnabled", true}, - {SML_URL,TEST_URL, "getSMLIntegrationUrl", true}, + {SML_URL, TEST_URL, "getSMLIntegrationUrl", true}, {SML_TLS_DISABLE_CN_CHECK, Boolean.FALSE, "smlDisableCNCheck", true}, {SML_TLS_SERVER_CERT_SUBJECT_REGEXP, TEST_REXEXP, "getSMLIntegrationServerCertSubjectRegExp", true}, - {SML_LOGICAL_ADDRESS, TEST_STRING,"getSMLIntegrationSMPLogicalAddress", false}, + {SML_LOGICAL_ADDRESS, TEST_STRING, "getSMLIntegrationSMPLogicalAddress", false}, {SML_PHYSICAL_ADDRESS, TEST_STRING, "getSMLIntegrationSMPPhysicalAddress", false}, {KEYSTORE_PASSWORD, TEST_STRING, "getKeystoreCredentialToken", true}, {KEYSTORE_FILENAME, TEST_FILE, "getKeystoreFile", true}, @@ -76,7 +78,7 @@ public class ConfigurationServiceAllGetMethodsTest { {CERTIFICATE_ALLOWED_CERTIFICATEPOLICY_OIDS, TEST_STRING_LIST, "getAllowedCertificatePolicies", true}, {CERTIFICATE_SUBJECT_REGULAR_EXPRESSION, TEST_REXEXP, "getCertificateSubjectRegularExpression", true}, //{SMP_PROPERTY_REFRESH_CRON, TEST_STRING, "", true}, - {UI_COOKIE_SESSION_SECURE, Boolean.FALSE, "getSessionCookieSecure", true}, + {UI_COOKIE_SESSION_SECURE, Boolean.FALSE, "getSessionCookieSecure", true}, {UI_COOKIE_SESSION_MAX_AGE, 1111, "getSessionCookieMaxAge", true}, {UI_COOKIE_SESSION_SITE, TEST_STRING, "getSessionCookieSameSite", true}, {UI_COOKIE_SESSION_PATH, TEST_STRING, "getSessionCookiePath", true}, @@ -88,8 +90,8 @@ public class ConfigurationServiceAllGetMethodsTest { {PASSWORD_POLICY_REGULAR_EXPRESSION, TEST_STRING, "getPasswordPolicyRexExpPattern", false}, {PASSWORD_POLICY_WARNING_DAYS_BEFORE_EXPIRE, 10, "getPasswordPolicyUIWarningDaysBeforeExpire", true}, {PASSWORD_POLICY_FORCE_CHANGE_EXPIRED, Boolean.TRUE, "getPasswordPolicyForceChangeIfExpired", true}, - {USER_LOGIN_FAIL_DELAY,1000, "getLoginFailDelayInMilliSeconds", true}, - {ACCESS_TOKEN_FAIL_DELAY,1000, "getAccessTokenLoginFailDelayInMilliSeconds", true}, + {USER_LOGIN_FAIL_DELAY, 1000, "getLoginFailDelayInMilliSeconds", true}, + {ACCESS_TOKEN_FAIL_DELAY, 1000, "getAccessTokenLoginFailDelayInMilliSeconds", true}, {USER_MAX_FAILED_ATTEMPTS, 55, "getLoginMaxAttempts", true}, {USER_SUSPENSION_TIME, 3600, "getLoginSuspensionTimeInSeconds", true}, {ACCESS_TOKEN_POLICY_VALID_DAYS, 1212, "getAccessTokenPolicyValidDays", true}, @@ -108,48 +110,58 @@ public class ConfigurationServiceAllGetMethodsTest { {ENCODED_SLASHES_ALLOWED_IN_URL, Boolean.FALSE, "encodedSlashesAllowedInUrl", true}, {SMP_ALERT_CREDENTIALS_SERVER, TEST_STRING, "getTargetServerForCredentialValidation", true}, {SML_TLS_SERVER_CERT_SUBJECT_REGEXP, TEST_STRING, "getSMLIntegrationServerCertSubjectRegExpPattern", false}, - {SML_TLS_TRUSTSTORE_USE_SYSTEM_DEFAULT, Boolean.FALSE , "useSystemTruststoreForTLS", true}, + {SML_TLS_TRUSTSTORE_USE_SYSTEM_DEFAULT, Boolean.FALSE, "useSystemTruststoreForTLS", true}, {SSO_CAS_SMP_LOGIN_URI, TEST_STRING, "getCasSMPLoginRelativePath", true}, {ALERT_USER_LOGIN_FAILURE_ENABLED, Boolean.FALSE, "getAlertUserLoginFailureEnabled", true}, - {ALERT_USER_SUSPENDED_ENABLED, Boolean.FALSE, "getAlertUserSuspendedEnabled", true}, + {ALERT_USER_SUSPENDED_ENABLED, Boolean.FALSE, "getAlertUserSuspendedEnabled", true}, {ALERT_USER_SUSPENDED_MAIL_SUBJECT, TEST_STRING, "getAlertUserSuspendedSubject", true}, - {ALERT_PASSWORD_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpirePasswordEnabled", true}, + {ALERT_PASSWORD_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpirePasswordEnabled", true}, {ALERT_PASSWORD_BEFORE_EXPIRATION_PERIOD, 10, "getAlertBeforeExpirePasswordPeriod", true}, {ALERT_PASSWORD_BEFORE_EXPIRATION_INTERVAL, 10, "getAlertBeforeExpirePasswordInterval", true}, {ALERT_PASSWORD_BEFORE_EXPIRATION_MAIL_SUBJECT, TEST_STRING, "getAlertBeforeExpirePasswordMailSubject", true}, - {ALERT_PASSWORD_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredPasswordEnabled", true}, + {ALERT_PASSWORD_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredPasswordEnabled", true}, {ALERT_PASSWORD_EXPIRED_PERIOD, 10, "getAlertExpiredPasswordPeriod", true}, {ALERT_PASSWORD_EXPIRED_INTERVAL, 10, "getAlertExpiredPasswordInterval", true}, {ALERT_PASSWORD_EXPIRED_MAIL_SUBJECT, TEST_STRING, "getAlertExpiredPasswordMailSubject", true}, - {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpireAccessTokenEnabled", true}, + {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpireAccessTokenEnabled", true}, {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_PERIOD, 10, "getAlertBeforeExpireAccessTokenPeriod", true}, {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_INTERVAL, 10, "getAlertBeforeExpireAccessTokenInterval", true}, {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_MAIL_SUBJECT, TEST_STRING, "getAlertBeforeExpireAccessTokenMailSubject", true}, - {ALERT_ACCESS_TOKEN_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredAccessTokenEnabled", true}, + {ALERT_ACCESS_TOKEN_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredAccessTokenEnabled", true}, {ALERT_ACCESS_TOKEN_EXPIRED_PERIOD, 10, "getAlertExpiredAccessTokenPeriod", true}, {ALERT_ACCESS_TOKEN_EXPIRED_INTERVAL, 10, "getAlertExpiredAccessTokenInterval", true}, {ALERT_ACCESS_TOKEN_EXPIRED_MAIL_SUBJECT, TEST_STRING, "getAlertExpiredAccessTokenMailSubject", true}, - {ALERT_CERTIFICATE_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpireCertificateEnabled", true}, + {ALERT_CERTIFICATE_BEFORE_EXPIRATION_ENABLED, Boolean.FALSE, "getAlertBeforeExpireCertificateEnabled", true}, {ALERT_CERTIFICATE_BEFORE_EXPIRATION_PERIOD, 10, "getAlertBeforeExpireCertificatePeriod", true}, {ALERT_CERTIFICATE_BEFORE_EXPIRATION_INTERVAL, 10, "getAlertBeforeExpireCertificateInterval", true}, {ALERT_CERTIFICATE_BEFORE_EXPIRATION_MAIL_SUBJECT, TEST_STRING, "getAlertBeforeExpireCertificateMailSubject", true}, - {ALERT_CERTIFICATE_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredCertificateEnabled", true}, + {ALERT_CERTIFICATE_EXPIRED_ENABLED, Boolean.FALSE, "getAlertExpiredCertificateEnabled", true}, {ALERT_CERTIFICATE_EXPIRED_PERIOD, 10, "getAlertExpiredCertificatePeriod", true}, {ALERT_CERTIFICATE_EXPIRED_INTERVAL, 10, "getAlertExpiredCertificateInterval", true}, {ALERT_CERTIFICATE_EXPIRED_MAIL_SUBJECT, TEST_STRING, "getAlertExpiredCertificateMailSubject", true}, {SMP_ALERT_BATCH_SIZE, 10, "getAlertCredentialsBatchSize", true}, {SMP_ALERT_MAIL_FROM, TEST_STRING, "getAlertEmailFrom", true}, + {ALERT_USER_SUSPENDED_LEVEL, AlertLevelEnum.HIGH, "getAlertUserSuspendedLevel", true}, + {ALERT_USER_LOGIN_FAILURE_LEVEL, AlertLevelEnum.HIGH, "getAlertUserLoginFailureLevel", true}, + {ALERT_PASSWORD_BEFORE_EXPIRATION_LEVEL, AlertLevelEnum.HIGH, "getAlertBeforeExpirePasswordLevel", true}, + {ALERT_ACCESS_TOKEN_BEFORE_EXPIRATION_LEVEL, AlertLevelEnum.HIGH, "getAlertBeforeExpireAccessTokenLevel", true}, + {ALERT_ACCESS_TOKEN_EXPIRED_LEVEL, AlertLevelEnum.HIGH, "getAlertExpiredAccessTokenLevel", true}, + {ALERT_CERTIFICATE_BEFORE_EXPIRATION_LEVEL, AlertLevelEnum.HIGH, "getAlertBeforeExpireCertificateLevel", true}, + {ALERT_CERTIFICATE_EXPIRED_LEVEL, AlertLevelEnum.HIGH, "getAlertExpiredCertificateLevel", true}, + + }); } + private final SMPPropertyEnum property; private final Object value; private final String methodName; private final boolean fromValue; - public ConfigurationServiceAllGetMethodsTest(SMPPropertyEnum property, Object value, String methodName,boolean fromValue) { + public ConfigurationServiceAllGetMethodsTest(SMPPropertyEnum property, Object value, String methodName, boolean fromValue) { this.property = property; this.value = value; this.methodName = methodName; @@ -160,14 +172,14 @@ public class ConfigurationServiceAllGetMethodsTest { public void testProperty() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException { if (fromValue) { - doReturn(value).when(configurationDaoMock).getCachedPropertyValue(property); + doReturn(value instanceof AlertLevelEnum ? value.toString() : value).when(configurationDaoMock).getCachedPropertyValue(property); } else { doReturn(value).when(configurationDaoMock).getCachedProperty(property); } Object result = MethodUtils.invokeExactMethod(testInstance, methodName); - if (result instanceof Optional){ + if (result instanceof Optional) { assertEquals(value, ((Optional<?>) result).get()); - }else { + } else { assertEquals(value, result); } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java index 0a8c56ab6ff52664c6b24db6e7944fa7e4862b81..e1f7492c1e19dd826eefdafd7077943de11d9bd5 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/SMLIntegrationServiceTest.java @@ -55,7 +55,6 @@ import static org.mockito.Mockito.verify; SMLIntegrationService.class}) public class SMLIntegrationServiceTest extends AbstractServiceIntegrationTest { - @Autowired IdentifierService identifierService; @Autowired diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..cdb8ae53c293100016d60e0c44a56ad167cae266 --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/resource/ResourceServiceTest.java @@ -0,0 +1,168 @@ +package eu.europa.ec.edelivery.smp.services.resource; + +import eu.europa.ec.edelivery.smp.auth.SMPUserDetails; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.model.user.DBUser; +import eu.europa.ec.edelivery.smp.exceptions.MalformedIdentifierException; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; +import eu.europa.ec.edelivery.smp.servlet.ResourceAction; +import eu.europa.ec.edelivery.smp.servlet.ResourceRequest; +import eu.europa.ec.edelivery.smp.servlet.ResourceResponse; +import eu.europa.ec.edelivery.smp.testutil.TestConstants; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.Arrays; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; + +class ResourceServiceTest extends AbstractJunit5BaseDao { + @Autowired + ResourceService testInstance; + + ResourceRequest resourceRequest = Mockito.mock(ResourceRequest.class); + ResolvedData resolvedData = Mockito.mock(ResolvedData.class); + ResourceResponse resourceResponse = Mockito.mock(ResourceResponse.class); + SMPUserDetails user = Mockito.mock(SMPUserDetails.class); + + + @BeforeEach + public void prepareDatabase() { + testUtilsDao.clearData(); + testUtilsDao.creatDomainMemberships(); + testUtilsDao.createGroupMemberships(); + testUtilsDao.createResourceMemberships(); + } + + @Test + void handleRequestFail() { + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.handleRequest(user, resourceRequest, resourceResponse)); + + assertThat(result.getMessage(), containsString("Invalid request")); + } + + @ParameterizedTest + @CsvSource({ + ", 'Location vector coordinates must not be null!'", + "1/2/3/4/5/6/7, 'More than max. count (5) of Resource Location vector coordinates!'", + TestConstants.TEST_DOMAIN_CODE_1 + ", 'Not enough path parameters to locate resource'", + TestConstants.TEST_DOMAIN_CODE_1 + "/" + TestConstants.TEST_RESOURCE_DEF_CPP + ", 'Not enough path parameters to locate resource'", + "badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: badidentifier'", + "doc-type/badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: doc-type'", + "domain/doc-type/badIdentifier, 'Malformed identifier, scheme and id should be delimited by double colon: domain'", + }) + void handleRequestFailBadPath(String path, String errorMessage) { + when(resourceRequest.getUrlPathParameters()).thenReturn(path == null ? null : Arrays.asList(path.split("/"))); + when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1()); + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.handleRequest(user, resourceRequest, resourceResponse)); + + assertThat(result.getMessage(), containsString(errorMessage)); + } + + @ParameterizedTest + @CsvSource({ + "'', 'Can not parse empty identifier value!'" + } + ) + void handleRequestFailBadIdentifier(String path, String errorMessage) { + when(resourceRequest.getUrlPathParameters()).thenReturn(path == null ? null : Arrays.asList(path.split("/"))); + when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1()); + + MalformedIdentifierException result = assertThrows(MalformedIdentifierException.class, + () -> testInstance.handleRequest(user, resourceRequest, resourceResponse)); + + assertThat(result.getMessage(), containsString(errorMessage)); + } + + @Test + void handleRequestReadOK() { + when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::" + TestConstants.TEST_SG_ID_1)); + when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.READ); + when(resourceRequest.getResolvedData()).thenReturn(resolvedData); + when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp()); + when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1()); + when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1()); + testInstance.handleRequest(user, resourceRequest, resourceResponse); + } + + @Test + void handleRequestCreateOK() { + when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::0007:001:utest")); + when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); + when(resourceRequest.getResolvedData()).thenReturn(resolvedData); + when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp()); + when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1()); + when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1()); + when(resourceRequest.getInputStream()).thenReturn(ResourceResolverServiceTest.class.getResourceAsStream("/examples/oasis-smp-1.0/ServiceGroupOK.xml")); + testInstance.handleRequest(user, resourceRequest, resourceResponse); + } + + @Test + void handleRequestDeleteOK() { + when(user.getUser()).thenReturn(testUtilsDao.getUser1()); + when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::" + TestConstants.TEST_SG_ID_1)); + when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.DELETE); + when(resourceRequest.getResolvedData()).thenReturn(resolvedData); + when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp()); + when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1()); + when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1()); + + testInstance.handleRequest(user, resourceRequest, resourceResponse); + } + + @Test + void handleRequestCreateNotAuthorized() { + + when(resourceRequest.getUrlPathParameters()).thenReturn(Arrays.asList(TestConstants.TEST_DOMAIN_CODE_1, TestConstants.TEST_SG_SCHEMA_1 + "::0007:001:utest")); + when(resourceRequest.getAuthorizedDomain()).thenReturn(testUtilsDao.getD1()); + when(resourceRequest.getAction()).thenReturn(ResourceAction.CREATE_UPDATE); + when(resourceRequest.getResolvedData()).thenReturn(resolvedData); + when(resolvedData.getResourceDef()).thenReturn(testUtilsDao.getResourceDefSmp()); + when(resolvedData.getResource()).thenReturn(testUtilsDao.getResourceD1G1RD1()); + when(resolvedData.getDomain()).thenReturn(testUtilsDao.getD1()); + when(resourceRequest.getInputStream()).thenReturn(ResourceResolverServiceTest.class.getResourceAsStream("/examples/oasis-smp-1.0/ServiceGroupOK.xml")); + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.handleRequest(user, resourceRequest, resourceResponse)); + + assertThat(result.getMessage(), containsString("User not authorized")); + } + + + @Test + void testFindOwnerOK() { + DBUser user = testInstance.findOwner(testUtilsDao.getUser1().getUsername()); + assertNotNull(user); + assertEquals(testUtilsDao.getUser1().getUsername(), user.getUsername()); + } + + @Test + void testFindOwnerNotExists() { + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, () -> testInstance.findOwner("CN=User not exists,OU=Test Users,O=Test Domain,C=BE:1234567890")); + assertThat(result.getMessage(), containsString("Invalid owner id")); + } + + + @Test + void testSplitSerialFromSubject() { + String[] values = + ResourceService.splitSerialFromSubject("CN=Test User 1,OU=Test Users,O=Test Domain,C=BE:1234567890"); + assertEquals(2, values.length); + assertEquals("CN=Test User 1,OU=Test Users,O=Test Domain,C=BE", values[0]); + assertEquals("1234567890", values[1]); + } + +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java index f1a327d75aea0ff3258ac9fc39558dc79ce41a2d..6ec81a26f65182eb0696a52f95b32ebd0c13bf81 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIAlertServiceIntegrationTest.java @@ -13,7 +13,7 @@ import org.springframework.test.context.ContextConfiguration; import static org.junit.Assert.assertEquals; -@Ignore + @ContextConfiguration(classes = UIAlertService.class) public class UIAlertServiceIntegrationTest extends AbstractServiceIntegrationTest { diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java index bd2dbe93003611648a8cdc8145c4eac80c57b9a3..a4d2df8e4e68b11d6dcb352506c22aaf9a6d47a0 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDocumentServiceTest.java @@ -105,4 +105,42 @@ public class UIDocumentServiceTest extends AbstractServiceIntegrationTest { MatcherAssert.assertThat(result.getMessage(), CoreMatchers.containsString("Invalid request [ResourceValidation]")); } + + @Test + public void testGetDocumentForResource(){ + DBResource resource = testUtilsDao.getResourceD1G1RD1(); + DocumentRo testDoc = testInstance.getDocumentForResource(resource.getId(), 1); + assertNotNull(testDoc.getPayload()); + } + + @Test + public void testGetDocumentForSubResource(){ + DBSubresource subresource = testUtilsDao.getSubresourceD1G1RD1_S1(); + DocumentRo testDoc = testInstance.getDocumentForSubResource(subresource.getId(), subresource.getResource().getId(), 1); + assertNotNull(testDoc.getPayload()); + } + + @Test + public void testSaveDocumentForResource(){ + DBResource resource = testUtilsDao.getResourceD1G1RD1(); + DocumentRo testDoc = testInstance.generateDocumentForResource(resource.getId(), null); + assertNotNull(testDoc.getPayload()); + //when + DocumentRo result = testInstance.saveDocumentForResource(resource.getId(), testDoc); + // then + assertNotNull(result); + } + + @Test + public void testSaveSubresourceDocumentForResource(){ + DBSubresource subresource = testUtilsDao.getSubresourceD1G1RD1_S1(); + DocumentRo testDoc = testInstance.generateDocumentForSubresource(subresource.getId(), + subresource.getResource().getId(), + null); + assertNotNull(testDoc.getPayload()); + //when + DocumentRo result = testInstance.saveSubresourceDocumentForResource(subresource.getId(), subresource.getResource().getId(), testDoc); + // then + assertNotNull(result); + } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..c0785254230a7bc788b4010ea0ccc3c29dbcfed7 --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainPublicServiceTest.java @@ -0,0 +1,95 @@ +package eu.europa.ec.edelivery.smp.services.ui; + +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.exceptions.BadRequestException; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@ContextConfiguration(classes = UIDomainPublicService.class) +class UIDomainPublicServiceTest extends AbstractJunit5BaseDao { + + @Autowired + UIDomainPublicService testInstance; + + @BeforeEach + public void prepareDatabase() { + testUtilsDao.clearData(); + testUtilsDao.creatDomainMemberships(); + testUtilsDao.createGroupMemberships(); + testUtilsDao.createResourceMemberships(); + + } + + @Test + public void testGetTableList() { + ServiceResult<DomainPublicRO> result = testInstance.getTableList(-1, -1, null, null, null); + assertEquals(2, result.getCount().intValue()); + } + + @Test + public void testGetAllDomainsForDomainAdminUser() { + List<DomainRO> result = testInstance.getAllDomainsForDomainAdminUser(testUtilsDao.getUser1().getId()); + assertEquals(1, result.size()); + } + + @Test + public void testGetAllDomainsForDomainAdminUser3() { + List<DomainRO> result = testInstance.getAllDomainsForDomainAdminUser(testUtilsDao.getUser3().getId()); + assertEquals(0, result.size()); + } + + @Test + public void testGetAllDomainsForGroupAdminUser() { + List<DomainRO> result = testInstance.getAllDomainsForGroupAdminUser(testUtilsDao.getUser1().getId()); + assertEquals(1, result.size()); + } + + @Test + public void testGetAllDomainsForGroupAdminUser3() { + List<DomainRO> result = testInstance.getAllDomainsForGroupAdminUser(testUtilsDao.getUser3().getId()); + assertEquals(0, result.size()); + } + + @Test + public void testGetAllDomainsForResourceAdminUser() { + List<DomainRO> result = testInstance.getAllDomainsForResourceAdminUser(testUtilsDao.getUser1().getId()); + assertEquals(1, result.size()); + } + + @Test + public void testGetAllDomainsForResourceAdminUser3() { + List<DomainRO> result = testInstance.getAllDomainsForResourceAdminUser(testUtilsDao.getUser3().getId()); + assertEquals(0, result.size()); + } + + @Test + public void testGetDomainMembers() { + ServiceResult<MemberRO> result = testInstance.getDomainMembers(testUtilsDao.getD1().getId(), -1, -1, null); + assertEquals(1, result.getCount().intValue()); + assertEquals(1, result.getServiceEntities().size()); + } + + @Test + public void testGetResourceDefDomainList() { + List<ResourceDefinitionRO> result = testInstance.getResourceDefDomainList(testUtilsDao.getD1().getId()); + assertEquals(2, result.size()); + } + + @Test + public void testGetResourceDefDomainListFal() { + BadRequestException result = assertThrows(BadRequestException.class, () -> + testInstance.getResourceDefDomainList(-100L)); + + MatcherAssert.assertThat(result.getMessage(), org.hamcrest.Matchers.containsString("Domain does not exist in database")); + + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java index d9c36484fc49f9a3d77e0355f01e277f41112a9c..548ba4128bfd699a8c1cf0c6e61e2ed0bbcc5bef 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainServiceIntegrationTest.java @@ -2,13 +2,10 @@ package eu.europa.ec.edelivery.smp.services.ui; import eu.europa.ec.edelivery.smp.data.model.DBDomain; -import eu.europa.ec.edelivery.smp.data.model.doc.DBResource; -import eu.europa.ec.edelivery.smp.data.ui.DeleteEntityValidation; import eu.europa.ec.edelivery.smp.data.ui.DomainRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest; import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; -import org.junit.Ignore; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -19,34 +16,28 @@ import static org.junit.Assert.*; /** - * Purpose of class is to test UIDomainService base methods + * Purpose of class is to test UIDomainService base methods * * @author Joze Rihtarsic * @since 4.1 */ -@Ignore -@ContextConfiguration(classes= UIDomainService.class) +@ContextConfiguration(classes = UIDomainService.class) public class UIDomainServiceIntegrationTest extends AbstractServiceIntegrationTest { - @Rule - public ExpectedException expectedExeption = ExpectedException.none(); @Autowired protected UIDomainService testInstance; - protected void insertDataObjects(int size){ - for (int i=0; i < size; i++){ - DBDomain d = TestDBUtils.createDBDomain("domain"+i); + protected void insertDataObjects(int size) { + for (int i = 0; i < size; i++) { + DBDomain d = TestDBUtils.createDBDomain("domain" + i); domainDao.persistFlushDetach(d); } } @Test - public void testGetTableListEmpty(){ - - // given - - //when - ServiceResult<DomainRO> res = testInstance.getTableList(-1,-1,null, null, null); + public void testGetTableListEmpty() { + // given when + ServiceResult<DomainRO> res = testInstance.getTableList(-1, -1, null, null, null); // then assertNotNull(res); assertEquals(0, res.getCount().intValue()); @@ -57,12 +48,12 @@ public class UIDomainServiceIntegrationTest extends AbstractServiceIntegrationTe } @Test - public void testGetTableList15(){ + public void testGetTableList15() { // given insertDataObjects(15); //when - ServiceResult<DomainRO> res = testInstance.getTableList(-1,-1,null, null,null); + ServiceResult<DomainRO> res = testInstance.getTableList(-1, -1, null, null, null); // then diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java index 8a691e1754ec2d2240c98cfe4596690308444e22..210c5ee1fb0e2da12e1f315098933c36993aa826 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIPropertyServiceIntegrationTest.java @@ -24,11 +24,10 @@ import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.SMP_CLUSTE import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.SMP_PROPERTY_REFRESH_CRON; import static org.junit.Assert.*; -@Ignore + @ContextConfiguration(classes = {UIPropertyService.class}) public class UIPropertyServiceIntegrationTest extends AbstractServiceIntegrationTest { - @Autowired protected UIPropertyService testInstance; @Autowired @@ -130,7 +129,7 @@ public class UIPropertyServiceIntegrationTest extends AbstractServiceIntegration assertEquals(propertyName, result.getProperty()); assertEquals(propertyValue, result.getValue()); assertFalse(result.isPropertyValid()); - MatcherAssert.assertThat(result.getErrorMessage(), CoreMatchers.containsString("Invalid integer: [" + propertyValue + "]. Error:NumberFormatException: For input string: \"" + propertyValue + "\"!")); + MatcherAssert.assertThat(result.getErrorMessage(), CoreMatchers.containsString("Invalid integer: [" + propertyValue + "]. Error:NumberFormatException")); } @Test diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java index e60d188ac77d584a79c2256e16cd534d16346514..bac7784cce12a1ca7dec89c7b8fd54627a88e12b 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIResourceServiceTest.java @@ -1,6 +1,7 @@ package eu.europa.ec.edelivery.smp.services.ui; import eu.europa.ec.edelivery.smp.config.ConversionTestConfig; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; import eu.europa.ec.edelivery.smp.data.dao.ResourceDao; import eu.europa.ec.edelivery.smp.data.dao.ResourceMemberDao; import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; @@ -10,10 +11,11 @@ import eu.europa.ec.edelivery.smp.data.model.user.DBResourceMember; import eu.europa.ec.edelivery.smp.data.ui.MemberRO; import eu.europa.ec.edelivery.smp.data.ui.ResourceRO; import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; -import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest; +import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; import eu.europa.ec.edelivery.smp.testutil.TestROUtils; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.test.context.ContextConfiguration; @@ -21,10 +23,12 @@ import org.springframework.test.context.ContextConfiguration; import java.util.UUID; import static eu.europa.ec.edelivery.smp.testutil.TestConstants.TEST_SG_SCHEMA_1; -import static org.junit.Assert.*; +import static org.hamcrest.CoreMatchers.containsString; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.*; @ContextConfiguration(classes = {UIResourceService.class, ConversionTestConfig.class}) -public class UIResourceServiceTest extends AbstractServiceIntegrationTest { +public class UIResourceServiceTest extends AbstractJunit5BaseDao { @Autowired protected UIResourceService testInstance; @@ -35,7 +39,7 @@ public class UIResourceServiceTest extends AbstractServiceIntegrationTest { @Autowired ConversionService conversionService; - @Before + @BeforeEach public void prepareDatabase() { // setup initial data! testUtilsDao.clearData(); @@ -77,6 +81,71 @@ public class UIResourceServiceTest extends AbstractServiceIntegrationTest { assertEquals(testResource.getIdentifierScheme(), result.getIdentifierScheme()); } + @Test + public void testCreateResourceForGroupFailsGroupNotExists() { + // given + ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1, + testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier()); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createResourceForGroup(testResource, -100L, + testUtilsDao.getD1().getId(), testUtilsDao.getUser1().getId())); + // then + assertNotNull(result); + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Group does not exist")); + } + + @Test + public void testCreateResourceForGroupFailsGroupNotForDomain() { + // given + ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1, + testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier()); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), -100L, + testUtilsDao.getUser1().getId())); + // then + assertNotNull(result); + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Group does not belong to the given domain")); + } + + @Test + public void testCreateResourceForGroupFailInvalidResourceDef() { + // given + ResourceRO testResource = TestROUtils.createResource(UUID.randomUUID().toString(), TEST_SG_SCHEMA_1, + UUID.randomUUID().toString()); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId(), + testUtilsDao.getUser1().getId())); + // then + assertNotNull(result); + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource definition [" + testResource.getResourceTypeIdentifier() + "] does not exist!")); + } + + @Test + public void testCreateResourceForGroupFailAlreadyExists() { + // given + DBResource dbResource = testUtilsDao.getResourceD1G1RD1(); + ResourceRO testResource = TestROUtils.createResource(dbResource.getIdentifierValue(), dbResource.getIdentifierScheme(), + testUtilsDao.getDomainResourceDefD1R1().getResourceDef().getIdentifier()); + + // when + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createResourceForGroup(testResource, testUtilsDao.getGroupD1G1().getId(), testUtilsDao.getD1().getId(), + testUtilsDao.getUser1().getId())); + // then + assertNotNull(result); + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource [val:" + testResource.getIdentifierValue() + " scheme:" + testResource.getIdentifierScheme() + "] already exists for domain!")); + } + @Test public void testUpdateResourceForGroup() { // given diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceServiceTest.java new file mode 100644 index 0000000000000000000000000000000000000000..7863821bf856a5fba4959254feaa6538091dab76 --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UISubresourceServiceTest.java @@ -0,0 +1,141 @@ +package eu.europa.ec.edelivery.smp.services.ui; + +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.ui.SubresourceRO; +import eu.europa.ec.edelivery.smp.exceptions.BadRequestException; +import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode; +import eu.europa.ec.edelivery.smp.exceptions.ErrorCode; +import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; +import org.hamcrest.MatcherAssert; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; + +import java.util.List; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.jupiter.api.Assertions.*; + +@ContextConfiguration(classes = UIDomainPublicService.class) +class UISubresourceServiceTest extends AbstractJunit5BaseDao { + + @Autowired + UISubresourceService testInstance; + + @BeforeEach + public void prepareDatabase() { + testUtilsDao.clearData(); + testUtilsDao.createSubresources(); + testUtilsDao.creatDomainMemberships(); + testUtilsDao.createGroupMemberships(); + testUtilsDao.createResourceMemberships(); + } + + @Test + void testGetSubResourcesForResourceOK() { + List<SubresourceRO> result = testInstance.getSubResourcesForResource(testUtilsDao.getResourceD1G1RD1().getId()); + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierValue(), result.get(0).getIdentifierValue()); + assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierScheme(), result.get(0).getIdentifierScheme()); + } + + @Test + void testGetSubResourcesForResourceEmpty() { + List<SubresourceRO> result = testInstance.getSubResourcesForResource(-1000L); + assertNotNull(result); + assertEquals(0, result.size()); + } +/* + @ParameterizedTest + @CsvSource({ + "1, -1, 'Resource does not exist'", + "-1, 1, 'Subresource does not exist!'", + "-1, 1, 'Subresource does not belong to the resource!", + })*/ + @Test + void testDeleteSubresourceFromResourceFailedResourceNotExists() { + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.deleteSubresourceFromResource(testUtilsDao.getSubresourceD1G1RD1_S1().getId(), -1L)); + + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource does not exist")); + } + + @Test + void testDeleteSubresourceFromResourceFailedSubResourceNotExists() { + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.deleteSubresourceFromResource(-1L, testUtilsDao.getResourceD1G1RD1().getId())); + + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Subresource does not exist!")); + } + + @Test + void testDeleteSubresourceFromResourceFailedSubResourceNotBelong() { + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.deleteSubresourceFromResource(testUtilsDao.getSubresourceD2G1RD1_S1().getId(), + testUtilsDao.getResourceD1G1RD1().getId())); + + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Subresource does not belong to the resource!")); + } + + @Test + void testDeleteSubresourceFromResourceFailedSubResourceOK() { + + SubresourceRO result = testInstance.deleteSubresourceFromResource( + testUtilsDao.getSubresourceD1G1RD1_S1().getId(), + testUtilsDao.getResourceD1G1RD1().getId()); + + assertNotNull(result); + assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierValue(), result.getIdentifierValue()); + assertEquals(testUtilsDao.getSubresourceD1G1RD1_S1().getIdentifierScheme(), result.getIdentifierScheme()); + } + + @Test + void createSubresourceForResource() { + SubresourceRO subresourceRO = new SubresourceRO(); + subresourceRO.setIdentifierScheme("scheme"); + subresourceRO.setIdentifierValue(UUID.randomUUID().toString()); + subresourceRO.setSubresourceTypeIdentifier(testUtilsDao.getSubresourceDefSmpMetadata().getIdentifier()); + int count = testInstance.getSubResourcesForResource(testUtilsDao.getResourceD1G1RD1().getId()).size(); + SubresourceRO result = testInstance.createSubresourceForResource(subresourceRO, + testUtilsDao.getResourceD1G1RD1().getId()); + + assertNotNull(result); + assertEquals(subresourceRO.getIdentifierValue(), result.getIdentifierValue()); + assertEquals(subresourceRO.getIdentifierScheme(), result.getIdentifierScheme()); + assertEquals(count + 1, testInstance.getSubResourcesForResource(testUtilsDao.getResourceD1G1RD1().getId()).size()); + } + + @Test + void createSubresourceForResourceFailResourceNotExists() { + SubresourceRO subresourceRO = Mockito.mock(SubresourceRO.class); + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createSubresourceForResource(subresourceRO, -1L)); + + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Resource does not exist")); + } + + @Test + void createSubresourceForResourceFailDefinitionNotExists() { + String def = UUID.randomUUID().toString(); + SubresourceRO subresourceRO = Mockito.mock(SubresourceRO.class); + Mockito.when(subresourceRO.getSubresourceTypeIdentifier()).thenReturn(def); + + SMPRuntimeException result = assertThrows(SMPRuntimeException.class, + () -> testInstance.createSubresourceForResource(subresourceRO, testUtilsDao.getResourceD1G1RD1().getId())); + + assertEquals(ErrorCode.INVALID_REQUEST, result.getErrorCode()); + assertThat(result.getMessage(), containsString("Subresource definition ["+def+"] does not exist")); + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java index aff77d50b918b23e217e4899ea84708d2451e26f..a92b6e9e3393d9d595cc2cffe92d296a840de14f 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceIntegrationTest.java @@ -13,7 +13,6 @@ import org.apache.commons.io.IOUtils; import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentMatchers; @@ -167,6 +166,15 @@ public class UITruststoreServiceIntegrationTest extends AbstractServiceIntegrati assertFalse(testInstance.isSubjectOnTrustedList(certificateRO.getSubject())); } + @Test + public void testDeleteCertificateNotExists() throws Exception { + // given + // when + X509Certificate cert = testInstance.deleteCertificate("alias-not-exists"); + // then + assertNull(cert); + } + @Test public void testIsTruststoreChanged() throws Exception { // given @@ -203,16 +211,16 @@ public class UITruststoreServiceIntegrationTest extends AbstractServiceIntegrati } @Test - public void validateCertificateWithTruststoreNullCertificate() { + public void validateCertificateWithTruststoreNullCertificate() { CertificateException result = assertThrows(CertificateException.class, - () ->testInstance.validateCertificateWithTruststore(null)); + () -> testInstance.validateCertificateWithTruststore(null)); assertThat(result.getMessage(), containsString("The X509Certificate is null ")); } @Test - public void validateCertificateWithTruststoreNullTruststore() throws Exception { + public void validateCertificateWithTruststoreNullTruststore() throws Exception { String certSubject = "CN=SMP Test,OU=eDelivery,O=DIGITAL,C=BE"; X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(certSubject); Mockito.doReturn(null).when(testInstance).getTrustStore(); @@ -232,7 +240,7 @@ public class UITruststoreServiceIntegrationTest extends AbstractServiceIntegrati CertificateRO cer = testInstance.getCertificateData(buff); //then - assertTrue( cer.isInvalid()); + assertTrue(cer.isInvalid()); assertEquals("Can not read the certificate!", cer.getInvalidReason()); } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java index 11c7672d81dd8c86051a21978a0cf23d55bed4ca..9d4c18fbc93f24a0cf5facb02516d9c2c0ac2b62 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UITruststoreServiceTest.java @@ -9,9 +9,12 @@ import eu.europa.ec.edelivery.smp.exceptions.CertificateNotTrustedException; import eu.europa.ec.edelivery.smp.services.CRLVerifierService; import eu.europa.ec.edelivery.smp.services.ConfigurationService; import eu.europa.ec.edelivery.smp.testutil.X509CertificateTestUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; +import org.apache.commons.io.FileUtils; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.ArgumentMatchers; import org.mockito.Mockito; @@ -20,22 +23,26 @@ import org.springframework.core.convert.ConversionService; import javax.security.auth.x500.X500Principal; import java.io.File; import java.io.FileOutputStream; +import java.io.IOException; import java.math.BigInteger; import java.nio.file.Path; import java.nio.file.Paths; import java.security.KeyStore; -import java.security.Security; import java.security.cert.*; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; import java.util.regex.Pattern; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; public class UITruststoreServiceTest { + // test data + protected Path resourceDirectory = Paths.get("src", "test", "resources", "truststore"); + protected Path targetDirectory = Paths.get("target", "test-uitruststoreservice"); + protected Path targetTruststore = targetDirectory.resolve("smp-truststore.jks"); + + String truststorePassword = "test123"; + // mocked services ConfigurationService configurationService = Mockito.mock(ConfigurationService.class); CRLVerifierService crlVerifierService = Mockito.mock(CRLVerifierService.class); ConversionService conversionService = Mockito.mock(ConversionService.class); @@ -43,9 +50,10 @@ public class UITruststoreServiceTest { UITruststoreService testInstance = spy(new UITruststoreService(configurationService, crlVerifierService, conversionService, userDao)); - @Before - public void setup() { - Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1); + @BeforeEach + public void setup() throws IOException { + testInstance.init(); + resetKeystore(); } @Test @@ -160,7 +168,6 @@ public class UITruststoreServiceTest { assertEquals(errorMessage, certData.getInvalidReason()); } - @Test public void validateCertificateSubjectExpressionLegacyIfNullSkip() throws CertificateException { X509Certificate cert = Mockito.mock(X509Certificate.class); @@ -177,8 +184,8 @@ public class UITruststoreServiceTest { CertificateException resultException = assertThrows(CertificateException.class, () -> testInstance.validateCertificateSubjectExpressionLegacy(certificate)); assertEquals("Certificate subject [" - +certificate.getSubjectX500Principal().getName(X500Principal.RFC2253) - +"] does not match the regular expression configured ["+regularExpression+"]", + + certificate.getSubjectX500Principal().getName(X500Principal.RFC2253) + + "] does not match the regular expression configured [" + regularExpression + "]", resultException.getMessage()); } @@ -195,7 +202,7 @@ public class UITruststoreServiceTest { } @Test - public void loadTruststoreDoNotThrowError(){ + public void loadTruststoreDoNotThrowError() { // test for null file KeyStore result = testInstance.loadTruststore(null); assertNull(result); @@ -203,35 +210,225 @@ public class UITruststoreServiceTest { result = testInstance.loadTruststore(new File(UUID.randomUUID().toString())); assertNull(result); // test for file credentials not exist - Path resourceDirectory = Paths.get("src", "test", "resources", "truststore","smp-truststore.jks"); - assertTrue(resourceDirectory.toFile().exists()); + + assertTrue(targetTruststore.toFile().exists()); doReturn(null).when(configurationService).getTruststoreCredentialToken(); - result = testInstance.loadTruststore(resourceDirectory.toFile()); + result = testInstance.loadTruststore(targetTruststore.toFile()); assertNull(result); } + @Test + public void testTruststoreNotConfiguredNotConfigured() { + doReturn(null).when(configurationService).getTruststoreFile(); + boolean result = testInstance.truststoreNotConfigured(); + assertTrue(result); + } + + @Test + public void testTruststoreNotConfiguredConfigured() { + + doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile(); + boolean result = testInstance.truststoreNotConfigured(); + assertFalse(result); + } + + @Test + public void testRefreshDataNoConfiguration() { + + doReturn(null).when(configurationService).getTruststoreFile(); + // must not throw error + testInstance.refreshData(); + //then + assertNull(testInstance.getTrustStore()); + assertNull(testInstance.getTrustManagers()); + assertTrue(testInstance.getNormalizedTrustedList().isEmpty()); + } + + @Test + public void testRefreshDataOk() { + + doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile(); + doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken(); + // must not throw error + testInstance.refreshData(); + //then + assertNotNull(testInstance.getTrustStore()); + assertNotNull(testInstance.getTrustManagers()); + assertFalse(testInstance.getNormalizedTrustedList().isEmpty()); + } + + @Test + public void getCertificateDataNullEmpty() { + + // must not throw error + CertificateRO certificateRO = testInstance.getCertificateData(null); + //then + assertNotNull(certificateRO); + assertTrue(certificateRO.isInvalid()); + assertTrue(certificateRO.isError()); + assertEquals("Can not read [null/empty] certificate!", certificateRO.getInvalidReason()); + } + + @Test + public void getCertificateDataInvalidCertificate() { + + // must not throw error + CertificateRO certificateRO = testInstance.getCertificateData("notACertificate".getBytes()); + //then + assertNotNull(certificateRO); + assertTrue(certificateRO.isInvalid()); + assertTrue(certificateRO.isError()); + assertEquals("Can not read the certificate!", certificateRO.getInvalidReason()); + } + + @Test + public void getCertificateDataNoValidationOK() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + CertificateRO convertedCert = Mockito.mock(CertificateRO.class); + doReturn(convertedCert).when(conversionService).convert(certificate, CertificateRO.class); + // must not throw error + CertificateRO certificateRO = testInstance.getCertificateData(certificate.getEncoded()); + //then + assertNotNull(certificateRO); + assertEquals(convertedCert, certificateRO); + } + + @Test + public void getCertificateDataNoValidationBase64OK() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + String base64Cert = Base64.getEncoder().encodeToString(certificate.getEncoded()); + CertificateRO convertedCert = Mockito.mock(CertificateRO.class); + doReturn(convertedCert).when(conversionService).convert(certificate, CertificateRO.class); + + // must not throw error + CertificateRO certificateRO = testInstance.getCertificateData(base64Cert, false, false); + //then + assertNotNull(certificateRO); + assertEquals(convertedCert, certificateRO); + } + + @Test + public void getCertificateDataValidateOK() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + CertificateRO convertedCert = Mockito.mock(CertificateRO.class); + doReturn(convertedCert).when(conversionService).convert(certificate, CertificateRO.class); + // must not throw error + CertificateRO certificateRO = testInstance.getCertificateData(certificate.getEncoded(), true, true); + //then + assertNotNull(certificateRO); + assertEquals(convertedCert, certificateRO); + } + + @Test + public void testValidateCertificateWithTruststoreNull() { + // when + CertificateException result = assertThrows(CertificateException.class, () -> testInstance.validateCertificateWithTruststore(null)); + // then + MatcherAssert.assertThat(result.getMessage(), Matchers.containsString("The X509Certificate is null")); + } + + @Test + public void testValidateCertificateWithTruststoreNoTruststoreConfigured() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + doReturn(null).when(configurationService).getTruststoreFile(); + // when + testInstance.refreshData(); + testInstance.validateCertificateWithTruststore(certificate); + // then + // no error is thrown + Mockito.verify(configurationService, Mockito.times(1)).getTruststoreFile(); + } + + @Test + public void testValidateCertificateWithTruststoreNotTrusted() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile(); + doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken(); + // when + testInstance.refreshData(); + CertificateException result = assertThrows(CertificateException.class, + () -> testInstance.validateCertificateWithTruststore(certificate)); + // then + MatcherAssert.assertThat(result.getMessage(), Matchers.containsString("is not trusted!")); + } + + @Test + public void testValidateAllowedCertificateKeyTypes() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + doReturn(Collections.singletonList("FutureKeyAlgorithm")).when(configurationService).getAllowedCertificateKeyTypes(); + //when + CertificateException result = assertThrows(CertificateException.class, + () -> testInstance.validateAllowedCertificateKeyTypes(certificate)); + // then + MatcherAssert.assertThat(result.getMessage(), Matchers.containsString("Certificate does not have allowed key algorithm type!")); + } + + + @Test + public void testAddCertificate() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + + doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile(); + doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken(); + testInstance.refreshData(); + int count = testInstance.getNormalizedTrustedList().size(); + // when + testInstance.addCertificate(null, certificate); + + assertEquals(count + 1, testInstance.getNormalizedTrustedList().size()); + } + + @Test + public void testDeleteCertificate() throws Exception { + String subject = "CN=Something,O=test,C=EU"; + X509Certificate certificate = X509CertificateTestUtils.createX509CertificateForTest(subject); + doReturn(targetTruststore.toFile()).when(configurationService).getTruststoreFile(); + doReturn(truststorePassword).when(configurationService).getTruststoreCredentialToken(); + String alias = "testInstanceCertificate"; + testInstance.addCertificate(alias, certificate); + int count = testInstance.getNormalizedTrustedList().size(); + + //then + X509Certificate result = testInstance.deleteCertificate(alias); + //when + assertNotNull(result); + assertEquals(count - 1, testInstance.getNormalizedTrustedList().size()); + } /** * This method is not a tests is it done for generating the tests Soapui certificates + * * @throws Exception */ @Test - @Ignore + @Disabled public void generateSoapUITestCertificates() throws Exception { - List <String[]> listCerts = Arrays.asList( new String[]{"f71ee8b11cb3b787","CN=EHEALTH_SMP_EC,O=European Commission,C=BE","ehealth_smp_ec",}, - new String[]{"E07B6b956330a19a","CN=blue_gw,O=eDelivery,C=BE","blue_gw"}, - new String[]{"9792ce69BC89F14C","CN=red_gw,O=eDelivery,C=BE","red_gw"} + List<String[]> listCerts = Arrays.asList(new String[]{"f71ee8b11cb3b787", "CN=EHEALTH_SMP_EC,O=European Commission,C=BE", "ehealth_smp_ec",}, + new String[]{"E07B6b956330a19a", "CN=blue_gw,O=eDelivery,C=BE", "blue_gw"}, + new String[]{"9792ce69BC89F14C", "CN=red_gw,O=eDelivery,C=BE", "red_gw"} ); String token = "test123"; - File keystoreFile = new File( "./target/smp-test-examples.p12"); + File keystoreFile = new File("./target/smp-test-examples.p12"); KeyStore keyStore = KeystoreUtils.createNewKeystore(keystoreFile, token); - for (String[] data: listCerts) { - BigInteger serial = new BigInteger(data[0],16); - X509CertificateUtils.createAndStoreSelfSignedCertificate(serial, data[1],data[2], keyStore, token); + for (String[] data : listCerts) { + BigInteger serial = new BigInteger(data[0], 16); + X509CertificateUtils.createAndStoreSelfSignedCertificate(serial, data[1], data[2], keyStore, token); } try (FileOutputStream fos = new FileOutputStream(keystoreFile)) { keyStore.store(fos, token.toCharArray()); } } + + protected void resetKeystore() throws IOException { + FileUtils.deleteDirectory(targetDirectory.toFile()); + FileUtils.copyDirectory(resourceDirectory.toFile(), targetDirectory.toFile()); + } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java index 93760e4107975bc82ef420384c6463dcf1a0ada4..598ec7fe0d46ac1a25484a3a636c42cd07a5891e 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/services/ui/UIUserServiceIntegrationTest.java @@ -2,6 +2,9 @@ package eu.europa.ec.edelivery.smp.services.ui; import eu.europa.ec.edelivery.smp.config.ConversionTestConfig; +import eu.europa.ec.edelivery.smp.data.dao.AbstractJunit5BaseDao; +import eu.europa.ec.edelivery.smp.data.dao.CredentialDao; +import eu.europa.ec.edelivery.smp.data.dao.UserDao; import eu.europa.ec.edelivery.smp.data.enums.ApplicationRoleType; import eu.europa.ec.edelivery.smp.data.enums.CredentialTargetType; import eu.europa.ec.edelivery.smp.data.enums.CredentialType; @@ -9,13 +12,17 @@ import eu.europa.ec.edelivery.smp.data.model.user.DBCredential; import eu.europa.ec.edelivery.smp.data.model.user.DBUser; import eu.europa.ec.edelivery.smp.data.ui.*; import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus; +import eu.europa.ec.edelivery.smp.exceptions.BadRequestException; +import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode; import eu.europa.ec.edelivery.smp.exceptions.SMPRuntimeException; -import eu.europa.ec.edelivery.smp.services.AbstractServiceIntegrationTest; import eu.europa.ec.edelivery.smp.testutil.TestDBUtils; import eu.europa.ec.edelivery.smp.testutil.TestROUtils; import org.hamcrest.CoreMatchers; import org.hamcrest.MatcherAssert; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.crypto.bcrypt.BCrypt; @@ -27,7 +34,8 @@ import java.util.Optional; import java.util.UUID; import static eu.europa.ec.edelivery.smp.testutil.SMPAssert.assertEqualDates; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.when; /** @@ -37,11 +45,17 @@ import static org.junit.Assert.*; * @since 4.1 */ @ContextConfiguration(classes = {UIUserService.class, ConversionTestConfig.class}) -public class UIUserServiceIntegrationTest extends AbstractServiceIntegrationTest { +public class UIUserServiceIntegrationTest extends AbstractJunit5BaseDao { @Autowired protected UIUserService testInstance; + @Autowired + protected UserDao userDao; + + @Autowired + protected CredentialDao credentialDao; + protected void insertDataObjects(int size) { for (int i = 0; i < size; i++) { @@ -408,6 +422,26 @@ public class UIUserServiceIntegrationTest extends AbstractServiceIntegrationTest assertEquals(count + 2, result.getServiceEntities().size()); MatcherAssert.assertThat(result.getServiceEntities().get(0).getUsername(), CoreMatchers.containsStringIgnoringCase("test")); MatcherAssert.assertThat(result.getServiceEntities().get(1).getUsername(), CoreMatchers.containsStringIgnoringCase("test")); + } + + @ParameterizedTest + @CsvSource({ + ", USERNAME_PASSWORD, UI, 1, USERNAME_PASSWORD, UI, 'Credential does not exist!'", + "1, USERNAME_PASSWORD, UI, 2, USERNAME_PASSWORD, UI, 'User is not owner of the credential'", + "1, USERNAME_PASSWORD, UI, 1, ACCESS_TOKEN, UI, 'Credentials are not expected credential type!'", + "1, USERNAME_PASSWORD, UI, 1, USERNAME_PASSWORD, REST_API, 'Credentials are not expected target type!'"}) + public void testValidateCredentialsFails(Long credentialUserId, CredentialType credentialType, CredentialTargetType credentialTargetType, Long testUserId, CredentialType testCredentialType, CredentialTargetType testCredentialTargetType, String errorMessage){ + DBCredential credential = credentialUserId == null? null:Mockito.mock(DBCredential.class); + if (credential!= null){ + DBUser user = Mockito.mock(DBUser.class); + when(user.getId()).thenReturn(credentialUserId); + when(credential.getUser()).thenReturn(user); + when(credential.getCredentialType()).thenReturn(credentialType); + when(credential.getCredentialTarget()).thenReturn(credentialTargetType); + } + BadRequestException result = assertThrows(BadRequestException.class, () -> testInstance.validateCredentials(credential, testUserId, testCredentialType, testCredentialTargetType)); + assertEquals(ErrorBusinessCode.UNAUTHORIZED, result.getErrorBusinessCode()); + assertEquals(errorMessage, result.getMessage()); } } diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/servlet/ResourceResponseTest.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/servlet/ResourceResponseTest.java new file mode 100644 index 0000000000000000000000000000000000000000..f5ab899f6e76052d101b526f6b2bae31a503bb4a --- /dev/null +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/servlet/ResourceResponseTest.java @@ -0,0 +1,76 @@ +package eu.europa.ec.edelivery.smp.servlet; + +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; + +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class ResourceResponseTest { + + HttpServletResponse mockHttpServletResponse = Mockito.mock(HttpServletResponse.class); + ResourceResponse testInstance = new ResourceResponse(mockHttpServletResponse); + + @Test + void testGetHttpStatus() { + int httpStatus = 200; + Mockito.when(mockHttpServletResponse.getStatus()).thenReturn(httpStatus); + int result = testInstance.getHttpStatus(); + + assertEquals(httpStatus, result); + } + + @Test + void testSetHttpStatus() { + int httpStatus = 200; + testInstance.setHttpStatus(httpStatus); + + Mockito.verify(mockHttpServletResponse).setStatus(httpStatus); + } + + @Test + void testGetMimeType() { + String mimeType = "mockMimeType"; + Mockito.when(mockHttpServletResponse.getContentType()).thenReturn(mimeType); + String result = testInstance.getMimeType(); + + assertEquals(mimeType, result); + } + + @Test + void testSetContentType() { + String mimeType = "mockMimeType"; + testInstance.setContentType(mimeType); + + Mockito.verify(mockHttpServletResponse).setContentType(mimeType); + } + + @Test + void testGetHttpHeader() { + String name = "mockName"; + String value = "mockValue"; + Mockito.when(mockHttpServletResponse.getHeader(name)).thenReturn(value); + String result = testInstance.getHttpHeader(name); + + assertEquals(value, result); + } + + @Test + void testSetHttpHeader() { + String name = "mockName"; + String value = "mockValue"; + testInstance.setHttpHeader(name, value); + + Mockito.verify(mockHttpServletResponse).setHeader(name, value); + } + + @Test + void testGetOutputStream() throws IOException { + testInstance.getOutputStream(); + + Mockito.verify(mockHttpServletResponse).getOutputStream(); + } +} diff --git a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java index e0e494ae2a7f64e3950584eba3772e5af4d57fd2..d4b8239f3efdf67fc67cac69e141af25baefc5b7 100644 --- a/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java +++ b/smp-server-library/src/test/java/eu/europa/ec/edelivery/smp/testutil/TestROUtils.java @@ -2,7 +2,6 @@ package eu.europa.ec.edelivery.smp.testutil; import eu.europa.ec.edelivery.smp.conversion.X509CertificateToCertificateROConverter; import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; -import eu.europa.ec.edelivery.smp.data.model.DBGroup; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.GroupRO; import eu.europa.ec.edelivery.smp.data.ui.ResourceRO; @@ -32,7 +31,7 @@ public class TestROUtils { return CERT_CONVERTER.convert(cert); } - public static GroupRO createGroup(String groupName, VisibilityType visibility){ + public static GroupRO createGroup(String groupName, VisibilityType visibility) { GroupRO group = new GroupRO(); group.setGroupName(groupName); group.setGroupDescription(anyString()); @@ -41,7 +40,7 @@ public class TestROUtils { } - public static String anyString(){ + public static String anyString() { return UUID.randomUUID().toString(); } } diff --git a/smp-server-library/src/test/resources/cleanup-database.sql b/smp-server-library/src/test/resources/cleanup-database.sql index db26999a5b8bb568807c9060f426983775183a46..218ac8322c6abe9dcc2bbd1b23846486d6da05dd 100755 --- a/smp-server-library/src/test/resources/cleanup-database.sql +++ b/smp-server-library/src/test/resources/cleanup-database.sql @@ -1,7 +1,7 @@ -DELETE FROM SMP_ALERT; -DELETE FROM SMP_ALERT_AUD; DELETE FROM SMP_ALERT_PROPERTY; DELETE FROM SMP_ALERT_PROPERTY_AUD; +DELETE FROM SMP_ALERT; +DELETE FROM SMP_ALERT_AUD; DELETE FROM SMP_CERTIFICATE; DELETE FROM SMP_CERTIFICATE_AUD; DELETE FROM SMP_CONFIGURATION; diff --git a/smp-webapp/pom.xml b/smp-webapp/pom.xml index 7cb23c94b797ea62ac6c705201146760380829c8..02c12664255d1fe55b53c1ff5a114ed8753d082b 100644 --- a/smp-webapp/pom.xml +++ b/smp-webapp/pom.xml @@ -105,6 +105,21 @@ <artifactId>hamcrest-junit</artifactId> <scope>test</scope> </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.vintage</groupId> + <artifactId>junit-vintage-engine</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.junit.jupiter</groupId> + <artifactId>junit-jupiter-params</artifactId> + <scope>test</scope> + </dependency> <!-- the default JDBC driver --> <dependency> <groupId>com.mysql</groupId> @@ -150,18 +165,10 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> - <configuration> - <runOrder>alphabetical</runOrder> - </configuration> - <dependencies> - <!-- Force using the latest JUnit 47 provider Remove this when moving to JUNIT5 --> - <dependency> - <groupId>org.apache.maven.surefire</groupId> - <artifactId>surefire-junit47</artifactId> - <version>${maven-surefire-plugin.version}</version> - </dependency> - </dependencies> - + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-failsafe-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java index ab940997bc57ba090e1bc2bd9df356ccbf5c3ec9..b649cf1c2781c7f4f05a86e6f1e34bf71808ba09 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/ResourceController.java @@ -194,6 +194,4 @@ public class ResourceController { throw new SMPRuntimeException(INVALID_REQUEST, "Can not read input stream!", e); } } - - } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java index 5c2fc48b25d3a792c711981eab4957f481cd9ae9..3f0b80e768f95a2b112a7f8252a6e9d840ad7f7a 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/controllers/RootController.java @@ -56,19 +56,27 @@ public class RootController { "image/ico", "image/x-ico" }, value = {"/index.html", "/favicon.png", "/favicon.ico"}) - public byte[] getServiceGroup(HttpServletRequest httpReq, HttpServletResponse httpRes) throws IOException { + public byte[] getStaticResources(HttpServletRequest httpReq, HttpServletResponse httpRes) throws IOException { String host = getRemoteHost(httpReq); LOG.businessInfo(SMPMessageCode.BUS_HTTP_GET_END_STATIC_CONTENT, host, httpReq.getPathInfo()); String value = httpReq.getPathInfo(); + + if (StringUtils.isBlank(value)) { + httpRes.setContentType(MediaType.TEXT_HTML_VALUE); + return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/index.html")); + } + if (value != null && value.endsWith("favicon.png")) { - httpRes.setContentType("image/x-ico"); + httpRes.setContentType(MediaType.IMAGE_PNG_VALUE); return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/favicon.png")); } else if (value != null && value.endsWith("favicon.ico")) { - httpRes.setContentType(MediaType.IMAGE_PNG_VALUE); + httpRes.setContentType("image/x-ico"); return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/favicon.ico")); - } else { - return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/index.html")); } + + httpRes.setContentType(MediaType.TEXT_HTML_VALUE); + return IOUtils.readBytesFromStream(RootController.class.getResourceAsStream("/html/index.html")); + } /** @@ -88,6 +96,4 @@ public class RootController { String host = httpReq.getHeader("X-Forwarded-For"); return StringUtils.isBlank(host) ? httpReq.getRemoteHost() : host; } - - } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorResource.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorController.java similarity index 73% rename from smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorResource.java rename to smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorController.java index 07046e1b4a20aa3dd224641b6392d02b8b4c1ac7..8d843b8945c12ff8e5ca946e7f74da81ce6a5699 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorResource.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/monitor/MonitorController.java @@ -4,7 +4,6 @@ package eu.europa.ec.edelivery.smp.monitor; import eu.europa.ec.edelivery.smp.data.dao.DomainDao; import eu.europa.ec.edelivery.smp.data.model.DBDomain; import eu.europa.ec.edelivery.smp.data.ui.auth.SMPAuthority; -import eu.europa.ec.edelivery.smp.exceptions.SMPTestIsALiveException; import eu.europa.ec.edelivery.smp.logging.SMPLogger; import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory; import org.apache.commons.lang3.exception.ExceptionUtils; @@ -17,7 +16,6 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; -import java.util.Objects; /** * @author Joze Rihtarsic @@ -26,17 +24,13 @@ import java.util.Objects; @RestController @RequestMapping(value = "/monitor") -public class MonitorResource { +public class MonitorController { - private static final SMPLogger LOG = SMPLoggerFactory.getLogger(MonitorResource.class); + private static final SMPLogger LOG = SMPLoggerFactory.getLogger(MonitorController.class); - - private static final String TEST_NAME = "urn:test:document:is-alive"; - private static final String TEST_EXTENSION_XML = "<Extension xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\"><ex:dummynode xmlns:ex=\"http://test.eu\">Sample not mandatory extension</ex:dummynode></Extension>"; - private static final String TEST_DB_SUCCESSFUL_ROLLBACK = "TEST_DB_SUCCESSFUL_ROLLBACK MESSAGE"; private final DomainDao domainDao; - public MonitorResource(DomainDao domainDao) { + public MonitorController(DomainDao domainDao) { this.domainDao = domainDao; } @@ -49,8 +43,6 @@ public class MonitorResource { LOG.debug("Start isAlive function for user: [{}]", user); try { suc = testDatabase(); - } catch (SMPTestIsALiveException ex) { - suc = Objects.equals(TEST_DB_SUCCESSFUL_ROLLBACK, ex.getMessage()); } catch (RuntimeException th) { LOG.error("Error occurred while testing database connection: Msg: [{}]", ExceptionUtils.getRootCauseMessage(th)); } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java index 7976b85e28633c0c5333e1eb25dd3ed1758c3f35..9bcc49a90633c0ef6df0d040288427f732365fa9 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditController.java @@ -43,6 +43,7 @@ public class DomainEditController { /** * Method returns all domains where user is domain administrator. + * * @param userEncId encrypted user identifier * @return Domain list where user has role domain administrator */ @@ -51,7 +52,7 @@ public class DomainEditController { public List<DomainRO> getDomainsForUserType( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @RequestParam(value = PARAM_NAME_TYPE, defaultValue = "domain-admin", required = false) String forRole) { - logAdminAccess("getDomainsForUserType ["+forRole+"]"); + logAdminAccess("getDomainsForUserType [" + forRole + "]"); Long userId = SessionSecurityUtils.decryptEntityId(userEncId); if (StringUtils.equals(forRole, "group-admin")) { @@ -63,7 +64,7 @@ public class DomainEditController { if (StringUtils.isBlank(forRole) || StringUtils.equals(forRole, "domain-admin")) { return uiDomainService.getAllDomainsForDomainAdminUser(userId); } - throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "GetDomains", "Unknown parameter type ["+forRole+"]!"); + throw new SMPRuntimeException(ErrorCode.INVALID_REQUEST, "GetDomains", "Unknown parameter type [" + forRole + "]!"); } @@ -76,14 +77,14 @@ public class DomainEditController { @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize, @RequestParam(value = PARAM_PAGINATION_FILTER, defaultValue = "", required = false) String filter) { logAdminAccess("getDomainMemberList"); - LOG.info("Search for domain members with filter [{}], paging: [{}/{}], user: {}",filter, page, pageSize, userEncId); + LOG.info("Search for domain members with filter [{}], paging: [{}/{}], user: {}", filter, page, pageSize, userEncId); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - return uiDomainService.getDomainMembers(domainId, page, pageSize, filter); + return uiDomainService.getDomainMembers(domainId, page, pageSize, filter); } @PutMapping(path = SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE) @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and (@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId))") - public MemberRO putDomainMember( + public MemberRO putDomainMember( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, @RequestBody MemberRO memberRO) { @@ -91,7 +92,7 @@ public class DomainEditController { logAdminAccess("putDomainMember"); LOG.info("add or update domain member"); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - Long memberId = memberRO.getMemberId() == null?null: SessionSecurityUtils.decryptEntityId(memberRO.getMemberId()); + Long memberId = memberRO.getMemberId() == null ? null : SessionSecurityUtils.decryptEntityId(memberRO.getMemberId()); if (memberRO.getRoleType() == null) { memberRO.setRoleType(MembershipRoleType.VIEWER); } @@ -101,14 +102,14 @@ public class DomainEditController { @DeleteMapping(value = SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE) @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and (@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId))") - public MemberRO deleteDomainMember( + public MemberRO deleteDomainMember( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, @PathVariable(PATH_PARAM_ENC_MEMBER_ID) String memberEncId - ) { + ) { logAdminAccess("deleteDomainMember"); Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - Long memberId= SessionSecurityUtils.decryptEntityId(memberEncId); + Long memberId = SessionSecurityUtils.decryptEntityId(memberEncId); // is user domain admin or system admin return uiDomainService.deleteMemberFromDomain(domainId, memberId); @@ -120,7 +121,7 @@ public class DomainEditController { "(@smpAuthorizationService.systemAdministrator or @smpAuthorizationService.isDomainAdministrator(#domainEncId) " + "or @smpAuthorizationService.isAnyDomainGroupAdministrator(#domainEncId)" + "or @smpAuthorizationService.isAnyResourceAdministrator)") - public List<ResourceDefinitionRO> getDomainResourceDefinitions( + public List<ResourceDefinitionRO> getDomainResourceDefinitions( @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId ) { @@ -132,7 +133,6 @@ public class DomainEditController { } - protected void logAdminAccess(String action) { LOG.info(SMPLogger.SECURITY_MARKER, "Admin Domain action [{}] by user [{}], ", action, SessionSecurityUtils.getSessionUserDetails()); } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java index 99f98db9e3912d80fc0d1356af0b6167a1561979..e94871d1f3019d7dc5813e537a23e7d7832fb9e4 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/edit/SubresourceEditController.java @@ -68,77 +68,8 @@ public class SubresourceEditController { @RequestBody SubresourceRO subresourceRO) { logAdminAccess("createSubresource"); Long subresourceId = SessionSecurityUtils.decryptEntityId(resourceEncId); - return uiSubresourceService.createResourceForGroup(subresourceRO, subresourceId); + return uiSubresourceService.createSubresourceForResource(subresourceRO, subresourceId); } -/* - @PostMapping(path = SUB_CONTEXT_PATH_EDIT_RESOURCE_UPDATE, produces = MimeTypeUtils.APPLICATION_JSON_VALUE) - @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isGroupAdministrator(#groupEncId)") - public ResourceRO updateResource(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, - @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, - @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId, - @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId, - @RequestBody ResourceRO resourceRO) { - logAdminAccess("createResource"); - Long domainId = SessionSecurityUtils.decryptEntityId(domainEncId); - Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId); - Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId); - return uiResourceService.updateResourceForGroup(resourceRO, resourceId, groupId, domainId); - } - - - @GetMapping(path = SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER, produces = MimeTypeUtils.APPLICATION_JSON_VALUE) - @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and" + - " (@smpAuthorizationService.isGroupAdministrator(#groupEncId) or @smpAuthorizationService.isResourceAdministrator(#resourceEncId))") - public ServiceResult<MemberRO> getGroupMemberList(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, - @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, - @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId, - @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId, - @RequestParam(value = PARAM_PAGINATION_PAGE, defaultValue = "0") int page, - @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize, - @RequestParam(value = PARAM_PAGINATION_FILTER, defaultValue = "", required = false) String filter) { - - LOG.info("Search for group members with filter [{}], paging: [{}/{}], user: {}", filter, page, pageSize, userEncId); - Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId); - Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId); - return uiResourceService.getResourceMembers(resourceId, page, pageSize, filter); - } - - @PutMapping(path = SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_PUT, produces = MimeTypeUtils.APPLICATION_JSON_VALUE, consumes = MimeTypeUtils.APPLICATION_JSON_VALUE) - @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isGroupAdministrator(#groupEncId)") - public MemberRO putGroupMember(@PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, - @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, - @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId, - @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId, - @RequestBody MemberRO memberRO) { - - LOG.info("add member to group"); - Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId); - Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId); - Long memberId = memberRO.getMemberId() == null ? null : SessionSecurityUtils.decryptEntityId(memberRO.getMemberId()); - if (memberRO.getRoleType() == null) { - memberRO.setRoleType(MembershipRoleType.VIEWER); - } - // is user domain admin or system admin - return uiResourceService.addMemberToResource(resourceId, memberRO, memberId); - } - - @DeleteMapping(value = SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_DELETE) - @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isGroupAdministrator(#groupEncId)") - public MemberRO deleteDomainMember( - @PathVariable(PATH_PARAM_ENC_USER_ID) String userEncId, - @PathVariable(PATH_PARAM_ENC_DOMAIN_ID) String domainEncId, - @PathVariable(PATH_PARAM_ENC_GROUP_ID) String groupEncId, - @PathVariable(PATH_PARAM_ENC_RESOURCE_ID) String resourceEncId, - @PathVariable(PATH_PARAM_ENC_MEMBER_ID) String memberEncId - ) { - LOG.info("Delete member from group"); - Long groupId = SessionSecurityUtils.decryptEntityId(groupEncId); - Long memberId = SessionSecurityUtils.decryptEntityId(memberEncId); - Long resourceId = SessionSecurityUtils.decryptEntityId(resourceEncId); - - // is user domain admin or system admin - return uiResourceService.deleteMemberFromResource(resourceId, memberId); - }*/ protected void logAdminAccess(String action) { LOG.info(SMPLogger.SECURITY_MARKER, "Admin Domain action [{}] by user [{}], ", action, SessionSecurityUtils.getSessionUserDetails()); diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java index d69b03ba588e6072756db341e1e4be122890e70b..dcb9b2bf31a20a1cd1de216b8d7361acf08fcd5a 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/AlertController.java @@ -31,7 +31,7 @@ public class AlertController { } @GetMapping(produces = {MimeTypeUtils.APPLICATION_JSON_VALUE}) - public ServiceResult<AlertRO> geDomainList( + public ServiceResult<AlertRO> getAlertList( @RequestParam(value = PARAM_PAGINATION_PAGE, defaultValue = "0") int page, @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize, @RequestParam(value = PARAM_PAGINATION_ORDER_BY, defaultValue = "id", required = false) String orderBy, diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java index 13d0ab03e8204aba0fabf4c6243a0e0cb8218c87..f46bf1a688844cd0e44ddbc91a7c2e5dbc085dd2 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/ExtensionAdminController.java @@ -41,6 +41,4 @@ public class ExtensionAdminController { LOG.info("getExtensionList count: "); return uiExtensionService.getExtensions(); } - - } diff --git a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java index 61c57b5ed6521a14679ffc80105353ff439b9595..052d0491845eb376b693889a649ef2137ab9160d 100644 --- a/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java +++ b/smp-webapp/src/main/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminController.java @@ -63,7 +63,7 @@ public class UserAdminController { @GetMapping(path = "/{user-enc-id}/search", produces = MimeTypeUtils.APPLICATION_JSON_VALUE) @PreAuthorize("@smpAuthorizationService.isCurrentlyLoggedIn(#userEncId) and @smpAuthorizationService.isSystemAdministrator") - public ServiceResult<SearchUserRO> getDomainMemberList( + public ServiceResult<SearchUserRO> searchUsers( @PathVariable("user-enc-id") String userEncId, @RequestParam(value = PARAM_PAGINATION_PAGE, defaultValue = "0") int page, @RequestParam(value = PARAM_PAGINATION_PAGE_SIZE, defaultValue = "10") int pageSize, diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java index 4d8b2160efa1846af2774b9fc55aa5989779810d..318bec87f8d8bcd65ca94440aae0c3eaf39e79b7 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/auth/URLCsrfMatcherTest.java @@ -12,7 +12,6 @@ import java.util.List; import static java.util.Arrays.asList; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; @RunWith(Parameterized.class) public class URLCsrfMatcherTest { diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java index 4b7cc6b0185f935207755683b2519a06f4d47696..47157baf061208e6300e00c0bfefbda2b2a8a52e 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/ResourceControllerTest.java @@ -14,31 +14,18 @@ package eu.europa.ec.edelivery.smp.controllers; import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; -import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; -import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockServletContext; -import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.RequestPostProcessor; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.WebApplicationContext; import org.springframework.web.server.adapter.ForwardedHeaderTransformer; -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; import java.io.IOException; import java.net.URLEncoder; import java.util.UUID; @@ -49,7 +36,6 @@ import static java.lang.String.format; import static org.hamcrest.Matchers.stringContainsInOrder; import static org.springframework.http.MediaType.APPLICATION_XML_VALUE; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; -import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -57,17 +43,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. /** * Created by gutowpa on 02/08/2017. */ -@RunWith(SpringRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = {SmpTestWebAppConfig.class}) -@Sql(scripts = { - "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}, - executionPhase = BEFORE_TEST_METHOD) -public class ResourceControllerTest { + +public class ResourceControllerTest extends AbstractControllerTest { public static final Logger LOG = LoggerFactory.getLogger(ResourceControllerTest.class); + private static final String DOCUMENT_TYPE_URL = "smp-1"; + private static final String IDENTIFIER_SCHEME = "ehealth-participantid-qns"; private static final String DOCUMENT_SCHEME = "doctype"; @@ -80,32 +62,16 @@ public class ResourceControllerTest { private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("pat_smp_admin", "123456"); - @Autowired - private WebApplicationContext webAppContext; - @Autowired ForwardedHeaderTransformer forwardedHeaderTransformer; @Autowired ConfigurationDao configurationDao; - private MockMvc mvc; - @Before + @BeforeEach public void setup() throws IOException { - X509CertificateTestUtils.reloadKeystores(); - mvc = MockMvcBuilders.webAppContextSetup(webAppContext) - .apply(SecurityMockMvcConfigurers.springSecurity()) - .build(); - - initServletContext(); - } - - private void initServletContext() { - MockServletContext sc = new MockServletContext(""); - ServletContextListener listener = new ContextLoaderListener(webAppContext); - ServletContextEvent event = new ServletContextEvent(sc); - listener.contextInitialized(event); + super.setup(); } @Test @@ -121,24 +87,10 @@ public class ResourceControllerTest { String urPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) - .andExpect(status().isCreated()); - } - - @Test - @Ignore("Setting of the 'identifiersBehaviour.scheme.mandatory' not working") - public void adminCanCreateServiceGroupNullScheme() throws Exception { - String participantId = UUID.randomUUID().toString(); - String nullSchemeExample = getSampleServiceGroupBody(null, UUID.randomUUID().toString()); - - mvc.perform(put(format("/%s", participantId)) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(nullSchemeExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isCreated()); } @@ -150,17 +102,17 @@ public class ResourceControllerTest { mvc.perform(put(urPath) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .with(ADMIN_CREDENTIALS) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isCreated()); mvc.perform(put(urPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isOk()); } @@ -171,10 +123,10 @@ public class ResourceControllerTest { String urPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isCreated()); mvc.perform(get(urPath)) @@ -182,30 +134,57 @@ public class ResourceControllerTest { } - @Test - public void existingServiceMetadataCanBeRetrievedByEverybody() throws Exception { + @ParameterizedTest + @ValueSource(strings = {"", // use default document and domain values + "/" + DOCUMENT_TYPE_URL, // document type + "/" + HTTP_DOMAIN_VALUE, // as domain value + "/" + HTTP_DOMAIN_VALUE + "/" + DOCUMENT_TYPE_URL // as domain value + }) + public void existingServiceGroupCanBeRetrievedByEverybodyWithSubContext(String context) throws Exception { + String participantId = UUID.randomUUID().toString(); + String resourceExample = getSampleServiceGroupBody(IDENTIFIER_SCHEME, participantId); + String urPath = format("%s/%s::%s", context, IDENTIFIER_SCHEME, participantId); + + mvc.perform(put(urPath) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) + .andExpect(status().isCreated()); + + mvc.perform(get(urPath)) + .andExpect(content().xml(resourceExample)); + + } + + @ParameterizedTest + @ValueSource(strings = {"", // use default document and domain values + "/" + DOCUMENT_TYPE_URL, // document type + "/" + HTTP_DOMAIN_VALUE, // as domain value + "/" + HTTP_DOMAIN_VALUE + "/" + DOCUMENT_TYPE_URL // as domain value + }) + public void existingServiceMetadataCanBeRetrievedByEverybody(String context) throws Exception { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String resourceExample = getSampleServiceGroupBody(IDENTIFIER_SCHEME, participantId); - String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); + String urlPath = format("%s/%s::%s", context, IDENTIFIER_SCHEME, participantId); String docUrlPath = format("%s/services/%s::%s", urlPath, DOCUMENT_SCHEME, documentId); String xmlMD = generateServiceMetadata(participantId, IDENTIFIER_SCHEME, documentId, DOCUMENT_SCHEME, "test"); // crate service group mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isCreated()); // add service metadata mvc.perform(put(docUrlPath) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .with(ADMIN_CREDENTIALS) - .contentType(APPLICATION_XML_VALUE) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) - .content(xmlMD)) + .content(xmlMD)) .andExpect(status().isCreated()); mvc.perform(get(urlPath)) @@ -221,14 +200,14 @@ public class ResourceControllerTest { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "http://ec.test.eu/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Host", "ec.test.eu") - .header("X-Forwarded-Port", "") - .header("X-Forwarded-Proto", "http")) + .header("X-Forwarded-Host", "ec.test.eu") + .header("X-Forwarded-Port", "") + .header("X-Forwarded-Proto", "http")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } @@ -238,14 +217,14 @@ public class ResourceControllerTest { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "http://localhost/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Port", "") - .header("X-Forwarded-Proto", "http")) + .header("X-Forwarded-Port", "") + .header("X-Forwarded-Proto", "http")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } @@ -255,13 +234,13 @@ public class ResourceControllerTest { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "https://ec.test.eu:8443/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Host", "ec.test.eu:8443") - .header("X-Forwarded-Proto", "https")) + .header("X-Forwarded-Host", "ec.test.eu:8443") + .header("X-Forwarded-Proto", "https")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } @@ -271,14 +250,14 @@ public class ResourceControllerTest { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "https://ec.test.eu:8443/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Port", "8443") - .header("X-Forwarded-Host", "ec.test.eu") - .header("X-Forwarded-Proto", "https")) + .header("X-Forwarded-Port", "8443") + .header("X-Forwarded-Host", "ec.test.eu") + .header("X-Forwarded-Proto", "https")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } @@ -290,14 +269,14 @@ public class ResourceControllerTest { String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); LOG.info("Create service metadata: getExistingServiceMetadataWithReverseProxySkipDefaultPortHttps [{}]", urlPath); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "https://ec.test.eu/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Port", "443") - .header("X-Forwarded-Host", "ec.test.eu") - .header("X-Forwarded-Proto", "https")) + .header("X-Forwarded-Port", "443") + .header("X-Forwarded-Host", "ec.test.eu") + .header("X-Forwarded-Proto", "https")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } @@ -307,14 +286,14 @@ public class ResourceControllerTest { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "http://ec.test.eu/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Port", "80") - .header("X-Forwarded-Host", "ec.test.eu") - .header("X-Forwarded-Proto", "http")) + .header("X-Forwarded-Port", "80") + .header("X-Forwarded-Host", "ec.test.eu") + .header("X-Forwarded-Proto", "http")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } @@ -324,27 +303,28 @@ public class ResourceControllerTest { String participantId = UUID.randomUUID().toString(); String documentId = UUID.randomUUID().toString(); String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); - prepareForGet(participantId,documentId); + prepareForGet(participantId, documentId); // when then.. String expectedUrl = "https://ec.test.eu:8443/"; mvc.perform(get(urlPath) - .header("X-Forwarded-Port", "8443") - .header("X-Forwarded-Host", "ec.test.eu:8443") - .header("X-Forwarded-Proto", "https")) + .header("X-Forwarded-Port", "8443") + .header("X-Forwarded-Host", "ec.test.eu:8443") + .header("X-Forwarded-Proto", "https")) .andExpect(content().xml(generateExpectedServiceGroup(expectedUrl, IDENTIFIER_SCHEME, participantId, DOCUMENT_SCHEME, documentId))); } public String generateExpectedServiceGroup(String expectedUrl, String resourceScheme, String resourceValue, String subresourceScheme, String subresourceValue) { return "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + "<ServiceGroup xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\" xmlns:ns2=\"http://www.w3.org/2000/09/xmldsig#\">" + - "<ParticipantIdentifier scheme=\""+resourceScheme+"\">"+resourceValue+"</ParticipantIdentifier>" + + "<ParticipantIdentifier scheme=\"" + resourceScheme + "\">" + resourceValue + "</ParticipantIdentifier>" + "<ServiceMetadataReferenceCollection>" + - "<ServiceMetadataReference href=\"" + generateEncodedURL(expectedUrl, resourceScheme, resourceValue,subresourceScheme,subresourceValue)+ "\"/>" + + "<ServiceMetadataReference href=\"" + generateEncodedURL(expectedUrl, resourceScheme, resourceValue, subresourceScheme, subresourceValue) + "\"/>" + "</ServiceMetadataReferenceCollection></ServiceGroup>"; } - public String generateEncodedURL(String expectedUrl, String resourceScheme, String resourceValue, String subresourceScheme, String subresourceValue){ - return expectedUrl + URLEncoder.encode(resourceScheme + "::" + resourceValue) + "/services/"+ URLEncoder.encode(subresourceScheme + "::" + subresourceValue); + + public String generateEncodedURL(String expectedUrl, String resourceScheme, String resourceValue, String subresourceScheme, String subresourceValue) { + return expectedUrl + URLEncoder.encode(resourceScheme + "::" + resourceValue) + "/services/" + URLEncoder.encode(subresourceScheme + "::" + subresourceValue); } @Test @@ -355,9 +335,9 @@ public class ResourceControllerTest { String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urlPath) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isUnauthorized()); mvc.perform(get(urlPath)) @@ -371,14 +351,14 @@ public class ResourceControllerTest { String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isCreated()); mvc.perform(delete(urlPath) - .with(ADMIN_CREDENTIALS)) + .with(ADMIN_CREDENTIALS)) .andExpect(status().isOk()); mvc.perform(get(urlPath)) .andExpect(status().isNotFound()); @@ -392,10 +372,10 @@ public class ResourceControllerTest { String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content("malformed input XML")) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content("malformed input XML")) .andExpect(status().isBadRequest()); } @@ -409,10 +389,10 @@ public class ResourceControllerTest { mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .content(resourceExample)) .andExpect(status().isBadRequest()); } @@ -424,10 +404,10 @@ public class ResourceControllerTest { mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .contentType(APPLICATION_XML_VALUE) - .header(HTTP_HEADER_KEY_DOMAIN, "not-existing-domain") - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) + .header(HTTP_HEADER_KEY_DOMAIN, "not-existing-domain") + .content(resourceExample)) .andExpect(status().isBadRequest()) .andExpect(content().string(stringContainsInOrder("FORMAT_ERROR"))); } @@ -440,10 +420,10 @@ public class ResourceControllerTest { String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .contentType(APPLICATION_XML_VALUE) - .header(HTTP_HEADER_KEY_DOMAIN, "notExistingDomain") - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) + .header(HTTP_HEADER_KEY_DOMAIN, "notExistingDomain") + .content(resourceExample)) .andExpect(status().isNotFound()) .andExpect(content().string(stringContainsInOrder("NOT_FOUND"))); } @@ -456,11 +436,11 @@ public class ResourceControllerTest { mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, OTHER_OWNER_NAME_URL_ENCODED) - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, OTHER_OWNER_NAME_URL_ENCODED) + .content(resourceExample)) .andExpect(status().isCreated()); } @@ -471,11 +451,11 @@ public class ResourceControllerTest { String urlPath = format("/%s::%s", IDENTIFIER_SCHEME, participantId); mvc.perform(put(urlPath) - .with(ADMIN_CREDENTIALS) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .contentType(APPLICATION_XML_VALUE) - .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, "not-existing-user") - .content(resourceExample)) + .with(ADMIN_CREDENTIALS) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .contentType(APPLICATION_XML_VALUE) + .header(HTTP_HEADER_KEY_SERVICE_GROUP_OWNER, "not-existing-user") + .content(resourceExample)) .andExpect(status().isBadRequest()); } @@ -489,18 +469,18 @@ public class ResourceControllerTest { LOG.info("create service service group: [{}]", docUrlPath); mvc.perform(put(urlPath) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .with(ADMIN_CREDENTIALS) - .contentType(APPLICATION_XML_VALUE) - .content(xmlSG)) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) + .content(xmlSG)) .andExpect(status().isCreated()); // add service metadata LOG.info("create service metadata: [{}]", docUrlPath); ResultActions actions = mvc.perform(put(docUrlPath) - .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) - .with(ADMIN_CREDENTIALS) - .contentType(APPLICATION_XML_VALUE) - .content(xmlMD)) + .header(HTTP_HEADER_KEY_DOMAIN, HTTP_DOMAIN_VALUE) + .with(ADMIN_CREDENTIALS) + .contentType(APPLICATION_XML_VALUE) + .content(xmlMD)) .andExpect(status().isCreated()); } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/RootControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/RootControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..008bb4b702662320702c5fb6abe2501e12a53e32 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/controllers/RootControllerTest.java @@ -0,0 +1,59 @@ +package eu.europa.ec.edelivery.smp.controllers; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.mockito.Mockito; +import org.springframework.ui.ModelMap; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class RootControllerTest { + + RootController testInstance = new RootController(); + + @Test + void testRedirectOldIndexPath() { + ModelMap mockModel = Mockito.mock(ModelMap.class); + ModelAndView result = testInstance.redirectOldIndexPath(mockModel); + + assertNotNull(result); + assertEquals("redirect:/index.html", result.getViewName()); + } + + @ParameterizedTest + @CsvSource({ + ", text/html", + "/index.html, text/html", + "/favicon.png, image/png", + "/favicon.ico, image/x-ico" + }) + void testGetStaticResources(String pathInfo, String contentType) throws IOException { + //given + HttpServletRequest mockHttpServletRequest = Mockito.mock(HttpServletRequest.class); + HttpServletResponse mockHttpServletResponse = Mockito.mock(HttpServletResponse.class); + Mockito.when(mockHttpServletRequest.getPathInfo()).thenReturn(pathInfo); + //when + byte[] result = testInstance.getStaticResources(mockHttpServletRequest, mockHttpServletResponse); + //then + assertNotNull(result); + Mockito.verify(mockHttpServletResponse).setContentType(contentType); + + } + + @Test + void testRedirectWithUsingRedirectPrefix() { + ModelMap mockModel = Mockito.mock(ModelMap.class); + ModelAndView result = testInstance.redirectWithUsingRedirectPrefix(mockModel); + + assertNotNull(result); + assertEquals("redirect:/ui/index.html", result.getViewName()); + } + +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..709df15c5c3763133c0761fa2048f8cce92eb0bf --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerIT.java @@ -0,0 +1,56 @@ +package eu.europa.ec.edelivery.smp.monitor; + +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.web.servlet.request.RequestPostProcessor; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * MonitorController integration tests + * @author Joze Rihtarsic + * @since 4.1 + */ +public class MonitorControllerIT extends AbstractControllerTest { + + private static final String URL = "/monitor/is-alive"; + private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("pat_smp_admin", "123456"); + + @Autowired + private MonitorController testInstance; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @Test + public void isAliveNotAuthorized() throws Exception { + mvc.perform(get(URL)) + .andExpect(status().isUnauthorized()); + } + + @Test + public void isAlive() throws Exception { + mvc.perform(get(URL) + .with(ADMIN_CREDENTIALS)) + .andExpect(status() + .isOk()); + } + + @Test + public void testDatabase() { + // when + boolean result = testInstance.testDatabase(); + + assertTrue(result); + + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..345989e9407c59260f9907b33e75c9fa743e9f6d --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorControllerTest.java @@ -0,0 +1,88 @@ +package eu.europa.ec.edelivery.smp.monitor; + +import eu.europa.ec.edelivery.smp.data.dao.DomainDao; +import eu.europa.ec.edelivery.smp.data.model.DBDomain; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.*; + +/** + * MonitorControllerTest unit tests + * + * @author Joze Rihtarsic + * @since 5.0 + */ +class MonitorControllerTest { + + DomainDao mockDomainDao = Mockito.mock(DomainDao.class); + MonitorController testInstance = new MonitorController(mockDomainDao); + + // mock security context and authentication + @BeforeAll + public static void before() { + SecurityContextHolder.setContext(SecurityContextHolder.createEmptyContext()); + SecurityContextHolder.getContext().setAuthentication(Mockito.mock(Authentication.class)); + } + + @AfterAll + public static void cleanup() { + SecurityContextHolder.clearContext(); + } + + @Test + void isAliveOK() { + // given + Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.singletonList(new DBDomain())); + // when + ResponseEntity result = testInstance.isAlive(); + // then + assertEquals(HttpStatus.OK, result.getStatusCode()); + } + + @Test + void isAliveNotConfigured() { + // given + Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.emptyList()); + // when + ResponseEntity result = testInstance.isAlive(); + // then + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, result.getStatusCode()); + } + + @Test + void isAliveDatabaseRuntimeError() { + // given + Mockito.when(mockDomainDao.getAllDomains()).thenThrow(Mockito.mock(RuntimeException.class)); + // when + ResponseEntity result = testInstance.isAlive(); + // then + assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, result.getStatusCode()); + } + + @Test + void testDatabaseEmpty() { + // when + Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.emptyList()); + boolean result = testInstance.testDatabase(); + + assertFalse(result); + } + + @Test + void testDatabaseNotEmpty() { + // when + Mockito.when(mockDomainDao.getAllDomains()).thenReturn(Collections.singletonList(new DBDomain())); + boolean result = testInstance.testDatabase(); + + assertTrue(result); + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorResourceTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorResourceTest.java deleted file mode 100644 index 593cec67fde1159d9169a907d7271e97b6c1646a..0000000000000000000000000000000000000000 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/monitor/MonitorResourceTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package eu.europa.ec.edelivery.smp.monitor; - -import eu.europa.ec.edelivery.smp.exceptions.SMPTestIsALiveException; -import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; -import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockServletContext; -import org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.RequestPostProcessor; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.WebApplicationContext; - -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; -import java.io.IOException; - -import static org.junit.Assert.*; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; -import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -/** - * @author Joze Rihtarsic - * @since 4.1 - */ -@RunWith(SpringRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = {SmpTestWebAppConfig.class}) -@Sql(scripts = { - "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}, - executionPhase = BEFORE_TEST_METHOD) -public class MonitorResourceTest { - - private static final String URL = "/monitor/is-alive"; - private static final RequestPostProcessor ADMIN_CREDENTIALS = httpBasic("pat_smp_admin", "123456"); - @Autowired - private WebApplicationContext webAppContext; - - @Autowired - private MonitorResource testInstance; - - private MockMvc mvc; - - @Before - public void setup() throws IOException { - X509CertificateTestUtils.reloadKeystores(); - mvc = MockMvcBuilders.webAppContextSetup(webAppContext) - .apply(SecurityMockMvcConfigurers.springSecurity()) - .build(); - - initServletContext(); - } - - private void initServletContext() { - MockServletContext sc = new MockServletContext(""); - ServletContextListener listener = new ContextLoaderListener(webAppContext); - ServletContextEvent event = new ServletContextEvent(sc); - listener.contextInitialized(event); - } - - @Test - public void isAliveNotAuthorized() throws Exception { - mvc.perform(get(URL)) - .andExpect(status().isUnauthorized()); - } - - @Test - public void isAlive() throws Exception { - mvc.perform(get(URL) - .with(ADMIN_CREDENTIALS)) - .andExpect(status().isOk()); - } - - @Test - public void testDatabase() { - // when - boolean result = testInstance.testDatabase(); - - assertTrue(result); - - } -} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java index d3e8c655d5e620c30240e465b8b59fd6b63c36e5..a0e47597de5895d887d941e5507cb78c8ebfcdf1 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/PropertiesTestConfig.java @@ -13,14 +13,13 @@ package eu.europa.ec.edelivery.smp.test; -import eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum; -import eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum; -import org.springframework.context.annotation.*; -import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; import java.nio.file.Path; import java.nio.file.Paths; -import java.util.Properties; import static eu.europa.ec.edelivery.smp.config.enums.SMPEnvPropertyEnum.*; import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*; @@ -35,14 +34,14 @@ import static eu.europa.ec.edelivery.smp.config.enums.SMPPropertyEnum.*; }) @ComponentScan(basePackages = "eu.europa.ec.edelivery.smp") public class PropertiesTestConfig { - public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpWebDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;"; + public static final String DATABASE_URL = "jdbc:h2:file:./target/DomiSmpWebDb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=TRUE;AUTO_SERVER=TRUE;Mode=MySQL"; public static final String DATABASE_USERNAME = "smp"; public static final String DATABASE_PASS = "smp"; public static final String DATABASE_DRIVER = "org.h2.Driver"; public static final String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect"; public static final String BUILD_FOLDER = "target"; - public static final Path SECURITY_PATH= Paths.get(BUILD_FOLDER, "keystores"); + public static final Path SECURITY_PATH = Paths.get(BUILD_FOLDER, "keystores"); static { System.setProperty(JDBC_DRIVER.getProperty(), DATABASE_DRIVER); diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java index 04b9602d5623b3bbf456a8d7ee8a3318cae5901f..5bbc6af0f956f362d176eed9eb86c62dd350944d 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/MockMvcUtils.java @@ -4,6 +4,9 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import com.fasterxml.jackson.databind.type.CollectionType; +import eu.europa.ec.edelivery.smp.data.ui.DomainRO; +import eu.europa.ec.edelivery.smp.data.ui.GroupRO; +import eu.europa.ec.edelivery.smp.data.ui.SearchUserRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,8 +27,7 @@ import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.List; -import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY; -import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY_AUTHENTICATION; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; import static org.junit.Assert.assertNotNull; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; @@ -40,11 +42,11 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. * @since 4.2 */ public class MockMvcUtils { - public static Logger LOG = LoggerFactory.getLogger(MockMvcUtils.class); + public static Logger LOG = LoggerFactory.getLogger(MockMvcUtils.class); static ObjectMapper mapper = JsonMapper.builder() .findAndAddModules() .build(); - + // The values match the values in the test data in webapp_integration_test_data.sql public static final String SYS_ADMIN_USERNAME = "sys_admin"; public static final String SYS_ADMIN_PASSWD = "test123"; public static final String SMP_ADMIN_USERNAME = "smp_admin"; @@ -57,6 +59,8 @@ public class MockMvcUtils { public static final String MOCK_LOGGED_USER = "mock_logged_user"; + public static final String RESOURCE_001_IDENTIFIER_VALUE = "urn:australia:ncpb"; + public static RequestPostProcessor getHttpBasicSystemAdminCredentials() { return httpBasic(SYS_ADMIN_USERNAME, SYS_ADMIN_PASSWD); } @@ -116,11 +120,11 @@ public class MockMvcUtils { .andReturn(); // assert successful login byte[] asByteArray = result.getResponse().getContentAsByteArray(); - System.out.println("User logged with data: "+ new String(asByteArray)); + System.out.println("User logged with data: " + new String(asByteArray)); UserRO userRO = mapper.readValue(asByteArray, UserRO.class); assertNotNull(userRO); - MockHttpSession session = (MockHttpSession)result.getRequest().getSession(); + MockHttpSession session = (MockHttpSession) result.getRequest().getSession(); session.setAttribute(MOCK_LOGGED_USER, userRO); return session; } @@ -143,6 +147,39 @@ public class MockMvcUtils { return mapper.readValue(asByteArray, UserRO.class); } + public static List<DomainRO> geUserDomainsForRole(MockMvc mvc, MockHttpSession session, UserRO userRO, String forRole) throws Exception { + + MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_DOMAIN, userRO.getUserId()) + .param(PARAM_NAME_TYPE, forRole) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + return getArrayFromResponse(result, DomainRO.class); + } + + public static List<GroupRO> geUserGroups(MockMvc mvc, MockHttpSession session, UserRO userRO, DomainRO domainRO, String forRole) throws Exception { + + MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_GROUP, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .param(PARAM_NAME_TYPE, forRole) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + return getArrayFromResponse(result, GroupRO.class); + } + + public static List<SearchUserRO> geUsersByUsernameFilter(MockMvc mvc, MockHttpSession session, UserRO userRO, String username) throws Exception { + + MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_USER + "/{user-id}/search", userRO.getUserId()) + .param(PARAM_PAGINATION_FILTER, username) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + return getArrayFromResponse(result, SearchUserRO.class); + } + + public static <T> T getObjectFromResponse(MvcResult result, Class<T> clazz) throws IOException { return mapper.readValue(result.getResponse().getContentAsByteArray(), clazz); diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..99b08b32123c99c7ee72b872b04e363747f01493 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/test/testutils/TestROUtils.java @@ -0,0 +1,47 @@ +package eu.europa.ec.edelivery.smp.test.testutils; + +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; +import eu.europa.ec.edelivery.smp.data.ui.DomainRO; +import eu.europa.ec.edelivery.smp.data.ui.GroupRO; + +import java.util.UUID; + +public class TestROUtils { + + public static GroupRO createGroup() { + return createGroup(anyString()); + } + + + public static GroupRO createGroup(String name) { + GroupRO groupRO = new GroupRO(); + groupRO.setGroupName(name); + groupRO.setGroupDescription(anyString()); + groupRO.setVisibility(VisibilityType.PRIVATE); + return groupRO; + } + + public static DomainRO createDomain() { + return createDomain(anyString()); + } + + public static DomainRO createDomain(String name) { + DomainRO domainRO = new DomainRO(); + domainRO.setDomainCode(name); + domainRO.setVisibility(VisibilityType.PRIVATE); + return domainRO; + } + + public static String anyString() { + return UUID.randomUUID().toString(); + } + + + public static String createSMP10ServiceGroupPayload(String id, String sch) { + + return "<ServiceGroup xmlns=\"http://docs.oasis-open.org/bdxr/ns/SMP/2016/05\">" + + "<ParticipantIdentifier scheme=\"" + sch + "\">" + id + "</ParticipantIdentifier>" + + "<ServiceMetadataReferenceCollection />" + + "</ServiceGroup>"; + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java index e2ecfdbf42e18b5f11f199bd2d30b4c8cb3ab608..c18993834ee04da04a55e7a2f1cd7cb284cdf6a2 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AbstractControllerTest.java @@ -3,30 +3,51 @@ package eu.europa.ec.edelivery.smp.ui; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; +import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; +import eu.europa.ec.edelivery.smp.data.ui.*; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils; +import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils; import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; import org.springframework.web.context.WebApplicationContext; import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.getObjectFromResponse; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@RunWith(SpringRunner.class) -@DirtiesContext +@ExtendWith(SpringExtension.class) @WebAppConfiguration @ContextConfiguration(classes = {SmpTestWebAppConfig.class}) +@DirtiesContext @Sql(scripts = { "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}) + "classpath:/webapp_integration_test_data.sql"}, + executionPhase = BEFORE_TEST_METHOD) abstract public class AbstractControllerTest { + + protected ObjectMapper mapper = null; protected MockMvc mvc; @Autowired private WebApplicationContext webAppContext; @@ -39,9 +60,166 @@ abstract public class AbstractControllerTest { configurationDao.reloadPropertiesFromDatabase(); } + /** + * Helper method for getting the ObjectMapper. + * + * @return ObjectMapper + */ public ObjectMapper getObjectMapper() { - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); + if (mapper == null) { + mapper = new ObjectMapper(); + mapper.registerModule(new JavaTimeModule()); + } return mapper; } + + /** + * Test helper method for Adding a new member with viewer role to a domain. + * + * @param session MockHttpSession of the user that is adding the new member + * @param domainRO Domain to which the new member is added + * @param domainAdminUser User that is adding the new member + * @param newMemberUsername Username of the new member + * @return MemberRO of the new member + * @throws Exception + */ + public MemberRO addDomainMember(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser, String newMemberUsername) throws Exception { + String pathTemplate = CONTEXT_PATH_EDIT_DOMAIN + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT; + return addMember(session, newMemberUsername, MembershipRoleType.VIEWER, pathTemplate, + domainAdminUser.getUserId(), domainRO.getDomainId()); + } + + /** + * Test helper method for Adding a new member with viewer role to a group. + * + * @param session MockHttpSession of the user that is adding the new member + * @param domainRO Domain to which the new member is added + * @param groupRO Group to which the new member is added + * @param domainAdminUser User that is adding the new member + * @param newMemberUsername Username of the new member + * @return MemberRO of the new member + * @throws Exception + **/ + public MemberRO addGroupMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, UserRO domainAdminUser, String newMemberUsername) throws Exception { + String pathTemplate = CONTEXT_PATH_EDIT_GROUP + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_PUT; + return addMember(session, newMemberUsername, MembershipRoleType.VIEWER, pathTemplate, + domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()); + } + + /** + * Test helper method for Adding a new member with viewer role to a resourse. + * + * @param session MockHttpSession of the user that is adding the new member + * @param domainRO Domain to which the new member is added + * @param groupRO Group to which the new member is added + * @param resourceRO Resource to which the new member is added + * @param domainAdminUser User that is adding the new member + * @param newMemberUsername Username of the new member + * @return MemberRO of the new member + * @throws Exception + **/ + public MemberRO addResourceMember(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, ResourceRO resourceRO, UserRO domainAdminUser, String newMemberUsername) throws Exception { + String pathTemplate = CONTEXT_PATH_EDIT_RESOURCE + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_PUT; + return addMember(session, newMemberUsername, MembershipRoleType.VIEWER, pathTemplate, + domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), resourceRO.getResourceId()); + } + + /** + * Generic Test helper method for Adding a new member with given role to a resource/group/domain. + * + * @param session MockHttpSession of the user that is adding the new member + * @param newMemberUsername Username of the new member + * @param roleType Role of the new member + * @param urlTemplate URL template of the resource/group/domain to which the new member is added + * @param encPathIds Encoded path ids of the adminUserID, domain id, group id resource id, ... + * @return MemberRO of the new member + * @throws Exception + */ + public MemberRO addMember(MockHttpSession session, String newMemberUsername, MembershipRoleType roleType, String urlTemplate, String... encPathIds) throws Exception { + + MemberRO memberToAdd = new MemberRO(); + memberToAdd.setRoleType(roleType); + memberToAdd.setUsername(newMemberUsername); + + // when + MvcResult result = mvc.perform(put(urlTemplate, encPathIds) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(memberToAdd))) + .andExpect(status().isOk()).andReturn(); + + //then + return getObjectFromResponse(result, MemberRO.class); + } + + /** + * Test helper method for creating and adding new resource to group. + * + * @param session MockHttpSession of the user that is adding the new resource + * @param domainRO Domain to which the new member is added + * @param groupRO Group to which the new member is added + * @param domainAdminUser User that is adding the new member + * @return ResourceRO return created resource + * @throws Exception + **/ + public ResourceRO addResourceToGroup(MockHttpSession session, DomainRO domainRO, GroupRO groupRO, UserRO domainAdminUser) throws Exception { + // create resource + ResourceRO resource = new ResourceRO(); + resource.setResourceTypeIdentifier("edelivery-oasis-smp-1.0-servicegroup"); + resource.setIdentifierValue(UUID.randomUUID().toString()); + resource.setIdentifierScheme("test-test-test"); + resource.setVisibility(VisibilityType.PUBLIC); + // add it to the group + MvcResult result = mvc.perform(put(CONTEXT_PATH_EDIT_RESOURCE + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_CREATE, + domainAdminUser.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(resource))) + .andExpect(status().isOk()).andReturn(); + + + return getObjectFromResponse(result, ResourceRO.class); + } + + /** + * Test helper method for Adding a new group to a domain. + * + * @param session + * @param domainRO + * @param domainAdminUser + * @return + * @throws Exception + */ + public GroupRO addGroupToDomain(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser) throws Exception { + GroupRO groupRO = TestROUtils.createGroup(); + MvcResult addGroupResult = mvc.perform(put(CONTEXT_PATH_EDIT_GROUP + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_CREATE, + domainAdminUser.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(groupRO))) + .andExpect(status().isOk()).andReturn(); + return getObjectFromResponse(addGroupResult, GroupRO.class); + } + + public List<ResourceRO> getEditResourcesForGroup(MockHttpSession session, UserRO userRO, DomainRO domainRO, GroupRO groupRO, String filter, String roleType) + throws Exception { + + MvcResult result = mvc.perform(get(CONTEXT_PATH_EDIT_RESOURCE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .param(PARAM_PAGINATION_FILTER, filter) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + if (serviceResult == null || serviceResult.getServiceEntities().isEmpty()) { + return Collections.emptyList(); + } + return (List<ResourceRO>) serviceResult.getServiceEntities().stream().map(o -> getObjectMapper().convertValue(o, ResourceRO.class)) + .collect(Collectors.toList()); + } } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIT.java similarity index 94% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIT.java index 206cc1e7ea0591f8dbfea94f6726fd200c49d866..70c27371e7410841ffcde369ee7d94db7131b73a 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/AuthenticationResourceIT.java @@ -2,7 +2,6 @@ package eu.europa.ec.edelivery.smp.ui; import eu.europa.ec.edelivery.smp.data.dao.ConfigurationDao; import eu.europa.ec.edelivery.smp.data.dao.CredentialDao; -import eu.europa.ec.edelivery.smp.data.model.user.DBCredential; import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils; @@ -22,8 +21,6 @@ import org.springframework.web.context.WebApplicationContext; import javax.servlet.http.HttpSession; import java.io.IOException; -import java.util.List; -import java.util.Optional; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; @@ -39,9 +36,9 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "classpath:/cleanup-database.sql", "classpath:/webapp_integration_test_data.sql"}, executionPhase = BEFORE_TEST_METHOD) -public class AuthenticationResourceIntegrationTest { +public class AuthenticationResourceIT { - private static final Logger LOG = LoggerFactory.getLogger(AuthenticationResourceIntegrationTest.class); + private static final Logger LOG = LoggerFactory.getLogger(AuthenticationResourceIT.class); private static final String PATH = ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY + "/authentication"; diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..af9ef4a9076c31f223fbcb7cd8d6b084901a7592 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DocumentEditControllerIT.java @@ -0,0 +1,192 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.data.ui.exceptions.ErrorResponseRO; +import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode; +import eu.europa.ec.edelivery.smp.services.ui.UIDocumentService; +import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +class DocumentEditControllerIT extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_DOCUMENT; + + @Autowired + protected UIDocumentService documentService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @Test + public void testGetDocumentForNewResource() throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + // add new resource + ResourceRO resourceRO = addResourceToGroup(session, domainRO, groupRO, userRO); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_GET, + userRO.getUserId(), resourceRO.getResourceId()) + .session(session) + .with(csrf()) + ) + .andExpect(status().isOk()).andReturn(); + // then + DocumentRo documentRo = getObjectFromResponse(result, DocumentRo.class); + assertNotNull(documentRo); + assertTrue(documentRo.getAllVersions().isEmpty()); // was just created without document + } + + @Test + public void testGetDocumentForResource() throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + + List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null); + assertEquals(1, resources.size()); + ResourceRO resourceRO = resources.get(0); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_GET, + userRO.getUserId(), resourceRO.getResourceId()) + .session(session) + .with(csrf()) + ) + .andExpect(status().isOk()).andReturn(); + // then + DocumentRo documentRo = getObjectFromResponse(result, DocumentRo.class); + assertNotNull(documentRo); + assertFalse(documentRo.getAllVersions().isEmpty()); // was just created without document + assertNotNull(documentRo.getPayload()); + } + + @Test + public void testValidateDocumentOk() throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + + List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null); + assertEquals(1, resources.size()); + ResourceRO resourceRO = resources.get(0); + + // document to validate + DocumentRo documentRo = new DocumentRo(); + documentRo.setPayload(TestROUtils.createSMP10ServiceGroupPayload(resourceRO.getIdentifierValue(), resourceRO.getIdentifierScheme())); + + // when + mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_VALIDATE, + userRO.getUserId(), resourceRO.getResourceId()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(documentRo)) + .session(session) + .with(csrf()) + ) + .andExpect(status().isOk()).andReturn(); + } + + @Test + public void testValidateDocumentInvalid() throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + + List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null); + assertEquals(1, resources.size()); + ResourceRO resourceRO = resources.get(0); + + // document to validate + DocumentRo documentRo = new DocumentRo(); + documentRo.setPayload("invalid payload"); + + // when + MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_VALIDATE, + userRO.getUserId(), resourceRO.getResourceId()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(documentRo)) + .session(session) + .with(csrf()) + ) + .andExpect(status().is4xxClientError()).andReturn(); + + ErrorResponseRO errorRO = getObjectFromResponse(result, ErrorResponseRO.class); + assertNotNull(errorRO); + assertEquals(ErrorBusinessCode.TECHNICAL.name(), errorRO.getBusinessCode()); + MatcherAssert.assertThat(errorRO.getErrorDescription(), Matchers.containsString("Invalid request [ResourceValidation]")); + } + + @Test + public void testGenerateDocument() throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + + List<ResourceRO> resources = getEditResourcesForGroup(session, userRO, domainRO, groupRO, RESOURCE_001_IDENTIFIER_VALUE, null); + assertEquals(1, resources.size()); + ResourceRO resourceRO = resources.get(0); + + // when + MvcResult response = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOCUMENT_GENERATE, + userRO.getUserId(), resourceRO.getResourceId()) + .session(session) + .with(csrf()) + ) + .andExpect(status().isOk()).andReturn(); + + DocumentRo result = getObjectFromResponse(response, DocumentRo.class); + assertNotNull(result); + assertNotNull(result.getPayload()); + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..986ecc67208eae7e5464d0d92025a6cbb3c71bb6 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerIT.java @@ -0,0 +1,160 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; +import eu.europa.ec.edelivery.smp.data.ui.DomainRO; +import eu.europa.ec.edelivery.smp.data.ui.MemberRO; +import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; +import eu.europa.ec.edelivery.smp.data.ui.UserRO; +import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +public class DomainEditControllerIT extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_DOMAIN; + + @Autowired + protected UIGroupPublicService uiGroupPublicService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @ParameterizedTest + @CsvSource({ + ", 1", + "'', 1", + "domain-admin, 1", + "group-admin, 1", + "resource-admin, 1", + }) + public void testGetDomains(String roleType, int values) throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + // when + MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + List<DomainRO> listDomains = getArrayFromResponse(result, DomainRO.class); + assertNotNull(listDomains); + assertEquals(values, listDomains.size()); + } + + + @Test + public void testGetDomainMembers() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(1, serviceResult.getServiceEntities().size()); + MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class); + + // the admin user who created group is automatically added as member + assertEquals(userRO.getUsername(), memberRO.getUsername()); + } + + @Test + public void testAddDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + //when + MemberRO response = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + // then + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testDeleteDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + + MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testUpdateDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + assertEquals(MembershipRoleType.VIEWER, member.getRoleType()); + member.setRoleType(MembershipRoleType.ADMIN); + + + MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(member))) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + assertEquals(member.getRoleType(), response.getRoleType()); + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java new file mode 100644 index 0000000000000000000000000000000000000000..6e63dcd6c38c65b47ed30aa3f4ba2c7f9a2091b1 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/DomainEditControllerTest.java @@ -0,0 +1,180 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; +import eu.europa.ec.edelivery.smp.data.ui.DomainRO; +import eu.europa.ec.edelivery.smp.data.ui.MemberRO; +import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; +import eu.europa.ec.edelivery.smp.data.ui.UserRO; +import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +public class DomainEditControllerTest extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_DOMAIN; + + @Autowired + protected UIGroupPublicService uiGroupPublicService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @ParameterizedTest + @CsvSource({ + ", 1", + "'', 1", + "domain-admin, 1", + "group-admin, 1", + "resource-admin, 1", + }) + public void testGetDomains(String roleType, int values) throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + // when + MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + List<DomainRO> listDomains = getArrayFromResponse(result, DomainRO.class); + assertNotNull(listDomains); + assertEquals(values, listDomains.size()); + } + + + @Test + public void testGetDomainMembers() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(1, serviceResult.getServiceEntities().size()); + MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class); + + // the admin user who created group is automatically added as member + assertEquals(userRO.getUsername(), memberRO.getUsername()); + } + + @Test + public void testAddDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + //when + MemberRO response = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + // then + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testDeleteDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + + MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + + MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testUpdateDomainMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + MemberRO member = addDomainMember(session, domainRO, userRO, SG_USER_USERNAME); + assertEquals(MembershipRoleType.VIEWER, member.getRoleType()); + member.setRoleType(MembershipRoleType.ADMIN); + + + MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), member.getMemberId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(member))) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + assertEquals(member.getRoleType(), response.getRoleType()); + } + + + public MemberRO addDomainMember(MockHttpSession session, DomainRO domainRO, UserRO domainAdminUser, String newMemberUsername) throws Exception { + + MemberRO memberToAdd = new MemberRO(); + memberToAdd.setRoleType(MembershipRoleType.VIEWER); + memberToAdd.setUsername(newMemberUsername); + + // when + MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_DOMAIN_MEMBER_PUT, domainAdminUser.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(memberToAdd))) + .andExpect(status().isOk()).andReturn(); + + //then + return getObjectFromResponse(result, MemberRO.class); + } + +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..03c9372950313eac49fcb7913944ae4a7fced226 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/GroupEditControllerIT.java @@ -0,0 +1,256 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.enums.MembershipRoleType; +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.services.ui.UIGroupPublicService; +import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * For the test configuration see the webapp_integration_test_data.sql file. + * The system admin user is admin member of domain '1' and group '1'. + */ +public class GroupEditControllerIT extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_GROUP; + + @Autowired + protected UIGroupPublicService uiGroupPublicService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @ParameterizedTest + @CsvSource({ + ", 2", + "'', 2", + "group-admin, 1", + "resource-admin, 1", + "group-viewer, 0", + "all-roles, 1" + }) + public void testGetGroup(String roleType, int values) throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + // when + MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + List<GroupRO> listGroups = getArrayFromResponse(result, GroupRO.class); + assertNotNull(listGroups); + assertEquals(values, listGroups.size()); + } + + @Test + public void testPutGroup() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = new GroupRO(); + groupRO.setGroupName(UUID.randomUUID().toString()); + groupRO.setGroupDescription(UUID.randomUUID().toString()); + groupRO.setVisibility(VisibilityType.PRIVATE); + + int initialGroupSize = uiGroupPublicService.getAllGroupsForDomain(1L).size(); + // when + MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_CREATE, userRO.getUserId(), domainRO.getDomainId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(groupRO))) + .andExpect(status().isOk()).andReturn(); + + //then + GroupRO response = getObjectFromResponse(result, GroupRO.class); + assertNotNull(response); + assertEquals(VisibilityType.PRIVATE, response.getVisibility()); + assertEquals(groupRO.getGroupName(), response.getGroupName()); + assertEquals(groupRO.getGroupDescription(), response.getGroupDescription()); + assertEquals(initialGroupSize + 1, uiGroupPublicService.getAllGroupsForDomain(1L).size()); + } + + @Test + public void testDeleteGroup() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + int initialGroupSize = uiGroupPublicService.getAllGroupsForDomain(1L).size(); + + // when + MvcResult result = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + + GroupRO response = getObjectFromResponse(result, GroupRO.class); + assertNotNull(response); + assertEquals(VisibilityType.PRIVATE, response.getVisibility()); + assertEquals(groupRO.getGroupName(), response.getGroupName()); + assertEquals(groupRO.getGroupDescription(), response.getGroupDescription()); + assertEquals(initialGroupSize - 1, uiGroupPublicService.getAllGroupsForDomain(1L).size()); + } + + @Test + public void testUpdateGroup() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + groupRO.setVisibility(VisibilityType.PUBLIC); + groupRO.setGroupDescription(TestROUtils.anyString()); + groupRO.setGroupName(TestROUtils.anyString()); + + // when + MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_UPDATE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(groupRO))) + .andExpect(status().isOk()).andReturn(); + + + GroupRO response = getObjectFromResponse(result, GroupRO.class); + assertNotNull(response); + assertEquals(groupRO.getVisibility(), response.getVisibility()); + assertEquals(groupRO.getGroupName(), response.getGroupName()); + assertEquals(groupRO.getGroupDescription(), response.getGroupDescription()); + } + + + @Test + public void testGetGroupMembers() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(1, serviceResult.getServiceEntities().size()); + MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class); + + // the admin user who created group is automatically added as member + assertEquals(userRO.getUsername(), memberRO.getUsername()); + } + + + @Test + public void testAddGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + + //when + MemberRO response = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME); + // then + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testDeleteGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + MemberRO member = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME); + + MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), member.getMemberId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testUpdateGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + GroupRO groupRO = addGroupToDomain(session, domainRO, userRO); + MemberRO member = addGroupMember(session, domainRO, groupRO, userRO, SG_USER_USERNAME); + assertEquals(MembershipRoleType.VIEWER, member.getRoleType()); + member.setRoleType(MembershipRoleType.ADMIN); + + + MvcResult deleteGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_GROUP_MEMBER_PUT, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), member.getMemberId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(member))) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + assertEquals(member.getRoleType(), response.getRoleType()); + } + +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..bce4a5ae2f21d5709bc3df2ecc9d7e04f9fa3f8e --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/edit/ResourceEditControllerIT.java @@ -0,0 +1,279 @@ +package eu.europa.ec.edelivery.smp.ui.edit; + +import eu.europa.ec.edelivery.smp.data.enums.VisibilityType; +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.services.ui.UIResourceSearchService; +import eu.europa.ec.edelivery.smp.services.ui.filters.ResourceFilter; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import java.io.IOException; +import java.util.List; +import java.util.UUID; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.*; +import static org.junit.jupiter.api.Assertions.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * For the test configuration see the webapp_integration_test_data.sql file. + * The system admin user is admin member of domain '1' and group '1'. + */ +public class ResourceEditControllerIT extends AbstractControllerTest { + private static final String PATH = CONTEXT_PATH_EDIT_RESOURCE; + + @Autowired + protected UIResourceSearchService uiResourceSearchService; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + // test must match the webapp_integration_test_data.sql file! + @ParameterizedTest + @CsvSource({ + ",'', 2", + ",'group-admin', 2", + ",'resource-admin', 1", + "'','', 2", + "ehealth-actorid-qns,'', 2", // filter by group match + "'No match at all','', 0", + "australia,'', 1", // filter by value match + }) + public void testGetResourcesForGroup(String filter, String roleType, int expectedResults) throws Exception { + // given when + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + // when + MvcResult result = mvc.perform(get(PATH, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .param(PARAM_PAGINATION_FILTER, filter) + .param(PARAM_NAME_TYPE, roleType) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(expectedResults, serviceResult.getServiceEntities().size()); + + } + + @Test + public void testPutResource() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + assertFalse(groupsForUser.isEmpty()); // set the webapp_integration_test_data.sql file + GroupRO groupRO = groupsForUser.get(0); + + + ResourceRO resource = new ResourceRO(); + resource.setResourceTypeIdentifier("edelivery-oasis-smp-1.0-servicegroup"); + resource.setIdentifierValue(UUID.randomUUID().toString()); + resource.setIdentifierScheme("test-test-test"); + resource.setVisibility(VisibilityType.PUBLIC); + + int initialSize = getResourceCount(); + // when + MvcResult result = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_CREATE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(resource))) + .andExpect(status().isOk()).andReturn(); + + //then + ResourceRO response = getObjectFromResponse(result, ResourceRO.class); + assertNotNull(response); + assertEquals(VisibilityType.PUBLIC, response.getVisibility()); + assertEquals(resource.getIdentifierValue(), response.getIdentifierValue()); + assertEquals(resource.getIdentifierScheme(), response.getIdentifierScheme()); + + assertEquals(initialSize + 1, getResourceCount()); + } + + @Test + public void testDeleteResource() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + GroupRO groupRO = groupsForUser.get(0); + ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO); + int initialSize = getResourceCount(); + + // when + MvcResult result = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_DELETE, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), addedResource.getResourceId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + // then + ResourceRO response = getObjectFromResponse(result, ResourceRO.class); + assertNotNull(response); + assertEquals(addedResource.getIdentifierValue(), response.getIdentifierValue()); + assertEquals(addedResource.getIdentifierScheme(), response.getIdentifierScheme()); + assertEquals(initialSize - 1, getResourceCount()); + } + + @Test + public void testUpdateResource() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + GroupRO groupRO = groupsForUser.get(0); + ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO); + addedResource.setVisibility(VisibilityType.PRIVATE); + + // when + MvcResult result = mvc.perform(post(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_UPDATE, userRO.getUserId(), domainRO.getDomainId(), + groupRO.getGroupId(), addedResource.getResourceId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(addedResource))) + .andExpect(status().isOk()).andReturn(); + // then + ResourceRO response = getObjectFromResponse(result, ResourceRO.class); + assertNotNull(response); + assertEquals(addedResource.getVisibility(), response.getVisibility()); + assertEquals(addedResource.getIdentifierValue(), response.getIdentifierValue()); + assertEquals(addedResource.getIdentifierScheme(), response.getIdentifierScheme()); + } + + @Test + public void testGetGroupMembers() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + GroupRO groupRO = groupsForUser.get(0); + ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO); + + // when + MvcResult result = mvc.perform(get(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER, userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), + addedResource.getResourceId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + ServiceResult serviceResult = getObjectFromResponse(result, ServiceResult.class); + assertNotNull(serviceResult); + assertEquals(1, serviceResult.getServiceEntities().size()); + MemberRO memberRO = getObjectMapper().convertValue(serviceResult.getServiceEntities().get(0), MemberRO.class); + + // the admin user who created group is automatically added as member + assertEquals(userRO.getUsername(), memberRO.getUsername()); + } + + + @Test + public void testAddGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + GroupRO groupRO = groupsForUser.get(0); + ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO); + + //when + MemberRO response = addResourceMember(session, domainRO, groupRO, addedResource, userRO, SG_USER_USERNAME); + // then + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testDeleteGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + GroupRO groupRO = groupsForUser.get(0); + ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO); + MemberRO member = addResourceMember(session, domainRO, groupRO, addedResource, userRO, SG_USER_USERNAME); + //when + MvcResult deleteGroupMemberResult = mvc.perform(delete(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_DELETE, + userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), addedResource.getResourceId(), member.getMemberId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(deleteGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + } + + @Test + public void testUpdateGroupMember() throws Exception { + // given + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + List<DomainRO> domainsForUser = geUserDomainsForRole(mvc, session, userRO, null); + assertEquals(1, domainsForUser.size()); + DomainRO domainRO = domainsForUser.get(0); + List<GroupRO> groupsForUser = geUserGroups(mvc, session, userRO, domainRO, null); + GroupRO groupRO = groupsForUser.get(0); + ResourceRO addedResource = addResourceToGroup(session, domainRO, groupRO, userRO); + MemberRO member = addResourceMember(session, domainRO, groupRO, addedResource, userRO, SG_USER_USERNAME); + + + MvcResult updateGroupMemberResult = mvc.perform(put(PATH + '/' + SUB_CONTEXT_PATH_EDIT_RESOURCE_MEMBER_PUT, + userRO.getUserId(), domainRO.getDomainId(), groupRO.getGroupId(), addedResource.getResourceId(), member.getMemberId()) + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsBytes(member))) + .andExpect(status().isOk()).andReturn(); + + //then + MemberRO response = getObjectFromResponse(updateGroupMemberResult, MemberRO.class); + assertNotNull(response); + assertEquals(SG_USER_USERNAME, response.getUsername()); + assertEquals(member.getRoleType(), response.getRoleType()); + } + + + public int getResourceCount() { + return uiResourceSearchService.getTableList(-1, -1, null, null, new ResourceFilter()).getCount().intValue(); + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIT.java similarity index 99% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIT.java index e1cd09f676da349af5fe29314ac5ed6531773a18..5bfc52c0081c6ee3e3ae0b9ed9de30fa7a27df12 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/ApplicationResourceIT.java @@ -48,7 +48,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "smp.artifact.version=TestApplicationVersion", "smp.artifact.build.time=2018-11-27 00:00:00", }) -public class ApplicationResourceIntegrationTest { +public class ApplicationResourceIT { private static final String PATH = ResourceConstants.CONTEXT_PATH_PUBLIC_APPLICATION; @Autowired diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIT.java similarity index 98% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIT.java index ffad2c65ccafb98d3420e3129e63eda50e20fafd..aeb2c25d5d451f7e699909a354d67e86b62a2c71 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/DomainResourceIT.java @@ -36,7 +36,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. @Sql(scripts = { "/cleanup-database.sql", "/webapp_integration_test_data.sql"}) -public class DomainResourceIntegrationTest { +public class DomainResourceIT { private static final String PATH = ResourceConstants.CONTEXT_PATH_PUBLIC_DOMAIN; @Autowired @@ -66,7 +66,7 @@ public class DomainResourceIntegrationTest { .with(csrf())) .andExpect(status().isOk()).andReturn(); - //them + //then ObjectMapper mapper = new ObjectMapper(); ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class); diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIT.java similarity index 96% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIT.java index 5aaace5de71d01ab9a36b783251fa231cf7f30eb..d73c5f4a675a2b20234624a953ae034583285050 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/SearchResourceIT.java @@ -41,7 +41,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "classpath:/cleanup-database.sql", "classpath:/webapp_integration_test_data.sql"}, executionPhase = BEFORE_TEST_METHOD) -public class SearchResourceIntegrationTest { +public class SearchResourceIT { @Autowired private WebApplicationContext webAppContext; @@ -66,8 +66,7 @@ public class SearchResourceIntegrationTest { @Test public void testSearchByAnonymous() throws Exception { // given when - MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_SEARCH_PARTICIPANT) - ).andExpect(status().isOk()).andReturn(); + MvcResult result = mvc.perform(get(CONTEXT_PATH_PUBLIC_SEARCH_PARTICIPANT)).andExpect(status().isOk()).andReturn(); //then ObjectMapper mapper = new ObjectMapper(); @@ -76,4 +75,4 @@ public class SearchResourceIntegrationTest { assertNotNull(res); assertEquals(2, res.getServiceEntities().size()); } -} \ No newline at end of file +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerIT.java similarity index 58% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerIT.java index ca2472210c2309f91db5b7ef6ef057956d828d5e..b028cd77bc180b199f765a551d313013b9e8a358 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserControllerIT.java @@ -1,13 +1,14 @@ package eu.europa.ec.edelivery.smp.ui.external; +import eu.europa.ec.edelivery.smp.data.enums.CredentialType; +import eu.europa.ec.edelivery.smp.data.ui.CredentialRO; import eu.europa.ec.edelivery.smp.data.ui.NavigationTreeNodeRO; import eu.europa.ec.edelivery.smp.data.ui.SearchUserRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.services.ui.UIUserService; import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MvcResult; @@ -19,23 +20,23 @@ import java.util.stream.Collectors; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_USER; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class UserControllerTest extends AbstractControllerTest { +public class UserControllerIT extends AbstractControllerTest { private static final String PATH = CONTEXT_PATH_PUBLIC_USER; @Autowired protected UIUserService uiUserService; - @Before + @BeforeEach public void setup() throws IOException { super.setup(); } - @Test public void testGetUserNavigationTreeForSystemAdmin() throws Exception { @@ -48,10 +49,10 @@ public class UserControllerTest extends AbstractControllerTest { NavigationTreeNodeRO result = getObjectFromResponse(response, NavigationTreeNodeRO.class); - Assert.assertNotNull(result); - Assert.assertEquals(4, result.getChildren().size()); + assertNotNull(result); + assertEquals(4, result.getChildren().size()); List<String> childrenNames = result.getChildren().stream().map(NavigationTreeNodeRO::getName).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("Search", "Administration", "System settings", "User Settings"), childrenNames); + assertEquals(Arrays.asList("Search", "Administration", "System settings", "User Settings"), childrenNames); } @Test @@ -66,10 +67,10 @@ public class UserControllerTest extends AbstractControllerTest { NavigationTreeNodeRO result = getObjectFromResponse(response, NavigationTreeNodeRO.class); - Assert.assertNotNull(result); - Assert.assertEquals(3, result.getChildren().size()); + assertNotNull(result); + assertEquals(3, result.getChildren().size()); List<String> childrenNames = result.getChildren().stream().map(NavigationTreeNodeRO::getName).collect(Collectors.toList()); - Assert.assertEquals(Arrays.asList("Search", "Administration", "User Settings"), childrenNames); + assertEquals(Arrays.asList("Search", "Administration", "User Settings"), childrenNames); } @Test @@ -83,8 +84,8 @@ public class UserControllerTest extends AbstractControllerTest { List<SearchUserRO> result = getArrayFromResponse(response, SearchUserRO.class); - Assert.assertNotNull(result); - Assert.assertTrue(result.size()>5); + assertNotNull(result); + assertTrue(result.size() > 5); } @Test @@ -98,8 +99,47 @@ public class UserControllerTest extends AbstractControllerTest { List<SearchUserRO> result = getArrayFromResponse(response, SearchUserRO.class); - Assert.assertNotNull(result); - Assert.assertEquals(1, result.size()); - Assert.assertEquals(userRO.getUsername(), result.get(0).getUsername()); + assertNotNull(result); + assertEquals(1, result.size()); + assertEquals(userRO.getUsername(), result.get(0).getUsername()); + } + + @Test + public void testGetUserCredentialStatus() throws Exception { + MockHttpSession session = loginWithUser2(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + MvcResult response = mvc.perform(get(PATH + "/{user-id}/username-credential-status", userRO.getUserId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + // when + CredentialRO result = getObjectFromResponse(response, CredentialRO.class); + // then + assertNotNull(result); + assertEquals(userRO.getUsername(), result.getName()); + assertTrue(result.isActive()); + assertTrue(result.isExpired()); // set by admin + assertNull(result.getExpireOn()); + } + + + @Test + public void testGetAccessTokenCredentials() throws Exception { + MockHttpSession session = loginWithUser2(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + MvcResult response = mvc.perform(get(PATH + "/{user-id}/access-token-credentials", userRO.getUserId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + // when + List<CredentialRO> result = getArrayFromResponse(response, CredentialRO.class); + // then + assertNotNull(result); + assertEquals(1, result.size()); + CredentialRO credentialRO = result.get(0); + assertEquals(CredentialType.ACCESS_TOKEN, credentialRO.getCredentialType()); + assertTrue(credentialRO.isActive()); + assertTrue(credentialRO.isExpired()); // set by admin + assertNull(credentialRO.getExpireOn()); } } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIT.java similarity index 97% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIT.java index c51451d93eff8115ed9394ead905f4c3061349c9..abde55fe8c84e93f73111daad462461b9c203b66 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/external/UserResourceIT.java @@ -3,7 +3,6 @@ package eu.europa.ec.edelivery.smp.ui.external; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; import eu.europa.ec.edelivery.smp.data.ui.AccessTokenRO; -import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.PasswordChangeRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; @@ -23,7 +22,6 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.web.context.WebApplicationContext; import javax.ws.rs.core.MediaType; -import java.util.UUID; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_SECURITY_USER; @@ -44,7 +42,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. "classpath:/cleanup-database.sql", "classpath:/webapp_integration_test_data.sql"}, executionPhase = BEFORE_TEST_METHOD) -public class UserResourceIntegrationTest { +public class UserResourceIT { private static final String PATH_PUBLIC = ResourceConstants.CONTEXT_PATH_PUBLIC_USER; diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminControllerIT.java similarity index 54% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminControllerIT.java index 0c4cda544909750f507a33d37172298034b9d8d1..0956d5da6c8e43f9d89d5d69386616a6399bb3d5 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/DomainAdminControllerIT.java @@ -1,69 +1,51 @@ package eu.europa.ec.edelivery.smp.ui.internal; -import com.fasterxml.jackson.databind.ObjectMapper; import eu.europa.ec.edelivery.smp.data.dao.DomainDao; import eu.europa.ec.edelivery.smp.data.model.DBDomain; -import eu.europa.ec.edelivery.smp.data.ui.DeleteEntityValidation; import eu.europa.ec.edelivery.smp.data.ui.DomainRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus; -import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; +import eu.europa.ec.edelivery.smp.data.ui.exceptions.ErrorResponseRO; +import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode; import eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils; +import eu.europa.ec.edelivery.smp.test.testutils.TestROUtils; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; import eu.europa.ec.edelivery.smp.ui.ResourceConstants; import org.apache.commons.lang3.StringUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.hamcrest.MatcherAssert; +import org.hamcrest.Matchers; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.mock.web.MockHttpSession; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; -import org.springframework.web.context.WebApplicationContext; +import java.io.IOException; +import java.util.Collections; import java.util.List; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; -import static org.hamcrest.Matchers.stringContainsInOrder; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@RunWith(SpringRunner.class) -@WebAppConfiguration -@DirtiesContext -@ContextConfiguration(classes = {SmpTestWebAppConfig.class}) -@Sql(scripts = { - "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}, - executionPhase = BEFORE_TEST_METHOD) -public class DomainAdminResourceIntegrationTest { +public class DomainAdminControllerIT extends AbstractControllerTest { private static final String PATH = ResourceConstants.CONTEXT_PATH_INTERNAL_DOMAIN; - @Autowired - private WebApplicationContext webAppContext; - @Autowired DomainDao domainDao; - private MockMvc mvc; - - @Before - public void setup() { - mvc = MockMvcUtils.initializeMockMvc(webAppContext); + @BeforeEach + public void setup() throws IOException { + super.setup(); } @Test public void testGetAllDomains() throws Exception { + List<DBDomain> domain = domainDao.getAllDomains(); MockHttpSession session = loginWithSystemAdmin(mvc); UserRO userRO = MockMvcUtils.getLoggedUserData(mvc, session); @@ -78,6 +60,69 @@ public class DomainAdminResourceIntegrationTest { assertEquals(domain.size(), response.size()); } + @Test + public void testCreateBasicDomainData() throws Exception { + DomainRO testDomain = TestROUtils.createDomain(); + + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = MockMvcUtils.getLoggedUserData(mvc, session); + + MvcResult result = mvc.perform(put(PATH + "/" + userRO.getUserId() + "/create") + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(entitiToString(testDomain))) + .andExpect(status().isOk()).andReturn(); + + DomainRO resultObject = parseResponse(result, DomainRO.class); + assertNotNull(resultObject); + assertNotNull(resultObject.getDomainId()); + assertEquals(testDomain.getDomainCode(), resultObject.getDomainCode()); + } + + @Test + public void testCreateDomainWithEmptyCode() throws Exception { + DomainRO testDomain = TestROUtils.createDomain(""); + + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = MockMvcUtils.getLoggedUserData(mvc, session); + + MvcResult result = mvc.perform(put(PATH + "/" + userRO.getUserId() + "/create") + .session(session) + .with(csrf()) + .contentType(MediaType.APPLICATION_JSON) + .content(entitiToString(testDomain))) + .andExpect(status().is4xxClientError()).andReturn(); + + ErrorResponseRO errorRO = getObjectFromResponse(result, ErrorResponseRO.class); + assertNotNull(errorRO); + assertEquals(ErrorBusinessCode.INVALID_INPUT_DATA.name(), errorRO.getBusinessCode()); + MatcherAssert.assertThat(errorRO.getErrorDescription(), Matchers.containsString("Invalid domain data! Domain code must not be empty!")); + } + + @Test + public void testUpdateResourceDefDomainList() throws Exception { + String domainCode = "domainTwo"; + String documentType = "edelivery-oasis-cppa"; + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER); + + DomainRO domainToUpdate = getDomain(domainCode, userRO, session); + assertTrue(domainToUpdate.getResourceDefinitions().isEmpty()); + + MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update-resource-types") + .session(session) + .with(csrf()) + .header("Content-Type", " application/json") + .content(entitiToString(Collections.singletonList(documentType)))) + .andExpect(status().isOk()).andReturn(); + DomainRO resultObject = parseResponse(result, DomainRO.class); + // + assertNotNull(resultObject); + assertEquals(1, resultObject.getResourceDefinitions().size()); + assertEquals(documentType, resultObject.getResourceDefinitions().get(0)); + } + @Test public void testDeleteDomainOK() throws Exception { // given - delete domain two :) @@ -87,7 +132,7 @@ public class DomainAdminResourceIntegrationTest { DomainRO domainToDelete = getDomain(domainCode, userRO, session); assertNotNull(domainToDelete); - MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/" + domainToDelete.getDomainId() + "" + "/delete") + MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/" + domainToDelete.getDomainId() + "/delete") .session(session) .with(csrf()) .header("Content-Type", " application/json")) // delete domain with id 2 @@ -108,7 +153,7 @@ public class DomainAdminResourceIntegrationTest { domainToUpdate.setDomainCode("NewCode"); domainToUpdate.setSignatureKeyAlias("New alias"); - MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "" + "/update") + MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update") .session(session) .with(csrf()) .header("Content-Type", " application/json") @@ -125,13 +170,13 @@ public class DomainAdminResourceIntegrationTest { public void updateDomainSmlIntegrationData() throws Exception { String domainCode = "domainTwo"; MockHttpSession session = loginWithSystemAdmin(mvc); - UserRO userRO = (UserRO)session.getAttribute(MOCK_LOGGED_USER); + UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER); DomainRO domainToUpdate = getDomain(domainCode, userRO, session); domainToUpdate.setSmlSubdomain("NewCode"); domainToUpdate.setSmlClientKeyAlias("New alias"); - MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "" + "/update-sml-integration-data") + MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update-sml-integration-data") .session(session) .with(csrf()) .header("Content-Type", " application/json") @@ -145,7 +190,6 @@ public class DomainAdminResourceIntegrationTest { } @Test - @Ignore public void updateDomainDataAddNewResourceDef() throws Exception { // set the webapp_integration_test_data.sql for resourceDefID String resourceDefID = "edelivery-oasis-cppa"; @@ -155,7 +199,7 @@ public class DomainAdminResourceIntegrationTest { DomainRO domainToUpdate = getDomain(domainCode, userRO, session); domainToUpdate.getResourceDefinitions().add(resourceDefID); - MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "" + "/update-resource-types") + MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/" + domainToUpdate.getDomainId() + "/update-resource-types") .session(session) .with(csrf()) .header("Content-Type", " application/json") @@ -168,110 +212,6 @@ public class DomainAdminResourceIntegrationTest { assertEquals(EntityROStatus.UPDATED.getStatusNumber(), resultObject.getStatus()); } -/* - @Test - public void updateDomainListNotExists() throws Exception { -// given when - MockHttpSession session = loginWithSystemAdmin(mvc); - - - MvcResult result = mvc.perform(put(PATH) - .session(session) - .with(csrf()) - .header("Content-Type", " application/json") - .content("[{\"status\":3,\"index\":9,\"id\":10,\"domainCode\":\"domainTwoNotExist\",\"smlSubdomain\":\"newdomain\",\"smlSmpId\":\"CEF-SMP-010\",\"smlParticipantIdentifierRegExp\":null,\"smlClientCertHeader\":null,\"smlClientKeyAlias\":null,\"signatureKeyAlias\":\"sig-key\",\"smlClientCertAuth\":true,\"smlRegistered\":false}]")) // delete domain with id 2 - .andExpect(status().isOk()).andReturn(); - } - - @Test - public void validateDeleteDomainOK() throws Exception { - // given when - MockHttpSession session = loginWithSystemAdmin(mvc); - MvcResult result = mvc.perform(put(PATH + "/validate-delete") - .session(session) - .with(csrf()) - .header("Content-Type", " application/json") - .content("[2]")) // delete domain with id 2 - .andExpect(status().isOk()).andReturn(); - - //them - ObjectMapper mapper = new ObjectMapper(); - DeleteEntityValidation res = mapper.readValue(result.getResponse().getContentAsString(), DeleteEntityValidation.class); - - assertNotNull(res); - assertTrue(res.getListDeleteNotPermitedIds().isEmpty()); - assertEquals(1, res.getListIds().size()); - assertEquals(true, res.isValidOperation()); - assertNull(res.getStringMessage()); - } - - @Test - public void updateDomainListOkUpdate() throws Exception { -// given when - assertEquals("CEF-SMP-002", domainDao.getDomainByCode("domainTwo").get().getSmlSmpId()); - MockHttpSession session = loginWithSystemAdmin(mvc); - MvcResult result = mvc.perform(put(PATH) - .session(session) - .with(csrf()) - .header("Content-Type", " application/json") - .content("[{\"status\":1,\"index\":9,\"id\":2,\"domainCode\":\"domainTwo\",\"smlSubdomain\":\"newdomain\",\"smlSmpId\":\"CEF-SMP-010\",\"smlParticipantIdentifierRegExp\":null,\"smlClientCertHeader\":null,\"smlClientKeyAlias\":null,\"signatureKeyAlias\":\"sig-key\",\"smlClientCertAuth\":true,\"smlRegistered\":false}]")) // delete domain with id 2 - .andExpect(status().isOk()).andReturn(); - - // check if exists - assertEquals("CEF-SMP-010", domainDao.getDomainByCode("domainTwo").get().getSmlSmpId()); - } - - @Test - public void validateDeleteDomainFalse() throws Exception { - // given when - MockHttpSession session = loginWithSystemAdmin(mvc); - MvcResult result = mvc.perform(put(PATH + "/validate-delete") - .session(session) - .with(csrf()) - .header("Content-Type", " application/json") - .content("[1]")) // delete domain with id 2 - .andExpect(status().isOk()).andReturn(); - - //them - ObjectMapper mapper = new ObjectMapper(); - DeleteEntityValidation res = mapper.readValue(result.getResponse().getContentAsString(), DeleteEntityValidation.class); - - assertNotNull(res); - assertEquals(1, res.getListDeleteNotPermitedIds().size()); - assertEquals(1, res.getListIds().size()); - assertEquals(false, res.isValidOperation()); - assertEquals("Could not delete domains used by Service groups! Domain: domain (domain ) uses by:1 SG.", res.getStringMessage()); - } - - @Test - public void registerDomainAndParticipantsNotEnabled() throws Exception { - // given when - // 3- user id - // domainTwo - domain code - MockHttpSession session = loginWithSystemAdmin(mvc); - mvc.perform(put(PATH + "/3/sml-register/domainTwo") - .session(session) - .with(csrf()) - .header("Content-Type", " application/json")) - .andExpect(status().isOk()) - .andExpect(content().string(stringContainsInOrder("Configuration error: [SML integration is not enabled!]!"))); - } - - @Test - public void unregisterDomainAndParticipants() throws Exception { - // given when - // 3- user id - // domainTwo - domain code - MockHttpSession session = loginWithSystemAdmin(mvc); - mvc.perform(put(PATH + "/3/sml-unregister/domainTwo") - .session(session) - .with(csrf()) - .header("Content-Type", " application/json")) - .andExpect(status().isOk()) - .andExpect(content().string(stringContainsInOrder("Configuration error: SML integration is not enabled!!"))); - } -*/ - private List<DomainRO> getAllDomains(UserRO userRO, MockHttpSession session) throws Exception { MvcResult result = mvc.perform(get(PATH + "/" + userRO.getUserId()) .session(session) @@ -290,8 +230,8 @@ public class DomainAdminResourceIntegrationTest { } - private String entitiToString(Object object ) throws Exception { - return serializeObject(object); + private String entitiToString(Object object) throws Exception { + return serializeObject(object); } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreAdminControllerIT.java similarity index 83% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreAdminControllerIT.java index 7bf7eb852f422ad7c258e20d1cb73c046a0c42f8..10a1e17365d49b2a7c080116f18ed02e5e2f72f9 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/KeystoreAdminControllerIT.java @@ -3,14 +3,13 @@ package eu.europa.ec.edelivery.smp.ui.internal; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.KeystoreImportResult; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.services.ui.UIKeystoreService; import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MvcResult; @@ -23,19 +22,19 @@ import java.util.List; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTERNAL_KEYSTORE; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -public class KeystoreResourceIntegrationTest extends AbstractControllerTest { +public class KeystoreAdminControllerIT extends AbstractControllerTest { private static final String PATH = CONTEXT_PATH_INTERNAL_KEYSTORE; Path keystore = Paths.get("src", "test", "resources", "keystores", "smp-keystore.jks"); @Autowired private UIKeystoreService uiKeystoreService; - @Before + @BeforeEach public void setup() throws IOException { super.setup(); uiKeystoreService.refreshData(); @@ -54,7 +53,8 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { //then ObjectMapper mapper = getObjectMapper(); - List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>(){}); + List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() { + }); assertNotNull(listCerts); assertEquals(countStart, listCerts.size()); @@ -90,7 +90,7 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { public void uploadKeystoreInvalidPassword() throws Exception { // login MockHttpSession session = loginWithSystemAdmin(mvc); - UserRO userRO = (UserRO)session.getAttribute(MOCK_LOGGED_USER); + UserRO userRO = (UserRO) session.getAttribute(MOCK_LOGGED_USER); // given when MvcResult result = mvc.perform(post(PATH + "/" + userRO.getUserId() + "/upload/JKS/NewPassword1234") .session(session) @@ -126,14 +126,14 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { } @Test - public void deleteKeystoreEntryOK() throws Exception { + public void deleteCertificateOK() throws Exception { MockHttpSession session = loginWithSystemAdmin(mvc); UserRO userRO = getLoggedUserData(mvc, session); - + String alias = "second_domain_alias"; int countStart = uiKeystoreService.getKeystoreEntriesList().size(); // given when - MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/delete/second_domain_alias") + MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/delete/" + alias) .session(session) .with(csrf())) .andExpect(status().isOk()).andReturn(); @@ -147,5 +147,19 @@ public class KeystoreResourceIntegrationTest extends AbstractControllerTest { assertEquals(countStart - 1, uiKeystoreService.getKeystoreEntriesList().size()); } + @Test + public void deleteCertificateNotExists() throws Exception { + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userRO = getLoggedUserData(mvc, session); + String alias = "alias-not-exists"; + + // given when + MvcResult result = mvc.perform(delete(PATH + "/" + userRO.getUserId() + "/delete/"+ alias) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + CertificateRO res = getObjectFromResponse(result, CertificateRO.class); + assertEquals("Certificate Key not removed because alias ["+alias+"] does not exist in keystore!", res.getActionMessage()); + } } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerIT.java similarity index 77% rename from smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResourceIntegrationTest.java rename to smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerIT.java index 9857fd9fb099209951257d73a799382209b1f770..d8e9c06a5f3097a11ae7777db2badcfbb35c64e3 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminResourceIntegrationTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerIT.java @@ -3,27 +3,21 @@ package eu.europa.ec.edelivery.smp.ui.internal; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; -import eu.europa.ec.edelivery.smp.data.ui.ServiceResult; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService; import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; -import eu.europa.ec.edelivery.smp.ui.external.UserResourceIntegrationTest; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import eu.europa.ec.edelivery.smp.ui.external.UserResourceIT; import org.apache.commons.io.IOUtils; import org.hamcrest.CoreMatchers; -import org.junit.Before; import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; -import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.context.web.WebAppConfiguration; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MvcResult; import org.springframework.web.context.WebApplicationContext; @@ -37,21 +31,12 @@ import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTER import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_PUBLIC_TRUSTSTORE; import static org.junit.Assert.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@RunWith(SpringRunner.class) -@DirtiesContext -@WebAppConfiguration @ContextConfiguration(classes = {SmpTestWebAppConfig.class, UITruststoreService.class}) -@Sql(scripts = { - "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}, - executionPhase = BEFORE_TEST_METHOD) -@Ignore -public class TruststoreAdminResourceIntegrationTest{ +public class TruststoreAdminControllerIT extends AbstractControllerTest { private static final String PATH_INTERNAL = CONTEXT_PATH_INTERNAL_TRUSTSTORE; private static final String PATH_PUBLIC = CONTEXT_PATH_PUBLIC_TRUSTSTORE; @@ -63,10 +48,11 @@ public class TruststoreAdminResourceIntegrationTest{ private MockMvc mvc; - @Before + @BeforeEach public void setup() throws IOException { - uiTruststoreService.refreshData(); + X509CertificateTestUtils.reloadKeystores(); + uiTruststoreService.refreshData(); mvc = initializeMockMvc(webAppContext); } @@ -82,25 +68,25 @@ public class TruststoreAdminResourceIntegrationTest{ // given when mvc.perform(post(PATH_PUBLIC + "/" + userRO.getUserId() + "/validate-certificate") - .session(session) - .with(csrf()) - .content(buff)) + .session(session) + .with(csrf()) + .content(buff)) .andExpect(status().isOk()) .andExpect(content().string(CoreMatchers.containsString("Can not read the certificate!"))); } @Test public void validateCertificateSystemAdmin() throws Exception { - byte[] buff = IOUtils.toByteArray(UserResourceIntegrationTest.class.getResourceAsStream("/SMPtest.crt")); + byte[] buff = IOUtils.toByteArray(UserResourceIT.class.getResourceAsStream("/SMPtest.crt")); // login MockHttpSession session = loginWithSystemAdmin(mvc); // when update data UserRO userRO = getLoggedUserData(mvc, session); // given when MvcResult result = mvc.perform(post(PATH_PUBLIC + "/" + userRO.getUserId() + "/validate-certificate") - .session(session) - .with(csrf()) - .content(buff)) + .session(session) + .with(csrf()) + .content(buff)) .andExpect(status().isOk()).andReturn(); //then @@ -129,13 +115,13 @@ public class TruststoreAdminResourceIntegrationTest{ byte[] buff = certificate.getEncoded(); // given when MvcResult result = mvc.perform(post(PATH_PUBLIC + "/" + userRO.getUserId() + "/validate-certificate") - .session(session) - .with(csrf()) - .content(buff)) + .session(session) + .with(csrf()) + .content(buff)) .andExpect(status().isOk()).andReturn(); //them - ObjectMapper mapper =getObjectMapper(); + ObjectMapper mapper = getObjectMapper(); CertificateRO res = mapper.readValue(result.getResponse().getContentAsString(), CertificateRO.class); assertEquals("CN=common name,O=org,C=BE:0000000001234321", res.getCertificateId()); @@ -143,13 +129,13 @@ public class TruststoreAdminResourceIntegrationTest{ @Test public void uploadCertificateInvalidUser() throws Exception { - byte[] buff = IOUtils.toByteArray(UserResourceIntegrationTest.class.getResourceAsStream("/SMPtest.crt")); + byte[] buff = IOUtils.toByteArray(UserResourceIT.class.getResourceAsStream("/SMPtest.crt")); // id and logged user not match // given when mvc.perform(post(PATH_PUBLIC + "/34556655/validate-certificate") - .with(getHttpBasicSMPAdminCredentials()) - .with(csrf()) - .content(buff)) + .with(getHttpBasicSMPAdminCredentials()) + .with(csrf()) + .content(buff)) .andExpect(status().isUnauthorized()).andReturn(); } @@ -162,14 +148,15 @@ public class TruststoreAdminResourceIntegrationTest{ UserRO userRO = getLoggedUserData(mvc, session); int countStart = uiTruststoreService.getCertificateROEntriesList().size(); - MvcResult result = mvc.perform(get(PATH_INTERNAL+ "/" + userRO.getUserId()) - .session(session) - .with(csrf())) + MvcResult result = mvc.perform(get(PATH_INTERNAL + "/" + userRO.getUserId()) + .session(session) + .with(csrf())) .andExpect(status().isOk()).andReturn(); //then ObjectMapper mapper = getObjectMapper(); - List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>(){}); + List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() { + }); assertNotNull(listCerts); assertEquals(countStart, listCerts.size()); @@ -189,13 +176,13 @@ public class TruststoreAdminResourceIntegrationTest{ MockHttpSession session = loginWithSystemAdmin(mvc); UserRO userRO = getLoggedUserData(mvc, session); - byte[] buff = IOUtils.toByteArray(UserResourceIntegrationTest.class.getResourceAsStream("/SMPtest.crt")); + byte[] buff = IOUtils.toByteArray(UserResourceIT.class.getResourceAsStream("/SMPtest.crt")); int countStart = uiTruststoreService.getNormalizedTrustedList().size(); MvcResult prepRes = mvc.perform(post(PATH_INTERNAL + "/" + userRO.getUserId() + "/upload-certificate") - .session(session) - .with(csrf()) - .content(buff)) + .session(session) + .with(csrf()) + .content(buff)) .andExpect(status().isOk()).andReturn(); // given when @@ -207,17 +194,12 @@ public class TruststoreAdminResourceIntegrationTest{ // then MvcResult result = mvc.perform(delete(PATH_INTERNAL + "/" + userRO.getUserId() + "/delete/" + res.getAlias()) - .session(session) - .with(csrf()) - .content(buff)) + .session(session) + .with(csrf()) + .content(buff)) .andExpect(status().isOk()).andReturn(); uiTruststoreService.refreshData(); assertEquals(countStart, uiTruststoreService.getNormalizedTrustedList().size()); } - protected ObjectMapper getObjectMapper(){ - ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JavaTimeModule()); - return mapper; - } } diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java index 29706842d6561b1be9e43cf3cc3836185667387a..d8cf8fd00d464cbf0974de84e65d76b4fb4a0ea6 100644 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/TruststoreAdminControllerTest.java @@ -3,15 +3,14 @@ package eu.europa.ec.edelivery.smp.ui.internal; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import eu.europa.ec.edelivery.smp.data.ui.CertificateRO; import eu.europa.ec.edelivery.smp.data.ui.UserRO; import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus; import eu.europa.ec.edelivery.smp.services.ui.UITruststoreService; import eu.europa.ec.edelivery.smp.test.testutils.X509CertificateTestUtils; import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mock.web.MockHttpSession; import org.springframework.test.web.servlet.MvcResult; @@ -23,7 +22,7 @@ import java.util.UUID; import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.CONTEXT_PATH_INTERNAL_TRUSTSTORE; -import static org.junit.Assert.*; +import static org.junit.jupiter.api.Assertions.*; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -35,7 +34,7 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { @Autowired private UITruststoreService uiTruststoreService; - @Before + @BeforeEach public void setup() throws IOException { super.setup(); uiTruststoreService.refreshData(); @@ -54,7 +53,8 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { //then ObjectMapper mapper = getObjectMapper(); - List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() {}); + List<CertificateRO> listCerts = mapper.readValue(result.getResponse().getContentAsString(), new TypeReference<List<CertificateRO>>() { + }); assertNotNull(listCerts); assertEquals(countStart, listCerts.size()); @@ -112,7 +112,6 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { @Test public void testDeleteCertificateFailed() throws Exception { - String alias = UUID.randomUUID().toString(); MockHttpSession session = loginWithSystemAdmin(mvc); @@ -134,7 +133,6 @@ public class TruststoreAdminControllerTest extends AbstractControllerTest { assertEquals(countStart, uiTruststoreService.getCertificateROEntriesList().size()); } - @Test public void testDeleteCertificateOK() throws Exception { diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminControllerIT.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminControllerIT.java new file mode 100644 index 0000000000000000000000000000000000000000..49970f1c25dc6d7d7da199a4d89b71362fccde45 --- /dev/null +++ b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminControllerIT.java @@ -0,0 +1,263 @@ +package eu.europa.ec.edelivery.smp.ui.internal; + +import eu.europa.ec.edelivery.smp.data.ui.*; +import eu.europa.ec.edelivery.smp.ui.AbstractControllerTest; +import eu.europa.ec.edelivery.smp.ui.ResourceConstants; +import org.apache.commons.lang3.StringUtils; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.BeforeEach; +import org.springframework.mock.web.MockHttpSession; +import org.springframework.test.web.servlet.MvcResult; + +import javax.ws.rs.core.MediaType; +import java.io.IOException; +import java.util.Map; +import java.util.UUID; + +import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; +import static eu.europa.ec.edelivery.smp.ui.ResourceConstants.PARAM_PAGINATION_FILTER; +import static org.junit.Assert.*; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + + +public class UserAdminControllerIT extends AbstractControllerTest { + + private static final String PATH_INTERNAL = ResourceConstants.CONTEXT_PATH_INTERNAL_USER; + + @BeforeEach + public void setup() throws IOException { + super.setup(); + } + + @Test + public void getUsers() throws Exception { + MockHttpSession session = loginWithSystemAdmin(mvc); + MvcResult result = mvc.perform(get(PATH_INTERNAL) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class); + // then + assertNotNull(res); + assertEquals(7, res.getServiceEntities().size()); + res.getServiceEntities().forEach(sgMap -> { + UserRO sgro = getObjectMapper().convertValue(sgMap, UserRO.class); + assertNotNull(sgro.getUserId()); + assertNotNull(sgro.getUsername()); + }); + } + + @Test + public void testSearch() throws Exception { + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userROAdmin = getLoggedUserData(mvc, session); + MvcResult result = mvc.perform(get(PATH_INTERNAL + "/{user-enc-id}/search", userROAdmin.getUserId()) + .session(session) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class); + // then + assertNotNull(res); + assertEquals(7, res.getServiceEntities().size()); + res.getServiceEntities().forEach(sgMap -> { + UserRO sgro = getObjectMapper().convertValue(sgMap, UserRO.class); + assertNotNull(sgro.getUserId()); + assertNotNull(sgro.getUsername()); + }); + } + + @Test + public void testSearchFilterNoMatch() throws Exception { + MockHttpSession session = loginWithSystemAdmin(mvc); + UserRO userROAdmin = getLoggedUserData(mvc, session); + MvcResult result = mvc.perform(get(PATH_INTERNAL + "/{user-enc-id}/search", userROAdmin.getUserId()) + .session(session) + .param(PARAM_PAGINATION_FILTER, "no-user-matches-this-filter") + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class); + // then + assertNotNull(res); + assertEquals(0, res.getServiceEntities().size()); + } + + @Test + public void testValidateDeleteUserOK() throws Exception { + + // login + MockHttpSession session = loginWithSystemAdmin(mvc); + // get list + MvcResult result = mvc.perform(get(PATH_INTERNAL) + .with(csrf()) + .session(session)) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(result.getResponse().getContentAsString(), ServiceResult.class); + assertNotNull(res); + assertFalse(res.getServiceEntities().isEmpty()); + UserRO userRO = getObjectMapper().convertValue(res.getServiceEntities().get(0), UserRO.class); + + MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete") + .with(csrf()) + .session(session) + .contentType(MediaType.APPLICATION_JSON) + .content("[\"" + userRO.getUserId() + "\"]")) + .andExpect(status().isOk()).andReturn(); + + DeleteEntityValidation dev = getObjectMapper().readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class); + + assertFalse(dev.getListIds().isEmpty()); + assertFalse(dev.getListDeleteNotPermitedIds().isEmpty()); + } + + @Test + public void testValidateDeleteLoggedUserNotOK() throws Exception { + + // login + MockHttpSession session = loginWithSystemAdmin(mvc); + // get list + mvc.perform(get(PATH_INTERNAL) + .with(csrf()) + .session(session)) + .andExpect(status().isOk()).andReturn(); + UserRO userRO = getLoggedUserData(mvc, session); + + // note system credential has id 3! + MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete") + .with(csrf()) + .session(session) + .contentType(org.springframework.http.MediaType.APPLICATION_JSON) + .content("[\"" + userRO.getUserId() + "\"]")) + .andExpect(status().isOk()) + .andReturn(); + + DeleteEntityValidation res = getObjectMapper().readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class); + + assertTrue(res.getListIds().isEmpty()); + assertEquals("Could not delete logged user!", res.getStringMessage()); + } + + @Test + public void changePasswordForUser() throws Exception { + MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc); + UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin); + + MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL) + .session(sessionAdmin) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class); + Map userROToUpdate = (Map) res.getServiceEntities().stream() + .filter(userMap -> + StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get(); + String newPassword = "TESTtest1234!@#$"; + + + PasswordChangeRO newPass = new PasswordChangeRO(); + newPass.setUsername(SG_USER2_USERNAME); + newPass.setCurrentPassword(SYS_ADMIN_PASSWD); + newPass.setNewPassword(newPassword); + assertNotEquals(newPassword, SG_USER2_PASSWD); + + mvc.perform(put(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/change-password-for/" + userROToUpdate.get("userId")) + .with(csrf()) + .session(sessionAdmin) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsString(newPass)) + ).andExpect(status().isOk()).andReturn(); + + // test to login with new password + MockHttpSession sessionNew = loginWithCredentials(mvc, SG_USER2_USERNAME, newPassword); + assertNotNull(sessionNew); + } + + @Test + public void testGetUserData() throws Exception { + MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc); + UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin); + + MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL) + .session(sessionAdmin) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class); + Map userROToUpdate = (Map) res.getServiceEntities().stream() + .filter(userMap -> + StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get(); + + MvcResult result = mvc.perform(get(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/" + userROToUpdate.get("userId")+"/retrieve") + .with(csrf()) + .session(sessionAdmin) + ).andExpect(status().isOk()).andReturn(); + UserRO resultUser = getObjectMapper().readValue(result.getResponse().getContentAsString(), UserRO.class); + + assertNotNull(resultUser); + assertNotNull(resultUser.getUserId()); + assertEquals(SG_USER2_USERNAME, resultUser.getUsername()); + } + + @Test + public void testUpdateUserData() throws Exception { + MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc); + UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin); + + MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL) + .session(sessionAdmin) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class); + UserRO userROToUpdate = (UserRO) res.getServiceEntities().stream() + .filter(userMap -> + StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))) + .findFirst() + .map(o -> getObjectMapper().convertValue(o, UserRO.class)).get(); + + userROToUpdate.setFullName(UUID.randomUUID().toString()); + // when + MvcResult result = mvc.perform(post(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/" + userROToUpdate.getUserId()+"/update") + .with(csrf()) + .session(sessionAdmin) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsString(userROToUpdate)) + ).andExpect(status().isOk()).andReturn(); + UserRO resultUser = getObjectMapper().readValue(result.getResponse().getContentAsString(), UserRO.class); + //then + assertNotNull(resultUser); + assertNotNull(resultUser.getUserId()); + assertEquals(SG_USER2_USERNAME, resultUser.getUsername()); + assertEquals(userROToUpdate.getFullName(), resultUser.getFullName()); + } + + @Test + public void testUDeleteUserData() throws Exception { + MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc); + UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin); + + MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL) + .session(sessionAdmin) + .with(csrf())) + .andExpect(status().isOk()).andReturn(); + ServiceResult res = getObjectMapper().readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class); + UserRO userROToUpdate = (UserRO) res.getServiceEntities().stream() + .filter(userMap -> + StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))) + .findFirst() + .map(o -> getObjectMapper().convertValue(o, UserRO.class)).get(); + + + // when + MvcResult result = mvc.perform(delete(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/" + userROToUpdate.getUserId()+"/delete") + .with(csrf()) + .session(sessionAdmin) + .contentType(MediaType.APPLICATION_JSON) + .content(getObjectMapper().writeValueAsString(userROToUpdate)) + ).andExpect(status().isOk()).andReturn(); + UserRO resultUser = getObjectMapper().readValue(result.getResponse().getContentAsString(), UserRO.class); + //then + assertNotNull(resultUser); + assertNotNull(resultUser.getUserId()); + assertEquals(SG_USER2_USERNAME, resultUser.getUsername()); + + } +} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminResourceIntegrationTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminResourceIntegrationTest.java deleted file mode 100644 index 381771a9046e282d77ccc1db7e7e901ccd64d1a2..0000000000000000000000000000000000000000 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/ui/internal/UserAdminResourceIntegrationTest.java +++ /dev/null @@ -1,204 +0,0 @@ -package eu.europa.ec.edelivery.smp.ui.internal; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.json.JsonMapper; -import eu.europa.ec.edelivery.smp.data.ui.*; -import eu.europa.ec.edelivery.smp.test.SmpTestWebAppConfig; -import eu.europa.ec.edelivery.smp.ui.ResourceConstants; -import org.apache.commons.lang3.StringUtils; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.mock.web.MockHttpSession; -import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.jdbc.Sql; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.MvcResult; -import org.springframework.web.context.WebApplicationContext; - -import javax.ws.rs.core.MediaType; -import java.util.Collections; -import java.util.Map; -import java.util.UUID; - -import static eu.europa.ec.edelivery.smp.test.testutils.MockMvcUtils.*; -import static org.junit.Assert.*; -import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf; -import static org.springframework.test.context.jdbc.Sql.ExecutionPhase.BEFORE_TEST_METHOD; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -@RunWith(SpringRunner.class) -@DirtiesContext -@WebAppConfiguration -@ContextConfiguration(classes = {SmpTestWebAppConfig.class}) -@Sql(scripts = { - "classpath:/cleanup-database.sql", - "classpath:/webapp_integration_test_data.sql"}, - executionPhase = BEFORE_TEST_METHOD) -@Ignore -public class UserAdminResourceIntegrationTest { - - private static final String PATH_INTERNAL = ResourceConstants.CONTEXT_PATH_INTERNAL_USER; - - @Autowired - private WebApplicationContext webAppContext; - - private MockMvc mvc; - - ObjectMapper mapper = JsonMapper.builder() - .findAndAddModules() - .build(); - - @Before - public void setup() { - mvc = initializeMockMvc(webAppContext); - } - - @Test - public void getUsers() throws Exception { - MockHttpSession session = loginWithSystemAdmin(mvc); - MvcResult result = mvc.perform(get(PATH_INTERNAL) - .session(session) - .with(csrf())) - .andExpect(status().isOk()).andReturn(); - ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class); - // then - assertNotNull(res); - assertEquals(7, res.getServiceEntities().size()); - res.getServiceEntities().forEach(sgMap -> { - UserRO sgro = mapper.convertValue(sgMap, UserRO.class); - assertNotNull(sgro.getUserId()); - assertNotNull(sgro.getUsername()); - }); - } - - @Test - @Ignore - public void testValidateDeleteUserOK() throws Exception { - - // login - MockHttpSession session = loginWithSystemAdmin(mvc); - // get list - MvcResult result = mvc.perform(get(PATH_INTERNAL) - .with(csrf()) - .session(session)) - .andExpect(status().isOk()).andReturn(); - ServiceResult res = mapper.readValue(result.getResponse().getContentAsString(), ServiceResult.class); - assertNotNull(res); - assertFalse(res.getServiceEntities().isEmpty()); - UserRO userRO = mapper.convertValue(res.getServiceEntities().get(0), UserRO.class); - - MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete") - .with(csrf()) - .session(session) - .contentType(MediaType.APPLICATION_JSON) - .content("[\"" + userRO.getUserId() + "\"]")) - .andExpect(status().isOk()).andReturn(); - - DeleteEntityValidation dev = mapper.readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class); - - assertFalse(dev.getListIds().isEmpty()); - assertTrue(dev.getListDeleteNotPermitedIds().isEmpty()); - assertEquals(userRO.getUserId(), dev.getListIds().get(0)); - } - - @Test - public void testValidateDeleteLoggedUserNotOK() throws Exception { - - // login - MockHttpSession session = loginWithSystemAdmin(mvc); - // get list - mvc.perform(get(PATH_INTERNAL) - .with(csrf()) - .session(session)) - .andExpect(status().isOk()).andReturn(); - UserRO userRO = getLoggedUserData(mvc, session); - - // note system credential has id 3! - MvcResult resultDelete = mvc.perform(post(PATH_INTERNAL + "/validate-delete") - .with(csrf()) - .session(session) - .contentType(org.springframework.http.MediaType.APPLICATION_JSON) - .content("[\"" + userRO.getUserId() + "\"]")) - .andExpect(status().isOk()) - .andReturn(); - - DeleteEntityValidation res = mapper.readValue(resultDelete.getResponse().getContentAsString(), DeleteEntityValidation.class); - - assertTrue(res.getListIds().isEmpty()); - assertEquals("Could not delete logged user!", res.getStringMessage()); - } - - - @Test - @Ignore - public void generateAccessTokenForUser() throws Exception { - MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc); - UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin); - - MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL) - .session(sessionAdmin) - .with(csrf())) - .andExpect(status().isOk()).andReturn(); - ServiceResult res = mapper.readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class); - Map userROToUpdate = (Map) res.getServiceEntities().stream() - .filter(userMap -> - StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get(); - - MvcResult result = mvc.perform(post(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "/generate-access-token-for/" + userROToUpdate.get("userId")) - .with(csrf()) - .session(sessionAdmin) - .content(SYS_ADMIN_PASSWD) - ).andExpect(status().isOk()).andReturn(); - - - AccessTokenRO resAccessToken = mapper.readValue(result.getResponse().getContentAsString(), AccessTokenRO.class); - assertNotNull(resAccessToken); - assertNotNull(resAccessToken.getIdentifier()); - assertNotNull(resAccessToken.getValue()); - - } - - @Test - @Ignore - public void changePasswordForUser() throws Exception { - MockHttpSession sessionAdmin = loginWithSystemAdmin(mvc); - UserRO userROAdmin = getLoggedUserData(mvc, sessionAdmin); - - MvcResult resultUsers = mvc.perform(get(PATH_INTERNAL) - .session(sessionAdmin) - .with(csrf())) - .andExpect(status().isOk()).andReturn(); - ServiceResult res = mapper.readValue(resultUsers.getResponse().getContentAsString(), ServiceResult.class); - Map userROToUpdate = (Map) res.getServiceEntities().stream() - .filter(userMap -> - StringUtils.equals(SG_USER2_USERNAME, (String) ((Map) userMap).get("username"))).findFirst().get(); - String newPassword = "TESTtest1234!@#$"; - - - PasswordChangeRO newPass = new PasswordChangeRO(); - newPass.setUsername(SG_USER2_USERNAME); - newPass.setCurrentPassword(SYS_ADMIN_PASSWD); - newPass.setNewPassword(newPassword); - assertNotEquals(newPassword, SG_USER2_PASSWD); - - mvc.perform(put(PATH_INTERNAL + "/" + userROAdmin.getUserId() + "//change-password-for/" + userROToUpdate.get("userId")) - .with(csrf()) - .session(sessionAdmin) - .contentType(MediaType.APPLICATION_JSON) - .content(mapper.writeValueAsString(newPass)) - ).andExpect(status().isOk()).andReturn(); - - // test to login with new password - MockHttpSession sessionNew = loginWithCredentials(mvc, SG_USER2_USERNAME, newPassword); - assertNotNull(sessionNew); - } - -} diff --git a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java b/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java deleted file mode 100644 index b53d8c877b1226a3a1f5aa066567ddc4a681a122..0000000000000000000000000000000000000000 --- a/smp-webapp/src/test/java/eu/europa/ec/edelivery/smp/validation/ServiceGroupValidatorTest.java +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright 2017 European Commission | CEF eDelivery - * - * Licensed under the EUPL, Version 1.2 or – as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); - * You may not use this work except in compliance with the Licence. - * - * You may obtain a copy of the Licence attached in file: LICENCE-EUPL-v1.2.pdf - * - * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the Licence for the specific language governing permissions and limitations under the Licence. - */ - -package eu.europa.ec.edelivery.smp.validation; - -import eu.europa.ec.edelivery.smp.conversion.IdentifierService; -import eu.europa.ec.edelivery.smp.identifiers.Identifier; -import eu.europa.ec.edelivery.smp.services.ConfigurationService; - -import org.hamcrest.CoreMatchers; -import org.hamcrest.MatcherAssert; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.mockito.Mockito; - -import java.util.Arrays; -import java.util.Collection; -import java.util.regex.Pattern; - -/** - * Created by gutowpa on 02/08/2017. - */ -@RunWith(Parameterized.class) -@Ignore -public class ServiceGroupValidatorTest { -/* - private static final Pattern ALLOWED_SCHEME_PATTERN = Pattern.compile("^$|^(?!^.{26})([a-z0-9]+-[a-z0-9]+-[a-z0-9]+)$|^urn:oasis:names:tc:ebcore:partyid-type:(iso6523|unregistered)(:.+)?$"); - - private ServiceGroupValidator validator; - ConfigurationService configurationService = Mockito.mock(ConfigurationService.class); - IdentifierService normalizer = new IdentifierService(configurationService); - - @Parameterized.Parameters(name = "{index}: {0}") - public static Collection<Object[]> data() { - return Arrays.asList(new Object[][]{ - - {"Good peppol schema", "good6-scheme4-ok", "urn:poland:ncpb", false, true, ALLOWED_SCHEME_PATTERN, null, null}, - {"Allowed null schema", null, "urn:poland:ncpb", false, false, ALLOWED_SCHEME_PATTERN, null, null}, - {"Length exceeded", "ength-exceeeeeedsTheCharacters-25chars", "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, MalformedIdentifierException.class, "Scheme does not match pattern:"}, - {"Too many parts", "too-many-segments-inside", "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, MalformedIdentifierException.class, "Scheme does not match pattern:"}, - {"Missing parts", "only-two", "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, MalformedIdentifierException.class, "Scheme does not match pattern: "}, - {"Null not allowed", null, "urn:poland:ncpb", true, true, ALLOWED_SCHEME_PATTERN, IllegalArgumentException.class, "Invalid Identifier: "}, - {"EBCorePartyId Oasis", "urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088", "123456", false, true, ALLOWED_SCHEME_PATTERN, null, null}, - {"EBCorePartyId eDelivery", null, "urn:oasis:names:tc:ebcore:partyid-type:iso6523:0088:123456", false, true, ALLOWED_SCHEME_PATTERN, null, null}, - }); - } - - @Before - public void init() { - validator = new ServiceGroupValidator(configurationService, normalizer); - } - - @Parameterized.Parameter - public String caseName; - @Parameterized.Parameter(1) - public String schema; - @Parameterized.Parameter(2) - public String value; - @Parameterized.Parameter(3) - public boolean expectedThrowError; - @Parameterized.Parameter(4) - public boolean mandatoryScheme; - @Parameterized.Parameter(5) - public Pattern schemePattern; - @Parameterized.Parameter(6) - public Class errorClass; - @Parameterized.Parameter(7) - public String errorMessage; - - - @Test - public void testServiceGroupIdentifier() { - normalizer.configureParticipantIdentifierFormatter(null, mandatoryScheme, schemePattern); - - validateScheme(schema, value); - } - - private void validateScheme(String scheme, String value) { - - Identifier id = new Identifier(value, scheme); - /* - //ServiceGroup sg = new ServiceGroup(); - sg.setParticipantIdentifier(id); - - if (expectedThrowError) { - Throwable throwable = Assert.assertThrows(errorClass, () -> validator.validate(normalizer.formatParticipant(id), sg)); - MatcherAssert.assertThat(throwable.getMessage(), CoreMatchers.containsString(errorMessage)); - } else { - validator.validate(normalizer.formatParticipant(id), sg); - } - - - } - */ - -} diff --git a/smp-webapp/src/test/resources/cleanup-database.sql b/smp-webapp/src/test/resources/cleanup-database.sql index db26999a5b8bb568807c9060f426983775183a46..218ac8322c6abe9dcc2bbd1b23846486d6da05dd 100755 --- a/smp-webapp/src/test/resources/cleanup-database.sql +++ b/smp-webapp/src/test/resources/cleanup-database.sql @@ -1,7 +1,7 @@ -DELETE FROM SMP_ALERT; -DELETE FROM SMP_ALERT_AUD; DELETE FROM SMP_ALERT_PROPERTY; DELETE FROM SMP_ALERT_PROPERTY_AUD; +DELETE FROM SMP_ALERT; +DELETE FROM SMP_ALERT_AUD; DELETE FROM SMP_CERTIFICATE; DELETE FROM SMP_CERTIFICATE_AUD; DELETE FROM SMP_CONFIGURATION; diff --git a/smp-webapp/src/test/resources/webapp_integration_test_data.sql b/smp-webapp/src/test/resources/webapp_integration_test_data.sql index 850c4356bbfa629a802d799d14605f8b6cacf3fc..1688a5596e7c594510c4f16803c9a7c476f0ef35 100644 --- a/smp-webapp/src/test/resources/webapp_integration_test_data.sql +++ b/smp-webapp/src/test/resources/webapp_integration_test_data.sql @@ -78,28 +78,6 @@ insert into SMP_CREDENTIAL (ID, FK_USER_ID, CREDENTIAL_ACTIVE, CREDENTIAL_NAME, insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (18, 'CN=utf-8_z_SMP,O=EC,C=BE:0000000000000666', null,null, NOW(), NOW()); - - --- insert into SMP_USER(ID, USERNAME, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (8, 'Cert3', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (8, 'CN=utf-8_ż_SMP,O=EC,C=BE:0000000000000666', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (9, 'Cert4', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (9, 'CN=EHEALTH_SMP_EC,O=European Commission,C=BE:f71ee8b11cb3b787', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (10, 'cert5', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (10, 'CN=common name UPPER database SN,O=org,C=BE:000000000000BB66', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (11, 'cert6', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (11, 'CN=ncp.fi.ehealth.testa.eu,O=Kansanelakelaitos,C=FI:f71ee8b11cb3b787', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (12, 'cert7', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (12, 'CN=Internal Business CA 2,O=T-Systems International GmbH,C=DE:f71ee8b11cb3b787', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (13, 'cert8', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (13, 'CN=GRP:test_proxy_01,O=European Commission,C=BE:0000000000001234', null,null, NOW(), NOW()); - --- insert into SMP_USER(ID, USERNAME, PASSWORD, ROLE, ACTIVE, CREATED_ON, LAST_UPDATED_ON) values (14, 'cert9', '', 'SMP_ADMIN', 1, NOW(), NOW()); --- insert into SMP_CERTIFICATE (ID, CERTIFICATE_ID, VALID_FROM, VALID_TO, CREATED_ON, LAST_UPDATED_ON) values (14, 'CN=GRP:TEST_\+\,& \=eau!,O=European Commission,C=BE:0000000000001234', null,null, NOW(), NOW()); -- -------------- -- Configure domains insert into SMP_DOMAIN (ID, VISIBILITY, DOMAIN_CODE, SML_SUBDOMAIN, SML_SMP_ID, SIGNATURE_KEY_ALIAS,SML_REGISTERED,SML_CLIENT_CERT_AUTH, CREATED_ON, LAST_UPDATED_ON) values @@ -107,7 +85,8 @@ insert into SMP_DOMAIN (ID, VISIBILITY, DOMAIN_CODE, SML_SUBDOMAIN, SML_SMP_ID, (2, 'PUBLIC', 'domainTwo','newdomain', 'CEF-SMP-002','single_domain_key',0,1,NOW(), NOW()); insert into SMP_GROUP (ID, FK_DOMAIN_ID, NAME, VISIBILITY, CREATED_ON, LAST_UPDATED_ON) values -(1, 1, 'domain group', 'PUBLIC', NOW(), NOW()); +(1, 1, 'domain group', 'PUBLIC', NOW(), NOW()), +(2, 1, 'Second group', 'PUBLIC', NOW(), NOW()); -- -------------- -- configure extension and document types service group and servicemetadata @@ -123,6 +102,7 @@ insert into SMP_SUBRESOURCE_DEF (ID,FK_RESOURCE_DEF_ID,URL_SEGMENT, IDENTIFIER, insert into SMP_DOMAIN_RESOURCE_DEF (ID, FK_RESOURCE_DEF_ID, FK_DOMAIN_ID,CREATED_ON, LAST_UPDATED_ON ) values (1, 1, 1, NOW(), NOW()); + -- ---------------------------------- -- add documents insert into SMP_DOCUMENT (ID, CURRENT_VERSION, MIME_TYPE, NAME,CREATED_ON, LAST_UPDATED_ON) values @@ -142,15 +122,20 @@ insert into SMP_RESOURCE ( ID, FK_GROUP_ID, FK_DOCUMENT_ID, FK_DOREDEF_ID, IDEN insert into SMP_SUBRESOURCE (ID, FK_RESOURCE_ID,FK_SUREDEF_ID, FK_DOCUMENT_ID, IDENTIFIER_SCHEME, IDENTIFIER_VALUE, CREATED_ON, LAST_UPDATED_ON) values (-1, -1, 1, -3, 'busdox-docid-qn', 'doc_7', NOW(), NOW()); +insert into SMP_DOMAIN_MEMBER (ID, FK_DOMAIN_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values +(1, 1, 3, 'ADMIN', NOW(), NOW()); + insert into SMP_GROUP_MEMBER (ID, FK_GROUP_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values -(1, 1, 1, 'ADMIN', NOW(), NOW()); +(1, 1, 1, 'ADMIN', NOW(), NOW()), +(2, 1, 3, 'ADMIN', NOW(), NOW()); -- set ownership insert into SMP_RESOURCE_MEMBER (ID, FK_RESOURCE_ID, FK_USER_ID, MEMBERSHIP_ROLE, CREATED_ON, LAST_UPDATED_ON) values (-1, -1, 1, 'ADMIN', NOW(), NOW()), -(-2, -2, 1, 'ADMIN', NOW(), NOW()), -(-3, -1, 5, 'ADMIN', NOW(), NOW()), -(-4, -1, 2, 'ADMIN', NOW(), NOW()), -(-5, -1, 6, 'ADMIN', NOW(), NOW()); +(-2, -1, 3, 'ADMIN', NOW(), NOW()), +(-3, -2, 1, 'ADMIN', NOW(), NOW()), +(-4, -1, 5, 'ADMIN', NOW(), NOW()), +(-5, -1, 2, 'ADMIN', NOW(), NOW()), +(-6, -1, 6, 'ADMIN', NOW(), NOW());