diff --git a/second-part/hw-03/user-service/pom.xml b/second-part/hw-03/user-service/pom.xml
index 4597166..3c6440e 100644
--- a/second-part/hw-03/user-service/pom.xml
+++ b/second-part/hw-03/user-service/pom.xml
@@ -72,13 +72,13 @@
org.testcontainers
junit-jupiter
- 1.20.3
+ 1.21.4
test
org.testcontainers
postgresql
- 1.20.3
+ 1.21.4
test
diff --git a/second-part/hw-03/user-service/src/test/java/com/example/UserDaoIntegrationTest.java b/second-part/hw-03/user-service/src/test/java/com/example/UserDaoIntegrationTest.java
new file mode 100644
index 0000000..a314282
--- /dev/null
+++ b/second-part/hw-03/user-service/src/test/java/com/example/UserDaoIntegrationTest.java
@@ -0,0 +1,120 @@
+package com.example;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import java.util.Properties;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+@Testcontainers
+class UserDaoIntegrationTest {
+
+ @Container
+ static final PostgreSQLContainer> POSTGRES =
+ new PostgreSQLContainer<>("postgres:16-alpine")
+ .withDatabaseName("user_service_test")
+ .withUsername("postgres")
+ .withPassword("postgres");
+
+ private static SessionFactory sessionFactory;
+ private UserDao userDao;
+
+ @BeforeAll
+ static void setUpSessionFactory() {
+ Properties properties = new Properties();
+ properties.put("hibernate.connection.driver_class", "org.postgresql.Driver");
+ properties.put("hibernate.connection.url", POSTGRES.getJdbcUrl());
+ properties.put("hibernate.connection.username", POSTGRES.getUsername());
+ properties.put("hibernate.connection.password", POSTGRES.getPassword());
+ properties.put("hibernate.hbm2ddl.auto", "create-drop");
+ properties.put("hibernate.show_sql", "false");
+
+ sessionFactory =
+ new Configuration()
+ .addProperties(properties)
+ .addAnnotatedClass(User.class)
+ .buildSessionFactory();
+ }
+
+ @AfterAll
+ static void tearDownSessionFactory() {
+ if (sessionFactory != null) {
+ sessionFactory.close();
+ }
+ }
+
+ @BeforeEach
+ void cleanDatabase() {
+ try (Session session = sessionFactory.openSession()) {
+ Transaction transaction = session.beginTransaction();
+ session.createMutationQuery("delete from User").executeUpdate();
+ transaction.commit();
+ }
+
+ userDao = new UserDao(sessionFactory);
+ }
+
+ @Test
+ void createPersistsUser() {
+ User user = new User("user1", "user1@example.com", 30);
+
+ User result = userDao.create(user);
+
+ assertNotNull(result.getId());
+ assertNotNull(result.getCreatedAt());
+
+ User persisted = userDao.findById(result.getId());
+ assertNotNull(persisted);
+ assertEquals("user1", persisted.getName());
+ assertEquals("user1@example.com", persisted.getEmail());
+ assertEquals(30, persisted.getAge());
+ }
+
+ @Test
+ void findByIdReturnsUser() {
+ User user = userDao.create(new User("user2", "user2@example.com", 25));
+
+ User result = userDao.findById(user.getId());
+
+ assertNotNull(result);
+ assertEquals(user.getId(), result.getId());
+ assertEquals("user2", result.getName());
+ }
+
+ @Test
+ void updateChangesPersistedUser() {
+ User user = userDao.create(new User("user3", "user3@example.com", 28));
+ user.setName("user3 Updated");
+ user.setEmail("user3.updated@example.com");
+ user.setAge(29);
+
+ User result = userDao.update(user);
+
+ assertNotNull(result);
+ User updated = userDao.findById(user.getId());
+ assertNotNull(updated);
+ assertEquals("user3 Updated", updated.getName());
+ assertEquals("user3.updated@example.com", updated.getEmail());
+ assertEquals(29, updated.getAge());
+ }
+
+ @Test
+ void deleteByIdRemovesUser() {
+ User user = userDao.create(new User("user3", "user3@example.com", 40));
+
+ userDao.deleteById(user.getId());
+
+ assertNull(userDao.findById(user.getId()));
+ }
+}