package de.unioninvestment.eai.portal.portlet.crud.scripting.domain.container.database; import com.google.common.collect.ImmutableMap; import de.unioninvestment.eai.portal.portlet.crud.domain.model.DatabaseQueryContainer; import de.unioninvestment.eai.portal.portlet.crud.domain.model.Table; import de.unioninvestment.eai.portal.portlet.crud.domain.model.TableColumn; import de.unioninvestment.eai.portal.portlet.crud.domain.model.TableColumns; import de.unioninvestment.eai.portal.portlet.crud.scripting.model.ScriptRow; import groovy.lang.GString; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import java.util.Collections; import static java.util.Arrays.asList; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.when; import static org.mockito.MockitoAnnotations.initMocks; /** * Created by cmj on 13.07.14. */ public class QueryInsertStatementGeneratorTest { private QueryInsertStatementGenerator generator; @Mock private ScriptRow rowMock; @Mock private Table tableMock; @Mock private TableColumns columnsMock; @Mock private DatabaseQueryContainer containerMock; @Mock private TableColumn col1Mock, col2Mock; @Before public void setup() { initMocks(this); when(tableMock.getColumns()).thenReturn(columnsMock); when(tableMock.getContainer()).thenReturn(containerMock); when(containerMock.getTablename()).thenReturn("MYTABLE"); when(columnsMock.getInsertColumns()).thenReturn(asList(col1Mock, col2Mock)); when(col1Mock.getName()).thenReturn("COL1"); when(col2Mock.getName()).thenReturn("COL2"); when(columnsMock.getPrimaryKeyNames()).thenReturn(asList("ID1","ID2")); when(rowMock.getValues()).thenReturn(ImmutableMap.<String,Object>of("COL1", "1", "COL2", 2)); generator = new QueryInsertStatementGenerator(tableMock); } @Test public void shouldReturnAnInsertStatement() { GString insert = generator.generateStatement(rowMock); assertThat(insert.getStrings().length, is(3)); assertThat(insert.getStrings()[0], is("INSERT INTO \"MYTABLE\" (\"COL1\",\"COL2\") VALUES (")); assertThat(insert.getStrings()[1], is(",")); assertThat(insert.getStrings()[2], is(")")); assertThat(insert.getValues().length, is(2)); assertEquals("1", insert.getValues()[0]); assertEquals(2, insert.getValues()[1]); } @Test public void shouldReturnAnInsertStatementContainingASequence() { when(col1Mock.getSequence()).thenReturn("TEST_SEQ"); GString insert = generator.generateStatement(rowMock); assertThat(insert.getStrings().length, is(2)); assertThat(insert.getStrings()[0], is("INSERT INTO \"MYTABLE\" (\"COL1\",\"COL2\") VALUES (\"TEST_SEQ\".NEXTVAL,")); assertThat(insert.getStrings()[1], is(")")); assertThat(insert.getValues().length, is(1)); assertEquals(2, insert.getValues()[0]); } @Test(expected = IllegalArgumentException.class) public void shouldFailOnMissingTable() { when(containerMock.getTablename()).thenReturn(null); generator = new QueryInsertStatementGenerator(tableMock); generator.generateStatement(rowMock); } @Test(expected = IllegalArgumentException.class) public void shouldFailIfNothingInsertable() { when(columnsMock.getInsertColumns()).thenReturn(Collections.<TableColumn>emptyList()); generator = new QueryInsertStatementGenerator(tableMock); generator.generateStatement(rowMock); } }