Skip to content

Commit 67b7a1f

Browse files
committed
Test no entity / no datasource cases with Hibernate with Panache
1 parent 4811438 commit 67b7a1f

File tree

9 files changed

+204
-4
lines changed

9 files changed

+204
-4
lines changed

extensions/hibernate-reactive/deployment/src/test/java/io/quarkus/hibernate/reactive/config/NoDatasourceTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

5-
import io.quarkus.arc.Arc;
6-
import io.quarkus.arc.InjectableInstance;
75
import jakarta.inject.Inject;
6+
87
import org.hibernate.reactive.mutiny.Mutiny;
98
import org.junit.jupiter.api.Test;
109
import org.junit.jupiter.api.extension.RegisterExtension;
1110

11+
import io.quarkus.arc.InjectableInstance;
1212
import io.quarkus.test.QuarkusUnitTest;
1313

1414
public class NoDatasourceTest {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.quarkus.hibernate.orm.panache.deployment.test;
1+
package io.quarkus.hibernate.orm.panache.deployment.test.config;
22

33
import org.jboss.shrinkwrap.api.ShrinkWrap;
44
import org.jboss.shrinkwrap.api.spec.JavaArchive;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.quarkus.hibernate.orm.panache.deployment.test.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.assertj.core.api.Assertions;
6+
import org.junit.jupiter.api.Test;
7+
import org.junit.jupiter.api.extension.RegisterExtension;
8+
9+
import io.quarkus.hibernate.orm.panache.deployment.test.MyEntity;
10+
import io.quarkus.test.QuarkusUnitTest;
11+
12+
public class NoDatasourceTest {
13+
14+
@RegisterExtension
15+
static QuarkusUnitTest runner = new QuarkusUnitTest()
16+
.withApplicationRoot((jar) -> jar
17+
.addClass(MyEntity.class))
18+
// Ideally we would not add quarkus-jdbc-h2 to the classpath and there _really_ wouldn't be a datasource,
19+
// but that's inconvenient given our testing setup,
20+
// so we'll just disable the implicit datasource.
21+
.overrideConfigKey("quarkus.datasource.jdbc", "false")
22+
.assertException(t -> assertThat(t)
23+
.hasMessageContainingAll(
24+
"Persistence unit '<default>' defines entities [" + MyEntity.class.getName()
25+
+ "], but its datasource '<default>' cannot be found",
26+
"Datasource '<default>' is not configured.",
27+
"To solve this, configure datasource '<default>'",
28+
"Refer to https://quarkus.io/guides/datasource for guidance.",
29+
"Alternatively, disable Hibernate ORM by setting 'quarkus.hibernate-orm.enabled=false', and the entities will be ignored"));
30+
31+
@Test
32+
public void test() {
33+
Assertions.fail("Startup should have failed");
34+
}
35+
36+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package io.quarkus.hibernate.orm.panache.deployment.test.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import jakarta.transaction.Transactional;
6+
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.RegisterExtension;
9+
10+
import io.quarkus.hibernate.orm.panache.Panache;
11+
import io.quarkus.test.QuarkusUnitTest;
12+
13+
public class NoEntitiesNoDatasourceTest {
14+
15+
@RegisterExtension
16+
static QuarkusUnitTest runner = new QuarkusUnitTest()
17+
.withEmptyApplication()
18+
// Ideally we would not add quarkus-jdbc-h2 to the classpath and there _really_ wouldn't be a datasource,
19+
// but that's inconvenient given our testing setup,
20+
// so we'll just disable the implicit datasource.
21+
.overrideConfigKey("quarkus.datasource.jdbc", "false");
22+
23+
// Test for https://github.com/quarkusio/quarkus/issues/50247
24+
// When having no entities, no configuration, and no datasource,
25+
// we should still be able to start the application.
26+
@Test
27+
@Transactional
28+
public void test() {
29+
// But Hibernate ORM should be disabled, so its beans should not be there.
30+
assertThat(Panache.getSession()).isNull();
31+
}
32+
33+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.quarkus.hibernate.orm.panache.deployment.test.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import jakarta.transaction.Transactional;
6+
7+
import org.junit.jupiter.api.Test;
8+
import org.junit.jupiter.api.extension.RegisterExtension;
9+
10+
import io.quarkus.hibernate.orm.panache.Panache;
11+
import io.quarkus.test.QuarkusUnitTest;
12+
13+
/**
14+
* Test that a persistence unit without any entities does get started,
15+
* and can be used, be it only for native queries,
16+
* as long as a datasource is present.
17+
*/
18+
public class NoEntitiesTest {
19+
20+
@RegisterExtension
21+
static QuarkusUnitTest runner = new QuarkusUnitTest()
22+
.withEmptyApplication();
23+
24+
@Test
25+
@Transactional
26+
public void testSessionNativeQuery() {
27+
assertThat(Panache.getSession().createNativeQuery("select 1", Long.class).getResultList())
28+
.containsExactly(1L);
29+
}
30+
31+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package io.quarkus.hibernate.reactive.panache.test;
1+
package io.quarkus.hibernate.reactive.panache.test.config;
22

33
import org.jboss.shrinkwrap.api.ShrinkWrap;
44
import org.jboss.shrinkwrap.api.spec.JavaArchive;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package io.quarkus.hibernate.reactive.panache.test.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import jakarta.inject.Inject;
6+
7+
import org.hibernate.reactive.mutiny.Mutiny;
8+
import org.junit.jupiter.api.Test;
9+
import org.junit.jupiter.api.extension.RegisterExtension;
10+
11+
import io.quarkus.arc.InjectableInstance;
12+
import io.quarkus.hibernate.reactive.panache.test.MyEntity;
13+
import io.quarkus.test.QuarkusUnitTest;
14+
15+
public class NoDatasourceTest {
16+
17+
@RegisterExtension
18+
static QuarkusUnitTest runner = new QuarkusUnitTest()
19+
.withApplicationRoot((jar) -> jar
20+
.addClass(MyEntity.class))
21+
// Ideally we would not add quarkus-reactive-pg-client to the classpath and there _really_ wouldn't be a datasource,
22+
// but that's inconvenient given our testing setup,
23+
// so we'll just disable the implicit datasource.
24+
.overrideConfigKey("quarkus.datasource.reactive", "false");
25+
26+
@Inject
27+
InjectableInstance<Mutiny.SessionFactory> sessionFactory;
28+
29+
@Test
30+
public void test() {
31+
// Unlike Hibernate ORM, Hibernate Reactive will silently disable itself if the default datasource is missing, even if there are entities.
32+
// We may want to revisit that someday, but it's not easy to do without deeper interaction between the Hibernate ORM and Reactive extensions.
33+
assertThat(sessionFactory.isUnsatisfied()).isTrue();
34+
}
35+
36+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.quarkus.hibernate.reactive.panache.test.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.hibernate.reactive.panache.Panache;
9+
import io.quarkus.test.QuarkusUnitTest;
10+
import io.quarkus.test.vertx.RunOnVertxContext;
11+
12+
public class NoEntitiesNoDatasourceTest {
13+
14+
@RegisterExtension
15+
static QuarkusUnitTest runner = new QuarkusUnitTest()
16+
.withEmptyApplication()
17+
// Ideally we would not add quarkus-reactive-pg-client to the classpath and there _really_ wouldn't be a datasource,
18+
// but that's inconvenient given our testing setup,
19+
// so we'll just disable the implicit datasource.
20+
.overrideConfigKey("quarkus.datasource.reactive", "false");
21+
22+
// When having no entities, no configuration, and no datasource,
23+
// we should still be able to start the application.
24+
@Test
25+
@RunOnVertxContext
26+
public void test() {
27+
// ... but any attempt to use Panache at runtime should fail.
28+
assertThatThrownBy(() -> Panache.getSession())
29+
.hasMessage("Mutiny.SessionFactory bean not found");
30+
}
31+
32+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package io.quarkus.hibernate.reactive.panache.test.config;
2+
3+
import static org.assertj.core.api.Assertions.assertThat;
4+
5+
import org.junit.jupiter.api.Test;
6+
import org.junit.jupiter.api.extension.RegisterExtension;
7+
8+
import io.quarkus.hibernate.reactive.panache.Panache;
9+
import io.quarkus.test.QuarkusUnitTest;
10+
import io.quarkus.test.vertx.RunOnVertxContext;
11+
import io.quarkus.test.vertx.UniAsserter;
12+
13+
/**
14+
* Test that a persistence unit without any entities does get started,
15+
* and can be used, be it only for native queries,
16+
* as long as a datasource is present.
17+
*/
18+
public class NoEntitiesTest {
19+
20+
@RegisterExtension
21+
static QuarkusUnitTest runner = new QuarkusUnitTest()
22+
.withEmptyApplication();
23+
24+
@Test
25+
@RunOnVertxContext
26+
public void testSessionNativeQuery(UniAsserter asserter) {
27+
asserter.assertThat(() -> Panache.withTransaction(
28+
() -> Panache.getSession().chain(session -> session.createNativeQuery("select 1", Long.class).getResultList())),
29+
result -> assertThat(result).containsExactly(1L));
30+
}
31+
32+
}

0 commit comments

Comments
 (0)