Skip to content

Commit c3bbcfa

Browse files
committed
HBX-3022: Create 5 Minute Tutorial for Gradle
- Create a functional test for the 5 Minute Tutorial Signed-off-by: Koen Aers <[email protected]>
1 parent 496b7d4 commit c3bbcfa

File tree

3 files changed

+170
-2
lines changed

3 files changed

+170
-2
lines changed

gradle/plugin/build.gradle

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,12 @@ repositories {
3737

3838
dependencies {
3939

40-
implementation "org.hibernate.tool:hibernate-tools-orm:$version"
40+
implementation "org.hibernate.tool:hibernate-tools-orm:$projectVersion"
4141

4242
testImplementation libs.junit.jupiter
4343

4444
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
45+
testRuntimeOnly "com.h2database:h2:$h2Version"
4546
}
4647

4748
rootProject.ext.set("gradle.publish.key", System.env.PLUGIN_PORTAL_USERNAME)
@@ -73,6 +74,8 @@ tasks.register('functionalTest', Test) {
7374
testClassesDirs = sourceSets.functionalTest.output.classesDirs
7475
classpath = sourceSets.functionalTest.runtimeClasspath
7576
useJUnitPlatform()
77+
environment("HIBERNATE_TOOLS_VERSION", projectVersion);
78+
environment("H2_VERSION", h2Version);
7679
}
7780

7881
gradlePlugin.testSourceSets.add(sourceSets.functionalTest)
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
package org.hibernate.tool.gradle.tutorial;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertFalse;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import java.io.File;
8+
import java.nio.file.Files;
9+
import java.sql.Connection;
10+
import java.sql.DriverManager;
11+
import java.sql.ResultSet;
12+
import java.sql.Statement;
13+
import java.util.List;
14+
15+
import org.gradle.testkit.runner.BuildResult;
16+
import org.gradle.testkit.runner.GradleRunner;
17+
import org.junit.jupiter.api.Test;
18+
import org.junit.jupiter.api.io.TempDir;
19+
20+
public class TutorialTest {
21+
22+
private static final List<String> GRADLE_INIT_PROJECT_ARGUMENTS = List.of(
23+
"init", "--type", "java-application", "--dsl", "groovy", "--test-framework", "junit-jupiter", "--java-version", "17");
24+
25+
@TempDir
26+
private File projectDir;
27+
28+
private File gradlePropertiesFile;
29+
private File gradleBuildFile;
30+
private File databaseFile;
31+
32+
@Test
33+
public void testTutorial() throws Exception {
34+
assertTrue(projectDir.exists());
35+
createGradleProject();
36+
editGradleBuildFile();
37+
editGradlePropertiesFile();
38+
createDatabase();
39+
createHibernatePropertiesFile();
40+
verifyDatabase();
41+
executeGenerateJavaTask();
42+
verifyProject();
43+
}
44+
45+
private void verifyDatabase() throws Exception {
46+
Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
47+
ResultSet resultSet = connection.createStatement().executeQuery("select * from PERSON");
48+
assertTrue(resultSet.next());
49+
assertEquals(1, resultSet.getInt(1));
50+
assertEquals("foo", resultSet.getString(2));
51+
}
52+
53+
private void createGradleProject() throws Exception {
54+
GradleRunner runner = GradleRunner.create();
55+
runner.withArguments(GRADLE_INIT_PROJECT_ARGUMENTS);
56+
runner.forwardOutput();
57+
runner.withProjectDir(projectDir);
58+
BuildResult buildResult = runner.build();
59+
assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
60+
gradlePropertiesFile = new File(projectDir, "gradle.properties");
61+
assertTrue(gradlePropertiesFile.exists());
62+
assertTrue(gradlePropertiesFile.isFile());
63+
File appDir = new File(projectDir, "app");
64+
assertTrue(appDir.exists());
65+
assertTrue(appDir.isDirectory());
66+
gradleBuildFile = new File(appDir, "build.gradle");
67+
assertTrue(gradleBuildFile.exists());
68+
assertTrue(gradleBuildFile.isFile());
69+
databaseFile = new File(projectDir, "database/test.mv.db");
70+
assertFalse(databaseFile.exists());
71+
}
72+
73+
private void editGradleBuildFile() throws Exception {
74+
StringBuffer gradleBuildFileContents = new StringBuffer(
75+
new String(Files.readAllBytes(gradleBuildFile.toPath())));
76+
addHibernateToolsPluginLine(gradleBuildFileContents);
77+
addH2DatabaseDependencyLine(gradleBuildFileContents);
78+
Files.writeString(gradleBuildFile.toPath(), gradleBuildFileContents.toString());
79+
}
80+
81+
private void editGradlePropertiesFile() throws Exception {
82+
// The Hibernate Tools Gradle plugin does not support the configuration cache.
83+
// As this is enabled by default when initializing a new Gradle project, the setting needs to be commented out
84+
// in the gradle.properties file.
85+
StringBuffer gradlePropertiesFileContents = new StringBuffer(
86+
new String(Files.readAllBytes(gradlePropertiesFile.toPath())));
87+
int pos = gradlePropertiesFileContents.indexOf("org.gradle.configuration-cache=true");
88+
gradlePropertiesFileContents.insert(pos, "#");
89+
Files.writeString(gradlePropertiesFile.toPath(), gradlePropertiesFileContents.toString());
90+
}
91+
92+
private void createDatabase() throws Exception {
93+
String CREATE_PERSON_TABLE = "create table PERSON (ID int not null, NAME varchar(20), primary key (ID))";
94+
Connection connection = DriverManager.getConnection(constructJdbcConnectionString());
95+
Statement statement = connection.createStatement();
96+
statement.execute(CREATE_PERSON_TABLE);
97+
statement.execute("insert into PERSON values (1, 'foo')");
98+
statement.close();
99+
connection.close();
100+
assertTrue(databaseFile.exists());
101+
assertTrue(databaseFile.isFile());
102+
}
103+
104+
private void createHibernatePropertiesFile() throws Exception {
105+
File hibernatePropertiesFile = new File(projectDir, "app/src/main/resources/hibernate.properties");
106+
StringBuffer hibernatePropertiesFileContents = new StringBuffer();
107+
hibernatePropertiesFileContents
108+
.append("hibernate.connection.driver_class=org.h2.Driver\n")
109+
.append("hibernate.connection.url=" + constructJdbcConnectionString() + "\n")
110+
.append("hibernate.connection.username=\n")
111+
.append("hibernate.connection.password=\n")
112+
.append("hibernate.default_catalog=TEST\n")
113+
.append("hibernate.default_schema=PUBLIC\n");
114+
Files.writeString(hibernatePropertiesFile.toPath(), hibernatePropertiesFileContents.toString());
115+
assertTrue(hibernatePropertiesFile.exists());
116+
System.out.println(hibernatePropertiesFileContents.toString());
117+
}
118+
119+
private void executeGenerateJavaTask() throws Exception {
120+
GradleRunner gradleRunner = GradleRunner.create();
121+
gradleRunner.forwardOutput();
122+
gradleRunner.withProjectDir(projectDir);
123+
gradleRunner.withPluginClasspath();
124+
gradleRunner.withArguments("generateJava");
125+
BuildResult buildResult = gradleRunner.build();
126+
assertTrue(buildResult.getOutput().contains("BUILD SUCCESSFUL"));
127+
}
128+
129+
private void verifyProject() {
130+
File generatedOutputFolder = new File(projectDir, "app/generated-sources");
131+
assertTrue(generatedOutputFolder.exists());
132+
assertTrue(generatedOutputFolder.isDirectory());
133+
assertEquals(1, generatedOutputFolder.list().length);
134+
File generatedPersonJavaFile = new File(generatedOutputFolder, "Person.java");
135+
assertTrue(generatedPersonJavaFile.exists());
136+
assertTrue(generatedPersonJavaFile.isFile());
137+
}
138+
139+
private void addHibernateToolsPluginLine(StringBuffer gradleBuildFileContents) {
140+
int pos = gradleBuildFileContents.indexOf("plugins {");
141+
pos = gradleBuildFileContents.indexOf("}", pos);
142+
gradleBuildFileContents.insert(pos, constructHibernateToolsPluginLine() + "\n");
143+
}
144+
145+
private void addH2DatabaseDependencyLine(StringBuffer gradleBuildFileContents) {
146+
int pos = gradleBuildFileContents.indexOf("dependencies {");
147+
pos = gradleBuildFileContents.indexOf("}", pos);
148+
gradleBuildFileContents.insert(pos, constructH2DatabaseDependencyLine() + "\n");
149+
}
150+
151+
private String constructJdbcConnectionString() {
152+
return "jdbc:h2:" + projectDir.getAbsolutePath() + "/database/test;AUTO_SERVER=TRUE";
153+
}
154+
155+
private String constructHibernateToolsPluginLine() {
156+
return " id 'org.hibernate.tool.hibernate-tools-gradle' version '"
157+
+ System.getenv("HIBERNATE_TOOLS_VERSION") + "'";
158+
}
159+
160+
private String constructH2DatabaseDependencyLine() {
161+
return " implementation 'com.h2database:h2:" + System.getenv("H2_VERSION") + "'";
162+
}
163+
164+
}

gradle/pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@
7474
<arguments>
7575
<argument>clean</argument>
7676
<argument>build</argument>
77-
<argument>-Pversion=${project.version}</argument>
77+
<argument>-PprojectVersion=${project.version}</argument>
78+
<argument>-Ph2Version=${h2.version}</argument>
7879
<argument>-Dmaven.repo.local=${settings.localRepository}</argument>
7980
</arguments>
8081
</configuration>

0 commit comments

Comments
 (0)