BAEL-3557: Completed a simple web application in spring boot and groovy (#9152)
Co-authored-by: Vikas Ramsingh Rajput <vikas.rajput@crownconsult.com>
This commit is contained in:
parent
8f0846bae9
commit
8da24b4abe
|
@ -0,0 +1,83 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||||
|
|
||||||
|
<modelVersion>4.0.0</modelVersion>
|
||||||
|
<groupId>com.baeldung.app</groupId>
|
||||||
|
<artifactId>spring-boot-groovy</artifactId>
|
||||||
|
<name>spring-boot-groovy</name>
|
||||||
|
<packaging>war</packaging>
|
||||||
|
<description>Spring Boot Todo Application with Groovy</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>com.baeldung</groupId>
|
||||||
|
<artifactId>parent-boot-2</artifactId>
|
||||||
|
<version>0.0.1-SNAPSHOT</version>
|
||||||
|
<relativePath>../parent-boot-2</relativePath>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.codehaus.groovy</groupId>
|
||||||
|
<artifactId>groovy</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.h2database</groupId>
|
||||||
|
<artifactId>h2</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.bytebuddy</groupId>
|
||||||
|
<artifactId>byte-buddy-dep</artifactId>
|
||||||
|
<version>1.10.9</version>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.gmavenplus</groupId>
|
||||||
|
<artifactId>gmavenplus-plugin</artifactId>
|
||||||
|
<version>1.9.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<goals>
|
||||||
|
<goal>addSources</goal>
|
||||||
|
<goal>addTestSources</goal>
|
||||||
|
<goal>generateStubs</goal>
|
||||||
|
<goal>compile</goal>
|
||||||
|
<goal>generateTestStubs</goal>
|
||||||
|
<goal>compileTests</goal>
|
||||||
|
<goal>removeStubs</goal>
|
||||||
|
<goal>removeTestStubs</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<start-class>com.baeldung.app.SpringBootGroovyApplication</start-class>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
</project>
|
|
@ -0,0 +1,13 @@
|
||||||
|
package com.baeldung.app
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication
|
||||||
|
|
||||||
|
import com.baeldung.app.SpringBootGroovyApplication
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
class SpringBootGroovyApplication {
|
||||||
|
static void main(String[] args) {
|
||||||
|
SpringApplication.run SpringBootGroovyApplication, args
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,48 @@
|
||||||
|
package com.baeldung.app.controller
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.web.bind.annotation.DeleteMapping
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable
|
||||||
|
import org.springframework.web.bind.annotation.PostMapping
|
||||||
|
import org.springframework.web.bind.annotation.PutMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestBody
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping
|
||||||
|
import org.springframework.web.bind.annotation.RequestMethod
|
||||||
|
import org.springframework.web.bind.annotation.RestController
|
||||||
|
|
||||||
|
import com.baeldung.app.entity.Todo
|
||||||
|
import com.baeldung.app.service.TodoService
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@RequestMapping('todo')
|
||||||
|
public class TodoController {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
TodoService todoService
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
List<Todo> getAllTodoList(){
|
||||||
|
todoService.findAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping
|
||||||
|
Todo saveTodo(@RequestBody Todo todo){
|
||||||
|
todoService.saveTodo todo
|
||||||
|
}
|
||||||
|
|
||||||
|
@PutMapping
|
||||||
|
Todo updateTodo(@RequestBody Todo todo){
|
||||||
|
todoService.updateTodo todo
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping('/{todoId}')
|
||||||
|
deleteTodo(@PathVariable Integer todoId){
|
||||||
|
todoService.deleteTodo todoId
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping('/{todoId}')
|
||||||
|
Todo getTodoById(@PathVariable Integer todoId){
|
||||||
|
todoService.findById todoId
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package com.baeldung.app.entity
|
||||||
|
|
||||||
|
import javax.persistence.Column
|
||||||
|
import javax.persistence.Entity
|
||||||
|
import javax.persistence.GeneratedValue
|
||||||
|
import javax.persistence.GenerationType
|
||||||
|
import javax.persistence.Id
|
||||||
|
import javax.persistence.Table
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = 'todo')
|
||||||
|
class Todo {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
Integer id
|
||||||
|
|
||||||
|
@Column
|
||||||
|
String task
|
||||||
|
|
||||||
|
@Column
|
||||||
|
Boolean isCompleted
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package com.baeldung.app.repository
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository
|
||||||
|
import org.springframework.stereotype.Repository
|
||||||
|
|
||||||
|
import com.baeldung.app.entity.Todo
|
||||||
|
|
||||||
|
@Repository
|
||||||
|
interface TodoRepository extends JpaRepository<Todo, Integer> {}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package com.baeldung.app.service
|
||||||
|
|
||||||
|
import com.baeldung.app.entity.Todo
|
||||||
|
|
||||||
|
interface TodoService {
|
||||||
|
|
||||||
|
List<Todo> findAll()
|
||||||
|
|
||||||
|
Todo findById(Integer todoId)
|
||||||
|
|
||||||
|
Todo saveTodo(Todo todo)
|
||||||
|
|
||||||
|
Todo updateTodo(Todo todo)
|
||||||
|
|
||||||
|
Todo deleteTodo(Integer todoId)
|
||||||
|
}
|
|
@ -0,0 +1,40 @@
|
||||||
|
package com.baeldung.app.service.impl
|
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired
|
||||||
|
import org.springframework.stereotype.Service
|
||||||
|
|
||||||
|
import com.baeldung.app.entity.Todo
|
||||||
|
import com.baeldung.app.repository.TodoRepository
|
||||||
|
import com.baeldung.app.service.TodoService
|
||||||
|
|
||||||
|
@Service
|
||||||
|
class TodoServiceImpl implements TodoService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
TodoRepository todoRepository
|
||||||
|
|
||||||
|
@Override
|
||||||
|
List<Todo> findAll() {
|
||||||
|
todoRepository.findAll()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Todo findById(Integer todoId) {
|
||||||
|
todoRepository.findById todoId get()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Todo saveTodo(Todo todo){
|
||||||
|
todoRepository.save todo
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Todo updateTodo(Todo todo){
|
||||||
|
todoRepository.save todo
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
Todo deleteTodo(Integer todoId){
|
||||||
|
todoRepository.deleteById todoId
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
spring.datasource.url=jdbc:h2:mem:todo
|
||||||
|
spring.datasource.driverClassName=org.h2.Driver
|
||||||
|
spring.datasource.username=sa
|
||||||
|
spring.datasource.password=sa
|
||||||
|
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
|
|
@ -0,0 +1,97 @@
|
||||||
|
package com.baeldung.app
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue
|
||||||
|
|
||||||
|
import org.junit.BeforeClass
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest
|
||||||
|
import org.springframework.http.HttpStatus
|
||||||
|
import org.springframework.http.MediaType
|
||||||
|
import org.springframework.test.context.event.annotation.BeforeTestClass
|
||||||
|
import org.springframework.test.context.junit4.SpringRunner
|
||||||
|
|
||||||
|
import com.baeldung.app.entity.Todo
|
||||||
|
|
||||||
|
import io.restassured.RestAssured
|
||||||
|
import io.restassured.response.Response
|
||||||
|
|
||||||
|
class TodoAppUnitTest {
|
||||||
|
static API_ROOT = 'http://localhost:8081/todo'
|
||||||
|
static readingTodoId
|
||||||
|
static writingTodoId
|
||||||
|
|
||||||
|
@BeforeClass
|
||||||
|
static void populateDummyData() {
|
||||||
|
Todo readingTodo = new Todo(task: 'Reading', isCompleted: false)
|
||||||
|
Todo writingTodo = new Todo(task: 'Writing', isCompleted: false)
|
||||||
|
|
||||||
|
final Response readingResponse =
|
||||||
|
RestAssured.given()
|
||||||
|
.contentType(MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
.body(readingTodo).post(API_ROOT)
|
||||||
|
|
||||||
|
Todo cookingTodoResponse = readingResponse.as Todo.class
|
||||||
|
readingTodoId = cookingTodoResponse.getId()
|
||||||
|
|
||||||
|
final Response writingResponse =
|
||||||
|
RestAssured.given()
|
||||||
|
.contentType(MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
.body(writingTodo).post(API_ROOT)
|
||||||
|
|
||||||
|
Todo writingTodoResponse = writingResponse.as Todo.class
|
||||||
|
writingTodoId = writingTodoResponse.getId()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenGetAllTodoList_thenOk(){
|
||||||
|
final Response response = RestAssured.get(API_ROOT)
|
||||||
|
|
||||||
|
assertEquals HttpStatus.OK.value(),response.getStatusCode()
|
||||||
|
assertTrue response.as(List.class).size() > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenGetTodoById_thenOk(){
|
||||||
|
final Response response =
|
||||||
|
RestAssured.get("$API_ROOT/$readingTodoId")
|
||||||
|
|
||||||
|
assertEquals HttpStatus.OK.value(),response.getStatusCode()
|
||||||
|
Todo todoResponse = response.as Todo.class
|
||||||
|
assertEquals readingTodoId,todoResponse.getId()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenUpdateTodoById_thenOk(){
|
||||||
|
Todo todo = new Todo(id:readingTodoId, isCompleted: true)
|
||||||
|
final Response response =
|
||||||
|
RestAssured.given()
|
||||||
|
.contentType(MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
.body(todo).put(API_ROOT)
|
||||||
|
|
||||||
|
assertEquals HttpStatus.OK.value(),response.getStatusCode()
|
||||||
|
Todo todoResponse = response.as Todo.class
|
||||||
|
assertTrue todoResponse.getIsCompleted()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenDeleteTodoById_thenOk(){
|
||||||
|
final Response response =
|
||||||
|
RestAssured.given()
|
||||||
|
.delete("$API_ROOT/$writingTodoId")
|
||||||
|
|
||||||
|
assertEquals HttpStatus.OK.value(),response.getStatusCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void whenSaveTodo_thenOk(){
|
||||||
|
Todo todo = new Todo(task: 'Blogging', isCompleted: false)
|
||||||
|
final Response response =
|
||||||
|
RestAssured.given()
|
||||||
|
.contentType(MediaType.APPLICATION_JSON_VALUE)
|
||||||
|
.body(todo).post(API_ROOT)
|
||||||
|
|
||||||
|
assertEquals HttpStatus.OK.value(),response.getStatusCode()
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue