diff --git a/Box.V2.Test/Box.V2.Test.csproj b/Box.V2.Test/Box.V2.Test.csproj index eb37744b5..a3c2d717c 100644 --- a/Box.V2.Test/Box.V2.Test.csproj +++ b/Box.V2.Test/Box.V2.Test.csproj @@ -87,6 +87,18 @@ PreserveNewest + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + PreserveNewest diff --git a/Box.V2.Test/Converters/SingleOrCollectionConverterTest.cs b/Box.V2.Test/Converters/SingleOrCollectionConverterTest.cs new file mode 100644 index 000000000..e32a2c677 --- /dev/null +++ b/Box.V2.Test/Converters/SingleOrCollectionConverterTest.cs @@ -0,0 +1,50 @@ +using Box.V2.Converter; +using Box.V2.Models; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Box.V2.Test +{ + [TestClass] + public class SingleOrCollectionConverterTest : BoxResourceManagerTest + { + private readonly IBoxConverter _converter; + + public SingleOrCollectionConverterTest() + { + _converter = new BoxJsonConverter(); + } + + [TestMethod] + public void SingleObject() + { + var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json"); + var error = _converter.Parse>(json); + Assert.AreEqual(error.Conflicts[0].Name, "Test Folder"); + } + + [TestMethod] + public void Array() + { + var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/Array.json"); + var error = _converter.Parse>(json); + Assert.AreEqual(error.Conflicts[0].Name, "Test Folder"); + Assert.AreEqual(error.Conflicts[1].Name, "Test Folder 2"); + } + + [TestMethod] + public void EmptyArray() + { + var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json"); + var error = _converter.Parse>(json); + Assert.AreEqual(error.Conflicts.Count, 0); + } + + [TestMethod] + public void Empty() + { + var json = LoadFixtureFromJson("Fixtures/Converters/SingleOrCollectionConverter/Empty.json"); + var error = _converter.Parse>(json); + Assert.IsNull(error.Conflicts); + } + } +} diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Array.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Array.json new file mode 100644 index 000000000..43b1b19c1 --- /dev/null +++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Array.json @@ -0,0 +1,18 @@ +{ + "conflicts": [ + { + "type": "folder", + "id": "123", + "sequence_id": "0", + "etag": "0", + "name": "Test Folder" + }, + { + "type": "folder", + "id": "124", + "sequence_id": "0", + "etag": "0", + "name": "Test Folder 2" + } + ] +} diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Empty.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Empty.json new file mode 100644 index 000000000..2c63c0851 --- /dev/null +++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/Empty.json @@ -0,0 +1,2 @@ +{ +} diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json new file mode 100644 index 000000000..62463aabc --- /dev/null +++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/EmptyArray.json @@ -0,0 +1,4 @@ +{ + "conflicts": [ + ] +} diff --git a/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json new file mode 100644 index 000000000..069c98831 --- /dev/null +++ b/Box.V2.Test/Fixtures/Converters/SingleOrCollectionConverter/SingleObject.json @@ -0,0 +1,9 @@ +{ + "conflicts": { + "type": "folder", + "id": "123", + "sequence_id": "0", + "etag": "0", + "name": "Test Folder" + } +} diff --git a/Box.V2/Wrappers/BoxErrorContextInfo.cs b/Box.V2/Wrappers/BoxErrorContextInfo.cs index be02eeeb6..72a4d721f 100644 --- a/Box.V2/Wrappers/BoxErrorContextInfo.cs +++ b/Box.V2/Wrappers/BoxErrorContextInfo.cs @@ -1,5 +1,8 @@ +using System; using System.Collections.ObjectModel; using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; namespace Box.V2 { @@ -14,6 +17,8 @@ public class BoxConflictErrorContextInfo where T : class /// /// The conflicts. [JsonProperty(PropertyName = "conflicts")] + //in case of copyFolder conflict object is returned instead of an array + [JsonConverter(typeof(SingleOrCollectionConverter))] public Collection Conflicts { get; set; } } @@ -30,4 +35,26 @@ public class BoxPreflightCheckConflictErrorContextInfo where T : class [JsonProperty(PropertyName = "conflicts")] public T Conflict { get; set; } } + + + internal class SingleOrCollectionConverter : JsonConverter + { + public override bool CanConvert(Type objectType) => true; + + public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) + { + var jToken = serializer.Deserialize(reader); + + return jToken is JArray ? + jToken.ToObject(objectType, serializer) : + new JArray(jToken).ToObject(objectType, serializer); + } + + public override bool CanWrite => false; + + public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + { + throw new NotImplementedException(); + } + } }