diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml
index c0321681c..a2fdd544a 100644
--- a/clearing-parent/imdg/pom.xml
+++ b/clearing-parent/imdg/pom.xml
@@ -118,6 +118,18 @@
assertj-core
test
+
+ org.testcontainers
+ testcontainers
+ 1.20.2
+ test
+
+
+ org.testcontainers
+ postgresql
+ 1.20.2
+ test
+
diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java
index 697a6c687..a82d711c4 100644
--- a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java
+++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/AllMapStoreTest.java
@@ -17,6 +17,7 @@ import org.springframework.jdbc.core.SqlTypeValue;
import org.springframework.jdbc.core.StatementCreatorUtils;
import org.springframework.lang.NonNull;
import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import ru.clearing.classes.statics.data.company.Company;
import ru.clearing.classes.statics.data.company.CompanyHistory;
@@ -52,7 +53,7 @@ import static ru.spcex.clearing.imdg.utils.DbDataUtils.generatingRandomString;
TestConfiguration.class,
DbTestConnectionConfig.class})
@ExtendWith(SpringExtension.class)
-//@TestPropertySource(properties = "spring.config.location=D:/repo/mfd/clearing/clearing-parent/imdg/src/main/resources") @TestPropertySource(locations = "/AllMapStoreTest.properties")
+@TestPropertySource(locations="classpath:application.properties")
public class AllMapStoreTest {
private static final Long ID = 1000000L;
private final Logger log = LoggerFactory.getLogger(this.getClass());
diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/DbUpdateCompareTest.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/DbUpdateCompareTest.java
new file mode 100644
index 000000000..d22890241
--- /dev/null
+++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/DbUpdateCompareTest.java
@@ -0,0 +1,155 @@
+package ru.spcex.clearing.imdg;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.mchange.v2.c3p0.ComboPooledDataSource;
+import java.beans.PropertyVetoException;
+import java.io.File;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Stream;
+import javax.sql.DataSource;
+import org.junit.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.core.io.FileSystemResource;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+import org.testcontainers.containers.PostgreSQLContainer;
+import ru.spcex.clearing.imdg.config.ImdgSettings;
+
+@ExtendWith(SpringExtension.class)
+@ContextConfiguration(classes = {
+ ImdgSettings.class
+})
+public class DbUpdateCompareTest {
+ private final Logger log = LoggerFactory.getLogger(this.getClass());
+ private static final File DB_SCRIPTS_LOCATION = new File("D:\\Projects\\MFD\\clearing\\clearing-parent\\db-scripts\\src\\main\\resources\\db\\");
+
+ @Test
+ public void compareCompleteDDLWithUpdatedDDL() {
+ // Creating docker containers
+ try (PostgreSQLContainer> dbWithCompleteDDL = new PostgreSQLContainer<>(PostgreSQLContainer.IMAGE);
+ PostgreSQLContainer> dbWithUpdatedDDL = new PostgreSQLContainer<>(PostgreSQLContainer.IMAGE)) {
+ // Starting docker containers
+ dbWithCompleteDDL.start();
+ dbWithUpdatedDDL.start();
+
+ // Acquiring JdbcTemplate through data source
+ JdbcTemplate dbWithCompleteDDLJdbc = new JdbcTemplate(getDataSource(dbWithCompleteDDL));
+ JdbcTemplate dbWithUpdatedDDLJdbc = new JdbcTemplate(getDataSource(dbWithUpdatedDDL));
+
+ // Creating clearing role
+ dbWithCompleteDDLJdbc.execute("CREATE ROLE clearing");
+ dbWithUpdatedDDLJdbc.execute("CREATE ROLE clearing");
+
+ // Executing DDL.sql (self-sufficient sql script containing all current updates)
+ new ResourceDatabasePopulator(new FileSystemResource(DB_SCRIPTS_LOCATION.toPath().resolve("DDL.sql").toString()))
+ .execute(Objects.requireNonNull(dbWithCompleteDDLJdbc.getDataSource()));
+
+ // Executing DDL_first.sql (template sql script for creating base tables)
+ new ResourceDatabasePopulator(new FileSystemResource(DB_SCRIPTS_LOCATION.toPath().resolve("DDL_first.sql").toString()))
+ .execute(Objects.requireNonNull(dbWithUpdatedDDLJdbc.getDataSource()));
+ // Executing all updateDDL_*.sql script in order
+ getUpdateScripts().forEach(us -> new ResourceDatabasePopulator(new FileSystemResource(us.getPath()))
+ .execute(Objects.requireNonNull(dbWithUpdatedDDLJdbc.getDataSource())));
+
+ // Get all table names
+ String getAllTablesSql = "SELECT table_name FROM information_schema.tables WHERE table_schema='public';";
+ List dbWithCompleteDDLTables = dbWithCompleteDDLJdbc.queryForList(getAllTablesSql)
+ .stream()
+ .map(t -> t.get("table_name").toString())
+ .sorted()
+ .toList();
+ List dbWithUpdatedDDLTables = dbWithUpdatedDDLJdbc.queryForList(getAllTablesSql)
+ .stream()
+ .map(t -> t.get("table_name").toString())
+ .sorted()
+ .toList();
+
+ assertThat(dbWithCompleteDDLTables.size()).isEqualTo(dbWithUpdatedDDLTables.size());
+ assertThat(dbWithCompleteDDLTables).usingRecursiveComparison().isEqualTo(dbWithUpdatedDDLTables);
+
+ // Comparing column names, data types, char max length, nullability, default values and comments
+ dbWithCompleteDDLTables.forEach(t -> {
+ String sql = """
+ SELECT cols.column_name,
+ (SELECT pg_catalog.col_description(c.oid, cols.ordinal_position::int)
+ FROM pg_catalog.pg_class c
+ WHERE c.oid = (SELECT ('"' || cols.table_name || '"')::regclass::oid)
+ AND c.relname = cols.table_name) AS column_comment,
+ cols.data_type,
+ cols.character_maximum_length,
+ cols.is_nullable
+ FROM information_schema.columns cols
+ WHERE cols.table_name = '""" + t + "';";
+
+ List