diff --git a/app.json b/app.json
index a4b770d6f..e6b97de45 100644
--- a/app.json
+++ b/app.json
@@ -1,5 +1,10 @@
{
"name": "Start on Heroku: Java",
"description": "A barebones Java app, which can easily be deployed to Heroku.",
- "addons": ["heroku-postgresql"]
+ "addons": ["heroku-postgresql"],
+ "environments": {
+ "test": {
+ "addons": ["heroku-postgresql:in-dyno"]
+ }
+ }
}
diff --git a/pom.xml b/pom.xml
index c67bfe787..bb9b5ea35 100644
--- a/pom.xml
+++ b/pom.xml
@@ -41,6 +41,16 @@
org.postgresql
postgresql
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-webmvc-test
+ test
+
diff --git a/src/test/java/com/heroku/java/GettingStartedApplicationTest.java b/src/test/java/com/heroku/java/GettingStartedApplicationTest.java
new file mode 100644
index 000000000..35b1e8fd0
--- /dev/null
+++ b/src/test/java/com/heroku/java/GettingStartedApplicationTest.java
@@ -0,0 +1,62 @@
+package com.heroku.java;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest;
+import org.springframework.test.context.bean.override.mockito.MockitoBean;
+import org.springframework.test.web.servlet.MockMvc;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.time.Instant;
+
+import static org.mockito.Mockito.when;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
+
+@WebMvcTest(GettingStartedApplication.class)
+class GettingStartedApplicationTest {
+
+ @Autowired
+ private MockMvc mockMvc;
+
+ @MockitoBean
+ private DataSource dataSource;
+
+ @Test
+ void indexReturnsOk() throws Exception {
+ mockMvc.perform(get("/"))
+ .andExpect(status().isOk())
+ .andExpect(view().name("index"));
+ }
+
+ @Test
+ void databaseReturnsRecords() throws Exception {
+ Connection connection = org.mockito.Mockito.mock(Connection.class);
+ Statement statement = org.mockito.Mockito.mock(Statement.class);
+ ResultSet resultSet = org.mockito.Mockito.mock(ResultSet.class);
+
+ when(dataSource.getConnection()).thenReturn(connection);
+ when(connection.createStatement()).thenReturn(statement);
+ when(statement.executeQuery("SELECT tick FROM ticks")).thenReturn(resultSet);
+ when(resultSet.next()).thenReturn(true, false);
+ when(resultSet.getTimestamp("tick")).thenReturn(Timestamp.from(Instant.parse("2024-01-01T00:00:00Z")));
+
+ mockMvc.perform(get("/database"))
+ .andExpect(status().isOk())
+ .andExpect(view().name("database"))
+ .andExpect(model().attributeExists("records"));
+ }
+
+ @Test
+ void databaseReturnsErrorOnFailure() throws Exception {
+ when(dataSource.getConnection()).thenThrow(new RuntimeException("Connection refused"));
+
+ mockMvc.perform(get("/database"))
+ .andExpect(view().name("error"))
+ .andExpect(model().attribute("message", "Connection refused"));
+ }
+}