Skip to content

Commit 2aaf917

Browse files
Bael-5023 data cassandra test (eugenp#11082)
* Example implementation of Hexagonal Architecture pattern * Example Cassandra Springboot application demonstrating the usage of @DataCassandraTest annotation * Example Cassandra Springboot application demonstrating the usage of @DataCassandraTest annotation * temporarily ignoring the unit test * removed ddd-hexagonal-arch module * changed the test to LiveTest added readme * refactored test names * changes per review comments * upgraded Cassandra java core driver versino Co-authored-by: Suresh Raghavan <contactnrsuresh@gmail.com>
1 parent 44c76b1 commit 2aaf917

14 files changed

Lines changed: 446 additions & 0 deletions

File tree

persistence-modules/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
<module>spring-boot-persistence-h2</module>
5959
<module>spring-boot-persistence-mongodb</module>
6060
<module>spring-data-cassandra</module>
61+
<module>spring-data-cassandra-test</module>
6162
<module>spring-data-cassandra-reactive</module>
6263
<module>spring-data-cosmosdb</module>
6364
<module>spring-data-couchbase-2</module>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
## Spring @DataCassandraTest
2+
3+
### Build the Project
4+
```
5+
mvn clean install
6+
```
7+
8+
### Prerequisite To Run Test
9+
- Docker Engine must be running on the system
10+
- Docker Compose must be installed
11+
12+
### Run Tests Directly
13+
```
14+
mvn test
15+
```
16+
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<artifactId>spring-data-cassandra-test</artifactId>
7+
<name>spring-data-cassandra-test</name>
8+
<packaging>jar</packaging>
9+
10+
<parent>
11+
<groupId>com.baeldung</groupId>
12+
<artifactId>parent-boot-2</artifactId>
13+
<version>0.0.1-SNAPSHOT</version>
14+
<relativePath>../../parent-boot-2</relativePath>
15+
</parent>
16+
17+
<properties>
18+
<spring-boot-starter-data-cassandra.version>2.5.3</spring-boot-starter-data-cassandra.version>
19+
<lombok.version>1.18.18</lombok.version>
20+
<java-driver-core.version>4.13.0</java-driver-core.version>
21+
<cassandra-unit-spring.version>4.3.1.0</cassandra-unit-spring.version>
22+
<testcontainers.version>1.15.3</testcontainers.version>
23+
<native-protocol.version>1.5.0</native-protocol.version>
24+
</properties>
25+
26+
<dependencies>
27+
<dependency>
28+
<groupId>org.springframework.boot</groupId>
29+
<artifactId>spring-boot-starter-web</artifactId>
30+
</dependency>
31+
32+
<dependency>
33+
<groupId>org.springframework.boot</groupId>
34+
<artifactId>spring-boot-starter-data-cassandra</artifactId>
35+
<version>${spring-boot-starter-data-cassandra.version}</version>
36+
</dependency>
37+
38+
<dependency>
39+
<groupId>com.datastax.oss</groupId>
40+
<artifactId>java-driver-core</artifactId>
41+
<version>${java-driver-core.version}</version>
42+
</dependency>
43+
44+
<dependency>
45+
<groupId>org.projectlombok</groupId>
46+
<artifactId>lombok</artifactId>
47+
<version>${lombok.version}</version>
48+
</dependency>
49+
50+
<dependency>
51+
<groupId>com.datastax.oss</groupId>
52+
<artifactId>native-protocol</artifactId>
53+
<version>${native-protocol.version}</version>
54+
</dependency>
55+
56+
<dependency>
57+
<groupId>org.springframework.boot</groupId>
58+
<artifactId>spring-boot-starter-test</artifactId>
59+
<scope>test</scope>
60+
</dependency>
61+
62+
<dependency>
63+
<groupId>org.testcontainers</groupId>
64+
<artifactId>testcontainers</artifactId>
65+
<version>${testcontainers.version}</version>
66+
<scope>test</scope>
67+
</dependency>
68+
69+
<dependency>
70+
<groupId>org.testcontainers</groupId>
71+
<artifactId>cassandra</artifactId>
72+
<version>${testcontainers.version}</version>
73+
<scope>test</scope>
74+
</dependency>
75+
</dependencies>
76+
77+
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.baeldung.spring.data.cassandra.test;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class CassandraDataTestApplication {
8+
public static void main(String[] args) {
9+
SpringApplication.run(CassandraDataTestApplication.class, args);
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package com.baeldung.spring.data.cassandra.test.api;
2+
3+
import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
4+
import com.baeldung.spring.data.cassandra.test.service.InventoryService;
5+
import org.springframework.web.bind.annotation.*;
6+
7+
import java.util.List;
8+
9+
@RestController
10+
@RequestMapping("/v1/api/inventory")
11+
public class InventoryController {
12+
private InventoryService inventoryService;
13+
14+
public InventoryController(InventoryService inventoryService) {
15+
this.inventoryService = inventoryService;
16+
}
17+
18+
@GetMapping("/vehicles")
19+
public List<Vehicle> getVehicles() {
20+
return this.inventoryService.getVehicles();
21+
}
22+
23+
@PostMapping("/vehicles")
24+
public void addVehicles(@RequestBody List<Vehicle> vehicles) {
25+
this.inventoryService.addVehicles(vehicles);
26+
}
27+
28+
@PutMapping("/vehicles")
29+
public void updateVehicles(@RequestBody List<Vehicle> vehicles) {
30+
this.inventoryService.updateVehicles(vehicles);
31+
}
32+
33+
@PutMapping("/vehicles/{vin}")
34+
public void updateVehicles(@PathVariable(name = "vin") String vin,
35+
@RequestBody Vehicle vehicles) {
36+
this.inventoryService.updateVehicle(vin, vehicles);
37+
}
38+
39+
@DeleteMapping("/vehicles/{vin}")
40+
public void removeVehicle(@PathVariable(name = "vin") String vin) {
41+
this.inventoryService.deleteVehicle(vin);
42+
}
43+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.baeldung.spring.data.cassandra.test.config;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.data.cassandra.config.AbstractCassandraConfiguration;
5+
6+
@Configuration
7+
public class CassandraConfig extends AbstractCassandraConfiguration {
8+
@Override
9+
protected String getKeyspaceName() {
10+
return "inventory";
11+
}
12+
13+
@Override
14+
public String getContactPoints() {
15+
return "localhost";
16+
}
17+
18+
@Override
19+
protected String getLocalDataCenter() {
20+
return "datacenter1";
21+
}
22+
23+
24+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.baeldung.spring.data.cassandra.test.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import org.springframework.data.annotation.Id;
6+
import org.springframework.data.cassandra.core.mapping.Table;
7+
8+
@Data
9+
@Table("vehicles")
10+
@AllArgsConstructor
11+
public class Vehicle {
12+
@Id
13+
private String vin;
14+
private Integer year;
15+
private String make;
16+
private String model;
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.baeldung.spring.data.cassandra.test.repository;
2+
3+
import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
4+
import com.datastax.oss.driver.api.core.DefaultConsistencyLevel;
5+
import org.springframework.data.cassandra.repository.Consistency;
6+
import org.springframework.data.cassandra.repository.Query;
7+
import org.springframework.data.repository.CrudRepository;
8+
import org.springframework.data.repository.query.Param;
9+
import org.springframework.stereotype.Repository;
10+
11+
import java.util.List;
12+
import java.util.Optional;
13+
14+
@Repository
15+
public interface InventoryRepository extends CrudRepository<Vehicle, String> {
16+
17+
@Query("select * from vehicles")
18+
@Consistency(DefaultConsistencyLevel.LOCAL_QUORUM)
19+
List<Vehicle> findAllVehicles();
20+
21+
@Consistency(DefaultConsistencyLevel.LOCAL_QUORUM)
22+
Optional<Vehicle> findByVin(@Param("vin") String vin);
23+
24+
@Consistency(DefaultConsistencyLevel.LOCAL_QUORUM)
25+
void deleteByVin(String vin);
26+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.baeldung.spring.data.cassandra.test.service;
2+
3+
import com.baeldung.spring.data.cassandra.test.domain.Vehicle;
4+
import com.baeldung.spring.data.cassandra.test.repository.InventoryRepository;
5+
import org.springframework.stereotype.Service;
6+
7+
import java.util.List;
8+
9+
@Service
10+
public class InventoryService {
11+
private final InventoryRepository inventoryRepository;
12+
13+
public InventoryService(InventoryRepository inventoryRepository) {
14+
this.inventoryRepository = inventoryRepository;
15+
}
16+
17+
public List<Vehicle> getVehicles() {
18+
return this.inventoryRepository.findAllVehicles();
19+
}
20+
21+
public Vehicle getVehicle(String vin) {
22+
return this.inventoryRepository.findByVin(vin).orElse(null);
23+
}
24+
25+
public void addVehicles(List<Vehicle> vehicles) {
26+
this.inventoryRepository.saveAll(vehicles);
27+
}
28+
29+
public void updateVehicles(List<Vehicle> vehicles) {
30+
this.inventoryRepository.saveAll(vehicles);
31+
}
32+
33+
public void updateVehicle(String vin, Vehicle vehicle) {
34+
Vehicle existingVehicle = this.inventoryRepository.findByVin(vin)
35+
.orElseThrow(() -> new RuntimeException("Vehicle not found"));
36+
37+
existingVehicle.setMake(vehicle.getMake());
38+
existingVehicle.setYear(vehicle.getYear());
39+
existingVehicle.setModel(vehicle.getModel());
40+
41+
this.inventoryRepository.save(existingVehicle);
42+
}
43+
44+
public void deleteVehicle(String vin) {
45+
this.inventoryRepository.deleteByVin(vin);
46+
}
47+
}

persistence-modules/spring-data-cassandra-test/src/main/resources/application.yml

Whitespace-only changes.

0 commit comments

Comments
 (0)