View Javadoc
1   package org.dbunit.ext.postgresql;
2   
3   import static org.assertj.core.api.Assertions.assertThat;
4   import static org.junit.jupiter.api.Assertions.fail;
5   
6   import java.io.StringReader;
7   import java.sql.Statement;
8   import java.util.Objects;
9   
10  import org.dbunit.DatabaseEnvironment;
11  import org.dbunit.database.IDatabaseConnection;
12  import org.dbunit.dataset.Column;
13  import org.dbunit.dataset.ReplacementDataSet;
14  import org.dbunit.dataset.xml.FlatXmlDataSetBuilder;
15  import org.dbunit.operation.DatabaseOperation;
16  import org.junit.jupiter.api.AfterEach;
17  import org.junit.jupiter.api.BeforeEach;
18  import org.junit.jupiter.api.Test;
19  import org.junit.jupiter.api.condition.EnabledIfSystemProperty;
20  import org.xml.sax.InputSource;
21  
22  /**
23   * Testcase for Postgresql to check SQL CREATE DOMAIN with FlatXmlDataSetBuilder
24   * to insert a dataset with SQL Domains (user-def-types).
25   * 
26   * @author Philipp S. (Unwissender2009)
27   * @since Nov 23, 2009
28   */
29  @EnabledIfSystemProperty(named = "dbunit.profile", matches = "postgresql")
30  class SQLHelperDomainPostgreSQLIT
31  {
32      private IDatabaseConnection _connection;
33  
34      private static final String xmlData = "<?xml version=\"1.0\"?>"
35              + "<dataset>" + "<T1 PK=\"1\" STATE=\"is_blabla\"/>" + "</dataset>";
36  
37      @BeforeEach
38      protected void setUp() throws Exception
39      {
40          // Load active postgreSQL profile and connection from Maven pom.xml.
41          _connection = DatabaseEnvironment.getInstance().getConnection();
42          final Statement stat = _connection.getConnection().createStatement();
43          // DELETE SQL DOMAIN and Table with DOMAINS
44          stat.execute("DROP TABLE  IF EXISTS T1;");
45          stat.execute("DROP DOMAIN IF EXISTS MYSTATE;");
46          stat.execute("DROP DOMAIN IF EXISTS MYPK;");
47  
48          // Create SQL DOMAIN and Table with DOMAINS
49          stat.execute(
50                  "CREATE DOMAIN MYSTATE AS VARCHAR(20) DEFAULT 'is_Valid';");
51          stat.execute("CREATE DOMAIN MYPK AS INTEGER DEFAULT 0;");
52          stat.execute(
53                  "CREATE TABLE T1 (PK MYPK,STATE MYSTATE,PRIMARY KEY (PK));");
54          stat.close();
55          _connection.close();
56          _connection = DatabaseEnvironment.getInstance().getConnection();
57      }
58  
59      @AfterEach
60      protected void tearDown() throws Exception
61      {
62          if (!Objects.isNull(_connection))
63          {
64              final Statement cleanStat =
65                      _connection.getConnection().createStatement();
66              // DELETE SQL OID tables
67              cleanStat.execute("DROP TABLE IF EXISTS T1;");
68              cleanStat.close();
69              _connection.close();
70  
71              _connection = null;
72          }
73      }
74  
75      @Test
76      void testDomainDataTypes_withCustomSqlDomains_mapsToUnderlyingSqlTypes() throws Exception
77      {
78          assertThat(_connection).as("didn't get a connection").isNotNull();
79  
80          final ReplacementDataSet dataSet =
81                  new ReplacementDataSet(new FlatXmlDataSetBuilder()
82                          .build(new InputSource(new StringReader(xmlData))));
83          dataSet.addReplacementObject("[NULL]", null);
84          dataSet.setStrictReplacement(true);
85  
86          DatabaseOperation.CLEAN_INSERT.execute(_connection, dataSet);
87  
88          // Check Types.
89          for (int i = 0; i < _connection.createDataSet()
90                  .getTableMetaData("T1").getColumns().length; i++)
91          {
92              final Column c = _connection.createDataSet()
93                      .getTableMetaData("T1").getColumns()[i];
94  
95              if (c.getSqlTypeName().compareTo("mypk") == 0)
96              {
97                  assertThat(c.getDataType().getSqlType())
98                          .isEqualTo(java.sql.Types.INTEGER);
99              } else if (c.getSqlTypeName().compareTo("mystate") == 0)
100             {
101                 assertThat(c.getDataType().getSqlType())
102                         .isEqualTo(java.sql.Types.VARCHAR);
103             } else
104             {
105                 fail("we should not be here");
106             }
107         }
108     }
109 }