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")); + } +}