Вот код моего файла test-data.sql:
Код: Выделить всё
CREATE TABLE IF NOT EXISTS users
(uuid UUID NOT NULL, first_name VARCHAR(255),
last_name VARCHAR(255), email_address VARCHAR(255));
INSERT INTO users (uuid, first_name, last_name, email_address)
VALUES (etc)
Код: Выделить всё
package users;
import cache.RedisBackedCache;
import com.example.config.JooqTestConfig;
import org.example.Application;
import org.jooq.DSLContext;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.flyway.FlywayProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.DynamicPropertyRegistry;
import org.springframework.test.context.DynamicPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.PostgreSQLContainer;
import org.testcontainers.junit.jupiter.Container;
import org.testcontainers.junit.jupiter.Testcontainers;
import org.testcontainers.utility.DockerImageName;
import java.util.List;
import java.util.UUID;
import static org.jooq.codegen.maven.example.Tables.USERS;
import static org.junit.jupiter.api.Assertions.*;
@SpringBootTest(classes = {Application.class, JooqTestConfig.class})
@Testcontainers
@ExtendWith(SpringExtension.class)
@ActiveProfiles("test")
public class UsersRepositoryTest {
private UsersRepository usersRepository;
@Autowired
private DSLContext dslContext;
@Container
private static final PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.1")
.withDatabaseName("integration-tests-db").withUsername("username").withPassword("password")
.withInitScript("db/test-data.sql");
static {
postgreSQLContainer.start();
}
UsersResource user = new UsersResource(UUID.randomUUID(), "Tom", "Campbell", "tcampbell@gmail.com");
@BeforeEach
void setUp() {
usersRepository = new UsersRepository(dslContext);
}
private UsersResource upsertedUser(String emailAddress) {
return dslContext.select(USERS.asterisk())
.from(USERS)
.where(USERS.EMAIL_ADDRESS.eq(emailAddress))
.fetchAnyInto(UsersResource.class);
}
@Test
void testConnectionToDatabase() {
Assertions.assertNotNull(usersRepository);
}
@Test
public void addUserSuccess(){
usersRepository.upsertUsers(user);
List users = usersRepository.getAllUsers();
assertTrue(users.contains(user));
}
@Test
void addUserAlreadyExists(){
usersRepository.upsertUsers(user);
Throwable exception = assertThrows(IllegalStateException.class, () -> usersRepository.upsertUsers(user));
assertEquals("User could not be created", exception.getMessage());
}
@Test
void updateUser(){
usersRepository.upsertUsers(user);
UUID userUUID = dslContext.select(USERS.UUID)
.from(USERS)
.where(USERS.EMAIL_ADDRESS.eq(user.emailAddress))
.fetchSingleInto(UUID.class);
UsersResource updatedUser = new UsersResource(userUUID
usersRepository.updateUserName(updatedUser);
assertEquals(upsertedUser.uuid, updatedUser.uuid);
assertEquals(upsertedUser.firstName, updatedUser.firstName);
assertEquals(upsertedUser.lastName, updatedUser.lastName);
assertEquals(upsertedUser.emailAddress, updatedUser.emailAddress);
}
@Test
void deleteUserSuccess(){
usersRepository.upsertUsers(user);
UUID userUUID = dslContext.select(USERS.UUID)
.from(USERS)
.where(USERS.EMAIL_ADDRESS.eq(user.emailAddress))
.fetchSingleInto(UUID.class);
usersRepository.deleteUser(userUUID);
boolean userRecordExists = dslContext.fetchExists(USERS, USERS.EMAIL_ADDRESS.eq(user.emailAddress));
assertFalse(userRecordExists);
}
}
Код: Выделить всё
& l t ; p r o j e c t x m l n s = & q u o t ; h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0 & q u o t ; < b r / > x m l n s : x s i = & q u o t ; h t t p : / / w w w . w 3 . o r g / 2 0 0 1 / X M L S c h e m a - i n s t a n c e & q u o t ; < b r / > x s i : s c h e m a L o c a t i o n = & q u o t ; h t t p : / / m a v e n . a p a c h e . o r g / P O M / 4 . 0 . 0 h t t p : / / m a v e n . a p a c h e . o r g / x s d / m a v e n - 3 . 9 . 7 . x s d & q u o t ; & g t ; < b r / > & l t ; m o d e l V e r s i o n & g t ; 4 . 0 . 0 & l t ; / m o d e l V e r s i o n & g t ; < b r / > < b r / > & l t ; g r o u p I d & g t ; o r g . e x a m p l e & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; g o w n - q u b - a p p & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 1 . 0 - S N A P S H O T & l t ; / v e r s i o n & g t ; < b r / > < b r / > & l t ; p r o p e r t i e s & g t ; < b r / > & l t ; m a v e n . c o m p i l e r . s o u r c e & g t ; 2 2 & l t ; / m a v e n . c o m p i l e r . s o u r c e & g t ; < b r / > & l t ; m a v e n . c o m p i l e r . t a r g e t & g t ; 2 2 & l t ; / m a v e n . c o m p i l e r . t a r g e t & g t ; < b r / > & l t ; p r o j e c t . b u i l d . s o u r c e E n c o d i n g & g t ; U T F - 8 & l t ; / p r o j e c t . b u i l d . s o u r c e E n c o d i n g & g t ; < b r / > & l t ; / p r o p e r t i e s & g t ; < b r / > < b r / > & l t ; p a r e n t & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - p a r e n t & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 3 . 3 . 0 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / p a r e n t & g t ; < b r / > < b r / > & l t ; d e p e n d e n c i e s & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - w e b & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - j o o q & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - l o g g i n g & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 3 . 2 . 4 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . j u n i t . j u p i t e r & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j u n i t - j u p i t e r & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 5 . 8 . 1 & l t ; / v e r s i o n & g t ; < b r / > & l t ; s c o p e & g t ; t e s t & l t ; / s c o p e & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . t e s t c o n t a i n e r s & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j u n i t - j u p i t e r & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 1 . 1 9 . 8 & l t ; / v e r s i o n & g t ; < b r / > & l t ; s c o p e & g t ; t e s t & l t ; / s c o p e & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . t e s t c o n t a i n e r s & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; p o s t g r e s q l & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 1 . 1 9 . 3 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; c o m . h 2 d a t a b a s e & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; h 2 & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 2 . 2 . 2 2 4 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . j o o q & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j o o q - p o s t g r e s - e x t e n s i o n s & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 3 . 1 9 . 9 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . j o o q & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j o o q - c o d e g e n - m a v e n & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 3 . 1 9 . 9 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . h s q l d b & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; h s q l d b & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 2 . 7 . 1 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - s t a r t e r - t e s t & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; s c o p e & g t ; t e s t & l t ; / s c o p e & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - t e s t c o n t a i n e r s & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; s c o p e & g t ; t e s t & l t ; / s c o p e & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . j u n i t . p l a t f o r m & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j u n i t - p l a t f o r m - c o m m o n s & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s l f 4 j & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s l f 4 j - a p i & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; r e d i s . c l i e n t s & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j e d i s & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 4 . 0 . 1 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; / d e p e n d e n c i e s & g t ; < b r / > < b r / > < b r / > & l t ; b u i l d & g t ; < b r / > & l t ; p l u g i n s & g t ; < b r / > & l t ; p l u g i n & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . s p r i n g f r a m e w o r k . b o o t & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; s p r i n g - b o o t - m a v e n - p l u g i n & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 3 . 3 . 0 & l t ; / v e r s i o n & g t ; < b r / > & l t ; e x e c u t i o n s & g t ; < b r / > & l t ; e x e c u t i o n & g t ; < b r / > & l t ; g o a l s & g t ; < b r / > & l t ; g o a l & g t ; r e p a c k a g e & l t ; / g o a l & g t ; < b r / > & l t ; / g o a l s & g t ; < b r / > & l t ; / e x e c u t i o n & g t ; < b r / > & l t ; / e x e c u t i o n s & g t ; < b r / > & l t ; / p l u g i n & g t ; < b r / > & l t ; p l u g i n & g t ; < b r / > < b r / > & l t ; g r o u p I d & g t ; o r g . j o o q & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; j o o q - c o d e g e n - m a v e n & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 3 . 1 9 . 9 & l t ; / v e r s i o n & g t ; < b r / > < b r / > & l t ; e x e c u t i o n s & g t ; < b r / > & l t ; e x e c u t i o n & g t ; < b r / > & l t ; g o a l s & g t ; < b r / > & l t ; g o a l & g t ; g e n e r a t e & l t ; / g o a l & g t ; < b r / > & l t ; / g o a l s & g t ; < b r / > & l t ; / e x e c u t i o n & g t ; < b r / > & l t ; / e x e c u t i o n s & g t ; < b r / > < b r / > & l t ; d e p e n d e n c i e s & g t ; < b r / > & l t ; d e p e n d e n c y & g t ; < b r / > & l t ; g r o u p I d & g t ; o r g . p o s t g r e s q l & l t ; / g r o u p I d & g t ; < b r / > & l t ; a r t i f a c t I d & g t ; p o s t g r e s q l & l t ; / a r t i f a c t I d & g t ; < b r / > & l t ; v e r s i o n & g t ; 4 2 . 6 . 0 & l t ; / v e r s i o n & g t ; < b r / > & l t ; / d e p e n d e n c y & g t ; < b r / > & l t ; / d e p e n d e n c i e s & g t ; < b r / > < b r / > & l t ; c o n f i g u r a t i o n & g t ; < b r / > & l t ; j d b c & g t ; < b r / > & l t ; d r i v e r & g t ; o r g . p o s t g r e s q l . D r i v e r & l t ; / d r i v e r & g t ; < b r / > & l t ; u r l & g t ; j d b c : p o s t g r e s q l : p o s t g r e s & l t ; / u r l & g t ; < b r / > & l t ; / j d b c & g t ; < b r / > < b r / > & l t ; g e n e r a t o r & g t ; < b r / > & l t ; d a t a b a s e & g t ; < b r / > & l t ; n a m e & g t ; o r g . j o o q . m e t a . p o s t g r e s . P o s t g r e s D a t a b a s e & l t ; / n a m e & g t ; < b r / > & l t ; i n c l u d e s & g t ; . * & l t ; / i n c l u d e s & g t ; < b r / > & l t ; e x c l u d e s & g t ; & l t ; / e x c l u d e s & g t ; < b r / > & l t ; i n p u t S c h e m a & g t ; p u b l i c & l t ; / i n p u t S c h e m a & g t ; < b r / > & l t ; / d a t a b a s e>
org.jooq.codegen.maven.example
target/generated-sources/jooq
org.apache.maven.plugins
maven-jar-plugin
3.4.1
true
lib/
org.example.Application
org.apache.maven.plugins
maven-compiler-plugin
22
22
22
--enable-preview
org.testcontainers
testcontainers-jooq-codegen-maven-plugin
org.testcontainers
postgresql
1.19.3
org.postgresql
postgresql
42.6.0
generate-jooq-sources
generate
generate-sources
POSTGRES
postgres:15.3-alpine
filesystem:src/main/resources/db/migration
.*
flyway_schema_history
public
example.micronaut.jooq
target/generated-sources/jooq
Код: Выделить всё
public void upsertUsers(UsersResource users) {
boolean emailExists = dslContext.fetchExists(
dslContext.selectOne().from(USERS).where(USERS.EMAIL_ADDRESS.eq(users.emailAddress))
);
try {
if(emailExists) {
throw new IllegalStateException("This user already exists");
} else {
dslContext.insertInto(USERS)
.set(USERS.UUID, UUID.randomUUID())
.set(USERS.FIRST_NAME, users.firstName)
.set(USERS.LAST_NAME, users.lastName)
.set(USERS.EMAIL_ADDRESS, users.emailAddress)
.onConflict(USERS.EMAIL_ADDRESS)
.doNothing()
.execute();
}
} catch(Exception e) {
// logger.info("User could not be created", e);
}
Я создал таблицу пользователей через пользовательский интерфейс dbeaver .
Подробнее здесь: https://stackoverflow.com/questions/786 ... repository
Мобильная версия