Package org.openengsb.core.edbi.jdbc

Source Code of org.openengsb.core.edbi.jdbc.JdbcIndexEngineTest

/**
* Licensed to the Austrian Association for Software Tool Integration (AASTI)
* under one or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information regarding copyright
* ownership. The AASTI licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.openengsb.core.edbi.jdbc;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openengsb.core.edbi.api.Index;
import org.openengsb.core.edbi.api.IndexExistsException;
import org.openengsb.core.edbi.api.IndexField;
import org.openengsb.core.edbi.api.IndexFieldNameTranslator;
import org.openengsb.core.edbi.api.IndexNameTranslator;
import org.openengsb.core.edbi.api.IndexNotFoundException;
import org.openengsb.core.edbi.jdbc.api.SchemaMapper;
import org.openengsb.core.edbi.jdbc.api.TypeMap;
import org.openengsb.core.edbi.jdbc.sql.DataType;
import org.openengsb.core.edbi.models.SubTestModel;
import org.openengsb.core.edbi.models.TestModel;

public class JdbcIndexEngineTest extends AbstractH2DatabaseTest {

    @Override
    protected String[] getInitScriptResourceNames() {
        return new String[]{
            "index-schema.h2.sql"
        };
    }

    JdbcIndexEngine indexEngine;

    SchemaMapper schemaMapper;
    HeadTableEngine headTableEngine;
    HistoryTableEngine historyTableEngine;

    @Before
    public void setUp() throws Exception {
        // Type Map
        TypeMap typeMap = mock(TypeMap.class);
        when(typeMap.getType(String.class)).thenReturn(new DataType(Types.LONGVARCHAR, "LONGVARCHAR"));
        when(typeMap.getType(Integer.class)).thenReturn(new DataType(Types.INTEGER, "INTEGER"));
        when(typeMap.getType(Long.class)).thenReturn(new DataType(Types.BIGINT, "LONG"));
        when(typeMap.getType(Date.class)).thenReturn(new DataType(Types.TIMESTAMP, "TIMESTAMP"));
        when(typeMap.getType(UUID.class)).thenReturn(new DataType(Types.VARCHAR, "VARCHAR"));

        // Translators
        IndexNameTranslator headIndexNameTranslator = new IndexNameTranslator() {
            @Override
            public String translate(Index<?> index) {
                return "INDEX_HEAD";
            }
        };

        IndexNameTranslator historyIndexNameTranslator = new IndexNameTranslator() {
            @Override
            public String translate(Index<?> index) {
                return "INDEX_HISTORY";
            }
        };

        IndexFieldNameTranslator fieldNameTranslatorStub = new IndexFieldNameTranslator() {
            @Override
            public String translate(IndexField<?> field) {
                return field.getName().toUpperCase();
            }
        };

        // Engine
        headTableEngine =
            new HeadTableEngine(getDataSource(), typeMap, headIndexNameTranslator, fieldNameTranslatorStub);
        historyTableEngine =
            new HistoryTableEngine(getDataSource(), typeMap, historyIndexNameTranslator, fieldNameTranslatorStub);

        schemaMapper = new DefaultSchemaMapper(headTableEngine, historyTableEngine);

        indexEngine = new JdbcIndexEngine(getDataSource(), schemaMapper);
    }

    @After
    public void tearDown() throws Exception {
        indexEngine = null;

        headTableEngine = null;
        historyTableEngine = null;
    }

    @Test
    public void createIndex_works() throws Exception {
        Index<TestModel> index = indexEngine.createIndex(TestModel.class);

        assertEquals("org.openengsb.core.edbi.models.TestModel", index.getName());
        assertEquals(TestModel.class, index.getModelClass());
        assertEquals("INDEX_HEAD", index.getHeadTableName());
        assertEquals("INDEX_HISTORY", index.getHistoryTableName());

        assertEquals(3, index.getFields().size());
    }

    @Test(expected = IndexExistsException.class)
    public void createIndex_twice_throwsException() throws Exception {
        try {
            indexEngine.createIndex(TestModel.class);
        } catch (IndexExistsException e) {
            fail("IndexExistsException caught on wrong call");
        }

        indexEngine.createIndex(TestModel.class);
    }

    @Test
    public void indexExists_onNonExistingClass_returnsFalse() throws Exception {
        assertFalse(indexEngine.indexExists(TestModel.class));
    }

    @Test
    public void indexExists_onNonExistingName_returnsFalse() throws Exception {
        assertFalse(indexEngine.indexExists("org.openengsb.core.edbi.models.TestModel"));
    }

    @Test(expected = IndexNotFoundException.class)
    public void getIndex_onNonExistingClass_throwsException() throws Exception {
        indexEngine.getIndex(TestModel.class);
    }

    @Test(expected = IndexNotFoundException.class)
    public void getIndex_onNonExistingNames_throwsException() throws Exception {
        indexEngine.getIndex("org.openengsb.core.edbi.models.TestModel");
    }

    @Test
    public void indexExists_afterCreateIndex_returnsTrue() throws Exception {
        indexEngine.createIndex(TestModel.class);

        assertTrue(indexEngine.indexExists(TestModel.class));
    }

    @Test
    public void indexExists_byName_afterCreateIndex_returnsTrue() throws Exception {
        indexEngine.createIndex(TestModel.class);

        assertTrue(indexEngine.indexExists("org.openengsb.core.edbi.models.TestModel"));
    }

    @Test
    public void getIndex_returnsCorrectIndex() throws Exception {
        indexEngine.createIndex(TestModel.class);

        Index<?> index = indexEngine.getIndex(TestModel.class);

        assertEquals("org.openengsb.core.edbi.models.TestModel", index.getName());
        assertEquals(TestModel.class, index.getModelClass());
        assertEquals("INDEX_HEAD", index.getHeadTableName());
        assertEquals("INDEX_HISTORY", index.getHistoryTableName());
    }

    @Test
    public void getIndex_returnsCorrectFields() throws Exception {
        indexEngine.createIndex(TestModel.class);

        Index<?> index = indexEngine.getIndex(TestModel.class);

        assertEquals(3, index.getFields().size());

        List<IndexField<?>> fields = new ArrayList<>(index.getFields());

        Collections.sort(fields, new Comparator<IndexField<?>>() {
            @Override
            public int compare(IndexField<?> o1, IndexField<?> o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });

        Iterator<IndexField<?>> iterator = fields.iterator();
        JdbcIndexField<?> field;

        field = (JdbcIndexField<?>) iterator.next();
        assertEquals("subModel", field.getName());
        assertEquals("SUBMODEL", field.getMappedName());
        assertEquals("INTEGER", field.getMappedType().getName());
        assertEquals(Types.INTEGER, field.getMappedType().getType());
        assertEquals(0, field.getMappedType().getScale());

        field = (JdbcIndexField<?>) iterator.next();
        assertEquals("testId", field.getName());
        assertEquals("TESTID", field.getMappedName());
        assertEquals("LONGVARCHAR", field.getMappedType().getName());
        assertEquals(Types.LONGVARCHAR, field.getMappedType().getType());
        assertEquals(0, field.getMappedType().getScale());

        field = (JdbcIndexField<?>) iterator.next();
        assertEquals("testInteger", field.getName());
        assertEquals("TESTINTEGER", field.getMappedName());
        assertEquals("INTEGER", field.getMappedType().getName());
        assertEquals(Types.INTEGER, field.getMappedType().getType());
        assertEquals(0, field.getMappedType().getScale());

    }

    @Test
    public void getIndex_byName_returnsCorrectIndex() throws Exception {
        indexEngine.createIndex(TestModel.class);

        Index<?> index = indexEngine.getIndex("org.openengsb.core.edbi.models.TestModel");

        assertEquals("org.openengsb.core.edbi.models.TestModel", index.getName());
        assertEquals(TestModel.class, index.getModelClass());
        assertEquals("INDEX_HEAD", index.getHeadTableName());
        assertEquals("INDEX_HISTORY", index.getHistoryTableName());
    }

    @Test
    public void getAll_returnsCorrectIndexes() throws Exception {
        Index<SubTestModel> i1 = indexEngine.createIndex(SubTestModel.class);
        Index<TestModel> i2 = indexEngine.createIndex(TestModel.class);

        List<Index<?>> all = indexEngine.getAll();

        assertEquals(2, all.size());
        assertTrue(all.contains(i1));
        assertTrue(all.contains(i2));
    }

    @Test
    public void load_works() throws Exception {
        Method loadIndex = JdbcIndexEngine.class.getDeclaredMethod("load", String.class);
        boolean accessibleFlag = loadIndex.isAccessible();
        loadIndex.setAccessible(true);

        indexEngine.createIndex(TestModel.class);

        Index index = (Index) loadIndex.invoke(indexEngine, "org.openengsb.core.edbi.models.TestModel");

        assertEquals("org.openengsb.core.edbi.models.TestModel", index.getName());
        assertEquals(TestModel.class, index.getModelClass());
        assertEquals("INDEX_HEAD", index.getHeadTableName());
        assertEquals("INDEX_HISTORY", index.getHistoryTableName());

        loadIndex.setAccessible(accessibleFlag);
    }

    @Test(expected = IndexNotFoundException.class)
    public void load_throwsException() throws Throwable {
        Method loadIndex = JdbcIndexEngine.class.getDeclaredMethod("load", String.class);
        loadIndex.setAccessible(true);

        try {
            loadIndex.invoke(indexEngine, "org.openengsb.core.edbi.models.TestModel");
        } catch (InvocationTargetException e) {
            if (e.getCause() instanceof IndexNotFoundException) {
                throw e.getCause();
            }
        }
    }

}
TOP

Related Classes of org.openengsb.core.edbi.jdbc.JdbcIndexEngineTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.