View Javadoc
1   package com.atlassian.dbexporter.importer;
2   
3   import com.atlassian.dbexporter.Column;
4   import com.atlassian.dbexporter.Context;
5   import com.atlassian.dbexporter.ImportExportErrorService;
6   import com.atlassian.dbexporter.NoOpEntityNameProcessor;
7   import com.atlassian.dbexporter.Table;
8   import com.atlassian.dbexporter.node.NodeParser;
9   import com.atlassian.dbexporter.progress.ProgressMonitor;
10  import org.junit.After;
11  import org.junit.Before;
12  import org.junit.Rule;
13  import org.junit.Test;
14  import org.junit.runner.RunWith;
15  import org.mockito.ArgumentCaptor;
16  import org.mockito.Mock;
17  import org.mockito.junit.MockitoJUnitRunner;
18  
19  import java.util.Iterator;
20  import java.util.List;
21  
22  import static org.junit.Assert.assertEquals;
23  import static org.junit.Assert.assertTrue;
24  import static org.mockito.ArgumentMatchers.any;
25  import static org.mockito.Mockito.verify;
26  import static org.mockito.Mockito.when;
27  
28  @RunWith(MockitoJUnitRunner.class)
29  public class TableDefinitionImporterTest {
30      @Rule
31      public NodeParserRule nodeParser = new NodeParserRule();
32  
33      private TableDefinitionImporter tableDefinitionImporter;
34  
35      private Context context;
36  
37      @Mock
38      private ImportExportErrorService errorService;
39  
40      @Mock
41      private TableCreator tableCreator;
42  
43      @Mock
44      private DatabaseCleaner databaseCleaner;
45  
46      @Mock
47      private ProgressMonitor monitor;
48  
49      @Mock
50      private ImportConfiguration configuration;
51  
52      @Test
53      @Xml(SINGLE_TABLE)
54      public void singleTableDefinition() {
55          final NodeParser node = nodeParser.getNode();
56          tableDefinitionImporter.doImportNode(node, configuration, context);
57  
58          final List<Table> tables = verifyTables();
59          assertEquals(1, tables.size());
60  
61          assertTable(tables.iterator().next(), "a-table", 2, "column-1", "column-2");
62      }
63  
64      @Test
65      @Xml(MULTIPLE_TABLES)
66      public void multipleTableDefinitions() {
67          final NodeParser node = nodeParser.getNode();
68          tableDefinitionImporter.doImportNode(node.getNextNode(), configuration, context);
69  
70          assertTrue(node.isClosed());
71  
72          final List<Table> tables = verifyTables();
73          assertEquals(3, tables.size());
74  
75          final Iterator<Table> iterator = tables.iterator();
76          assertTable(iterator.next(), "table-1", 1, "column-11");
77          assertTable(iterator.next(), "table-2", 2, "column-21", "column-22");
78          assertTable(iterator.next(), "table-3", 3, "column-31", "column-32", "column-33");
79      }
80  
81      @SuppressWarnings("unchecked")
82      private List<Table> verifyTables() {
83          final ArgumentCaptor<List> argument = ArgumentCaptor.forClass(List.class);
84          verify(tableCreator).create(any(), argument.capture(), any(), any());
85          return argument.getValue();
86      }
87  
88      @Before
89      public void setUp() {
90          when(configuration.getProgressMonitor()).thenReturn(monitor);
91          when(configuration.getEntityNameProcessor()).thenReturn(new NoOpEntityNameProcessor());
92          context = new Context();
93          tableDefinitionImporter = new TableDefinitionImporter(errorService, tableCreator, databaseCleaner);
94      }
95  
96      @After
97      public void tearDown() {
98          tableDefinitionImporter = null;
99          context = null;
100     }
101 
102     private static final String SINGLE_TABLE =
103             "<table name=\"a-table\">\n" +
104                     "  <column name=\"column-1\" sqlType=\"3\"/>\n" +
105                     "  <column name=\"column-2\" sqlType=\"5\"/>\n" +
106                     "  <foreignKey name=\"fk-1\" fromTable=\"a-table\" toTable=\"table-2\" fromColumn=\"column-11\" toColumn=\"column-21\"/>\n" +
107                     "</table>";
108 
109 
110     private static final String MULTIPLE_TABLES = "<database>\n" +
111             "<table name=\"table-1\">\n" +
112             "  <column name=\"column-11\" sqlType=\"3\"/>\n" +
113             "  <foreignKey name=\"fk-11\" fromTable=\"table-1\" toTable=\"table-2\" fromColumn=\"column-11\" toColumn=\"column-21\"/>\n" +
114             "</table>\n" +
115             "<table name=\"table-2\">\n" +
116             "  <column name=\"column-21\" sqlType=\"3\"/>\n" +
117             "  <column name=\"column-22\" sqlType=\"5\"/>\n" +
118             "</table>\n" +
119             "<table name=\"table-3\">\n" +
120             "  <column name=\"column-31\" sqlType=\"3\"/>\n" +
121             "  <column name=\"column-32\" sqlType=\"5\"/>\n" +
122             "  <column name=\"column-33\" sqlType=\"7\"/>\n" +
123             "</table>\n" +
124             "</database>";
125 
126     private static void assertTable(Table table, String tableName, int columnsCount, String... columnNames) {
127         assertEquals(tableName, table.getName());
128         assertEquals(columnsCount, table.getColumns().size());
129         final Iterator<Column> colIt = table.getColumns().iterator();
130         for (String columnName : columnNames) {
131             assertEquals(columnName, colIt.next().getName());
132         }
133     }
134 }