/*****************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF 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.apache.cayenne;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.di.Inject;
import org.apache.cayenne.query.ObjectIdQuery;
import org.apache.cayenne.testdo.relationships_to_one_fk.ToOneFK1;
import org.apache.cayenne.testdo.relationships_to_one_fk.ToOneFK2;
import org.apache.cayenne.unit.di.server.CayenneProjects;
import org.apache.cayenne.unit.di.server.ServerCase;
import org.apache.cayenne.unit.di.server.UseServerRuntime;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
import static org.junit.Assert.assertTrue;
/**
* Tests the behavior of one-to-one relationship where to-one is pointing to an FK.
*/
@UseServerRuntime(CayenneProjects.RELATIONSHIPS_TO_ONE_FK_PROJECT)
public class CDOOneToOneFKIT extends ServerCase {
@Inject
private DataContext context;
@Inject
private DataContext context1;
@Test
public void testReadRelationship() {
ToOneFK2 src = context.newObject(ToOneFK2.class);
ToOneFK1 target = context.newObject(ToOneFK1.class);
src.setToOneToFK(target);
context.commitChanges();
context.invalidateObjects(src, target);
ToOneFK2 src1 = (ToOneFK2) Cayenne.objectForPK(context, src.getObjectId());
assertNotNull(src1.getToOneToFK());
// resolve HOLLOW
assertSame(src1, src1.getToOneToFK().getToPK());
context.invalidateObjects(src1, src1.getToOneToFK());
ToOneFK1 target2 = (ToOneFK1) Cayenne.objectForPK(context, target.getObjectId());
assertNotNull(target2.getToPK());
// resolve HOLLOW
assertSame(target2, target2.getToPK().getToOneToFK());
}
@Test
public void test2Null() throws Exception {
ToOneFK2 src = context.newObject(ToOneFK2.class);
context.commitChanges();
// test database data
ObjectIdQuery refetch = new ObjectIdQuery(
src.getObjectId(),
false,
ObjectIdQuery.CACHE_REFRESH);
ToOneFK2 src2 = (ToOneFK2) Cayenne.objectForQuery(context1, refetch);
// *** TESTING THIS ***
assertNull(src2.getToOneToFK());
}
@Test
public void testReplaceNull1() throws Exception {
ToOneFK2 src = context.newObject(ToOneFK2.class);
context.commitChanges();
// test database data
ObjectIdQuery refetch = new ObjectIdQuery(
src.getObjectId(),
false,
ObjectIdQuery.CACHE_REFRESH);
ToOneFK2 src2 = (ToOneFK2) Cayenne.objectForQuery(context1, refetch);
assertEquals(src.getObjectId(), src2.getObjectId());
// *** TESTING THIS ***
src2.setToOneToFK(null);
assertNull(src2.getToOneToFK());
}
@Test
public void testReplaceNull2() throws Exception {
ToOneFK2 src = context.newObject(ToOneFK2.class);
context.commitChanges();
ToOneFK1 target = context.newObject(ToOneFK1.class);
// *** TESTING THIS ***
src.setToOneToFK(target);
// test before save
assertSame(target, src.getToOneToFK());
// do save
context.commitChanges();
// test database data
ObjectIdQuery refetch = new ObjectIdQuery(
src.getObjectId(),
false,
ObjectIdQuery.CACHE_REFRESH);
ToOneFK2 src2 = (ToOneFK2) Cayenne.objectForQuery(context1, refetch);
ToOneFK1 target2 = src2.getToOneToFK();
assertNotNull(target2);
assertEquals(src.getObjectId(), src2.getObjectId());
assertEquals(target.getObjectId(), target2.getObjectId());
}
@Test
public void testNewAdd() throws Exception {
ToOneFK2 src = context.newObject(ToOneFK2.class);
ToOneFK1 target = context.newObject(ToOneFK1.class);
// *** TESTING THIS ***
src.setToOneToFK(target);
// test before save
assertSame(target, src.getToOneToFK());
// do save
context.commitChanges();
// test database data
ObjectIdQuery refetch = new ObjectIdQuery(
src.getObjectId(),
false,
ObjectIdQuery.CACHE_REFRESH);
ToOneFK2 src2 = (ToOneFK2) Cayenne.objectForQuery(context1, refetch);
ToOneFK1 target2 = src2.getToOneToFK();
assertNotNull(target2);
assertEquals(src.getObjectId(), src2.getObjectId());
assertEquals(target.getObjectId(), target2.getObjectId());
}
@Test
public void testTakeObjectSnapshotDependentFault() throws Exception {
ToOneFK2 src = context.newObject(ToOneFK2.class);
ToOneFK1 target = context.newObject(ToOneFK1.class);
src.setToOneToFK(target);
context.commitChanges();
ObjectIdQuery refetch = new ObjectIdQuery(
src.getObjectId(),
false,
ObjectIdQuery.CACHE_REFRESH);
ToOneFK2 src2 = (ToOneFK2) Cayenne.objectForQuery(context1, refetch);
assertTrue(src2.readPropertyDirectly("toOneToFK") instanceof Fault);
// test that taking a snapshot does not trigger a fault, and generally works well
context.currentSnapshot(src2);
assertTrue(src2.readPropertyDirectly("toOneToFK") instanceof Fault);
}
@Test
public void testDelete() throws Exception {
ToOneFK2 src = context.newObject(ToOneFK2.class);
ToOneFK1 target = context.newObject(ToOneFK1.class);
src.setToOneToFK(target);
context.commitChanges();
src.setToOneToFK(null);
context.deleteObjects(target);
context.commitChanges();
// test database data
ObjectIdQuery refetch = new ObjectIdQuery(
src.getObjectId(),
false,
ObjectIdQuery.CACHE_REFRESH);
ToOneFK2 src2 = (ToOneFK2) Cayenne.objectForQuery(context1, refetch);
assertNull(src.getToOneToFK());
assertEquals(src.getObjectId(), src2.getObjectId());
}
}