public void TestForeignKeyInterceptors(){
var em = new EntityManager(shouldConnect: false);
//Make an order
var order = em.CreateEntity<Order>();
order.EntityAspect.AddToManager();
//Make a customer - and generate a new ID for it
var customer = em.CreateEntity<Customer>();
customer.CustomerID = Guid.NewGuid();
customer.EntityAspect.AddToManager();
//The CustomerID field should currently be NULL
var originalCustomerId = order.CustomerID;
Assert.IsNull(originalCustomerId);
//Various bools used to see what things get fired
var propertyChangeFired = false;
var afterSetFired = false;
var beforeSetFired = false;
//Add before and after set interceptors to the CustomerID field
Order.PropertyMetadata.CustomerID.SetterInterceptor.AddAction(
PropertyInterceptorTiming.After,
args => { afterSetFired = true; });
Order.PropertyMetadata.CustomerID.SetterInterceptor.AddAction(
PropertyInterceptorTiming.Before,
args => { beforeSetFired = true; });
//Also watch for property change notifications
order.PropertyChanged += (s, e) =>
{
if (e.PropertyName == "CustomerID")
propertyChangeFired = true;
};
//Assign the customer entity - this will trigger the Customer and CustomerID fields to get changed
order.Customer = customer;
//Verify that the CustomerID did in fact get updated
var newCustomerId = order.CustomerID;
Assert.AreEqual(customer.CustomerID, newCustomerId);
Assert.AreNotEqual(originalCustomerId, newCustomerId);
//Now see what things got fired
//PropertyChanged event is raised
Assert.IsTrue(propertyChangeFired);
//But before and after set interceptors don't. These next two tests will fail.
Assert.IsTrue(afterSetFired); //Fails
Assert.IsTrue(beforeSetFired);//Fails
}