View Javadoc
1   package org.dbunit.ext.postgresql;
2   
3   import static org.assertj.core.api.Assertions.assertThat;
4   
5   import java.io.StringReader;
6   import java.sql.Statement;
7   import java.sql.Types;
8   import java.util.Objects;
9   
10  import org.dbunit.DatabaseEnvironment;
11  import org.dbunit.database.DatabaseConfig;
12  import org.dbunit.database.IDatabaseConnection;
13  import org.dbunit.dataset.Column;
14  import org.dbunit.dataset.IDataSet;
15  import org.dbunit.dataset.ITable;
16  import org.dbunit.dataset.ITableMetaData;
17  import org.dbunit.dataset.ReplacementDataSet;
18  import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
19  import org.dbunit.operation.DatabaseOperation;
20  import org.junit.jupiter.api.AfterEach;
21  import org.junit.jupiter.api.BeforeEach;
22  import org.junit.jupiter.api.Test;
23  import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
24  import org.xml.sax.InputSource;
25  
26  /**
27   * @author Edward Mann <e.dev@edmann.com>
28   *         <p>
29   *         Created: May 27, 2024
30   */
31  @EnabledIfSystemProperty(named = "dbunit.profile", matches = "postgresql")
32  class PostgresqlUuidIT
33  {
34      private IDatabaseConnection _connection;
35      private final String testTable = "t2";
36      // @formatter:off
37      private static final String xmlData = "<?xml version=\"1.0\"?>" +
38              "<dataset>" +
39              "<T2 ID=\"08004327-3f6c-4335-9738-0b2bf885cc43\" />" +
40              "<T2 ID=\"1a0e342a-02cc-43bf-9643-f9ea312dd349\" />" +
41              "</dataset>";
42      // @formatter:on
43  
44      @BeforeEach
45      protected void setUp() throws Exception
46      {
47          // Load active postgreSQL profile and connection from Maven pom.xml.
48          _connection = DatabaseEnvironment.getInstance().getConnection();
49          final Statement stat = _connection.getConnection().createStatement();
50          // DELETE SQL OID tables
51          stat.execute("DROP TABLE IF EXISTS " + testTable + ";");
52  
53          // Create SQL OID tables
54          stat.execute("CREATE TABLE " + testTable + "(ID uuid NOT NULL);");
55          stat.close();
56          // TODO found that if close the connection and create again the t2 table
57          // will be there for test. There must be something i'm missing on this.
58          _connection.close();
59          _connection = DatabaseEnvironment.getInstance().getConnection();
60      }
61  
62      @AfterEach
63      protected void tearDown() throws Exception
64      {
65          if (!Objects.isNull(_connection))
66          {
67              final Statement stat =
68                      _connection.getConnection().createStatement();
69              // DELETE SQL OID tables
70              stat.execute("DROP TABLE IF EXISTS " + testTable + ";");
71              _connection.close();
72  
73              _connection = null;
74          }
75      }
76  
77      @Test
78      void testUuidDataType_withUuidColumn_roundTripsThroughDatabase() throws Exception
79      {
80          assertThat(_connection).as("didn't get a connection").isNotNull();
81          final DatabaseConfig config = _connection.getConfig();
82          config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
83                  new PostgresqlDataTypeFactory());
84  
85          final ReplacementDataSet dataSet =
86                  new ReplacementDataSet(new FlatXmlDataSetBuilder()
87                          .build(new InputSource(new StringReader(xmlData))));
88          dataSet.addReplacementObject("[NULL]", null);
89          dataSet.setStrictReplacement(true);
90  
91          IDataSet ids;
92          ids = _connection.createDataSet();
93          final ITableMetaData itmd = ids.getTableMetaData(testTable);
94          final Column[] cols = itmd.getColumns();
95          ids = _connection.createDataSet();
96          for (final Column col : cols)
97          {
98              assertThat(col.getDataType().getSqlType())
99                      .isEqualTo(Types.OTHER);
100             assertThat(col.getSqlTypeName()).isEqualTo("uuid");
101         }
102 
103         DatabaseOperation.CLEAN_INSERT.execute(_connection, dataSet);
104         ids = _connection.createDataSet();
105         final ITable it = ids.getTable(testTable);
106         assertThat(it.getValue(0, "ID")).isNotNull()
107                 .isEqualTo("08004327-3f6c-4335-9738-0b2bf885cc43");
108         assertThat(it.getValue(1, "ID"))
109                 .isEqualTo("1a0e342a-02cc-43bf-9643-f9ea312dd349");
110     }
111 }