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 }