diff --git a/README.md b/README.md index fe52cf5..c1c221e 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ An example implementation of Spring Boot R2DBC REST API with PostgreSQL database. ## Technology stack -* Java 17 +* Java 21 * Maven -* PostgreSQL 16.1 +* PostgreSQL 17 * Docker ## Java Dependencies -* Spring Boot 3.2.1 +* Spring Boot 3.4.1 * Spring Data R2DBC * R2DBC PostgreSQL Driver * JUnit 5 @@ -30,7 +30,7 @@ An example implementation of Spring Boot R2DBC REST API with PostgreSQL database 2. Run generated docker image -`docker run -it -p8080:8080 --network="host" reactive-postgres:0.0.2-SNAPSHOT` +`docker run -it -p8080:8080 --network="host" reactive-postgres:0.0.3-SNAPSHOT` diff --git a/docker-compose.yml b/docker-compose.yml index 41a7777..2834045 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,7 @@ -version: '3.8' services: postgresql: container_name: db-postgres - image: postgres:16.1 + image: postgres:17 ports: - "5432:5432" environment: diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml index f346660..73204d8 100644 --- a/pom.xml +++ b/pom.xml @@ -15,17 +15,17 @@ org.springframework.boot spring-boot-starter-parent - 3.2.1 + 3.4.1 dev.kamalhm reactive-postgres - 0.0.2-SNAPSHOT + 0.0.3-SNAPSHOT reactive-postgres - Demo project for Spring Boot + Example Spring Boot with R2DBC project - 17 + 21 @@ -45,21 +45,15 @@ true - io.r2dbc + org.postgresql r2dbc-postgresql - 0.8.6.RELEASE - runtime + 1.0.7.RELEASE org.postgresql postgresql runtime - - org.projectlombok - lombok - true - org.springframework.boot spring-boot-starter-test @@ -80,24 +74,10 @@ commons-lang3 3.11 + + org.springframework.boot + spring-boot-starter-actuator + - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - - - - diff --git a/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java b/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java index 5e8b641..145baae 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplication.java @@ -14,17 +14,17 @@ @EnableR2dbcAuditing public class ReactivePostgresApplication { - public static void main(String[] args) { - SpringApplication.run(ReactivePostgresApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(ReactivePostgresApplication.class, args); + } - @Bean - ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) { - ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer(); - initializer.setConnectionFactory(connectionFactory); - ResourceDatabasePopulator resource = - new ResourceDatabasePopulator(new ClassPathResource("schema.sql")); - initializer.setDatabasePopulator(resource); - return initializer; - } + @Bean + ConnectionFactoryInitializer initializer(@Qualifier("connectionFactory") ConnectionFactory connectionFactory) { + ConnectionFactoryInitializer initializer = new ConnectionFactoryInitializer(); + initializer.setConnectionFactory(connectionFactory); + ResourceDatabasePopulator resource = + new ResourceDatabasePopulator(new ClassPathResource("schema.sql")); + initializer.setDatabasePopulator(resource); + return initializer; + } } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java b/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java index 90d5b81..f87ffb5 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/config/PostgresAuditorAwareConfiguration.java @@ -9,9 +9,9 @@ @Configuration public class PostgresAuditorAwareConfiguration { - @Bean - ReactiveAuditorAware auditorAware() { - return () -> Mono.just("AUDITOR"); - } + @Bean + ReactiveAuditorAware auditorAware() { + return () -> Mono.just("AUDITOR"); + } } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java b/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java index 0008cf2..6779157 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/controller/BalanceController.java @@ -3,8 +3,6 @@ import dev.kamalhm.reactivepostgres.dto.CreateBalanceWebRequest; import dev.kamalhm.reactivepostgres.entity.Balance; import dev.kamalhm.reactivepostgres.repository.BalanceRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,19 +11,18 @@ @RestController @RequestMapping(value = "/api/balance") -@RequiredArgsConstructor -@Slf4j public class BalanceController { - private final BalanceRepository balanceRepository; + private final BalanceRepository balanceRepository; - @PostMapping - public Mono createBalance(@RequestBody CreateBalanceWebRequest request) { - final Balance balance = Balance.builder() - .balance(request.getBalance()) - .memberId(request.getMemberId()) - .build(); - return balanceRepository.save(balance); - } + public BalanceController(BalanceRepository balanceRepository) { + this.balanceRepository = balanceRepository; + } + + @PostMapping + public Mono createBalance(@RequestBody CreateBalanceWebRequest request) { + final Balance balance = new Balance(request.memberId(), request.balance()); + return balanceRepository.save(balance); + } } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java b/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java index 7fd7726..43f30c3 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/controller/MemberController.java @@ -2,8 +2,6 @@ import dev.kamalhm.reactivepostgres.entity.Member; import dev.kamalhm.reactivepostgres.repository.MemberRepository; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -19,48 +17,50 @@ @RestController @RequestMapping(value = "/api/member") -@RequiredArgsConstructor -@Slf4j public class MemberController { - private final MemberRepository memberRepository; + private final MemberRepository memberRepository; - @GetMapping - public Flux getAll() { - return memberRepository.findAll(); - } + public MemberController(MemberRepository memberRepository) { + this.memberRepository = memberRepository; + } - @GetMapping(value = "/{name}") - public Mono getOne(@PathVariable String name) { - return memberRepository.findByName(name); - } + @GetMapping + public Flux getAll() { + return memberRepository.findAll(); + } - @PostMapping - public Mono createMember(@RequestBody Member member) { - return memberRepository.save(member); - } + @GetMapping(value = "/{name}") + public Mono getOne(@PathVariable String name) { + return memberRepository.findByName(name); + } - @PostMapping(value = "/{number}") - public Flux createMembers(@PathVariable int number) { - return generateRandomMember(number).subscribeOn(Schedulers.boundedElastic()); - } + @PostMapping + public Mono createMember(@RequestBody Member member) { + return memberRepository.save(member); + } - private Flux generateRandomMember(int number) { - return Mono.fromSupplier( - () -> Member.builder().name(RandomStringUtils.randomAlphabetic(5)).build()) - .flatMap(memberRepository::save) - .repeat(number); - } + @PostMapping(value = "/{number}") + public Flux createMembers(@PathVariable int number) { + return generateRandomMember(number).subscribeOn(Schedulers.boundedElastic()); + } - @PutMapping - public Mono updateMember(@RequestBody Member member) { - return memberRepository - .findByName(member.getName()) - .flatMap(memberResult -> memberRepository.save(member)); - } + private Flux generateRandomMember(int number) { + return Mono.fromSupplier( + () -> new Member(RandomStringUtils.randomAlphabetic(5))) + .flatMap(memberRepository::save) + .repeat(number); + } - @DeleteMapping - public Mono deleteMember(@RequestBody Member member) { - return memberRepository.deleteById(member.getId()); - } + @PutMapping + public Mono updateMember(@RequestBody Member member) { + return memberRepository + .findByName(member.name()) + .flatMap(memberResult -> memberRepository.save(member)); + } + + @DeleteMapping + public Mono deleteMember(@RequestBody Member member) { + return memberRepository.deleteById(member.id()); + } } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java b/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java index d0b10c7..c4d3bfd 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/controller/TransactionController.java @@ -3,8 +3,6 @@ import dev.kamalhm.reactivepostgres.dto.CreateTransactionWebRequest; import dev.kamalhm.reactivepostgres.entity.Balance; import dev.kamalhm.reactivepostgres.service.TransactionalService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -14,15 +12,17 @@ @RestController @RequestMapping("/api/transaction") -@RequiredArgsConstructor -@Slf4j public class TransactionController { - private final TransactionalService transactionalService; + private final TransactionalService transactionalService; - @PostMapping - @Transactional - public Mono createTransaction(@RequestBody CreateTransactionWebRequest request) { - return transactionalService.doTransaction(request); - } + public TransactionController(TransactionalService transactionalService) { + this.transactionalService = transactionalService; + } + + @PostMapping + @Transactional + public Mono createTransaction(@RequestBody CreateTransactionWebRequest request) { + return transactionalService.doTransaction(request); + } } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java index ad852b4..45b0489 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateBalanceWebRequest.java @@ -1,10 +1,5 @@ package dev.kamalhm.reactivepostgres.dto; -import lombok.Data; -@Data -public class CreateBalanceWebRequest { - - private String memberId; - private Long balance; +public record CreateBalanceWebRequest(Long memberId, Long balance) { } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java index ba57a7a..18a0bea 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/dto/CreateTransactionWebRequest.java @@ -1,11 +1,4 @@ package dev.kamalhm.reactivepostgres.dto; -import lombok.Data; - -@Data -public class CreateTransactionWebRequest { - - private String from; - private String to; - private Long amount; +public record CreateTransactionWebRequest(Long from, Long to, Long amount) { } \ No newline at end of file diff --git a/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java b/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java index a05e434..bf81304 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/entity/Balance.java @@ -1,8 +1,5 @@ package dev.kamalhm.reactivepostgres.entity; -import java.util.UUID; -import lombok.Builder; -import lombok.Data; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.Id; @@ -10,25 +7,17 @@ import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.relational.core.mapping.Column; -@Builder -@Data -public class Balance { - - @Id - private UUID id; - @Column("member_id") - private String memberId; - private Long balance; - @CreatedBy - @Column("created_by") - private String createdBy; - @CreatedDate - @Column("created_date") - private Long createdDate; - @LastModifiedBy - @Column("last_modified_by") - private String lastModifiedBy; - @LastModifiedDate - @Column("last_modified_date") - private Long lastModifiedDate; +public record Balance( + @Id Long id, + @Column("member_id") Long memberId, + Long balance, + @CreatedBy @Column("created_by") String createdBy, + @CreatedDate @Column("created_date") Long createdDate, + @LastModifiedBy @Column("last_modified_by") String lastModifiedBy, + @LastModifiedDate @Column("last_modified_date") Long lastModifiedDate +) { + public Balance(Long memberId, Long balance) { + this(null, memberId, balance, null, null, null, null); + } } + diff --git a/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java b/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java index a092d29..198956c 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/entity/Member.java @@ -1,15 +1,10 @@ package dev.kamalhm.reactivepostgres.entity; -import lombok.Builder; -import lombok.Data; import org.springframework.data.annotation.Id; +public record Member(@Id Long id, String name) { + public Member(String name) { + this(null, name); // `id` is null, it will be auto-generated when persisted + } -@Builder -@Data -public class Member { - - @Id - private Long id; - private String name; } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java b/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java index 1c6db1f..196b174 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/repository/BalanceRepository.java @@ -4,6 +4,6 @@ import org.springframework.data.r2dbc.repository.R2dbcRepository; import reactor.core.publisher.Mono; -public interface BalanceRepository extends R2dbcRepository { - Mono findByMemberId(String memberId); +public interface BalanceRepository extends R2dbcRepository { + Mono findByMemberId(Long memberId); } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java b/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java index 33b3dac..dcee974 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/repository/MemberRepository.java @@ -5,5 +5,5 @@ import reactor.core.publisher.Mono; public interface MemberRepository extends R2dbcRepository { - Mono findByName(String name); + Mono findByName(String name); } diff --git a/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java b/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java index 28835f3..3352567 100644 --- a/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java +++ b/src/main/java/dev/kamalhm/reactivepostgres/service/TransactionalService.java @@ -3,56 +3,72 @@ import dev.kamalhm.reactivepostgres.dto.CreateTransactionWebRequest; import dev.kamalhm.reactivepostgres.entity.Balance; import dev.kamalhm.reactivepostgres.repository.BalanceRepository; + import java.util.Random; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; -@RequiredArgsConstructor @Service -@Slf4j public class TransactionalService { - private final BalanceRepository balanceRepository; - - @Transactional - public Mono doTransaction(CreateTransactionWebRequest request) { - Long amount = request.getAmount(); - - return Mono.zip(balanceRepository.findByMemberId(request.getFrom()), - balanceRepository.findByMemberId(request.getTo())) - .flatMap(balanceTuple -> executeTransaction(balanceTuple, amount)); - } - - private Mono executeTransaction(Tuple2 balanceTuple, Long amount) { - Balance fromBalance = balanceTuple.getT1(); - Balance toBalance = balanceTuple.getT2(); - return deductBalance(fromBalance, amount).flatMap( - balance -> increaseBalance(toBalance, amount)); - } - - private Mono increaseBalance(Balance toBalance, Long amount) { - return Mono.fromSupplier(() -> new Random().nextDouble()) - .flatMap(randomValue -> increaseBalance(toBalance, amount, randomValue)); - } - - private Mono increaseBalance(Balance toBalance, Long amount, Double randomValue) { - log.info("random value {}", randomValue); - if (randomValue > 0.5) { - toBalance.setBalance(toBalance.getBalance() + amount); - return balanceRepository.save(toBalance); + private final BalanceRepository balanceRepository; + + public TransactionalService(BalanceRepository balanceRepository) { + this.balanceRepository = balanceRepository; + } + + @Transactional + public Mono doTransaction(CreateTransactionWebRequest request) { + Long amount = request.amount(); + + return Mono.zip(balanceRepository.findByMemberId(request.from()), + balanceRepository.findByMemberId(request.to())) + .flatMap(balanceTuple -> executeTransaction(balanceTuple, amount)); + } + + private Mono executeTransaction(Tuple2 balanceTuple, Long amount) { + Balance fromBalance = balanceTuple.getT1(); + Balance toBalance = balanceTuple.getT2(); + return deductBalance(fromBalance, amount).flatMap( + balance -> increaseBalance(toBalance, amount)); + } + + private Mono increaseBalance(Balance toBalance, Long amount) { + return Mono.fromSupplier(() -> new Random().nextDouble()) + .flatMap(randomValue -> increaseBalance(toBalance, amount, randomValue)); } - return Mono.error(new RuntimeException("randomized error")); - } - private Mono deductBalance(Balance fromBalance, Long amount) { - fromBalance.setBalance(fromBalance.getBalance() - amount); - return balanceRepository.save(fromBalance); - } + private Mono increaseBalance(Balance toBalance, Long amount, Double randomValue) { + if (randomValue < 0.5) { + return Mono.error(new RuntimeException("randomized error")); + } + Balance updatedBalance = new Balance( + toBalance.id(), + toBalance.memberId(), + toBalance.balance() + amount, // Update balance + toBalance.createdBy(), + toBalance.createdDate(), + toBalance.lastModifiedBy(), + toBalance.lastModifiedDate() + ); + return balanceRepository.save(updatedBalance); + } + + private Mono deductBalance(Balance fromBalance, Long amount) { + Balance updatedBalance = new Balance( + fromBalance.id(), + fromBalance.memberId(), + fromBalance.balance() - amount, // Update balance + fromBalance.createdBy(), + fromBalance.createdDate(), + fromBalance.lastModifiedBy(), + fromBalance.lastModifiedDate() + ); + return balanceRepository.save(updatedBalance); + } } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 30c88d3..990e3c8 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,17 +1,17 @@ -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - -CREATE TABLE IF NOT EXISTS member ( - id SERIAL PRIMARY KEY, +CREATE TABLE IF NOT EXISTS member +( + id BIGINT GENERATED ALWAYS AS IDENTITY, name TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS balance ( - id uuid default uuid_generate_v4(), - member_id TEXT NOT NULL, - balance integer NOT NULL, - created_by TEXT NOT NULL, - created_date bigint NOT NULL, - last_modified_date bigint NOT NULL, - last_modified_by TEXT NOT NULL, - updated_by TEXT +CREATE TABLE IF NOT EXISTS balance +( + id BIGINT GENERATED ALWAYS AS IDENTITY, + member_id BIGINT NOT NULL, + balance integer NOT NULL, + created_by TEXT NOT NULL, + created_date bigint NOT NULL, + last_modified_date bigint NOT NULL, + last_modified_by TEXT NOT NULL, + updated_by TEXT ); diff --git a/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java b/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java index b3cc823..70816a0 100644 --- a/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java +++ b/src/test/java/dev/kamalhm/reactivepostgres/MemberControllerTest.java @@ -4,7 +4,6 @@ import dev.kamalhm.reactivepostgres.repository.MemberRepository; import io.r2dbc.spi.ConnectionFactories; import io.r2dbc.spi.ConnectionFactory; -import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -22,71 +21,74 @@ @SpringBootTest @AutoConfigureWebTestClient -@Slf4j @ActiveProfiles(profiles = "test") class MemberControllerTest { - @Autowired - private WebTestClient webTestClient; + @Autowired + private WebTestClient webTestClient; - @Autowired - private MemberRepository memberRepository; + @Autowired + private MemberRepository memberRepository; - @Value("${spring.r2dbc.url}") - private String dbUrl; + @Value("${spring.r2dbc.url}") + private String dbUrl; - @BeforeEach - public void setup() { - initializeDatabase(); - insertData(); - } + @BeforeEach + public void setup() { + initializeDatabase(); + insertData(); + } - private void initializeDatabase() { - ConnectionFactory connectionFactory = ConnectionFactories.get(dbUrl); - R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory); - String query = "CREATE TABLE IF NOT EXISTS member (id SERIAL PRIMARY KEY, name TEXT NOT NULL);"; - template.getDatabaseClient().sql(query).fetch().rowsUpdated().block(); - } + private void initializeDatabase() { + ConnectionFactory connectionFactory = ConnectionFactories.get(dbUrl); + R2dbcEntityTemplate template = new R2dbcEntityTemplate(connectionFactory); + String query = """ + CREATE TABLE IF NOT EXISTS member + ( + id BIGINT GENERATED ALWAYS AS IDENTITY, + name TEXT NOT NULL + ); + """; + template.getDatabaseClient().sql(query).fetch().rowsUpdated().block(); + } - private void insertData() { - Flux memberFlux = Flux.just( - Member.builder().name("ani").build(), - Member.builder().name("budi").build(), - Member.builder().name("cep").build(), - Member.builder().name("dod").build() - ); - memberRepository.deleteAll() - .thenMany(memberFlux) - .flatMap(memberRepository::save) - .doOnNext(member -> log.info("inserted {}", member)) - .blockLast(); - } + private void insertData() { + Flux memberFlux = Flux.just( + new Member("ani"), + new Member("budi"), + new Member("cep"), + new Member("dod")); + memberRepository.deleteAll() + .thenMany(memberFlux) + .flatMap(memberRepository::save) + .blockLast(); + } - @Test - public void getAll() { - webTestClient.get() - .uri("/api/member") - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus().isOk() - .expectBody() - .jsonPath("$[*].name") - .value(containsInAnyOrder("ani", "budi", "cep", "dod")); - } + @Test + public void getAll() { + webTestClient.get() + .uri("/api/member") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus().isOk() + .expectBody() + .jsonPath("$[*].name") + .value(containsInAnyOrder("ani", "budi", "cep", "dod")); + } - @Test - public void getOne() { - webTestClient.get() - .uri("/api/member/ani") - .accept(MediaType.APPLICATION_JSON) - .exchange() - .expectStatus() - .isOk() - .expectBody() - .jsonPath("$.name") - .isEqualTo("ani") - .jsonPath("$.id") - .isNumber(); - } + @Test + public void getOne() { + webTestClient.get() + .uri("/api/member/ani") + .accept(MediaType.APPLICATION_JSON) + .exchange() + .expectStatus() + .isOk() + .expectBody() + .jsonPath("$.name") + .isEqualTo("ani") + .jsonPath("$.id") + .isNumber(); + } } diff --git a/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java b/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java index b048670..013144a 100644 --- a/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java +++ b/src/test/java/dev/kamalhm/reactivepostgres/ReactivePostgresApplicationTests.java @@ -6,8 +6,8 @@ @SpringBootTest class ReactivePostgresApplicationTests { - @Test - void contextLoads() { - } + @Test + void contextLoads() { + } } diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql index df243a4..990e3c8 100644 --- a/src/test/resources/schema.sql +++ b/src/test/resources/schema.sql @@ -1,9 +1,17 @@ -CREATE TABLE IF NOT EXISTS member ( - id SERIAL PRIMARY KEY, +CREATE TABLE IF NOT EXISTS member +( + id BIGINT GENERATED ALWAYS AS IDENTITY, name TEXT NOT NULL ); -CREATE TABLE IF NOT EXISTS balance ( - id TEXT PRIMARY KEY, - balance integer NOT NULL +CREATE TABLE IF NOT EXISTS balance +( + id BIGINT GENERATED ALWAYS AS IDENTITY, + member_id BIGINT NOT NULL, + balance integer NOT NULL, + created_by TEXT NOT NULL, + created_date bigint NOT NULL, + last_modified_date bigint NOT NULL, + last_modified_by TEXT NOT NULL, + updated_by TEXT );