From ab0ff54ae78389128ba489ccc873d7d8e4f072d2 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Thu, 8 Aug 2024 11:56:44 +0200 Subject: [PATCH] Add test for fragments API See gh-249 --- .../data/jpa/DataJpaApplicationAotTests.java | 7 +++++ .../extension/DefaultRepositoryExtension.java | 30 +++++++++++++++++++ .../jpa/extension/RepositoryExtension.java | 22 ++++++++++++++ .../com/example/data/jpa/BookRepository.java | 3 +- .../example/data/jpa/TransactionalRunner.java | 5 ++++ .../main/resources/META-INF/spring.factories | 1 + 6 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 data/data-jpa/src/main/java/com/acme/data/jpa/extension/DefaultRepositoryExtension.java create mode 100644 data/data-jpa/src/main/java/com/acme/data/jpa/extension/RepositoryExtension.java create mode 100644 data/data-jpa/src/main/resources/META-INF/spring.factories diff --git a/data/data-jpa/src/appTest/java/com/example/data/jpa/DataJpaApplicationAotTests.java b/data/data-jpa/src/appTest/java/com/example/data/jpa/DataJpaApplicationAotTests.java index 4832f562..a53cd807 100644 --- a/data/data-jpa/src/appTest/java/com/example/data/jpa/DataJpaApplicationAotTests.java +++ b/data/data-jpa/src/appTest/java/com/example/data/jpa/DataJpaApplicationAotTests.java @@ -116,4 +116,11 @@ class DataJpaApplicationAotTests { }); } + @Test + void fragmentsApi(AssertableOutput output) { + Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> { + assertThat(output).hasSingleLineContaining("fragmentsApi(): RepositoryExtension says hello to Book"); + }); + } + } diff --git a/data/data-jpa/src/main/java/com/acme/data/jpa/extension/DefaultRepositoryExtension.java b/data/data-jpa/src/main/java/com/acme/data/jpa/extension/DefaultRepositoryExtension.java new file mode 100644 index 00000000..f4697b19 --- /dev/null +++ b/data/data-jpa/src/main/java/com/acme/data/jpa/extension/DefaultRepositoryExtension.java @@ -0,0 +1,30 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.acme.data.jpa.extension; + +import org.springframework.data.repository.core.RepositoryMethodContext; +import org.springframework.data.repository.core.support.RepositoryMetadataAccess; + +class DefaultRepositoryExtension implements RepositoryExtension, RepositoryMetadataAccess { + + @Override + public String extensionMethod(String arg) { + + return "RepositoryExtension says %s to %s".formatted(arg, + RepositoryMethodContext.getContext().getMetadata().getDomainType().getSimpleName()); + } + +} diff --git a/data/data-jpa/src/main/java/com/acme/data/jpa/extension/RepositoryExtension.java b/data/data-jpa/src/main/java/com/acme/data/jpa/extension/RepositoryExtension.java new file mode 100644 index 00000000..bcca9243 --- /dev/null +++ b/data/data-jpa/src/main/java/com/acme/data/jpa/extension/RepositoryExtension.java @@ -0,0 +1,22 @@ +/* + * Copyright 2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.acme.data.jpa.extension; + +public interface RepositoryExtension { + + String extensionMethod(String arg); + +} diff --git a/data/data-jpa/src/main/java/com/example/data/jpa/BookRepository.java b/data/data-jpa/src/main/java/com/example/data/jpa/BookRepository.java index fb33e588..6e9ab601 100644 --- a/data/data-jpa/src/main/java/com/example/data/jpa/BookRepository.java +++ b/data/data-jpa/src/main/java/com/example/data/jpa/BookRepository.java @@ -15,12 +15,13 @@ */ package com.example.data.jpa; +import com.acme.data.jpa.extension.RepositoryExtension; import com.example.data.jpa.model.Book; import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.ListCrudRepository; -public interface BookRepository extends ListCrudRepository { +public interface BookRepository extends ListCrudRepository, RepositoryExtension { @EntityGraph(attributePaths = "authors") @Query("SELECT b FROM Book b WHERE b.title = :title") diff --git a/data/data-jpa/src/main/java/com/example/data/jpa/TransactionalRunner.java b/data/data-jpa/src/main/java/com/example/data/jpa/TransactionalRunner.java index dce41b64..9929c5b5 100644 --- a/data/data-jpa/src/main/java/com/example/data/jpa/TransactionalRunner.java +++ b/data/data-jpa/src/main/java/com/example/data/jpa/TransactionalRunner.java @@ -42,6 +42,7 @@ class TransactionalRunner implements CommandLineRunner { deleteAll(); entityGraph(); insertPublishers(); // uses AbstractPersistable + fragmentsApi(); } private void deleteAll() { @@ -119,4 +120,8 @@ class TransactionalRunner implements CommandLineRunner { return List.of(publisher1); } + private void fragmentsApi() { + System.out.printf("fragmentsApi(): %s%n", this.bookRepository.extensionMethod("hello")); + } + } diff --git a/data/data-jpa/src/main/resources/META-INF/spring.factories b/data/data-jpa/src/main/resources/META-INF/spring.factories new file mode 100644 index 00000000..bfed7a6c --- /dev/null +++ b/data/data-jpa/src/main/resources/META-INF/spring.factories @@ -0,0 +1 @@ +com.acme.data.jpa.extension.RepositoryExtension=com.acme.data.jpa.extension.DefaultRepositoryExtension