diff --git a/src/classes/sfab_FabricatedSObject.cls b/src/classes/sfab_FabricatedSObject.cls index e243207..566283e 100644 --- a/src/classes/sfab_FabricatedSObject.cls +++ b/src/classes/sfab_FabricatedSObject.cls @@ -28,11 +28,35 @@ public virtual class sfab_FabricatedSObject { nodes.add(new sfab_ParentRelationshipNode(relationshipName, fabricatedParent)); return this; } + + public sfab_FabricatedSObject setParent(Schema.SObjectField field, sfab_FabricatedSObject fabricatedParent) { + nodes.add(new sfab_ParentRelationshipNode(field, fabricatedParent)); + return this; + } + + public sfab_FabricatedSObject setParent(Schema.SObjectField field, sfab_FabricatedSObject fabricatedParent, Schema.SObjectField parentIdField) { + Object parentId = fabricatedParent.getFieldValue(parentIdField); + if(parentId != null) setField(field, parentId); + + nodes.add(new sfab_ParentRelationshipNode(field, fabricatedParent)); + return this; + } public sfab_FabricatedSObject setChildren(String relationshipName, List fabricatedChildren) { nodes.add(new sfab_ChildRelationshipNode(relationshipName, fabricatedChildren)); return this; } + + public Object getFieldValue(Schema.SObjectField field) { + for(sfab_FabricatedSObjectNode node : nodes) { + if(node instanceOf sfab_FieldValuePairNode) { + sfab_FieldValuePairNode theNode = ((sfab_FieldValuePairNode) node); + if(theNode.field == field) return theNode.value; + } + } + + return null; + } public SObject toSObject() { return (SObject)JSON.deserialize(JSON.serialize(serialize()), sType); diff --git a/src/classes/sfab_FabricatedSObjectTest.cls b/src/classes/sfab_FabricatedSObjectTest.cls index 033cbf4..b552bd1 100644 --- a/src/classes/sfab_FabricatedSObjectTest.cls +++ b/src/classes/sfab_FabricatedSObjectTest.cls @@ -48,6 +48,23 @@ private class sfab_FabricatedSObjectTest { fabricatedSObject.setParent('Account', new sfab_FabricatedSObject(Account.class)); System.assertEquals(1, fabricatedSObject.nodes.size()); } + + @isTest + private static void setParentByToken_expectFieldAddedToNodes() { + sfab_FabricatedSObject fabricatedSObject = new sfab_FabricatedSObject(Opportunity.class); + fabricatedSObject.setParent(Opportunity.AccountId, new sfab_FabricatedSObject(Account.class)); + System.assertEquals(1, fabricatedSObject.nodes.size()); + } + + @isTest + private static void setParentWithId_expectFieldAddedToNodes() { + sfab_FabricatedSObject fabricatedParentSObject = new sfab_FabricatedSObject(Account.class); + fabricatedParentSObject.setField(Account.Id, 'Id-1'); + sfab_FabricatedSObject fabricatedSObject = new sfab_FabricatedSObject(Opportunity.class); + fabricatedSObject.setParent(Opportunity.AccountId, fabricatedParentSObject, Account.Id); + System.assertEquals(2, fabricatedSObject.nodes.size()); + System.assertEquals('Id-1', fabricatedSObject.getFieldValue(Opportunity.AccountId)); + } @isTest private static void setChildren_expectFieldAdded() { @@ -55,4 +72,17 @@ private class sfab_FabricatedSObjectTest { fabricatedSObject.setChildren('Opportunites', new List()); System.assertEquals(1, fabricatedSObject.nodes.size()); } + + @isTest + private static void getFieldValue_expectValue() { + sfab_FabricatedSObject fabricatedSObject = new sfab_FabricatedSObject(Account.class); + fabricatedSObject.setField(Account.Id, 'Id-1'); + System.assertEquals('Id-1', fabricatedSObject.getFieldValue(Account.Id)); + } + + @isTest + private static void getFieldValue_expectNotFound() { + sfab_FabricatedSObject fabricatedSObject = new sfab_FabricatedSObject(Account.class); + System.assertEquals(null, fabricatedSObject.getFieldValue(Account.Id)); + } } \ No newline at end of file diff --git a/src/classes/sfab_FieldValuePairNode.cls b/src/classes/sfab_FieldValuePairNode.cls index c742679..d2afcaa 100644 --- a/src/classes/sfab_FieldValuePairNode.cls +++ b/src/classes/sfab_FieldValuePairNode.cls @@ -1,6 +1,6 @@ public class sfab_FieldValuePairNode implements sfab_FabricatedSObjectNode { - protected Schema.SObjectField field; - protected Object value; + public Schema.SObjectField field {get; private set;} + public Object value {get; private set;} public sfab_FieldValuePairNode(Schema.SObjectField field, Object value) { this.field = field; diff --git a/src/classes/sfab_ParentRelationshipNode.cls b/src/classes/sfab_ParentRelationshipNode.cls index 8ba3e96..4f9f0d8 100644 --- a/src/classes/sfab_ParentRelationshipNode.cls +++ b/src/classes/sfab_ParentRelationshipNode.cls @@ -6,6 +6,10 @@ public class sfab_ParentRelationshipNode implements sfab_FabricatedSObjectNode { this.fieldName = fieldName; this.parent = parent; } + + public sfab_ParentRelationshipNode(Schema.SObjectField field, sfab_FabricatedSObject parent) { + this(field.getDescribe().getRelationshipName(), parent); + } public Map serialize() { return new Map { fieldName => parent.serialize() };