public RelativityObjectFieldAttribute(string fieldGuid, RdoFieldType fieldType, int length)
     : this(fieldGuid, fieldType)
 {
     this.Length = length;
 }
 public RelativityObjectFieldAttribute(string fieldGuid, RdoFieldType fieldType)
 {
     this.FieldGuid = new Guid(fieldGuid);
     this.FieldType = fieldType;
 }
        //need object fields, could get a little more difficult
        public void Valid_Gravity_RelativityObject_Create_Field_Type <T>(string objectPropertyName, T sampleData)
        {
            void Inner()
            {
                //Arrange
                LogStart($"for property{objectPropertyName}");

                GravityLevelOne testObject = new GravityLevelOne()
                {
                    Name = $"TestObjectCreate_{objectPropertyName}{Guid.NewGuid()}"
                };

                var          testFieldAttribute = testObject.GetCustomAttribute <RelativityObjectFieldAttribute>(objectPropertyName);
                Guid         testFieldGuid      = testFieldAttribute.FieldGuid;
                RdoFieldType fieldType          = testFieldAttribute.FieldType;


                //need this mess because when passing in tests for decimal and currency System wants to use double and causes problems
                switch (fieldType)
                {
                case RdoFieldType.Currency:
                case RdoFieldType.Decimal:
                    testObject.SetValueByPropertyName(objectPropertyName, Convert.ToDecimal(sampleData));
                    break;

                default:
                    testObject.SetValueByPropertyName(objectPropertyName, sampleData);
                    break;
                }

                _client.APIOptions.WorkspaceID = _workspaceId;

                LogEnd("Arrangement");

                //Act
                LogStart("Act");

                var newRdoArtifactId = _testObjectHelper.CreateTestObjectWithGravity <GravityLevelOne>(testObject);

                //read artifactID from RSAPI
                RDO newObject = _client.Repositories.RDO.ReadSingle(newRdoArtifactId);

                FieldValue field = newObject.Fields.Get(testFieldGuid);

                object newObjectValue = null;
                object expectedData   = sampleData;

                switch (fieldType)
                {
                case RdoFieldType.LongText:
                    newObjectValue = field.ValueAsLongText;
                    break;

                case RdoFieldType.FixedLengthText:
                    newObjectValue = field.ValueAsFixedLengthText;
                    break;

                case RdoFieldType.WholeNumber:
                    newObjectValue = field.ValueAsWholeNumber;
                    break;

                case RdoFieldType.YesNo:
                    newObjectValue = field.ValueAsYesNo;
                    break;

                case RdoFieldType.Currency:
                    newObjectValue = field.ValueAsCurrency;
                    break;

                case RdoFieldType.Decimal:
                    newObjectValue = field.ValueAsDecimal;
                    break;

                case RdoFieldType.SingleChoice:
                    int choiceArtifactId = field.ValueAsSingleChoice.ArtifactID;
                    if (choiceArtifactId > 0)
                    {
                        Choice choice           = _client.Repositories.Choice.ReadSingle(choiceArtifactId);
                        Enum   singleChoice     = (Enum)Enum.ToObject(sampleData.GetType(), sampleData);
                        Guid   singleChoiceGuid = singleChoice.GetRelativityObjectAttributeGuidValue();
                        newObjectValue = choice.Guids.SingleOrDefault(x => x == singleChoiceGuid);
                        expectedData   = singleChoiceGuid;
                    }
                    break;

                case RdoFieldType.SingleObject:
                    newObjectValue = field.ValueAsSingleObject.ArtifactID;
                    expectedData   = testObject.GravityLevel2Obj.ArtifactId > 0
                                                        ? (object)testObject.GravityLevel2Obj.ArtifactId
                                                        : null;
                    break;

                case RdoFieldType.MultipleObject:
                    var  rawNewObjectValue  = field.GetValueAsMultipleObject <Artifact>();
                    var  resultData         = new List <GravityLevel2>();
                    Guid childFieldNameGuid = new GravityLevel2().GetCustomAttribute <RelativityObjectFieldAttribute>("Name").FieldGuid;

                    foreach (Artifact child in rawNewObjectValue)
                    {
                        //'Read' - need to get name.
                        RDO childRdo = new RDO()
                        {
                            Fields = new List <FieldValue>()
                            {
                                new FieldValue(childFieldNameGuid)
                            }
                        };
                        childRdo = _client.Repositories.RDO.ReadSingle(child.ArtifactID);
                        string childNameValue = childRdo.Fields.Where(x => x.Guids.Contains(childFieldNameGuid)).FirstOrDefault().ToString();

                        resultData.Add(new GravityLevel2()
                        {
                            ArtifactId = child.ArtifactID, Name = childNameValue
                        });
                    }
                    newObjectValue = resultData.ToDictionary(x => x.ArtifactId, x => x.Name);
                    expectedData   = ((IEnumerable <GravityLevel2>)expectedData).ToDictionary(x => x.ArtifactId, x => x.Name);

                    break;
                }

                LogEnd("Act");

                //Assert
                LogStart("Assertion");

                //Assert
                Assert.AreEqual(expectedData, newObjectValue);

                LogEnd("Assertion");
            }

            TestWrapper(Inner);
        }
        public void Valid_Gravity_RelativityObject_Read_Field_Type <T>(string objectPropertyName, T sampleData)
        {
            void Inner()
            {
                //Arrange
                LogStart($"Arrangement for property {objectPropertyName}");

                GravityLevelOne testObject = new GravityLevelOne()
                {
                    Name = $"TestObjectRead_{objectPropertyName}{Guid.NewGuid()}"
                };

                Guid         testObjectTypeGuid = testObject.GetObjectLevelCustomAttribute <RelativityObjectAttribute>().ObjectTypeGuid;
                Guid         nameFieldGuid      = testObject.GetCustomAttribute <RelativityObjectFieldAttribute>("Name").FieldGuid;
                var          testFieldAttribute = testObject.GetCustomAttribute <RelativityObjectFieldAttribute>(objectPropertyName);
                Guid         testFieldGuid      = testFieldAttribute.FieldGuid;
                RdoFieldType fieldType          = testObject.GetCustomAttribute <RelativityObjectFieldAttribute>(objectPropertyName).FieldType;

                _client.APIOptions.WorkspaceID = _workspaceId;

                object expectedData = sampleData;

                var dto = new RDO()
                {
                    ArtifactTypeGuids = new List <Guid> {
                        testObjectTypeGuid
                    }
                };
                int newArtifactId = -1;

                dto.Fields.Add(new FieldValue(nameFieldGuid, testObject.Name));

                int objectToAttachID;

                //need this mess because when passing in tests for decimal and currency System wants to use double and causes problems
                switch (fieldType)
                {
                case RdoFieldType.SingleChoice:
                    Enum   singleChoice      = (Enum)Enum.ToObject(sampleData.GetType(), sampleData);
                    Guid   singleChoiceGuid  = singleChoice.GetRelativityObjectAttributeGuidValue();
                    Choice singleChoiceToAdd = new Choice(singleChoiceGuid);
                    dto.Fields.Add(new FieldValue(testFieldGuid, singleChoiceToAdd));
                    break;

                case RdoFieldType.SingleObject:
                    int objectToAttach =
                        _testObjectHelper.CreateTestObjectWithGravity <GravityLevel2>(sampleData as GravityLevel2);
                    dto.Fields.Add(new FieldValue(testFieldGuid, objectToAttach));
                    expectedData = (sampleData as GravityLevel2).Name;
                    break;

                case RdoFieldType.MultipleObject:
                    IList <GravityLevel2>     gravityLevel2s = (IList <GravityLevel2>)sampleData;
                    FieldValueList <Artifact> objects        = new FieldValueList <Artifact>();
                    expectedData = new Dictionary <int, string>();
                    foreach (GravityLevel2 child in gravityLevel2s)
                    {
                        objectToAttachID =
                            _testObjectHelper.CreateTestObjectWithGravity <GravityLevel2>(child);
                        objects.Add(new Artifact(objectToAttachID));
                        (expectedData as Dictionary <int, string>).Add(objectToAttachID, child.Name);
                    }
                    dto.Fields.Add(new FieldValue(testFieldGuid, objects));
                    break;

                default:
                    dto.Fields.Add(new FieldValue(testFieldGuid, sampleData));
                    break;
                }

                WriteResultSet <RDO> writeResults = _client.Repositories.RDO.Create(dto);

                if (writeResults.Success)
                {
                    newArtifactId = writeResults.Results[0].Artifact.ArtifactID;
                    Console.WriteLine($"Object was created with Artifact ID {newArtifactId}.");
                }
                else
                {
                    Console.WriteLine($"An error occurred creating object: {writeResults.Message}");
                    foreach (var result in
                             writeResults.Results
                             .Select((item, index) => new { rdoResult = item, itemNumber = index })
                             .Where(x => x.rdoResult.Success == false))
                    {
                        Console.WriteLine($"An error occurred in create request {result.itemNumber}: {result.rdoResult.Message}");
                    }
                }

                LogEnd("Arrangement");

                //Act
                LogStart("Act");

                object gravityFieldValue = null;

                if (newArtifactId > 0)
                {
                    GravityLevelOne testGravityObject = _testObjectHelper.ReturnTestObjectWithGravity <GravityLevelOne>(newArtifactId);
                    gravityFieldValue = testGravityObject.GetPropertyValue(objectPropertyName);
                    if (gravityFieldValue != null)
                    {
                        switch (fieldType)
                        {
                        case RdoFieldType.SingleObject:
                            gravityFieldValue = ((GravityLevel2)gravityFieldValue).Name;
                            break;

                        case RdoFieldType.MultipleObject:
                            gravityFieldValue = ((List <GravityLevel2>)gravityFieldValue).ToDictionary(x => x.ArtifactId, x => x.Name);
                            break;
                        }
                    }
                }

                LogEnd("Act");

                //Assert
                LogStart("Assertion");

                if (newArtifactId > 0)
                {
                    Assert.AreEqual(expectedData, gravityFieldValue);
                }
                else
                {
                    Assert.Fail("Could not create object to test with through RSAPI. This is not a Gravity failure.");
                }

                LogEnd("Assertion");
            }

            TestWrapper(Inner);
        }
Example #5
0
        private static object ConvertPropertyValue(PropertyInfo property, RdoFieldType fieldType, object propertyValue)
        {
            switch (fieldType)
            {
            case RdoFieldType.Currency:
            case RdoFieldType.Date:
            case RdoFieldType.Decimal:
            case RdoFieldType.Empty:
            case RdoFieldType.LongText:
            case RdoFieldType.WholeNumber:
            case RdoFieldType.YesNo:
            case RdoFieldType.User:
            {
                return(propertyValue);
            }

            //truncate fixed-length text
            case RdoFieldType.FixedLengthText:
            {
                int stringLength = property.GetCustomAttribute <RelativityObjectFieldAttribute>().Length ?? 3000;

                string theString = propertyValue as string;
                if (string.IsNullOrEmpty(theString) == false && theString.Length > stringLength)
                {
                    theString = theString.Substring(0, (stringLength - 3)) + "...";
                }

                return(theString);
            }

            case RdoFieldType.MultipleChoice:
            {
                var choiceList = ((IEnumerable)propertyValue)
                                 .Cast <Enum>()
                                 .Select(x => x.GetRelativityObjectAttributeGuidValue())
                                 .Select(choiceGuid => new Choice(choiceGuid))
                                 .ToList();

                return(choiceList.Any() ? (MultiChoiceFieldValueList)choiceList : null);
            }

            case RdoFieldType.MultipleObject:
            {
                return(new FieldValueList <Artifact>(
                           ((IEnumerable <object>)propertyValue).Select(x => new Artifact((x as BaseDto).ArtifactId))));
            }

            case RdoFieldType.SingleChoice:
            {
                if (Enum.IsDefined(propertyValue.GetType(), propertyValue))
                {
                    var choiceGuid = ((Enum)propertyValue).GetRelativityObjectAttributeGuidValue();
                    return(new Choice(choiceGuid));
                }
                break;
            }

            case RdoFieldType.SingleObject:
            {
                int artifactId = (propertyValue as BaseDto).ArtifactId;
                if (artifactId > 0)
                {
                    return(new Artifact(artifactId));
                }
                break;
            }
            }

            return(null);
        }