/**
* 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.integration;
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 java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.openengsb.core.edbi.api.Index;
import org.openengsb.core.edbi.api.IndexCommit;
import org.openengsb.core.edbi.api.IndexCommitBuilder;
import org.openengsb.core.edbi.jdbc.AbstractH2DatabaseTest;
import org.openengsb.core.edbi.jdbc.JdbcIndex;
import org.openengsb.core.edbi.jdbc.JdbcIndexEngine;
import org.openengsb.core.edbi.jdbc.JdbcIndexEngineFactory;
import org.openengsb.core.edbi.jdbc.driver.h2.Driver;
import org.openengsb.core.edbi.models.PrimitivePropertyModel;
import org.openengsb.core.edbi.models.SubTestModel;
import org.openengsb.core.edbi.models.TestModel;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.support.rowset.SqlRowSet;
public class H2IndexEngineIntegrationTest extends AbstractH2DatabaseTest {
@Override
protected String[] getInitScriptResourceNames() {
return new String[]{
"index-schema.h2.sql"
};
}
Driver driver;
JdbcIndexEngine engine;
@Before
public void setUp() throws Exception {
driver = new Driver(getDataSource());
JdbcIndexEngineFactory factory = new JdbcIndexEngineFactory(driver);
engine = factory.create();
}
@Test
public void create_shouldProperlyCreateDatabaseTables() throws Exception {
Index<TestModel> index = engine.createIndex(TestModel.class);
String sql = "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = ?";
assertEquals(1, jdbc().queryForInt(sql, index.getHeadTableName()));
assertEquals(1, jdbc().queryForInt(sql, index.getHistoryTableName()));
}
@Test
public void commit_createsIndexInherently() throws Exception {
assertFalse(engine.indexExists(TestModel.class));
assertEquals(0, jdbc().queryForInt("SELECT COUNT(*) FROM INDEX_INFORMATION"));
IndexCommit commit = newTestCommit()
.insert(new TestModel("foo", 1))
.get();
engine.commit(commit);
assertEquals(1, jdbc().queryForInt("SELECT COUNT(*) FROM INDEX_INFORMATION"));
assertTrue(engine.indexExists(TestModel.class));
}
@Test
public void commit_insertWithSubmodel_shouldProperlyInsertRecords() throws Exception {
SubTestModel submodel = new SubTestModel(11);
IndexCommit commit = newTestCommit()
.insert(submodel)
.insert(new TestModel("foo", 1, submodel))
.insert(new TestModel("bar", 2))
.get();
engine.commit(commit);
assertEquals(2,
jdbc().queryForInt("SELECT COUNT(*) FROM " + engine.getIndex(TestModel.class).getHeadTableName()));
assertEquals(2,
jdbc().queryForInt("SELECT COUNT(*) FROM " + engine.getIndex(TestModel.class).getHistoryTableName()));
Map<String, Object> record;
// testmodel
String sql = "SELECT * FROM " + engine.getIndex(TestModel.class).getHeadTableName() + " WHERE TESTID = 'foo'";
record = jdbc().queryForMap(sql);
assertEquals(11, record.get("SUBMODEL")); // foreign key should be the id of the model
// extensive asserts for sub model tables
JdbcIndex<SubTestModel> index = engine.getIndex(SubTestModel.class);
assertEquals(1, jdbc().queryForInt("SELECT COUNT(*) FROM " + index.getHeadTableName()));
assertEquals(1, jdbc().queryForInt("SELECT COUNT(*) FROM " + index.getHistoryTableName()));
// submodel
String column = index.getFields().get(0).getMappedName(); // SubTestModel only has one field
record = jdbc().queryForMap("SELECT * FROM " + index.getHeadTableName());
assertEquals(commit.getTimestamp(), record.get("REV_CREATED"));
assertEquals(null, record.get("REV_MODIFIED"));
assertEquals(11, record.get(column));
record = jdbc().queryForMap("SELECT * FROM " + index.getHistoryTableName());
assertEquals(11, record.get(column));
// assert meta data
assertEquals(commit.getTimestamp(), record.get("REV_TIMESTAMP"));
assertEquals("INSERT", record.get("REV_OPERATION"));
assertEquals("testUser", record.get("REV_USER"));
assertEquals("testContext", record.get("REV_CONTEXTID"));
assertEquals("testDomain", record.get("REV_DOMAINID"));
assertEquals("testConnector", record.get("REV_CONNECTORID"));
assertEquals("testInstance", record.get("REV_INSTANCEID"));
}
@Test
public void commit_update_updatesTablesCorrectly() throws Exception {
TestModel entity = new TestModel("foo", 1);
// initial insert
IndexCommit insertCommit = newTestCommit().insert(entity).get();
engine.commit(insertCommit);
// update
entity.setTestInteger(42);
IndexCommit updateCommit = newTestCommit().update(entity).get();
engine.commit(updateCommit);
// assert
Index<TestModel> index = engine.getIndex(TestModel.class);
assertEquals(1, jdbc().queryForInt("SELECT COUNT(*) FROM " + index.getHeadTableName()));
assertEquals(2, jdbc().queryForInt("SELECT COUNT(*) FROM " + index.getHistoryTableName()));
// check head table
Map<String, Object> record = jdbc().queryForMap("SELECT * FROM " + index.getHeadTableName());
assertEquals(insertCommit.getTimestamp(), record.get("REV_CREATED"));
assertEquals("foo", record.get("TESTID"));
assertEquals(42, record.get("TESTINTEGER"));
// check revisions
SqlRowSet rowset =
jdbc().queryForRowSet("SELECT * FROM " + index.getHistoryTableName() + " ORDER BY REV_TIMESTAMP");
assertTrue(rowset.next());
assertEquals("foo", rowset.getString("TESTID"));
assertEquals(1, rowset.getInt("TESTINTEGER"));
assertEquals("INSERT", rowset.getString("REV_OPERATION"));
assertTrue(rowset.next());
assertEquals("foo", rowset.getString("TESTID"));
assertEquals(42, rowset.getInt("TESTINTEGER"));
assertEquals("UPDATE", rowset.getString("REV_OPERATION"));
assertFalse(rowset.next());
}
@Test
public void commit_delete_updatesTablesCorrectly() throws Exception {
TestModel entity = new TestModel("foo", 1);
// initial insert
IndexCommit insertCommit = newTestCommit().insert(entity).get();
engine.commit(insertCommit);
// deletion
IndexCommit deleteCommit = newTestCommit().delete(entity).get();
engine.commit(deleteCommit);
// assert
Index<TestModel> index = engine.getIndex(TestModel.class);
assertEquals(0, jdbc().queryForInt("SELECT COUNT(*) FROM " + index.getHeadTableName()));
assertEquals(2, jdbc().queryForInt("SELECT COUNT(*) FROM " + index.getHistoryTableName()));
// check revisions
String sql = "SELECT * FROM " + index.getHistoryTableName() + " ORDER BY REV_TIMESTAMP";
SqlRowSet rowset = jdbc().queryForRowSet(sql);
assertTrue(rowset.next());
assertEquals("foo", rowset.getString("TESTID"));
assertEquals(1, rowset.getInt("TESTINTEGER"));
assertEquals("INSERT", rowset.getString("REV_OPERATION"));
assertTrue(rowset.next());
assertEquals("foo", rowset.getString("TESTID"));
assertEquals(1, rowset.getInt("TESTINTEGER"));
assertEquals("DELETE", rowset.getString("REV_OPERATION"));
assertFalse(rowset.next());
}
@Test
public void commit_insert_primitivePropertyModel_createsRecordsCorrectly() throws Exception {
PrimitivePropertyModel model = new PrimitivePropertyModel();
model.setId("ppm/1");
model.setBooleanByGet(true);
model.setBooleanByIs(true);
model.setPrimitiveDouble(Double.MAX_VALUE);
model.setPrimitiveFloat(Float.MAX_VALUE);
model.setPrimitiveInt(Integer.MAX_VALUE);
model.setPrimitiveLong(Long.MAX_VALUE);
model.setPrimitiveShort(Short.MAX_VALUE);
engine.commit(newTestCommit().insert(model).get());
JdbcIndex<?> index = engine.getIndex(PrimitivePropertyModel.class);
Map<String, Object> record;
try {
record = jdbc().queryForMap("SELECT * FROM " + index.getHeadTableName());
} catch (EmptyResultDataAccessException e) {
fail("There was no record inserted to " + index.getHeadTableName() + ": " + e.getMessage());
return;
}
assertEquals(true, record.get("BOOLEANBYGET"));
assertEquals(true, record.get("BOOLEANBYIS"));
assertEquals(Double.MAX_VALUE, record.get("PRIMITIVEDOUBLE"));
assertEquals(Float.MAX_VALUE, record.get("PRIMITIVEFLOAT"));
assertEquals(Integer.MAX_VALUE, record.get("PRIMITIVEINT"));
assertEquals(Long.MAX_VALUE, record.get("PRIMITIVELONG"));
assertEquals(Short.MAX_VALUE, record.get("PRIMITIVESHORT"));
}
private IndexCommitBuilder newTestCommit() {
return IndexCommitBuilder.create()
.context("testContext")
.user("testUser")
.domain("testDomain")
.connector("testConnector")
.instance("testInstance");
}
}