From 219301207e244e5a48deaaac723830f73aa1f350 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Fri, 5 Jun 2026 08:07:16 +0200 Subject: [PATCH 01/10] Adding test for BookChapter --- .../search/resources/bibtex/BibTexTest.java | 59 +++++++++++++++---- .../search/BibTexExpectationFixtures.java | 48 +++++++++------ 2 files changed, 77 insertions(+), 30 deletions(-) diff --git a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java index 5bca059..783c291 100644 --- a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java +++ b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java @@ -5,13 +5,10 @@ import static java.util.concurrent.TimeUnit.SECONDS; import java.util.stream.Stream; -import org.assertj.core.api.SoftAssertions; -import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; -import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import static org.awaitility.Awaitility.with; import static org.awaitility.pollinterval.FibonacciPollInterval.fibonacci; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import static org.junit.jupiter.params.provider.Arguments.argumentSet; @@ -22,6 +19,7 @@ import io.restassured.parsing.Parser; import no.sikt.Category; import static no.sikt.Category.ACADEMIC_ARTICLE; +import static no.sikt.Category.ACADEMIC_CHAPTER; import static no.sikt.Category.ACADEMIC_MONOGRAPH; import static no.sikt.nva.apitest.base.CurrentTimeConstants.CURRENT_MONTH_SHORT_NAME; import static no.sikt.nva.apitest.base.CurrentTimeConstants.CURRENT_YEAR; @@ -29,19 +27,18 @@ import static no.sikt.nva.apitest.base.UserFixtures.UIB_PUBLISHING_CURATOR; import no.sikt.nva.apitest.search.BibTexExpectation; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_ARTICLE; +import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_CHAPTER; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH; import no.sikt.nva.apitest.search.SearchTestBase; @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") -@ExtendWith(SoftAssertionsExtension.class) class BibTexTest extends SearchTestBase { - @InjectSoftAssertions private SoftAssertions softly; - private static Stream publicationsInBibTexFormatProvider() { return Stream.of( argumentSet("AcademicArticle", ACADEMIC_ARTICLE, EXPECTED_BIBTEX_ACADEMIC_ARTICLE), - argumentSet("AcademicMonograph", ACADEMIC_MONOGRAPH, EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH)); + argumentSet("AcademicMonograph", ACADEMIC_MONOGRAPH, EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH), + argumentSet("AcademicChapter", ACADEMIC_CHAPTER, EXPECTED_BIBTEX_ACADEMIC_CHAPTER)); } @ParameterizedTest @@ -52,11 +49,27 @@ void shouldReturnPublicationsInBibTexFormat(Category category, BibTexExpectation RestAssured.registerParser("text/x-bibtex", Parser.TEXT); var titleUuid = UUID.randomUUID().toString(); + var anthologyUuid = UUID.randomUUID().toString(); var title = "BibTex Integration test publication " + titleUuid; + var anthologyTitle = "BibTex integration test anthology " + anthologyUuid; + var anthologyIdentifier = + category == ACADEMIC_CHAPTER + ? PUBLICATION_FACTORY.createAnthologyForChapter( + UIB_CREATOR, anthologyTitle, UIB_PUBLISHING_CURATOR, List.of(UIB_CREATOR)) + : ""; var identifier = - PUBLICATION_FACTORY.createPublishedPublication( - UIB_CREATOR, title, category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR); + category == ACADEMIC_CHAPTER + ? PUBLICATION_FACTORY.createChapterInAnthology( + UIB_CREATOR, + title, + category, + List.of(UIB_CREATOR), + UIB_PUBLISHING_CURATOR, + anthologyIdentifier, + List.of(UIB_CREATOR)) + : PUBLICATION_FACTORY.createPublishedPublication( + UIB_CREATOR, title, category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR); with() .pollInterval(fibonacci().with().unit(SECONDS)) @@ -67,7 +80,28 @@ void shouldReturnPublicationsInBibTexFormat(Category category, BibTexExpectation var responseBody = getResponseBody(titleUuid); var allExpectations = buildAllExpectations(expectation, title, identifier); - allExpectations.forEach(expected -> softly.assertThat(responseBody).contains(expected)); + // if (category == ACADEMIC_CHAPTER) { + // allExpectations = + // Stream.concat( + // allExpectations.stream(), + // buildAllExpectations( + // EXPECTED_BIBTEX_BOOK_ANTHOLOGY, "Anthology for " + title, + // anthologyIdentifier) + // .stream()) + // .toList(); + // } + + // given() + // .param("query", titleUuid) + // .accept("text/x-bibtex") + // .when() + // .get("/search/resources") + // .then() + // .statusCode(200) + // .contentType("text/x-bibtex") + // .body("testing", Matchers.notNullValue()); + + allExpectations.forEach(expected -> assertTrue(responseBody.contains(expected))); } private String getResponseBody(String titleUuid) { @@ -92,7 +126,8 @@ private List buildAllExpectations( "url = {" + RestAssured.baseURI + "/publication/" + identifier + "}", "title = {" + title + "}", "month = {" + CURRENT_MONTH_SHORT_NAME + "}", - "year = {" + CURRENT_YEAR + "}")) + "year = {" + CURRENT_YEAR + "}", + "}")) .toList(); } } diff --git a/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java b/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java index 8b6657b..b29123d 100644 --- a/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java +++ b/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java @@ -4,22 +4,34 @@ public class BibTexExpectationFixtures { - public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_ARTICLE = - new BibTexExpectation( - "article", - List.of( - "journal = {ACM Journal of Data and Information Quality}", - "issn = {1936-1963}", - "note = {nva type: AcademicArticle}", - "number = {1}", - "pages = {10--20}", - "volume = {3}")); - public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH = - new BibTexExpectation( - "book", - List.of( - "isbn = {9783161484100}", - "note = {nva type: AcademicMonograph}", - "pages = {150}", - "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_ARTICLE = new BibTexExpectation( + "article", + List.of( + "journal = {ACM Journal of Data and Information Quality}", + "issn = {1936-1963}", + "note = {nva type: AcademicArticle}", + "number = {1}", + "pages = {10--20}", + "volume = {3}")); + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH = new BibTexExpectation( + "book", + List.of( + "isbn = {9783161484100}", + "note = {nva type: AcademicMonograph}", + "pages = {150}", + "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_BOOK_ANTHOLOGY = new BibTexExpectation( + "book", + List.of( + "isbn = {9783161484100}", + "note = {nva type: BookAnthology}", + "pages = {150}", + "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_CHAPTER = new BibTexExpectation( + "inbook", + List.of( + "isbn = {9783161484100}", + "note = {nva type: AcademicChapter}", + "pages = {1--20}", + "publisher = {Springer Nature}")); } From 8608f39a3da12511139242b94f709abeca20a5b7 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Fri, 5 Jun 2026 08:11:49 +0200 Subject: [PATCH 02/10] Fixing BookChapter test --- .../search/resources/bibtex/BibTexTest.java | 35 +++++----- .../search/BibTexExpectationFixtures.java | 64 ++++++++++--------- .../java/no/sikt/nva/PublicationFactory.java | 54 ++++++++++++++++ 3 files changed, 105 insertions(+), 48 deletions(-) diff --git a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java index 783c291..5cc5d7f 100644 --- a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java +++ b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java @@ -1,23 +1,7 @@ package no.sikt.nva.apitest.search.resources.bibtex; -import java.util.List; -import java.util.UUID; -import static java.util.concurrent.TimeUnit.SECONDS; -import java.util.stream.Stream; - -import static org.awaitility.Awaitility.with; -import static org.awaitility.pollinterval.FibonacciPollInterval.fibonacci; -import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import static org.junit.jupiter.params.provider.Arguments.argumentSet; -import org.junit.jupiter.params.provider.MethodSource; - -import io.restassured.RestAssured; import static io.restassured.RestAssured.given; -import io.restassured.parsing.Parser; -import no.sikt.Category; +import static java.util.concurrent.TimeUnit.SECONDS; import static no.sikt.Category.ACADEMIC_ARTICLE; import static no.sikt.Category.ACADEMIC_CHAPTER; import static no.sikt.Category.ACADEMIC_MONOGRAPH; @@ -25,11 +9,26 @@ import static no.sikt.nva.apitest.base.CurrentTimeConstants.CURRENT_YEAR; import static no.sikt.nva.apitest.base.UserFixtures.UIB_CREATOR; import static no.sikt.nva.apitest.base.UserFixtures.UIB_PUBLISHING_CURATOR; -import no.sikt.nva.apitest.search.BibTexExpectation; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_ARTICLE; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_CHAPTER; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH; +import static org.awaitility.Awaitility.with; +import static org.awaitility.pollinterval.FibonacciPollInterval.fibonacci; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.params.provider.Arguments.argumentSet; + +import io.restassured.RestAssured; +import io.restassured.parsing.Parser; +import java.util.List; +import java.util.UUID; +import java.util.stream.Stream; +import no.sikt.Category; +import no.sikt.nva.apitest.search.BibTexExpectation; import no.sikt.nva.apitest.search.SearchTestBase; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class BibTexTest extends SearchTestBase { diff --git a/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java b/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java index b29123d..aec6efb 100644 --- a/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java +++ b/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java @@ -4,34 +4,38 @@ public class BibTexExpectationFixtures { - public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_ARTICLE = new BibTexExpectation( - "article", - List.of( - "journal = {ACM Journal of Data and Information Quality}", - "issn = {1936-1963}", - "note = {nva type: AcademicArticle}", - "number = {1}", - "pages = {10--20}", - "volume = {3}")); - public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH = new BibTexExpectation( - "book", - List.of( - "isbn = {9783161484100}", - "note = {nva type: AcademicMonograph}", - "pages = {150}", - "publisher = {Springer Nature}")); - public static final BibTexExpectation EXPECTED_BIBTEX_BOOK_ANTHOLOGY = new BibTexExpectation( - "book", - List.of( - "isbn = {9783161484100}", - "note = {nva type: BookAnthology}", - "pages = {150}", - "publisher = {Springer Nature}")); - public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_CHAPTER = new BibTexExpectation( - "inbook", - List.of( - "isbn = {9783161484100}", - "note = {nva type: AcademicChapter}", - "pages = {1--20}", - "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_ARTICLE = + new BibTexExpectation( + "article", + List.of( + "journal = {ACM Journal of Data and Information Quality}", + "issn = {1936-1963}", + "note = {nva type: AcademicArticle}", + "number = {1}", + "pages = {10--20}", + "volume = {3}")); + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH = + new BibTexExpectation( + "book", + List.of( + "isbn = {9783161484100}", + "note = {nva type: AcademicMonograph}", + "pages = {150}", + "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_BOOK_ANTHOLOGY = + new BibTexExpectation( + "book", + List.of( + "isbn = {9783161484100}", + "note = {nva type: BookAnthology}", + "pages = {150}", + "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_CHAPTER = + new BibTexExpectation( + "inbook", + List.of( + "isbn = {9783161484100}", + "note = {nva type: AcademicChapter}", + "pages = {1--20}", + "publisher = {Springer Nature}")); } diff --git a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java index 7fe0d55..1633a99 100644 --- a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java +++ b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java @@ -12,6 +12,7 @@ import static no.sikt.nva.apitest.publication.PublicationPaths.publicationPath; import static no.sikt.nva.apitest.publication.PublicationPaths.publishPublicationPath; +import io.restassured.RestAssured; import io.restassured.path.json.JsonPath; import io.restassured.response.Response; import java.util.ArrayList; @@ -71,6 +72,59 @@ public String createPublishedPublication( return createResponse.jsonPath().get(IDENTIFIER_FIELD); } + public String createChapterInAnthology( + User user, + String title, + Category category, + List contributorList, + User curator, + String anthologyIdentifier, + List anthologyEditorList) { + + var createResponse = createDraftPublication(user); + + var identifier = createResponse.body().jsonPath().getString(IDENTIFIER_FIELD); + Map responseBody = createResponse.body().jsonPath().getMap(""); + responseBody.remove(CONTEXT_FIELD); + + var entityDescription = createEntityDescription(title, category, contributorList); + ((Map) + ((Map) entityDescription.get("reference")).get("publicationContext")) + .put("id", RestAssured.baseURI + "/publication/" + anthologyIdentifier); + responseBody.put(ENTITY_DESCRIPTION_FIELD, entityDescription); + + updatePublication(user, responseBody); + + publish(curator, identifier); + + return createResponse.jsonPath().get(IDENTIFIER_FIELD); + } + + public String createAnthologyForChapter( + User user, String title, User curator, List anthologyEditorList) { + var anthologyTitle = "Anthology for " + title; + var anthologyCreateResponse = createDraftPublication(user); + + var anthologyIdentifier = anthologyCreateResponse.body().jsonPath().getString(IDENTIFIER_FIELD); + Map anthologyResponseBody = + anthologyCreateResponse.body().jsonPath().getMap(""); + anthologyResponseBody.remove(CONTEXT_FIELD); + + var anthologyEntityDescription = + createEntityDescription(anthologyTitle, Category.BOOK_ANTHOLOGY, anthologyEditorList); + var contributors = (List>) anthologyEntityDescription.get("contributors"); + + contributors.forEach( + contributor -> { + ((Map) contributor.get("role")).put("type", "Editor"); + }); + anthologyResponseBody.put(ENTITY_DESCRIPTION_FIELD, anthologyEntityDescription); + updatePublication(user, anthologyResponseBody); + + publish(curator, anthologyIdentifier); + return anthologyIdentifier; + } + public Map createEntityDescription( String title, Category category, List contributorList) { From 7ed7ec88d37a8405d89805203160b6042f3263b5 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Fri, 5 Jun 2026 08:14:49 +0200 Subject: [PATCH 03/10] Fixing BookChapter test --- .../metadata/BookChapterReference.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 publication-api/src/testFixtures/resources/metadata/BookChapterReference.json diff --git a/publication-api/src/testFixtures/resources/metadata/BookChapterReference.json b/publication-api/src/testFixtures/resources/metadata/BookChapterReference.json new file mode 100644 index 0000000..117baf1 --- /dev/null +++ b/publication-api/src/testFixtures/resources/metadata/BookChapterReference.json @@ -0,0 +1,18 @@ +{ + "reference": { + "type": "Reference", + "publicationContext": { + "type": "Anthology", + "id": "" + }, + "publicationInstance": { + "type": "AcademicChapter", + "pages": { + "type": "Range", + "begin": 1, + "end": 20, + "illustrated": false + } + } + } +} \ No newline at end of file From 9e462de3adb4ce52079acbe7eec7465df13b91fd Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Fri, 5 Jun 2026 08:20:23 +0200 Subject: [PATCH 04/10] Fixing BookChapter test --- ...nce.json => AcademicChapterReference.json} | 0 .../metadata/BookAnthologyReference.json | 28 +++++++++++++++++++ 2 files changed, 28 insertions(+) rename publication-api/src/testFixtures/resources/metadata/{BookChapterReference.json => AcademicChapterReference.json} (100%) create mode 100644 publication-api/src/testFixtures/resources/metadata/BookAnthologyReference.json diff --git a/publication-api/src/testFixtures/resources/metadata/BookChapterReference.json b/publication-api/src/testFixtures/resources/metadata/AcademicChapterReference.json similarity index 100% rename from publication-api/src/testFixtures/resources/metadata/BookChapterReference.json rename to publication-api/src/testFixtures/resources/metadata/AcademicChapterReference.json diff --git a/publication-api/src/testFixtures/resources/metadata/BookAnthologyReference.json b/publication-api/src/testFixtures/resources/metadata/BookAnthologyReference.json new file mode 100644 index 0000000..ec70b1c --- /dev/null +++ b/publication-api/src/testFixtures/resources/metadata/BookAnthologyReference.json @@ -0,0 +1,28 @@ +{ + "reference": { + "type": "Reference", + "publicationInstance": { + "type": "BookAnthology", + "pages" : { + "type" : "MonographPages", + "pages" : "150", + "illustrated" : false + } + }, + "publicationContext": { + "type": "Book", + "series" : { + "type" : "UnconfirmedSeries" + }, + "isbnList": [ + "9783161484100" + ], + "publisher": { + "type": "Publisher", + "name": "Springer Nature", + "id": "https://api.e2e.nva.aws.unit.no/publication-channels-v2/publisher/DC752087-7122-4D3A-9E4F-382AA2F39D2C", + "valid": "true" + } + } + } +} \ No newline at end of file From fdf3460693b76b10db7eafa4b6ed565217b95e59 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Mon, 8 Jun 2026 09:41:44 +0200 Subject: [PATCH 05/10] Tests for ResearcReport and DegrePhd --- .../sikt/nva/apitest/base/UserFixtures.java | 16 +++ .../search/resources/bibtex/BibTexTest.java | 100 ++++++++++-------- .../search/BibTexExpectationFixtures.java | 29 ++++- .../java/no/sikt/nva/PublicationFactory.java | 8 +- .../metadata/DegreePhDReference.json | 28 +++++ .../metadata/ReportResearchReference.json | 26 +++++ 6 files changed, 154 insertions(+), 53 deletions(-) create mode 100644 publication-api/src/testFixtures/resources/metadata/DegreePhDReference.json create mode 100644 publication-api/src/testFixtures/resources/metadata/ReportResearchReference.json diff --git a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/UserFixtures.java b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/UserFixtures.java index ed8bfc4..41153df 100644 --- a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/UserFixtures.java +++ b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/UserFixtures.java @@ -49,5 +49,21 @@ public final class UserFixtures { .withAffiliations(Affiliation.UIB) .build(); + public static final User UIB_CONTRIBUTOR = + User.builder() + .withName("Contributor UiB ApiTestUser") + .withUserId("api-test-user-contributor-uib@test.sikt.no") + .withCristinId("1862464@184.0.0.0") + .withAffiliations(Affiliation.UIB) + .build(); + + public static final User UIB_THESIS_CURATOR = + User.builder() + .withName("Curator-thesis UiB ApiTestUser") + .withUserId("api-test-user-curator-thesis-uib@test.sikt.no") + .withCristinId("1862466@184.0.0.0") + .withAffiliations(Affiliation.UIB) + .build(); + private UserFixtures() {} } diff --git a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java index 5cc5d7f..a22061b 100644 --- a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java +++ b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java @@ -5,16 +5,19 @@ import static no.sikt.Category.ACADEMIC_ARTICLE; import static no.sikt.Category.ACADEMIC_CHAPTER; import static no.sikt.Category.ACADEMIC_MONOGRAPH; +import static no.sikt.Category.DEGREE_PHD; import static no.sikt.nva.apitest.base.CurrentTimeConstants.CURRENT_MONTH_SHORT_NAME; import static no.sikt.nva.apitest.base.CurrentTimeConstants.CURRENT_YEAR; import static no.sikt.nva.apitest.base.UserFixtures.UIB_CREATOR; import static no.sikt.nva.apitest.base.UserFixtures.UIB_PUBLISHING_CURATOR; +import static no.sikt.nva.apitest.base.UserFixtures.UIB_THESIS_CURATOR; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_ARTICLE; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_CHAPTER; import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH; +import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_DEGREE_PHD; +import static no.sikt.nva.apitest.search.BibTexExpectationFixtures.EXPECTED_BIBTEX_REPORT_RESEARCH; import static org.awaitility.Awaitility.with; import static org.awaitility.pollinterval.FibonacciPollInterval.fibonacci; -import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.params.provider.Arguments.argumentSet; import io.restassured.RestAssured; @@ -25,19 +28,59 @@ import no.sikt.Category; import no.sikt.nva.apitest.search.BibTexExpectation; import no.sikt.nva.apitest.search.SearchTestBase; +import org.assertj.core.api.SoftAssertions; +import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; +import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -@SuppressWarnings("PMD.UnitTestShouldIncludeAssert") +@ExtendWith(SoftAssertionsExtension.class) class BibTexTest extends SearchTestBase { + @InjectSoftAssertions private SoftAssertions softly; + private static Stream publicationsInBibTexFormatProvider() { return Stream.of( argumentSet("AcademicArticle", ACADEMIC_ARTICLE, EXPECTED_BIBTEX_ACADEMIC_ARTICLE), argumentSet("AcademicMonograph", ACADEMIC_MONOGRAPH, EXPECTED_BIBTEX_ACADEMIC_MONOGRAPH), - argumentSet("AcademicChapter", ACADEMIC_CHAPTER, EXPECTED_BIBTEX_ACADEMIC_CHAPTER)); + argumentSet("AcademicChapter", ACADEMIC_CHAPTER, EXPECTED_BIBTEX_ACADEMIC_CHAPTER), + argumentSet("DegreePhD", DEGREE_PHD, EXPECTED_BIBTEX_DEGREE_PHD), + argumentSet("ReportResearch", Category.RESEARCH_REPORT, EXPECTED_BIBTEX_REPORT_RESEARCH)); + } + + private String createTestPublication(Category category, String title) { + var identifier = ""; + switch (category) { + case ACADEMIC_CHAPTER -> { + var anthologyUuid = UUID.randomUUID().toString(); + var anthologyTitle = "BibTex integration test anthology " + anthologyUuid; + var anthologyIdentifier = + PUBLICATION_FACTORY.createAnthologyForChapter( + UIB_CREATOR, anthologyTitle, UIB_PUBLISHING_CURATOR, List.of(UIB_CREATOR)); + identifier = + PUBLICATION_FACTORY.createChapterInAnthology( + UIB_CREATOR, + title, + category, + List.of(UIB_CREATOR), + UIB_PUBLISHING_CURATOR, + anthologyIdentifier, + List.of(UIB_CREATOR)); + } + case DEGREE_PHD -> + identifier = + PUBLICATION_FACTORY.createPublishedPublication( + UIB_THESIS_CURATOR, title, category, List.of(UIB_CREATOR), UIB_THESIS_CURATOR); + default -> + identifier = + PUBLICATION_FACTORY.createPublishedPublication( + UIB_CREATOR, title, category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR); + } + + return identifier; } @ParameterizedTest @@ -48,59 +91,22 @@ void shouldReturnPublicationsInBibTexFormat(Category category, BibTexExpectation RestAssured.registerParser("text/x-bibtex", Parser.TEXT); var titleUuid = UUID.randomUUID().toString(); - var anthologyUuid = UUID.randomUUID().toString(); - var title = "BibTex Integration test publication " + titleUuid; - var anthologyTitle = "BibTex integration test anthology " + anthologyUuid; - var anthologyIdentifier = - category == ACADEMIC_CHAPTER - ? PUBLICATION_FACTORY.createAnthologyForChapter( - UIB_CREATOR, anthologyTitle, UIB_PUBLISHING_CURATOR, List.of(UIB_CREATOR)) - : ""; - var identifier = - category == ACADEMIC_CHAPTER - ? PUBLICATION_FACTORY.createChapterInAnthology( - UIB_CREATOR, - title, - category, - List.of(UIB_CREATOR), - UIB_PUBLISHING_CURATOR, - anthologyIdentifier, - List.of(UIB_CREATOR)) - : PUBLICATION_FACTORY.createPublishedPublication( - UIB_CREATOR, title, category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR); + + var identifier = createTestPublication(category, title); with() .pollInterval(fibonacci().with().unit(SECONDS)) .await() - .atMost(12, SECONDS) + .atMost(20, SECONDS) .until(() -> !getResponseBody(titleUuid).isEmpty()); var responseBody = getResponseBody(titleUuid); var allExpectations = buildAllExpectations(expectation, title, identifier); - // if (category == ACADEMIC_CHAPTER) { - // allExpectations = - // Stream.concat( - // allExpectations.stream(), - // buildAllExpectations( - // EXPECTED_BIBTEX_BOOK_ANTHOLOGY, "Anthology for " + title, - // anthologyIdentifier) - // .stream()) - // .toList(); - // } - - // given() - // .param("query", titleUuid) - // .accept("text/x-bibtex") - // .when() - // .get("/search/resources") - // .then() - // .statusCode(200) - // .contentType("text/x-bibtex") - // .body("testing", Matchers.notNullValue()); - - allExpectations.forEach(expected -> assertTrue(responseBody.contains(expected))); + allExpectations.forEach(expected -> softly.assertThat(responseBody).contains(expected)); + + softly.assertAll(); } private String getResponseBody(String titleUuid) { @@ -110,6 +116,8 @@ private String getResponseBody(String titleUuid) { .when() .get("/search/resources") .then() + .log() + .all() .statusCode(200) .contentType("text/x-bibtex") .extract() diff --git a/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java b/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java index aec6efb..1aa2239 100644 --- a/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java +++ b/bibtex/src/testFixtures/java/no/sikt/nva/apitest/search/BibTexExpectationFixtures.java @@ -4,6 +4,9 @@ public class BibTexExpectationFixtures { + private static final String ISBN = "isbn = {9783161484100}"; + private static final String MONOGRAPH_PAGES = "pages = {150}"; + public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_ARTICLE = new BibTexExpectation( "article", @@ -18,24 +21,40 @@ public class BibTexExpectationFixtures { new BibTexExpectation( "book", List.of( - "isbn = {9783161484100}", + ISBN, "note = {nva type: AcademicMonograph}", - "pages = {150}", + MONOGRAPH_PAGES, "publisher = {Springer Nature}")); public static final BibTexExpectation EXPECTED_BIBTEX_BOOK_ANTHOLOGY = new BibTexExpectation( "book", List.of( - "isbn = {9783161484100}", + ISBN, "note = {nva type: BookAnthology}", - "pages = {150}", + MONOGRAPH_PAGES, "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_DEGREE_PHD = + new BibTexExpectation( + "phdthesis", + List.of( + ISBN, + "note = {nva type: DegreePhd}", + MONOGRAPH_PAGES, + "school = {SINTEF akademisk forlag}")); public static final BibTexExpectation EXPECTED_BIBTEX_ACADEMIC_CHAPTER = new BibTexExpectation( "inbook", List.of( - "isbn = {9783161484100}", + ISBN, "note = {nva type: AcademicChapter}", "pages = {1--20}", "publisher = {Springer Nature}")); + public static final BibTexExpectation EXPECTED_BIBTEX_REPORT_RESEARCH = + new BibTexExpectation( + "techreport", + List.of( + ISBN, + "note = {nva type: ReportResearch}", + MONOGRAPH_PAGES, + "institution = {SINTEF akademisk forlag}")); } diff --git a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java index 1633a99..df6c59a 100644 --- a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java +++ b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java @@ -154,8 +154,12 @@ public Map createReference(Category category) { var referenceJsonPath = loadJsonResource("/metadata/" + category.getValue() + "Reference.json"); Map publicationContext = referenceJsonPath.getMap("reference.publicationContext"); - publicationContext.put("id", publicationContext.get("id") + "/" + CURRENT_YEAR); - + if (publicationContext.containsKey("publisher")) { + Map publisher = + referenceJsonPath.get("reference.publicationContext.publisher"); + publisher.put("id", publisher.get("id") + "/" + CURRENT_YEAR); + publicationContext.put("publisher", publisher); + } Map reference = referenceJsonPath.getMap("reference"); reference.put("publicationContext", publicationContext); diff --git a/publication-api/src/testFixtures/resources/metadata/DegreePhDReference.json b/publication-api/src/testFixtures/resources/metadata/DegreePhDReference.json new file mode 100644 index 0000000..39e74de --- /dev/null +++ b/publication-api/src/testFixtures/resources/metadata/DegreePhDReference.json @@ -0,0 +1,28 @@ +{ + "reference": { + "type": "Reference", + "publicationContext": { + "type": "Degree", + "series": { + "type": "UnconfirmedSeries", + "id": "https://api.e2e.nva.aws.unit.no/publication-channels-v2/serial-publication/01F85FBB-B084-43E5-9C67-E8F3D629CE73" + }, + "publisher": { + "type": "Publisher", + "id": "https://api.e2e.nva.aws.unit.no/publication-channels-v2/publisher/D4AA649E-CB53-4CA0-89EC-F68FB02CFB96", + "valid": "true" + }, + "isbnList": [ + "9783161484100" + ] + }, + "publicationInstance": { + "type": "DegreePhd", + "pages": { + "type": "MonographPages", + "pages": "150", + "illustrated": "false" + } + } + } +} \ No newline at end of file diff --git a/publication-api/src/testFixtures/resources/metadata/ReportResearchReference.json b/publication-api/src/testFixtures/resources/metadata/ReportResearchReference.json new file mode 100644 index 0000000..25f71c5 --- /dev/null +++ b/publication-api/src/testFixtures/resources/metadata/ReportResearchReference.json @@ -0,0 +1,26 @@ +{ + "reference": { + "type": "Reference", + "publicationContext": { + "type": "Report", + "series": { + "type": "UnconfirmedSeries", + "id": "https://api.e2e.nva.aws.unit.no/publication-channels-v2/serial-publication/01F85FBB-B084-43E5-9C67-E8F3D629CE73" + }, + "publisher": { + "type": "Publisher", + "id": "https://api.e2e.nva.aws.unit.no/publication-channels-v2/publisher/D4AA649E-CB53-4CA0-89EC-F68FB02CFB96", + "valid": "true" + }, + "isbnList": ["9783161484100"] + }, + "publicationInstance": { + "type": "ReportResearch", + "pages": { + "type": "MonographPages", + "pages": "150", + "illustrated": "false" + } + } + } +} \ No newline at end of file From 939d7e2710949e57ac55ff9fbefdc8dcc0d79fb0 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Tue, 9 Jun 2026 09:19:50 +0200 Subject: [PATCH 06/10] Fix PMD errors, fix failed test --- .vscode/settings.json | 2 +- apitest-base/build.gradle | 2 +- .../sikt/nva/apitest/base/CognitoLogin.java | 5 +- .../nva/apitest/base/IntegrationTestBase.java | 2 +- .../search/resources/bibtex/BibTexTest.java | 43 +++++------ publication-api/build.gradle | 2 +- .../apitest/publication/CreateApiTest.java | 58 ++++++++------- .../publication/identifier/DeleteApiTest.java | 18 +++-- .../publication/identifier/FetchApiTest.java | 71 +++++++++++-------- .../identifier/PublishApiTest.java | 25 ++++--- .../fileupload/CompleteApiTest.java | 61 +++++++++------- .../identifier/fileupload/CreateApiTest.java | 27 ++++--- .../fileupload/FileUploadTestBase.java | 16 ++--- .../identifier/fileupload/PrepareApiTest.java | 27 ++----- .../fileupload/PresignedUrlApiTest.java | 22 +++--- .../java/no/sikt/nva/PublicationFactory.java | 6 +- 16 files changed, 207 insertions(+), 180 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index 0981f95..7b51e6b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,5 +3,5 @@ "java.project.sourcePaths": [ "bibtex/src/testFixtures" ], - "java.configuration.updateBuildConfiguration": "interactive" + "java.configuration.updateBuildConfiguration": "automatic" } \ No newline at end of file diff --git a/apitest-base/build.gradle b/apitest-base/build.gradle index c5aa9d8..59bd6bd 100644 --- a/apitest-base/build.gradle +++ b/apitest-base/build.gradle @@ -9,7 +9,7 @@ dependencies { implementation('software.amazon.awssdk:secretsmanager') implementation('software.amazon.awssdk:ssm') implementation(libs.rest.assured.json.path) - implementation(nvaCatalog.hamcrest) + implementation(nvaCatalog.assertj.core) implementation(nvaCatalog.httpcore4) runtimeOnly('software.amazon.awssdk:sso') runtimeOnly('software.amazon.awssdk:ssooidc') diff --git a/apitest-base/src/main/java/no/sikt/nva/apitest/base/CognitoLogin.java b/apitest-base/src/main/java/no/sikt/nva/apitest/base/CognitoLogin.java index 250cbe4..fc08236 100644 --- a/apitest-base/src/main/java/no/sikt/nva/apitest/base/CognitoLogin.java +++ b/apitest-base/src/main/java/no/sikt/nva/apitest/base/CognitoLogin.java @@ -1,7 +1,7 @@ package no.sikt.nva.apitest.base; import static java.util.Objects.nonNull; -import static org.hamcrest.Matchers.stringContainsInOrder; +import static org.assertj.core.api.Assertions.assertThat; import io.restassured.RestAssured; import io.restassured.path.json.JsonPath; @@ -132,10 +132,11 @@ private static String getCode(String userName, String password) { .post(url) .then() .statusCode(302) - .header("Location", stringContainsInOrder("?code=")) .extract() .response(); + assertThat(response.header("Location")).contains("?code="); + return response.getHeader("Location").split("\\?code=", -1)[1]; } diff --git a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java index 1da8363..f080c03 100644 --- a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java +++ b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java @@ -17,7 +17,7 @@ static void configureRestAssured() { .setResponseTemplate("sanitized-http-response.ftl")); var logConfig = LogConfig.logConfig() - .enableLoggingOfRequestAndResponseIfValidationFails() + // .enableLoggingOfRequestAndResponseIfValidationFails() .blacklistHeaders(List.of("Authorization")); RestAssured.config = RestAssured.config().logConfig(logConfig); } diff --git a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java index a22061b..acc224e 100644 --- a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java +++ b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java @@ -38,6 +38,7 @@ import org.junit.jupiter.params.provider.MethodSource; @ExtendWith(SoftAssertionsExtension.class) +@SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class BibTexTest extends SearchTestBase { @InjectSoftAssertions private SoftAssertions softly; @@ -52,35 +53,31 @@ private static Stream publicationsInBibTexFormatProvider() { } private String createTestPublication(Category category, String title) { - var identifier = ""; - switch (category) { + return switch (category) { case ACADEMIC_CHAPTER -> { - var anthologyUuid = UUID.randomUUID().toString(); - var anthologyTitle = "BibTex integration test anthology " + anthologyUuid; var anthologyIdentifier = PUBLICATION_FACTORY.createAnthologyForChapter( - UIB_CREATOR, anthologyTitle, UIB_PUBLISHING_CURATOR, List.of(UIB_CREATOR)); - identifier = - PUBLICATION_FACTORY.createChapterInAnthology( UIB_CREATOR, - title, - category, - List.of(UIB_CREATOR), + "BibTex integration test anthology " + UUID.randomUUID(), UIB_PUBLISHING_CURATOR, - anthologyIdentifier, List.of(UIB_CREATOR)); + + yield PUBLICATION_FACTORY.createChapterInAnthology( + UIB_CREATOR, + title, + category, + List.of(UIB_CREATOR), + UIB_PUBLISHING_CURATOR, + anthologyIdentifier, + List.of(UIB_CREATOR)); } case DEGREE_PHD -> - identifier = - PUBLICATION_FACTORY.createPublishedPublication( - UIB_THESIS_CURATOR, title, category, List.of(UIB_CREATOR), UIB_THESIS_CURATOR); + PUBLICATION_FACTORY.createPublishedPublication( + UIB_THESIS_CURATOR, title, category, List.of(UIB_CREATOR), UIB_THESIS_CURATOR); default -> - identifier = - PUBLICATION_FACTORY.createPublishedPublication( - UIB_CREATOR, title, category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR); - } - - return identifier; + PUBLICATION_FACTORY.createPublishedPublication( + UIB_CREATOR, title, category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR); + }; } @ParameterizedTest @@ -98,15 +95,13 @@ void shouldReturnPublicationsInBibTexFormat(Category category, BibTexExpectation with() .pollInterval(fibonacci().with().unit(SECONDS)) .await() - .atMost(20, SECONDS) + .atMost(30, SECONDS) .until(() -> !getResponseBody(titleUuid).isEmpty()); var responseBody = getResponseBody(titleUuid); var allExpectations = buildAllExpectations(expectation, title, identifier); allExpectations.forEach(expected -> softly.assertThat(responseBody).contains(expected)); - - softly.assertAll(); } private String getResponseBody(String titleUuid) { @@ -116,8 +111,6 @@ private String getResponseBody(String titleUuid) { .when() .get("/search/resources") .then() - .log() - .all() .statusCode(200) .contentType("text/x-bibtex") .extract() diff --git a/publication-api/build.gradle b/publication-api/build.gradle index f91d915..fb3fd57 100644 --- a/publication-api/build.gradle +++ b/publication-api/build.gradle @@ -8,7 +8,7 @@ dependencies { testFixturesApi(testFixtures(project(':apitest-base'))) testFixturesImplementation(libs.rest.assured.json.path) testImplementation(libs.allure.java.commons) - testImplementation(nvaCatalog.hamcrest) + testImplementation(nvaCatalog.assertj.core) testImplementation(nvaCatalog.junit.jupiter.api) testImplementation(nvaCatalog.junit.jupiter.params) testImplementation(testFixtures(project(':apitest-base'))) diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/CreateApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/CreateApiTest.java index 9f04748..294cb8e 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/CreateApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/CreateApiTest.java @@ -1,11 +1,9 @@ package no.sikt.nva.apitest.publication; +import static no.sikt.nva.apitest.base.Affiliation.UIB; import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedRequest; +import static no.sikt.nva.apitest.base.UserFixtures.UIB_CREATOR; import static no.sikt.nva.apitest.publication.PublicationFields.IDENTIFIER_FIELD; -import static no.sikt.nva.apitest.publication.PublicationFields.RESOURCE_OWNER_FIELD; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; import io.qameta.allure.Description; import io.restassured.RestAssured; @@ -13,16 +11,20 @@ import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import no.sikt.nva.apitest.base.Affiliation; import no.sikt.nva.apitest.base.CognitoLogin; -import no.sikt.nva.apitest.base.UserFixtures; +import org.assertj.core.api.SoftAssertions; +import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; +import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; -@SuppressWarnings("PMD.UnitTestShouldIncludeAssert") +@ExtendWith(SoftAssertionsExtension.class) class CreateApiTest extends PublicationTestBase { + @InjectSoftAssertions private SoftAssertions softly; + private static String customerUib; private static String creatorAccessToken; @@ -31,7 +33,7 @@ static void init() { customerUib = RestAssured.baseURI + "/customer/a228aba6-932b-4f53-b2de-31ad8daf9f8d"; - creatorAccessToken = CognitoLogin.login(UserFixtures.UIB_CREATOR.userId()).get("accessToken"); + creatorAccessToken = CognitoLogin.login(UIB_CREATOR.userId()).get("accessToken"); } @Test @@ -43,24 +45,26 @@ void shouldCreateDraftPublicationOwnedByCreator() { var today = LocalDate.now(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - givenAuthenticatedRequest(creatorAccessToken) - .accept(ContentType.JSON) - .when() - .post(PublicationPaths.createPublicationPath()) - .then() - .statusCode(201) - .body("type", equalTo("Publication")) - .body(IDENTIFIER_FIELD, notNullValue()) - .body("status", equalTo("DRAFT")) - .appendRootPath(RESOURCE_OWNER_FIELD) - .body("owner", equalTo(UserFixtures.UIB_CREATOR.cristinId())) - .body("ownerAffiliation", equalTo(Affiliation.UIB.getValue())) - .detachRootPath(RESOURCE_OWNER_FIELD) - .appendRootPath("publisher") - .body("type", equalTo("Organization")) - .body("id", equalTo(customerUib)) - .detachRootPath("publisher") - .body("createdDate", startsWith(today)) - .body("modifiedDate", startsWith(today)); + var response = + givenAuthenticatedRequest(creatorAccessToken) + .accept(ContentType.JSON) + .when() + .post(PublicationPaths.createPublicationPath()) + .then() + .statusCode(201) + .extract() + .jsonPath(); + + softly.assertThat(response.getString("type")).isEqualTo("Publication"); + softly.assertThat(response.getString(IDENTIFIER_FIELD)).isNotNull(); + softly.assertThat(response.getString("status")).isEqualTo("DRAFT"); + softly.assertThat(response.getString("resourceOwner.owner")).isEqualTo(UIB_CREATOR.cristinId()); + softly + .assertThat(response.getString("resourceOwner.ownerAffiliation")) + .isEqualTo(UIB.getValue()); + softly.assertThat(response.getString("publisher.type")).isEqualTo("Organization"); + softly.assertThat(response.getString("publisher.id")).isEqualTo(customerUib); + softly.assertThat(response.getString("createdDate")).startsWith(today); + softly.assertThat(response.getString("modifiedDate")).startsWith(today); } } diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/DeleteApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/DeleteApiTest.java index 2e0c97c..148d791 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/DeleteApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/DeleteApiTest.java @@ -3,7 +3,7 @@ import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedRequest; import static no.sikt.nva.apitest.base.Requests.givenUnauthenticatedJsonRequest; import static no.sikt.nva.apitest.publication.PublicationPaths.publicationPath; -import static org.hamcrest.Matchers.equalTo; +import static org.assertj.core.api.Assertions.assertThat; import io.qameta.allure.Description; import java.util.UUID; @@ -55,11 +55,15 @@ void shouldReturnNotFoundWhenDeletingUnknownIdentifier() { void shouldReturnUnauthorizedWhenDeletingWithoutAuthentication() { var identifier = setupDraftPublication(); - givenUnauthenticatedJsonRequest() - .when() - .delete(publicationPath(identifier)) - .then() - .statusCode(401) - .body("message", equalTo("Unauthorized")); + var response = + givenUnauthenticatedJsonRequest() + .when() + .delete(publicationPath(identifier)) + .then() + .statusCode(401) + .extract() + .jsonPath(); + + assertThat(response.getString("message")).isEqualTo("Unauthorized"); } } diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/FetchApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/FetchApiTest.java index 82c704c..38d0017 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/FetchApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/FetchApiTest.java @@ -1,34 +1,38 @@ package no.sikt.nva.apitest.publication.identifier; import static io.restassured.RestAssured.given; +import static no.sikt.nva.apitest.base.Affiliation.UIB; import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedJsonRequest; +import static no.sikt.nva.apitest.base.UserFixtures.UIB_CREATOR; import static no.sikt.nva.apitest.publication.PublicationFields.IDENTIFIER_FIELD; import static no.sikt.nva.apitest.publication.PublicationFields.RESOURCE_OWNER_FIELD; import static no.sikt.nva.apitest.publication.PublicationPaths.publicationPath; -import static org.hamcrest.Matchers.equalTo; import io.qameta.allure.Description; import io.restassured.RestAssured; import io.restassured.http.ContentType; import java.util.UUID; -import no.sikt.nva.apitest.base.Affiliation; import no.sikt.nva.apitest.base.CognitoLogin; -import no.sikt.nva.apitest.base.UserFixtures; import no.sikt.nva.apitest.publication.PublicationTestBase; +import org.assertj.core.api.SoftAssertions; +import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; +import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; -@SuppressWarnings("PMD.UnitTestShouldIncludeAssert") +@ExtendWith(SoftAssertionsExtension.class) class FetchApiTest extends PublicationTestBase { + @InjectSoftAssertions private SoftAssertions softly; private static String creatorAccessToken; private static String customerUib; @BeforeAll static void init() { customerUib = RestAssured.baseURI + "/customer/a228aba6-932b-4f53-b2de-31ad8daf9f8d"; - creatorAccessToken = CognitoLogin.login(UserFixtures.UIB_CREATOR.userId()).get("accessToken"); + creatorAccessToken = CognitoLogin.login(UIB_CREATOR.userId()).get("accessToken"); } @Test @@ -38,22 +42,27 @@ static void init() { void shouldReturnDraftPublicationWhenFetchedByIdentifier() { var identifier = setupDraftPublication(); - given() - .accept(ContentType.JSON) - .contentType(ContentType.JSON) - .when() - .get(publicationPath(identifier)) - .then() - .statusCode(200) - .body(IDENTIFIER_FIELD, equalTo(identifier)) - .body("status", equalTo("DRAFT")) - .appendRootPath(RESOURCE_OWNER_FIELD) - .body("owner", equalTo(UserFixtures.UIB_CREATOR.cristinId())) - .body("ownerAffiliation", equalTo(Affiliation.UIB.getValue())) - .detachRootPath(RESOURCE_OWNER_FIELD) - .appendRootPath("publisher") - .body("type", equalTo("Organization")) - .body("id", equalTo(customerUib)); + var response = + given() + .accept(ContentType.JSON) + .contentType(ContentType.JSON) + .when() + .get(publicationPath(identifier)) + .then() + .statusCode(200) + .extract() + .jsonPath(); + + softly.assertThat(response.getString(IDENTIFIER_FIELD)).isEqualTo(identifier); + softly.assertThat(response.getString("status")).isEqualTo("DRAFT"); + softly + .assertThat(response.getString(RESOURCE_OWNER_FIELD + ".owner")) + .isEqualTo(UIB_CREATOR.cristinId()); + softly + .assertThat(response.getString(RESOURCE_OWNER_FIELD + ".ownerAffiliation")) + .isEqualTo(UIB.getValue()); + softly.assertThat(response.getString("publisher.type")).isEqualTo("Organization"); + softly.assertThat(response.getString("publisher.id")).isEqualTo(customerUib); } @Test @@ -62,12 +71,18 @@ void shouldReturnDraftPublicationWhenFetchedByIdentifier() { void shouldReturnNotFoundWhenFetchingUnknownIdentifier() { var randomIdentifier = UUID.randomUUID().toString(); - givenAuthenticatedJsonRequest(creatorAccessToken) - .when() - .get(publicationPath(randomIdentifier)) - .then() - .statusCode(404) - .body("title", equalTo("Not Found")) - .body("detail", equalTo("Publication not found: " + randomIdentifier)); + var response = + givenAuthenticatedJsonRequest(creatorAccessToken) + .when() + .get(publicationPath(randomIdentifier)) + .then() + .statusCode(404) + .extract() + .jsonPath(); + + softly.assertThat(response.getString("title")).isEqualTo("Not Found"); + softly + .assertThat(response.getString("detail")) + .isEqualTo("Publication not found: " + randomIdentifier); } } diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/PublishApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/PublishApiTest.java index 923eb19..f1db294 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/PublishApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/PublishApiTest.java @@ -4,7 +4,6 @@ import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedRequest; import static no.sikt.nva.apitest.publication.PublicationFields.IDENTIFIER_FIELD; import static no.sikt.nva.apitest.publication.PublicationPaths.publishPublicationPath; -import static org.hamcrest.Matchers.equalTo; import io.qameta.allure.Description; import io.restassured.http.ContentType; @@ -15,15 +14,21 @@ import no.sikt.nva.apitest.base.CognitoLogin; import no.sikt.nva.apitest.base.UserFixtures; import no.sikt.nva.apitest.publication.PublicationTestBase; +import org.assertj.core.api.SoftAssertions; +import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; +import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; +@ExtendWith(SoftAssertionsExtension.class) @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class PublishApiTest extends PublicationTestBase { + @InjectSoftAssertions private SoftAssertions softly; private static String curatorAccessToken; @BeforeAll @@ -66,12 +71,16 @@ void shouldPublishDraftWhenRequestedByCurator(Category category) { void shouldRejectPublishWhenMetadataIsIncomplete() { var identifier = setupDraftPublication(); - givenAuthenticatedJsonRequest(curatorAccessToken) - .when() - .post(publishPublicationPath(identifier)) - .then() - .statusCode(400) - .body("title", equalTo("Bad Request")) - .body("detail", equalTo("Resource is not publishable!")); + var response = + givenAuthenticatedJsonRequest(curatorAccessToken) + .when() + .post(publishPublicationPath(identifier)) + .then() + .statusCode(400) + .extract() + .jsonPath(); + + softly.assertThat(response.getString("title")).isEqualTo("Bad Request"); + softly.assertThat(response.getString("detail")).isEqualTo("Resource is not publishable!"); } } diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CompleteApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CompleteApiTest.java index 1435be8..40a543f 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CompleteApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CompleteApiTest.java @@ -2,10 +2,9 @@ import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedJsonRequest; import static no.sikt.nva.apitest.base.Requests.givenUnauthenticatedJsonRequest; +import static no.sikt.nva.apitest.base.UserFixtures.UIB_CREATOR; +import static no.sikt.nva.apitest.publication.PublicationFields.IDENTIFIER_FIELD; import static no.sikt.nva.apitest.publication.PublicationPaths.fileUploadCompletePath; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; import io.qameta.allure.Description; import java.time.LocalDate; @@ -13,19 +12,20 @@ import java.time.format.DateTimeFormatter; import java.util.List; import java.util.Map; -import no.sikt.nva.apitest.base.UserFixtures; +import org.assertj.core.api.SoftAssertions; +import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; +import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(SoftAssertionsExtension.class) @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class CompleteApiTest extends FileUploadTestBase { - private static final String PARTS = "parts"; - private static final String TEXT_PLAIN = "text/plain"; - private static final String UPLOAD_ID = "uploadId"; - private static final String KEY = "key"; - private static final String TYPE = "type"; + @InjectSoftAssertions private SoftAssertions softly; + private static final String EXAMPLE_FILE = "example.txt"; private Map completePayload(String uploadId, String key, String eTag) { @@ -48,24 +48,31 @@ void shouldReturnFileMetaDataWhenCompleteUpload() { var today = LocalDate.now(ZoneId.systemDefault()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - givenAuthenticatedJsonRequest(getCreatorAccessToken()) - .body(completePayload(uploadId, key, eTag)) - .when() - .post(fileUploadCompletePath(identifier)) - .then() - .statusCode(200) - .body(TYPE, equalTo("UploadedFile")) - .body("identifier", notNullValue()) - .body("name", equalTo(EXAMPLE_FILE)) - .body("mimeType", equalTo(TEXT_PLAIN)) - .appendRootPath("rightsRetentionStrategy") - .body(TYPE, equalTo("NullRightsRetentionStrategy")) - .body("configuredType", equalTo("NullRightsRetentionStrategy")) - .detachRootPath("rightsRetentionStrategy") - .appendRootPath("uploadDetails") - .body(TYPE, equalTo("UserUploadDetails")) - .body("uploadedBy", equalTo(UserFixtures.UIB_CREATOR.cristinId())) - .body("uploadedDate", startsWith(today)); + var response = + givenAuthenticatedJsonRequest(getCreatorAccessToken()) + .body(completePayload(uploadId, key, eTag)) + .when() + .post(fileUploadCompletePath(identifier)) + .then() + .statusCode(200) + .extract() + .jsonPath(); + + softly.assertThat(response.getString(TYPE)).isEqualTo("UploadedFile"); + softly.assertThat(response.getString(IDENTIFIER_FIELD)).isNotNull(); + softly.assertThat(response.getString("name")).isEqualTo(EXAMPLE_FILE); + softly.assertThat(response.getString("mimeType")).isEqualTo(TEXT_PLAIN); + softly + .assertThat(response.getString("rightsRetentionStrategy.type")) + .isEqualTo("NullRightsRetentionStrategy"); + softly + .assertThat(response.getString("rightsRetentionStrategy.configuredType")) + .isEqualTo("NullRightsRetentionStrategy"); + softly.assertThat(response.getString("uploadDetails.type")).isEqualTo("UserUploadDetails"); + softly + .assertThat(response.getString("uploadDetails.uploadedBy")) + .isEqualTo(UIB_CREATOR.cristinId()); + softly.assertThat(response.getString("uploadDetails.uploadedDate")).startsWith(today); } @Test diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CreateApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CreateApiTest.java index 5c2dbc9..93fd5ed 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CreateApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/CreateApiTest.java @@ -3,16 +3,21 @@ import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedJsonRequest; import static no.sikt.nva.apitest.base.Requests.givenUnauthenticatedJsonRequest; import static no.sikt.nva.apitest.publication.PublicationPaths.fileUploadCreatePath; -import static org.hamcrest.Matchers.notNullValue; import io.qameta.allure.Description; import java.util.UUID; +import org.assertj.core.api.SoftAssertions; +import org.assertj.core.api.junit.jupiter.InjectSoftAssertions; +import org.assertj.core.api.junit.jupiter.SoftAssertionsExtension; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +@ExtendWith(SoftAssertionsExtension.class) @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class CreateApiTest extends FileUploadTestBase { + @InjectSoftAssertions private SoftAssertions softly; private static final String UPLOAD_ID = "uploadId"; private static final String KEY = "key"; @@ -22,14 +27,18 @@ class CreateApiTest extends FileUploadTestBase { void shouldReturnUploadIdAndKeyWhenCreatingFileUpload() { var identifier = setupDraftPublication(); - givenAuthenticatedJsonRequest(getCreatorAccessToken()) - .body(CREATE_PAYLOAD) - .when() - .post(fileUploadCreatePath(identifier)) - .then() - .statusCode(200) - .body(UPLOAD_ID, notNullValue()) - .body(KEY, notNullValue()); + var response = + givenAuthenticatedJsonRequest(getCreatorAccessToken()) + .body(CREATE_PAYLOAD) + .when() + .post(fileUploadCreatePath(identifier)) + .then() + .statusCode(200) + .extract() + .jsonPath(); + + softly.assertThat(response.getString(UPLOAD_ID)).isNotNull(); + softly.assertThat(response.getString(KEY)).isNotNull(); } @Test diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/FileUploadTestBase.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/FileUploadTestBase.java index 0c39a54..23302a5 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/FileUploadTestBase.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/FileUploadTestBase.java @@ -21,16 +21,16 @@ public class FileUploadTestBase extends PublicationTestBase { - private static final String URL = "url"; - private static final String PARTS = "parts"; - private static final String BODY = "body"; - private static final String NUMBER = "number"; + protected static final String URL = "url"; + protected static final String PARTS = "parts"; + protected static final String BODY = "body"; + protected static final String NUMBER = "number"; private static final String FILE_NAME = "filename"; - private static final String TEXT_PLAIN = "text/plain"; + protected static final String TEXT_PLAIN = "text/plain"; private static final String MIMETYPE = "mimetype"; - private static final String UPLOAD_ID = "uploadId"; - private static final String KEY = "key"; - private static final String TYPE = "type"; + protected static final String UPLOAD_ID = "uploadId"; + protected static final String KEY = "key"; + protected static final String TYPE = "type"; private static final String EXAMPLE_FILE = "example.txt"; diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PrepareApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PrepareApiTest.java index ca98f7a..eed0f97 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PrepareApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PrepareApiTest.java @@ -3,8 +3,7 @@ import static no.sikt.nva.apitest.base.Requests.givenAuthenticatedJsonRequest; import static no.sikt.nva.apitest.base.Requests.givenUnauthenticatedJsonRequest; import static no.sikt.nva.apitest.publication.PublicationPaths.fileUploadPreparePath; -import static org.hamcrest.Matchers.notNullValue; -import static org.hamcrest.Matchers.startsWith; +import static org.assertj.core.api.Assertions.assertThat; import io.qameta.allure.Description; import java.util.Map; @@ -16,33 +15,15 @@ @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class PrepareApiTest extends FileUploadTestBase { - private static final String URL = "url"; - private static final String BODY = "body"; - private static final String NUMBER = "number"; - private static final String UPLOAD_ID = "uploadId"; - private static final String KEY = "key"; - @Test @DisplayName("file-upload/prepare returns presigned URL") @Description("Calling file-upload/prepare should return presigned URL and status code 200 OK") void shouldReturnUploadUrlWhenPrepareFile() { var identifier = setupDraftPublication(); - var createResponse = createFileUpload(identifier); - - var uploadId = createResponse.jsonPath().getString(UPLOAD_ID); - var key = createResponse.jsonPath().getString(KEY); - var preparePayload = - Map.of(NUMBER, "1", UPLOAD_ID, uploadId, KEY, key, BODY, getFileAsString()); + var url = createAndPrepareFileUpload(identifier); - givenAuthenticatedJsonRequest(getCreatorAccessToken()) - .body(preparePayload) - .when() - .post(fileUploadPreparePath(identifier)) - .then() - .statusCode(200) - .body(URL, notNullValue()) - .body(URL, startsWith("https://nva-resource-storage")); + assertThat(url).startsWith("https://nva-resource-storage"); } @Test @@ -76,7 +57,7 @@ void shouldReturnUnauthorizedWhenPrepareWithoutAuthorization() { void shouldReturnNotFoundWhenPrepareWithWrongIdentifier() { var identifier = UUID.randomUUID().toString(); var preparePayload = - Map.of(NUMBER, "1", UPLOAD_ID, UPLOAD_ID, KEY, KEY, BODY, getFileAsString()); + Map.of(NUMBER, "1", UPLOAD_ID, "uploadId", KEY, "key", BODY, getFileAsString()); givenAuthenticatedJsonRequest(getCreatorAccessToken()) .body(preparePayload) diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java index 603850f..c38563f 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java @@ -1,14 +1,14 @@ package no.sikt.nva.apitest.publication.identifier.fileupload; import static no.sikt.nva.apitest.base.Requests.givenUnauthenticatedJsonRequest; -import static org.hamcrest.Matchers.notNullValue; +import static org.assertj.core.api.Assertions.assertThat; import io.qameta.allure.Description; import java.util.Map; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -@SuppressWarnings("PMD.UnitTestShouldIncludeAssert") +// @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class PresignedUrlApiTest extends FileUploadTestBase { @Test @@ -19,12 +19,16 @@ void shouldReturnEtagInHeaderWhenPostingToPresignedUrl() { var uploadUrl = createAndPrepareFileUpload(identifier); var presignedPayload = Map.of("data", getFileAsString()); - givenUnauthenticatedJsonRequest() - .body(presignedPayload) - .when() - .put(uploadUrl) - .then() - .statusCode(200) - .header("ETag", notNullValue()); + var etag = + givenUnauthenticatedJsonRequest() + .body(presignedPayload) + .when() + .put(uploadUrl) + .then() + .statusCode(200) + .extract() + .header("ETag"); + + assertThat(etag).isNotNull(); } } diff --git a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java index df6c59a..2c306fd 100644 --- a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java +++ b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java @@ -90,7 +90,7 @@ public String createChapterInAnthology( var entityDescription = createEntityDescription(title, category, contributorList); ((Map) ((Map) entityDescription.get("reference")).get("publicationContext")) - .put("id", RestAssured.baseURI + "/publication/" + anthologyIdentifier); + .put("id", RestAssured.baseURI + publicationPath(anthologyIdentifier)); responseBody.put(ENTITY_DESCRIPTION_FIELD, entityDescription); updatePublication(user, responseBody); @@ -177,9 +177,9 @@ public List> createContributors(List users) { List> contributors = new ArrayList<>(); final var sequence = new AtomicInteger(1); + var contributorJsonPath = loadJsonResource("/metadata/Contributor.json"); users.forEach( user -> { - var contributorJsonPath = loadJsonResource("/metadata/Contributor.json"); Map contributor = contributorJsonPath.getMap(""); contributor.put("sequence", String.valueOf(sequence.getAndIncrement())); Map identity = new HashMap<>(); @@ -197,8 +197,8 @@ public List> createContributors(List users) { affiliation.put("type", "Organization"); affiliation.put("id", userAffiliation); affiliations.add(affiliation); - contributor.put("affiliations", affiliations); }); + contributor.put("affiliations", affiliations); contributors.add(contributor); }); From 4e23aa8813cdfd178f784de22ce59daa29da9e7b Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Tue, 9 Jun 2026 10:48:43 +0200 Subject: [PATCH 07/10] Fixed logging --- .../sikt/nva/apitest/base/IntegrationTestBase.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java index f080c03..6e638f0 100644 --- a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java +++ b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java @@ -1,10 +1,12 @@ package no.sikt.nva.apitest.base; +import java.util.List; + +import org.junit.jupiter.api.BeforeAll; + import io.qameta.allure.restassured.AllureRestAssured; import io.restassured.RestAssured; import io.restassured.config.LogConfig; -import java.util.List; -import org.junit.jupiter.api.BeforeAll; public class IntegrationTestBase { @@ -15,10 +17,9 @@ static void configureRestAssured() { new AllureRestAssured() .setRequestTemplate("sanitized-http-request.ftl") .setResponseTemplate("sanitized-http-response.ftl")); - var logConfig = - LogConfig.logConfig() - // .enableLoggingOfRequestAndResponseIfValidationFails() - .blacklistHeaders(List.of("Authorization")); + var logConfig = LogConfig.logConfig() + .enableLoggingOfRequestAndResponseIfValidationFails() + .blacklistHeaders(List.of("Authorization")); RestAssured.config = RestAssured.config().logConfig(logConfig); } } From dc99d8307c51c77b801f57607f8c8a092ed638e8 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Tue, 9 Jun 2026 10:49:38 +0200 Subject: [PATCH 08/10] added .vscode/settings.json to .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 057139a..55d0b0f 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ build allure-results allure-report .vscode +.vscode/settings.json .idea package-lock.json From 33bb6add7f34b8685301598f51af75682322a1a1 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Tue, 9 Jun 2026 10:50:17 +0200 Subject: [PATCH 09/10] Delete .vscode/settings.json --- .vscode/settings.json | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 7b51e6b..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "java.compile.nullAnalysis.mode": "disabled", - "java.project.sourcePaths": [ - "bibtex/src/testFixtures" - ], - "java.configuration.updateBuildConfiguration": "automatic" -} \ No newline at end of file From 91d1ac8143550f34cb1fd9c9a54aa46e2f503a00 Mon Sep 17 00:00:00 2001 From: Eirik Nilsen Date: Tue, 9 Jun 2026 11:51:22 +0200 Subject: [PATCH 10/10] Fixes after PR --- .../sikt/nva/apitest/base/IntegrationTestBase.java | 13 ++++++------- .../apitest/search/resources/bibtex/BibTexTest.java | 3 +-- .../identifier/fileupload/PresignedUrlApiTest.java | 1 - .../java/no/sikt/nva/PublicationFactory.java | 6 +++--- 4 files changed, 10 insertions(+), 13 deletions(-) diff --git a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java index 6e638f0..1da8363 100644 --- a/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java +++ b/apitest-base/src/testFixtures/java/no/sikt/nva/apitest/base/IntegrationTestBase.java @@ -1,12 +1,10 @@ package no.sikt.nva.apitest.base; -import java.util.List; - -import org.junit.jupiter.api.BeforeAll; - import io.qameta.allure.restassured.AllureRestAssured; import io.restassured.RestAssured; import io.restassured.config.LogConfig; +import java.util.List; +import org.junit.jupiter.api.BeforeAll; public class IntegrationTestBase { @@ -17,9 +15,10 @@ static void configureRestAssured() { new AllureRestAssured() .setRequestTemplate("sanitized-http-request.ftl") .setResponseTemplate("sanitized-http-response.ftl")); - var logConfig = LogConfig.logConfig() - .enableLoggingOfRequestAndResponseIfValidationFails() - .blacklistHeaders(List.of("Authorization")); + var logConfig = + LogConfig.logConfig() + .enableLoggingOfRequestAndResponseIfValidationFails() + .blacklistHeaders(List.of("Authorization")); RestAssured.config = RestAssured.config().logConfig(logConfig); } } diff --git a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java index acc224e..47256f7 100644 --- a/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java +++ b/bibtex/src/test/java/no/sikt/nva/apitest/search/resources/bibtex/BibTexTest.java @@ -68,8 +68,7 @@ private String createTestPublication(Category category, String title) { category, List.of(UIB_CREATOR), UIB_PUBLISHING_CURATOR, - anthologyIdentifier, - List.of(UIB_CREATOR)); + anthologyIdentifier); } case DEGREE_PHD -> PUBLICATION_FACTORY.createPublishedPublication( diff --git a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java index c38563f..036f757 100644 --- a/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java +++ b/publication-api/src/test/java/no/sikt/nva/apitest/publication/identifier/fileupload/PresignedUrlApiTest.java @@ -8,7 +8,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -// @SuppressWarnings("PMD.UnitTestShouldIncludeAssert") class PresignedUrlApiTest extends FileUploadTestBase { @Test diff --git a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java index 2c306fd..e70349c 100644 --- a/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java +++ b/publication-api/src/testFixtures/java/no/sikt/nva/PublicationFactory.java @@ -78,8 +78,7 @@ public String createChapterInAnthology( Category category, List contributorList, User curator, - String anthologyIdentifier, - List anthologyEditorList) { + String anthologyIdentifier) { var createResponse = createDraftPublication(user); @@ -180,7 +179,8 @@ public List> createContributors(List users) { var contributorJsonPath = loadJsonResource("/metadata/Contributor.json"); users.forEach( user -> { - Map contributor = contributorJsonPath.getMap(""); + Map contributor = new HashMap<>(); + contributor.putAll(contributorJsonPath.getMap("")); contributor.put("sequence", String.valueOf(sequence.getAndIncrement())); Map identity = new HashMap<>(); identity.put("type", "Identity");