1 package com.atlassian.dbexporter.exporter;
2
3 import com.atlassian.dbexporter.Column;
4 import com.atlassian.dbexporter.ConnectionProvider;
5 import com.atlassian.dbexporter.Context;
6 import com.atlassian.dbexporter.EntityNameProcessor;
7 import com.atlassian.dbexporter.ImportExportErrorService;
8 import com.atlassian.dbexporter.Table;
9 import com.atlassian.dbexporter.node.NodeCreator;
10 import com.atlassian.dbexporter.progress.ProgressMonitor;
11 import org.junit.Before;
12 import org.junit.Test;
13 import org.junit.runner.RunWith;
14 import org.mockito.Mock;
15 import org.mockito.junit.MockitoJUnitRunner;
16
17 import java.sql.Connection;
18 import java.sql.DatabaseMetaData;
19 import java.sql.ResultSet;
20 import java.sql.ResultSetMetaData;
21 import java.sql.Statement;
22 import java.sql.Types;
23 import java.util.Collections;
24
25 import static org.mockito.ArgumentMatchers.any;
26 import static org.mockito.ArgumentMatchers.anyString;
27 import static org.mockito.Mockito.mock;
28 import static org.mockito.Mockito.verify;
29 import static org.mockito.Mockito.when;
30
31 @RunWith(MockitoJUnitRunner.class)
32 public class DataExporterTest {
33 @Mock
34 private ImportExportErrorService errorService;
35 @Mock
36 private ExportConfiguration configuration;
37 @Mock
38 private ConnectionProvider connectionProvider;
39 @Mock
40 private Connection connection;
41 @Mock
42 private DatabaseMetaData metaData;
43 @Mock
44 private ProgressMonitor progressMonitor;
45 @Mock
46 private EntityNameProcessor entityNameProcessor;
47 @Mock
48 private NodeCreator nodeCreator;
49
50 private DataExporter dataExporter;
51
52 @Before
53 public void setUp() throws Exception {
54 when(configuration.getConnectionProvider()).thenReturn(connectionProvider);
55 when(connectionProvider.getConnection()).thenReturn(connection);
56 when(connection.getMetaData()).thenReturn(metaData);
57 when(metaData.getIdentifierQuoteString()).thenReturn(" ");
58 when(configuration.getProgressMonitor()).thenReturn(progressMonitor);
59 when(configuration.getEntityNameProcessor()).thenReturn(entityNameProcessor);
60 when(entityNameProcessor.columnName(anyString())).thenAnswer(invocation -> invocation.getArgument(0));
61
62 dataExporter = new DataExporter(errorService, null);
63 }
64
65 @Test
66 public void shouldExportBinaryColumn() throws Exception {
67 final byte[] bytes = new byte[]{0, 1, 100, 2};
68
69 when(nodeCreator.addNode(anyString())).thenReturn(nodeCreator);
70 when(nodeCreator.addAttribute(anyString(), anyString())).thenReturn(nodeCreator);
71 when(nodeCreator.setContentAsBinary(any())).thenReturn(nodeCreator);
72 when(nodeCreator.closeEntity()).thenReturn(nodeCreator);
73 Statement st = mock(Statement.class);
74 when(connection.createStatement()).thenReturn(st);
75 ResultSet rs = mock(ResultSet.class);
76 when(st.executeQuery(anyString())).thenReturn(rs);
77 ResultSetMetaData rsmd = mock(ResultSetMetaData.class);
78 when(rs.getMetaData()).thenReturn(rsmd);
79 when(rsmd.getColumnCount()).thenReturn(1);
80 when(rs.next()).thenReturn(true).thenReturn(false);
81 when(rsmd.getColumnType(1)).thenReturn(Types.BINARY);
82 when(rsmd.getColumnName(1)).thenReturn("column1");
83 when(rs.getBytes(1)).thenReturn(bytes);
84
85 Context context = new Context(new Table("table",
86 Collections.singletonList(new Column("column", Types.BINARY, null, null, null, null)),
87 Collections.emptyList()));
88
89 dataExporter.export(nodeCreator, configuration, context);
90
91 verify(nodeCreator).setContentAsBinary(bytes);
92 }
93 }