package net.sourceforge.mayfly.datastore.constraint; import junit.framework.TestCase; import net.sourceforge.mayfly.Database; import net.sourceforge.mayfly.MayflyException; import net.sourceforge.mayfly.MayflyInternalException; import net.sourceforge.mayfly.datastore.Column; import net.sourceforge.mayfly.datastore.Columns; import net.sourceforge.mayfly.datastore.DataStore; import net.sourceforge.mayfly.evaluation.select.Evaluator; import net.sourceforge.mayfly.evaluation.select.StoreEvaluator; import net.sourceforge.mayfly.util.ImmutableList; import java.util.Iterator; import java.util.List; public class ConstraintsTest extends TestCase { public void testDropColumn() throws Exception { Constraints constraints = new Constraints( ImmutableList.fromArray(new Constraint[] { new PrimaryKey(makeColumns("id")), new UniqueConstraint(makeColumns("id")) }) ); assertEquals(2, constraints.constraintCount()); Constraints newConstraints = constraints.dropColumn(null, "id"); assertEquals(0, newConstraints.constraintCount()); } private Columns makeColumns(String name) { return new Columns(ImmutableList.singleton(new Column(name))); } public void testWrongType() throws Exception { Constraints constraints = new Constraints( ImmutableList.singleton( new PrimaryKey(makeColumns("id"), "my_constraint"))); try { constraints.dropForeignKey("my_constraint"); fail(); } catch (MayflyException e) { assertEquals("constraint my_constraint is not a foreign key", e.getMessage()); } } public void testMultiplePrimaryKeys() throws Exception { try { new Constraints( ImmutableList.fromArray(new Constraint[] { new PrimaryKey(Columns.singleton(new Column("a"))), new PrimaryKey(Columns.singleton(new Column("b"))) }) ); } catch (MayflyInternalException e) { assertEquals("attempt to define 2 primary keys", e.getMessage()); } } public void testRefersTo() throws Exception { Database database = new Database(); database.execute("create table aa(a integer primary key)"); database.execute("create table bb(a_id integer," + "foreign key(a_id) references aa(a))"); DataStore dataStore = database.dataStore(); Evaluator evaluator = new StoreEvaluator( dataStore, DataStore.ANONYMOUS_SCHEMA_NAME); assertTrue( dataStore.table("bb").constraints.refersTo("aa", evaluator)); Constraints aaConstraints = dataStore.table("aa").constraints; assertFalse(aaConstraints.refersTo("bb", evaluator)); try { aaConstraints.refersTo("nonexist", evaluator); fail(); } catch (MayflyException e) { assertEquals("no table nonexist", e.getMessage()); } } public void testReferencedTables() throws Exception { Database database = new Database(); database.execute("create table aa(a integer primary key)"); database.execute("create table bb(b integer primary key," + "a_id integer," + "foreign key(a_id) references aa(a))"); database.execute("create table cc(a_id integer," + "foreign key(a_id) references aa(a)," + "b_id integer," + "foreign key(b_id) references bb(b))"); DataStore dataStore = database.dataStore(); Evaluator evaluator = new StoreEvaluator( dataStore, DataStore.ANONYMOUS_SCHEMA_NAME); Constraints aaConstraints = dataStore.table("aa").constraints; List aaRefersTo = aaConstraints.referencedTables(evaluator); assertEquals(0, aaRefersTo.size()); Constraints bbConstraints = dataStore.table("bb").constraints; Iterator bbRefersTo = bbConstraints.referencedTables(evaluator).iterator(); assertEquals("aa", bbRefersTo.next()); assertFalse(bbRefersTo.hasNext()); Constraints ccConstraints = dataStore.table("cc").constraints; Iterator ccRefersTo = ccConstraints.referencedTables(evaluator).iterator(); assertEquals("aa", ccRefersTo.next()); assertEquals("bb", ccRefersTo.next()); assertFalse(ccRefersTo.hasNext()); } }